mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	Reset kill markers after live interval is reconstructed.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83608 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		| @@ -778,6 +778,24 @@ void PreAllocSplitting::ReconstructLiveInterval(LiveInterval* LI) { | ||||
|     LI->addRange(LiveRange(DefIdx, LIs->getNextSlot(DefIdx), DeadVN)); | ||||
|     DeadVN->addKill(DefIdx); | ||||
|   } | ||||
|  | ||||
|   // Update kill markers. | ||||
|   for (LiveInterval::vni_iterator VI = LI->vni_begin(), VE = LI->vni_end(); | ||||
|        VI != VE; ++VI) { | ||||
|     VNInfo* VNI = *VI; | ||||
|     for (unsigned i = 0, e = VNI->kills.size(); i != e; ++i) { | ||||
|       LiveIndex KillIdx = VNI->kills[i]; | ||||
|       if (KillIdx.isPHIIndex()) | ||||
|         continue; | ||||
|       MachineInstr *KillMI = LIs->getInstructionFromIndex(KillIdx); | ||||
|       if (KillMI) { | ||||
|         MachineOperand *KillMO = KillMI->findRegisterUseOperand(CurrLI->reg); | ||||
|         if (KillMO) | ||||
|           // It could be a dead def. | ||||
|           KillMO->setIsKill(); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| /// RenumberValno - Split the given valno out into a new vreg, allowing it to | ||||
| @@ -1102,7 +1120,7 @@ bool PreAllocSplitting::SplitRegLiveInterval(LiveInterval *LI) { | ||||
|       return false; // Def is dead. Do nothing. | ||||
|      | ||||
|     if ((SpillMI = FoldSpill(LI->reg, RC, DefMI, Barrier, | ||||
|                             BarrierMBB, SS, RefsInMBB))) { | ||||
|                              BarrierMBB, SS, RefsInMBB))) { | ||||
|       SpillIndex = LIs->getInstructionIndex(SpillMI); | ||||
|     } else { | ||||
|       // Check if it's possible to insert a spill after the def MI. | ||||
| @@ -1118,11 +1136,9 @@ bool PreAllocSplitting::SplitRegLiveInterval(LiveInterval *LI) { | ||||
|         if (SpillPt == DefMBB->end()) | ||||
|           return false; // No gap to insert spill. | ||||
|       } | ||||
|       // Add spill. The store instruction kills the register if def is before | ||||
|       // the barrier in the barrier block. | ||||
|       // Add spill.  | ||||
|       SS = CreateSpillStackSlot(CurrLI->reg, RC); | ||||
|       TII->storeRegToStackSlot(*DefMBB, SpillPt, CurrLI->reg, | ||||
|                                DefMBB == BarrierMBB, SS, RC); | ||||
|       TII->storeRegToStackSlot(*DefMBB, SpillPt, CurrLI->reg, false, SS, RC); | ||||
|       SpillMI = prior(SpillPt); | ||||
|       LIs->InsertMachineInstrInMaps(SpillMI, SpillIndex); | ||||
|     } | ||||
| @@ -1150,7 +1166,7 @@ bool PreAllocSplitting::SplitRegLiveInterval(LiveInterval *LI) { | ||||
|                           LIs->getDefIndex(RestoreIndex)); | ||||
|  | ||||
|   ReconstructLiveInterval(CurrLI); | ||||
|    | ||||
|  | ||||
|   if (!FoldedRestore) { | ||||
|     LiveIndex RestoreIdx = LIs->getInstructionIndex(prior(RestorePt)); | ||||
|     RestoreIdx = LIs->getDefIndex(RestoreIdx); | ||||
|   | ||||
							
								
								
									
										34
									
								
								test/CodeGen/X86/pre-split11.ll
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								test/CodeGen/X86/pre-split11.ll
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+sse2 -pre-alloc-split | FileCheck %s | ||||
|  | ||||
| @.str = private constant [28 x i8] c"\0A\0ADOUBLE            D = %f\0A\00", align 1 ; <[28 x i8]*> [#uses=1] | ||||
| @.str1 = private constant [37 x i8] c"double to long    l1 = %ld\09\09(0x%lx)\0A\00", align 8 ; <[37 x i8]*> [#uses=1] | ||||
| @.str2 = private constant [35 x i8] c"double to uint   ui1 = %u\09\09(0x%x)\0A\00", align 8 ; <[35 x i8]*> [#uses=1] | ||||
| @.str3 = private constant [37 x i8] c"double to ulong  ul1 = %lu\09\09(0x%lx)\0A\00", align 8 ; <[37 x i8]*> [#uses=1] | ||||
|  | ||||
| define i32 @main(i32 %argc, i8** nocapture %argv) nounwind ssp { | ||||
| ; CHECK: movsd %xmm0, (%rsp) | ||||
| entry: | ||||
|   %0 = icmp sgt i32 %argc, 4                      ; <i1> [#uses=1] | ||||
|   br i1 %0, label %bb, label %bb2 | ||||
|  | ||||
| bb:                                               ; preds = %entry | ||||
|   %1 = getelementptr inbounds i8** %argv, i64 4   ; <i8**> [#uses=1] | ||||
|   %2 = load i8** %1, align 8                      ; <i8*> [#uses=1] | ||||
|   %3 = tail call double @atof(i8* %2) nounwind    ; <double> [#uses=1] | ||||
|   br label %bb2 | ||||
|  | ||||
| bb2:                                              ; preds = %bb, %entry | ||||
|   %storemerge = phi double [ %3, %bb ], [ 2.000000e+00, %entry ] ; <double> [#uses=4] | ||||
|   %4 = fptoui double %storemerge to i32           ; <i32> [#uses=2] | ||||
|   %5 = fptoui double %storemerge to i64           ; <i64> [#uses=2] | ||||
|   %6 = fptosi double %storemerge to i64           ; <i64> [#uses=2] | ||||
|   %7 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([28 x i8]* @.str, i64 0, i64 0), double %storemerge) nounwind ; <i32> [#uses=0] | ||||
|   %8 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([37 x i8]* @.str1, i64 0, i64 0), i64 %6, i64 %6) nounwind ; <i32> [#uses=0] | ||||
|   %9 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([35 x i8]* @.str2, i64 0, i64 0), i32 %4, i32 %4) nounwind ; <i32> [#uses=0] | ||||
|   %10 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([37 x i8]* @.str3, i64 0, i64 0), i64 %5, i64 %5) nounwind ; <i32> [#uses=0] | ||||
|   ret i32 0 | ||||
| } | ||||
|  | ||||
| declare double @atof(i8* nocapture) nounwind readonly | ||||
|  | ||||
| declare i32 @printf(i8* nocapture, ...) nounwind | ||||
		Reference in New Issue
	
	Block a user