mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	Cleanup initial-value constants in PPCCTRLoops
Because the initial-value constants had not been added to the list of instructions considered for DCE the resulting code had redundant constant-materialization instructions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@177294 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		@@ -380,13 +380,13 @@ CountValue *PPCCTRLoops::getTripCount(MachineLoop *L,
 | 
			
		||||
        assert(InitialValue->isReg() && "Expecting register for init value");
 | 
			
		||||
        unsigned InitialValueReg = InitialValue->getReg();
 | 
			
		||||
  
 | 
			
		||||
        const MachineInstr *DefInstr = MRI->getVRegDef(InitialValueReg);
 | 
			
		||||
        MachineInstr *DefInstr = MRI->getVRegDef(InitialValueReg);
 | 
			
		||||
  
 | 
			
		||||
        // Here we need to look for an immediate load (an li or lis/ori pair).
 | 
			
		||||
        if (DefInstr && (DefInstr->getOpcode() == PPC::ORI8 ||
 | 
			
		||||
                         DefInstr->getOpcode() == PPC::ORI)) {
 | 
			
		||||
          int64_t start = (short) DefInstr->getOperand(2).getImm();
 | 
			
		||||
          const MachineInstr *DefInstr2 =
 | 
			
		||||
          MachineInstr *DefInstr2 =
 | 
			
		||||
            MRI->getVRegDef(DefInstr->getOperand(0).getReg());
 | 
			
		||||
          if (DefInstr2 && (DefInstr2->getOpcode() == PPC::LIS8 ||
 | 
			
		||||
                            DefInstr2->getOpcode() == PPC::LIS)) {
 | 
			
		||||
@@ -399,6 +399,10 @@ CountValue *PPCCTRLoops::getTripCount(MachineLoop *L,
 | 
			
		||||
            if ((count % iv_value) != 0) {
 | 
			
		||||
              return 0;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            OldInsts.push_back(DefInstr);
 | 
			
		||||
            OldInsts.push_back(DefInstr2);
 | 
			
		||||
 | 
			
		||||
            return new CountValue(count/iv_value);
 | 
			
		||||
          }
 | 
			
		||||
        } else if (DefInstr && (DefInstr->getOpcode() == PPC::LI8 ||
 | 
			
		||||
@@ -409,6 +413,9 @@ CountValue *PPCCTRLoops::getTripCount(MachineLoop *L,
 | 
			
		||||
          if ((count % iv_value) != 0) {
 | 
			
		||||
            return 0;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          OldInsts.push_back(DefInstr);
 | 
			
		||||
 | 
			
		||||
          return new CountValue(count/iv_value);
 | 
			
		||||
        } else if (iv_value == 1 || iv_value == -1) {
 | 
			
		||||
          // We can't determine a constant starting value.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										25
									
								
								test/CodeGen/PowerPC/ctr-cleanup.ll
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								test/CodeGen/PowerPC/ctr-cleanup.ll
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
; RUN: llc < %s -mcpu=a2 | FileCheck %s
 | 
			
		||||
target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64"
 | 
			
		||||
target triple = "powerpc64-unknown-linux-gnu"
 | 
			
		||||
 | 
			
		||||
define void @main() #0 {
 | 
			
		||||
entry:
 | 
			
		||||
  br i1 undef, label %for.end, label %for.body
 | 
			
		||||
 | 
			
		||||
for.body:                                         ; preds = %for.body, %entry
 | 
			
		||||
  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 1, %entry ]
 | 
			
		||||
  %indvars.iv.next = add i64 %indvars.iv, 1
 | 
			
		||||
  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
 | 
			
		||||
  %exitcond = icmp eq i32 %lftr.wideiv, 5
 | 
			
		||||
  br i1 %exitcond, label %for.end, label %for.body
 | 
			
		||||
 | 
			
		||||
; CHECK: @main
 | 
			
		||||
; CHECK: li {{[0-9]+}}, 4
 | 
			
		||||
; CHECK-NOT: li {{[0-9]+}}, 4
 | 
			
		||||
; CHECK: bdnz
 | 
			
		||||
 | 
			
		||||
for.end:                                          ; preds = %for.body, %entry
 | 
			
		||||
  ret void
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
 | 
			
		||||
		Reference in New Issue
	
	Block a user