mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	When if converting something like: true: ... = R0<kill> false: ... = R0<kill> then the instructions of the true block must not have a <kill> flag anymore, as the instruction of the false block follow and do still read the R0 value. Specifically this patch determines the set of register live-in in the false block (possibly after simulating the liveness changes of the duplicated instructions). Each of these live-in registers mustn't be killed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@192482 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			31 lines
		
	
	
		
			877 B
		
	
	
	
		
			LLVM
		
	
	
	
	
	
			
		
		
	
	
			31 lines
		
	
	
		
			877 B
		
	
	
	
		
			LLVM
		
	
	
	
	
	
| ; RUN: llc < %s -march arm -mcpu swift -verify-machineinstrs
 | |
| 
 | |
| declare i32 @f(i32 %p0, i32 %p1)
 | |
| 
 | |
| define i32 @foo(i32* %ptr) {
 | |
| entry:
 | |
|   %cmp = icmp ne i32* %ptr, null
 | |
|   br i1 %cmp, label %if.then, label %if.else
 | |
| 
 | |
| ; present something which can be easily if-converted
 | |
| if.then:
 | |
|   ; %R0 should be killed here
 | |
|   %valt = load i32* %ptr, align 4
 | |
|   br label %return
 | |
| 
 | |
| if.else:
 | |
|   ; %R0 should be killed here, however after if-conversion the %R0 kill
 | |
|   ; has to be removed because if.then will follow after this and still
 | |
|   ; read it.
 | |
|   %addr = getelementptr inbounds i32* %ptr, i32 4
 | |
|   %vale = load i32* %addr, align 4
 | |
|   br label %return
 | |
| 
 | |
| return:
 | |
|   %phival = phi i32 [ %valt, %if.then ], [ %vale, %if.else ]
 | |
|   ; suggest to bring %phival/%valt/%vale into %R1 (because otherwise there
 | |
|   ; will be no kills in if.then/if.else)
 | |
|   %retval = call i32 @f (i32 0, i32 %phival)
 | |
|   ret i32 %retval
 | |
| }
 |