219 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			219 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			LLVM
		
	
	
	
| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
 | |
| ; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
 | |
| 
 | |
| ; PR12189
 | |
| define i1 @test1(i32 %x) {
 | |
| ; CHECK-LABEL: @test1(
 | |
| ; CHECK-NEXT:    br i1 true, label [[A:%.*]], label [[B:%.*]]
 | |
| ; CHECK:       a:
 | |
| ; CHECK-NEXT:    [[AA:%.*]] = or i32 [[X:%.*]], 10
 | |
| ; CHECK-NEXT:    br label [[C:%.*]]
 | |
| ; CHECK:       b:
 | |
| ; CHECK-NEXT:    [[BB:%.*]] = or i32 [[X]], 10
 | |
| ; CHECK-NEXT:    br label [[C]]
 | |
| ; CHECK:       c:
 | |
| ; CHECK-NEXT:    [[CC:%.*]] = phi i32 [ [[BB]], [[B]] ], [ [[AA]], [[A]] ]
 | |
| ; CHECK-NEXT:    [[D:%.*]] = urem i32 [[CC]], 2
 | |
| ; CHECK-NEXT:    [[E:%.*]] = icmp eq i32 [[D]], 0
 | |
| ; CHECK-NEXT:    ret i1 [[E]]
 | |
| ;
 | |
|   br i1 true, label %a, label %b
 | |
| 
 | |
| a:
 | |
|   %aa = or i32 %x, 10
 | |
|   br label %c
 | |
| 
 | |
| b:
 | |
|   %bb = or i32 %x, 10
 | |
|   br label %c
 | |
| 
 | |
| c:
 | |
|   %cc = phi i32 [ %bb, %b ], [%aa, %a ]
 | |
|   %d = urem i32 %cc, 2
 | |
|   %e = icmp eq i32 %d, 0
 | |
|   ret i1 %e
 | |
| }
 | |
| 
 | |
| ; D63489 - https://reviews.llvm.org/D63489
 | |
| ; If this single-value phi form needs to be preserved to enable
 | |
| ; further analysis, then -passes=instsimplify should not be running?
 | |
| 
 | |
| define i32 @lcssa-phi(i32 %x) {
 | |
| ; CHECK-LABEL: @lcssa-phi(
 | |
| ; CHECK-NEXT:  entry:
 | |
| ; CHECK-NEXT:    br label [[END:%.*]]
 | |
| ; CHECK:       end:
 | |
| ; CHECK-NEXT:    ret i32 [[X:%.*]]
 | |
| ;
 | |
| entry:
 | |
|   br label %end
 | |
| 
 | |
| end:
 | |
|   %counter.lcssa = phi i32 [ %x, %entry ]
 | |
|   ret i32 %counter.lcssa
 | |
| }
 | |
| 
 | |
| define i32 @poison(i1 %cond, i32 %v) {
 | |
| ; CHECK-LABEL: @poison(
 | |
| ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]]
 | |
| ; CHECK:       A:
 | |
| ; CHECK-NEXT:    br label [[EXIT:%.*]]
 | |
| ; CHECK:       B:
 | |
| ; CHECK-NEXT:    br label [[EXIT]]
 | |
| ; CHECK:       EXIT:
 | |
| ; CHECK-NEXT:    ret i32 [[V:%.*]]
 | |
| ;
 | |
|   br i1 %cond, label %A, label %B
 | |
| A:
 | |
|   br label %EXIT
 | |
| B:
 | |
|   br label %EXIT
 | |
| EXIT:
 | |
|   %w = phi i32 [%v, %A], [poison, %B]
 | |
|   ret i32 %w
 | |
| }
 | |
| 
 | |
| define i32 @undef(i1 %cond, i32 %v) {
 | |
| ; CHECK-LABEL: @undef(
 | |
| ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]]
 | |
| ; CHECK:       A:
 | |
| ; CHECK-NEXT:    br label [[EXIT:%.*]]
 | |
| ; CHECK:       B:
 | |
| ; CHECK-NEXT:    br label [[EXIT]]
 | |
| ; CHECK:       EXIT:
 | |
| ; CHECK-NEXT:    ret i32 [[V:%.*]]
 | |
| ;
 | |
|   br i1 %cond, label %A, label %B
 | |
| A:
 | |
|   br label %EXIT
 | |
| B:
 | |
|   br label %EXIT
 | |
| EXIT:
 | |
|   %w = phi i32 [%v, %A], [undef, %B]
 | |
|   ret i32 %w
 | |
| }
 | |
| 
 | |
| define i8 @undef_poison(i1 %cond) {
 | |
| ; CHECK-LABEL: @undef_poison(
 | |
| ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]]
 | |
| ; CHECK:       A:
 | |
| ; CHECK-NEXT:    br label [[EXIT:%.*]]
 | |
| ; CHECK:       B:
 | |
| ; CHECK-NEXT:    br label [[EXIT]]
 | |
| ; CHECK:       EXIT:
 | |
| ; CHECK-NEXT:    ret i8 undef
 | |
| ;
 | |
|   br i1 %cond, label %A, label %B
 | |
| A:
 | |
|   br label %EXIT
 | |
| B:
 | |
|   br label %EXIT
 | |
| EXIT:
 | |
