mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-03 14:21:30 +00:00 
			
		
		
		
	Never attempt to join an early-clobber def with a regular kill.
This fixes PR14194. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166880 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		@@ -1492,6 +1492,20 @@ JoinVals::analyzeValue(unsigned ValNo, JoinVals &Other) {
 | 
				
			|||||||
  if ((V.WriteLanes & OtherV.ValidLanes) == 0)
 | 
					  if ((V.WriteLanes & OtherV.ValidLanes) == 0)
 | 
				
			||||||
    return CR_Replace;
 | 
					    return CR_Replace;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // If the other live range is killed by DefMI and the live ranges are still
 | 
				
			||||||
 | 
					  // overlapping, it must be because we're looking at an early clobber def:
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  //   %dst<def,early-clobber> = ASM %src<kill>
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  // In this case, it is illegal to merge the two live ranges since the early
 | 
				
			||||||
 | 
					  // clobber def would clobber %src before it was read.
 | 
				
			||||||
 | 
					  if (OtherLRQ.isKill()) {
 | 
				
			||||||
 | 
					    // This case where the def doesn't overlap the kill is handled above.
 | 
				
			||||||
 | 
					    assert(VNI->def.isEarlyClobber() &&
 | 
				
			||||||
 | 
					           "Only early clobber defs can overlap a kill");
 | 
				
			||||||
 | 
					    return CR_Impossible;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // VNI is clobbering live lanes in OtherVNI, but there is still the
 | 
					  // VNI is clobbering live lanes in OtherVNI, but there is still the
 | 
				
			||||||
  // possibility that no instructions actually read the clobbered lanes.
 | 
					  // possibility that no instructions actually read the clobbered lanes.
 | 
				
			||||||
  // If we're clobbering all the lanes in OtherVNI, at least one must be read.
 | 
					  // If we're clobbering all the lanes in OtherVNI, at least one must be read.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -580,3 +580,12 @@ bb28:                                             ; preds = %bb21
 | 
				
			|||||||
bb29:                                             ; preds = %bb28, %bb26, %bb25, %bb21
 | 
					bb29:                                             ; preds = %bb28, %bb26, %bb25, %bb21
 | 
				
			||||||
  unreachable
 | 
					  unreachable
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define void @pr14194() nounwind uwtable {
 | 
				
			||||||
 | 
					  %tmp = load i64* undef, align 16
 | 
				
			||||||
 | 
					  %tmp1 = trunc i64 %tmp to i32
 | 
				
			||||||
 | 
					  %tmp2 = lshr i64 %tmp, 32
 | 
				
			||||||
 | 
					  %tmp3 = trunc i64 %tmp2 to i32
 | 
				
			||||||
 | 
					  %tmp4 = call { i32, i32 } asm sideeffect "", "=&r,=&r,r,r,0,1,~{dirflag},~{fpsr},~{flags}"(i32 %tmp3, i32 undef, i32 %tmp3, i32 %tmp1) nounwind
 | 
				
			||||||
 | 
					 ret void
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user