mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	If a switch instruction has a case for every possible value of its type, with the same successor, SimplifyCFG would replace it with an icmp ult, but the computation of the bound overflows in that case, which inverts the test. Patch by Jed Davis! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179587 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			58 lines
		
	
	
		
			1016 B
		
	
	
	
		
			LLVM
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1016 B
		
	
	
	
		
			LLVM
		
	
	
	
	
	
| ; RUN: opt -S -simplifycfg < %s | FileCheck %s
 | |
| 
 | |
| define zeroext i1 @test1(i32 %x) nounwind readnone ssp noredzone {
 | |
| entry:
 | |
|  switch i32 %x, label %lor.rhs [
 | |
|    i32 2, label %lor.end
 | |
|    i32 1, label %lor.end
 | |
|    i32 3, label %lor.end
 | |
|  ]
 | |
| 
 | |
| lor.rhs:
 | |
|  br label %lor.end
 | |
| 
 | |
| lor.end:
 | |
|  %0 = phi i1 [ true, %entry ], [ false, %lor.rhs ], [ true, %entry ], [ true, %entry ]
 | |
|  ret i1 %0
 | |
| 
 | |
| ; CHECK: @test1
 | |
| ; CHECK: %x.off = add i32 %x, -1
 | |
| ; CHECK: %switch = icmp ult i32 %x.off, 3
 | |
| }
 | |
| 
 | |
| define zeroext i1 @test2(i32 %x) nounwind readnone ssp noredzone {
 | |
| entry:
 | |
|  switch i32 %x, label %lor.rhs [
 | |
|    i32 0, label %lor.end
 | |
|    i32 1, label %lor.end
 | |
|  ]
 | |
| 
 | |
| lor.rhs:
 | |
|  br label %lor.end
 | |
| 
 | |
| lor.end:
 | |
|  %0 = phi i1 [ true, %entry ], [ false, %lor.rhs ], [ true, %entry ]
 | |
|  ret i1 %0
 | |
| 
 | |
| ; CHECK: @test2
 | |
| ; CHECK: %switch = icmp ult i32 %x, 2
 | |
| }
 | |
| 
 | |
| define i32 @test3(i1 %flag) {
 | |
| entry:
 | |
|  switch i1 %flag, label %bad [
 | |
|    i1 true, label %good
 | |
|    i1 false, label %good
 | |
|  ]
 | |
| 
 | |
| good:
 | |
|  ret i32 0
 | |
| 
 | |
| bad:
 | |
|  ret i32 1
 | |
| 
 | |
| ; CHECK: @test3
 | |
| ; CHECK: entry:
 | |
| ; CHECK-NEXT: ret i32 0
 | |
| }
 |