|   %r = phi i8 [undef, %A], [poison, %B]
 | |
|   ret i8 %r
 | |
| }
 | |
| 
 | |
| define i8 @only_undef(i1 %cond) {
 | |
| ; CHECK-LABEL: @only_undef(
 | |
| ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]]
 | |
| ; CHECK:       A:
 | |
| ; CHECK-NEXT:    br label [[EXIT:%.*]]
 | |
| ; CHECK:       B:
 | |
| ; CHECK-NEXT:    br label [[EXIT]]
 | |
| ; CHECK:       EXIT:
 | |
| ; CHECK-NEXT:    ret i8 undef
 | |
| ;
 | |
|   br i1 %cond, label %A, label %B
 | |
| A:
 | |
|   br label %EXIT
 | |
| B:
 | |
|   br label %EXIT
 | |
| EXIT:
 | |
|   %r = phi i8 [undef, %A], [undef, %B]
 | |
|   ret i8 %r
 | |
| }
 | |
| 
 | |
| define i8 @only_poison(i1 %cond) {
 | |
| ; CHECK-LABEL: @only_poison(
 | |
| ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]]
 | |
| ; CHECK:       A:
 | |
| ; CHECK-NEXT:    br label [[EXIT:%.*]]
 | |
| ; CHECK:       B:
 | |
| ; CHECK-NEXT:    br label [[EXIT]]
 | |
| ; CHECK:       EXIT:
 | |
| ; CHECK-NEXT:    ret i8 undef
 | |
| ;
 | |
|   br i1 %cond, label %A, label %B
 | |
| A:
 | |
|   br label %EXIT
 | |
| B:
 | |
|   br label %EXIT
 | |
| EXIT:
 | |
|   %r = phi i8 [poison, %A], [poison, %B]
 | |
|   ret i8 %r
 | |
| }
 | |
| 
 | |
| @g = extern_weak global i32
 | |
| 
 | |
| define i64 @pr49839_with_poison(i1 %c) {
 | |
| ; CHECK-LABEL: @pr49839_with_poison(
 | |
| ; CHECK-NEXT:  entry:
 | |
| ; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF:%.*]], label [[JOIN:%.*]]
 | |
| ; CHECK:       if:
 | |
| ; CHECK-NEXT:    br label [[JOIN]]
 | |
| ; CHECK:       join:
 | |
| ; CHECK-NEXT:    [[PHI:%.*]] = phi i64 [ poison, [[IF]] ], [ srem (i64 1, i64 ptrtoint (ptr @g to i64)), [[ENTRY:%.*]] ]
 | |
| ; CHECK-NEXT:    ret i64 [[PHI]]
 | |
| ;
 | |
| entry:
 | |
|   br i1 %c, label %if, label %join
 | |
| 
 | |
| if:
 | |
|   br label %join
 | |
| 
 | |
| join:
 | |
|   %phi = phi i64 [ poison, %if ], [ srem (i64 1, i64 ptrtoint (ptr @g to i64)) , %entry ]
 | |
|   ret i64 %phi
 | |
| }
 | |
| 
 | |
| define i64 @pr49839_without_poison(i1 %c) {
 | |
| ; CHECK-LABEL: @pr49839_without_poison(
 | |
| ; CHECK-NEXT:  entry:
 | |
| ; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF:%.*]], label [[JOIN:%.*]]
 | |
| ; CHECK:       if:
 | |
| ; CHECK-NEXT:    br label [[JOIN]]
 | |
| ; CHECK:       join:
 | |
| ; CHECK-NEXT:    ret i64 srem (i64 1, i64 ptrtoint (ptr @g to i64))
 | |
| ;
 | |
| entry:
 | |
|   br i1 %c, label %if, label %join
 | |
| 
 | |
| if:
 | |
|   br label %join
 | |
| 
 | |
| join:
 | |
|   %phi = phi i64 [ srem (i64 1, i64 ptrtoint (ptr @g to i64)), %if ], [ srem (i64 1, i64 ptrtoint (ptr @g to i64)) , %entry ]
 | |
|   ret i64 %phi
 | |
| }
 | |
| 
 | |
| define <1 x i64> @pr49839_vector(i1 %c) {
 | |
| ; CHECK-LABEL: @pr49839_vector(
 | |
| ; CHECK-NEXT:  entry:
 | |
| ; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF:%.*]], label [[JOIN:%.*]]
 | |
| ; CHECK:       if:
 | |
| ; CHECK-NEXT:    br label [[JOIN]]
 | |
| ; CHECK:       join:
 | |
| ; CHECK-NEXT:    [[PHI:%.*]] = phi <1 x i64> [ poison, [[IF]] ], [ <i64 srem (i64 1, i64 ptrtoint (ptr @g to i64))>, [[ENTRY:%.*]] ]
 | |
| ; CHECK-NEXT:    ret <1 x i64> [[PHI]]
 | |
| ;
 | |
| entry:
 | |
|   br i1 %c, label %if, label %join
 | |
| 
 | |
| if:
 | |
|   br label %join
 | |
| 
 | |
| join:
 | |
|   %phi = phi <1 x i64> [ poison, %if ], [ <i64 srem (i64 1, i64 ptrtoint (ptr @g to i64))>, %entry ]
 | |
|   ret <1 x i64> %phi
 | |
| }
 |