mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-03 14:21:30 +00:00 
			
		
		
		
	This prevents the behavior observed in llvm.org/PR22369. I am not sure
whether I am reading the code correctly, but the early exit based on
isLiveOutPastPHIs() seems to make the wrong assumption that
RegisterCoalescer won't be able to coalesce those copies later.
This change hides the new behavior behind -no-phi-elim-live-out-early-exit
as it currently breaks four tests:
 * Assertion in:
     CodeGen/Hexagon/hwloop-cleanup.ll
 * Worse code in:
     CodeGen/X86/coalescer-commute4.ll
     CodeGen/X86/phys_subreg_coalesce-2.ll
     CodeGen/X86/zlib-longest-match.ll
   The root cause here seems to be that the heuristic that determines
   the visitation order in RegisterCoalescer gets less lucky.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231064 91177308-0d34-0410-b5e6-96231b3b80d8
		
	
		
			
				
	
	
		
			68 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			LLVM
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			LLVM
		
	
	
	
	
	
; RUN: llc < %s -verify-machineinstrs -no-phi-elim-live-out-early-exit | FileCheck %s
 | 
						|
target triple = "x86_64-apple-macosx10.8.0"
 | 
						|
 | 
						|
; The critical edge from for.cond to if.end2 should be split to avoid injecting
 | 
						|
; copies into the loop. The use of %b after the loop causes interference that
 | 
						|
; makes a copy necessary.
 | 
						|
; <rdar://problem/11561842>
 | 
						|
;
 | 
						|
; CHECK: split_loop_exit
 | 
						|
; CHECK: %for.cond
 | 
						|
; CHECK-NOT: mov
 | 
						|
; CHECK: je
 | 
						|
 | 
						|
define i32 @split_loop_exit(i32 %a, i32 %b, i8* nocapture %p) nounwind uwtable readonly ssp {
 | 
						|
entry:
 | 
						|
  %cmp = icmp sgt i32 %a, 10
 | 
						|
  br i1 %cmp, label %for.cond, label %if.end2
 | 
						|
 | 
						|
for.cond:                                         ; preds = %entry, %for.cond
 | 
						|
  %p.addr.0 = phi i8* [ %incdec.ptr, %for.cond ], [ %p, %entry ]
 | 
						|
  %incdec.ptr = getelementptr inbounds i8, i8* %p.addr.0, i64 1
 | 
						|
  %0 = load i8, i8* %p.addr.0, align 1
 | 
						|
  %tobool = icmp eq i8 %0, 0
 | 
						|
  br i1 %tobool, label %for.cond, label %if.end2
 | 
						|
 | 
						|
if.end2:                                          ; preds = %for.cond, %entry
 | 
						|
  %r.0 = phi i32 [ %a, %entry ], [ %b, %for.cond ]
 | 
						|
  %add = add nsw i32 %r.0, %b
 | 
						|
  ret i32 %add
 | 
						|
}
 | 
						|
 | 
						|
; CHECK: split_live_out
 | 
						|
; CHECK: %while.body
 | 
						|
; CHECK: cmp
 | 
						|
; CHECK-NEXT: ja
 | 
						|
define i8* @split_live_out(i32 %value, i8* %target) nounwind uwtable readonly ssp {
 | 
						|
entry:
 | 
						|
  %cmp10 = icmp ugt i32 %value, 127
 | 
						|
  br i1 %cmp10, label %while.body.preheader, label %while.end
 | 
						|
 | 
						|
while.body.preheader:                             ; preds = %entry
 | 
						|
  br label %while.body
 | 
						|
 | 
						|
while.body:                                       ; preds = %while.body.preheader, %while.body
 | 
						|
  %target.addr.012 = phi i8* [ %incdec.ptr, %while.body ], [ %target, %while.body.preheader ]
 | 
						|
  %value.addr.011 = phi i32 [ %shr, %while.body ], [ %value, %while.body.preheader ]
 | 
						|
  %or = or i32 %value.addr.011, 128
 | 
						|
  %conv = trunc i32 %or to i8
 | 
						|
  store i8 %conv, i8* %target.addr.012, align 1
 | 
						|
  %shr = lshr i32 %value.addr.011, 7
 | 
						|
  %incdec.ptr = getelementptr inbounds i8, i8* %target.addr.012, i64 1
 | 
						|
  %cmp = icmp ugt i32 %value.addr.011, 16383
 | 
						|
  br i1 %cmp, label %while.body, label %while.end.loopexit
 | 
						|
 | 
						|
while.end.loopexit:                               ; preds = %while.body
 | 
						|
  %incdec.ptr.lcssa = phi i8* [ %incdec.ptr, %while.body ]
 | 
						|
  %shr.lcssa = phi i32 [ %shr, %while.body ]
 | 
						|
  br label %while.end
 | 
						|
 | 
						|
while.end:                                        ; preds = %while.end.loopexit, %entry
 | 
						|
  %target.addr.0.lcssa = phi i8* [ %target, %entry ], [ %incdec.ptr.lcssa, %while.end.loopexit ]
 | 
						|
  %value.addr.0.lcssa = phi i32 [ %value, %entry ], [ %shr.lcssa, %while.end.loopexit ]
 | 
						|
  %conv1 = trunc i32 %value.addr.0.lcssa to i8
 | 
						|
  store i8 %conv1, i8* %target.addr.0.lcssa, align 1
 | 
						|
  %incdec.ptr3 = getelementptr inbounds i8, i8* %target.addr.0.lcssa, i64 1
 | 
						|
  ret i8* %incdec.ptr3
 | 
						|
}
 |