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)); |     LI->addRange(LiveRange(DefIdx, LIs->getNextSlot(DefIdx), DeadVN)); | ||||||
|     DeadVN->addKill(DefIdx); |     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 | /// RenumberValno - Split the given valno out into a new vreg, allowing it to | ||||||
| @@ -1118,11 +1136,9 @@ bool PreAllocSplitting::SplitRegLiveInterval(LiveInterval *LI) { | |||||||
|         if (SpillPt == DefMBB->end()) |         if (SpillPt == DefMBB->end()) | ||||||
|           return false; // No gap to insert spill. |           return false; // No gap to insert spill. | ||||||
|       } |       } | ||||||
|       // Add spill. The store instruction kills the register if def is before |       // Add spill.  | ||||||
|       // the barrier in the barrier block. |  | ||||||
|       SS = CreateSpillStackSlot(CurrLI->reg, RC); |       SS = CreateSpillStackSlot(CurrLI->reg, RC); | ||||||
|       TII->storeRegToStackSlot(*DefMBB, SpillPt, CurrLI->reg, |       TII->storeRegToStackSlot(*DefMBB, SpillPt, CurrLI->reg, false, SS, RC); | ||||||
|                                DefMBB == BarrierMBB, SS, RC); |  | ||||||
|       SpillMI = prior(SpillPt); |       SpillMI = prior(SpillPt); | ||||||
|       LIs->InsertMachineInstrInMaps(SpillMI, SpillIndex); |       LIs->InsertMachineInstrInMaps(SpillMI, SpillIndex); | ||||||
|     } |     } | ||||||
|   | |||||||
							
								
								
									
										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