mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	PHIElimination splits critical edges when it predicts it can resolve interference and eliminate copies. It doesn't split the edge if the interference wouldn't be resolved anyway because the phi-use register is live in the critical edge anyway. Teach PHIElimination to split loop exiting edges with interference, even if it wouldn't resolve the interference. This removes the necessary copies from the loop, which is still an improvement from injecting the copies into the loop. The test case demonstrates the improvement. Before: LBB0_1: cmpb $0, (%rdx) leaq 1(%rdx), %rdx movl %esi, %eax je LBB0_1 After: LBB0_1: cmpb $0, (%rdx) leaq 1(%rdx), %rdx je LBB0_1 movl %esi, %eax git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160571 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			31 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			LLVM
		
	
	
	
	
	
			
		
		
	
	
			31 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			LLVM
		
	
	
	
	
	
; RUN: llc < %s -verify-machineinstrs | 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* %p.addr.0, i64 1
 | 
						|
  %0 = load 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
 | 
						|
}
 |