1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; A == B implies A >u B is false. 4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1 5*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select 6*9880d681SAndroid Build Coastguard Worker; CHECK: call void @foo(i32 10) 7*9880d681SAndroid Build Coastguard Workerdefine void @test1(i32 %a, i32 %b) { 8*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp eq i32 %a, %b 9*9880d681SAndroid Build Coastguard Worker br i1 %cmp1, label %taken, label %end 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workertaken: 12*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp ugt i32 %a, %b 13*9880d681SAndroid Build Coastguard Worker %c = select i1 %cmp2, i32 0, i32 10 14*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %c) 15*9880d681SAndroid Build Coastguard Worker br label %end 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerend: 18*9880d681SAndroid Build Coastguard Worker ret void 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; If A == B is false then A != B is true. 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2 23*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select 24*9880d681SAndroid Build Coastguard Worker; CHECK: call void @foo(i32 20) 25*9880d681SAndroid Build Coastguard Workerdefine void @test2(i32 %a, i32 %b) { 26*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp eq i32 %a, %b 27*9880d681SAndroid Build Coastguard Worker br i1 %cmp1, label %end, label %taken 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workertaken: 30*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp ne i32 %a, %b 31*9880d681SAndroid Build Coastguard Worker %c = select i1 %cmp2, i32 20, i32 0 32*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %c) 33*9880d681SAndroid Build Coastguard Worker br label %end 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerend: 36*9880d681SAndroid Build Coastguard Worker ret void 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker; A >u 10 implies A >u 10 is true. 40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3 41*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select 42*9880d681SAndroid Build Coastguard Worker; CHECK: call void @foo(i32 30) 43*9880d681SAndroid Build Coastguard Workerdefine void @test3(i32 %a) { 44*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp ugt i32 %a, 10 45*9880d681SAndroid Build Coastguard Worker br i1 %cmp1, label %taken, label %end 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workertaken: 48*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp ugt i32 %a, 10 49*9880d681SAndroid Build Coastguard Worker %c = select i1 %cmp2, i32 30, i32 0 50*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %c) 51*9880d681SAndroid Build Coastguard Worker br label %end 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerend: 54*9880d681SAndroid Build Coastguard Worker ret void 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR23333 58*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select 59*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8 1 60*9880d681SAndroid Build Coastguard Workerdefine i8 @PR23333(i8 addrspace(1)* %ptr) { 61*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 addrspace(1)* %ptr, null 62*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %taken, label %end 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workertaken: 65*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp ne i8 addrspace(1)* %ptr, null 66*9880d681SAndroid Build Coastguard Worker %res = select i1 %cmp2, i8 2, i8 1 67*9880d681SAndroid Build Coastguard Worker ret i8 %res 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerend: 70*9880d681SAndroid Build Coastguard Worker ret i8 0 71*9880d681SAndroid Build Coastguard Worker} 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker; We know the condition of the select is true based on a dominating condition. 74*9880d681SAndroid Build Coastguard Worker; Therefore, we can replace %cond with %len. However, now the inner icmp is 75*9880d681SAndroid Build Coastguard Worker; always false and can be elided. 76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4 77*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select 78*9880d681SAndroid Build Coastguard Workerdefine void @test4(i32 %len) { 79*9880d681SAndroid Build Coastguard Workerentry: 80*9880d681SAndroid Build Coastguard Worker %0 = call i32 @bar(i32 %len); 81*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i32 %len, 4 82*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %bb, label %b1 83*9880d681SAndroid Build Coastguard Workerbb: 84*9880d681SAndroid Build Coastguard Worker %cond = select i1 %cmp, i32 %len, i32 8 85*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %cmp11 = icmp eq i32 %{{.*}}, 8 86*9880d681SAndroid Build Coastguard Worker %cmp11 = icmp eq i32 %cond, 8 87*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 false, label %b0, label %b1 88*9880d681SAndroid Build Coastguard Worker br i1 %cmp11, label %b0, label %b1 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerb0: 91*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %len) 92*9880d681SAndroid Build Coastguard Worker br label %b1 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerb1: 95*9880d681SAndroid Build Coastguard Worker; CHECK: phi i32 [ %len, %bb ], [ undef, %b0 ], [ %0, %entry ] 96*9880d681SAndroid Build Coastguard Worker %1 = phi i32 [ %cond, %bb ], [ undef, %b0 ], [ %0, %entry ] 97*9880d681SAndroid Build Coastguard Worker br label %ret 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerret: 100*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %1) 101*9880d681SAndroid Build Coastguard Worker ret void 102*9880d681SAndroid Build Coastguard Worker} 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker; A >u 10 implies A >u 9 is true. 105*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5 106*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: select 107*9880d681SAndroid Build Coastguard Worker; CHECK: call void @foo(i32 30) 108*9880d681SAndroid Build Coastguard Workerdefine void @test5(i32 %a) { 109*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp ugt i32 %a, 10 110*9880d681SAndroid Build Coastguard Worker br i1 %cmp1, label %taken, label %end 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Workertaken: 113*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp ugt i32 %a, 9 114*9880d681SAndroid Build Coastguard Worker %c = select i1 %cmp2, i32 30, i32 0 115*9880d681SAndroid Build Coastguard Worker call void @foo(i32 %c) 116*9880d681SAndroid Build Coastguard Worker br label %end 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Workerend: 119*9880d681SAndroid Build Coastguard Worker ret void 120*9880d681SAndroid Build Coastguard Worker} 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Workerdeclare void @foo(i32) 123*9880d681SAndroid Build Coastguard Workerdeclare i32 @bar(i32) 124