1; RUN: opt -S -instcombine < %s | FileCheck %s 2 3declare void @foo() 4 5define void @test1(i32 %a, i32 %b) nounwind { 6 %1 = icmp slt i32 %a, 0 7 %2 = icmp slt i32 %b, 0 8 %or.cond = or i1 %1, %2 9 br i1 %or.cond, label %if.then, label %if.end 10 11; CHECK: @test1 12; CHECK-NEXT: %1 = or i32 %a, %b 13; CHECK-NEXT: %2 = icmp slt i32 %1, 0 14; CHECK-NEXT: br 15 16if.then: 17 tail call void @foo() nounwind 18 ret void 19 20if.end: 21 ret void 22} 23 24define void @test2(i32 %a, i32 %b) nounwind { 25 %1 = icmp sgt i32 %a, -1 26 %2 = icmp sgt i32 %b, -1 27 %or.cond = or i1 %1, %2 28 br i1 %or.cond, label %if.then, label %if.end 29 30; CHECK: @test2 31; CHECK-NEXT: %1 = and i32 %a, %b 32; CHECK-NEXT: %2 = icmp sgt i32 %1, -1 33; CHECK-NEXT: br 34 35if.then: 36 tail call void @foo() nounwind 37 ret void 38 39if.end: 40 ret void 41} 42 43define void @test3(i32 %a, i32 %b) nounwind { 44 %1 = icmp slt i32 %a, 0 45 %2 = icmp slt i32 %b, 0 46 %or.cond = and i1 %1, %2 47 br i1 %or.cond, label %if.then, label %if.end 48 49; CHECK: @test3 50; CHECK-NEXT: %1 = and i32 %a, %b 51; CHECK-NEXT: %2 = icmp slt i32 %1, 0 52; CHECK-NEXT: br 53 54if.then: 55 tail call void @foo() nounwind 56 ret void 57 58if.end: 59 ret void 60} 61 62define void @test4(i32 %a, i32 %b) nounwind { 63 %1 = icmp sgt i32 %a, -1 64 %2 = icmp sgt i32 %b, -1 65 %or.cond = and i1 %1, %2 66 br i1 %or.cond, label %if.then, label %if.end 67 68; CHECK: @test4 69; CHECK-NEXT: %1 = or i32 %a, %b 70; CHECK-NEXT: %2 = icmp sgt i32 %1, -1 71; CHECK-NEXT: br 72 73if.then: 74 tail call void @foo() nounwind 75 ret void 76 77if.end: 78 ret void 79} 80 81define void @test5(i32 %a) nounwind { 82 %and = and i32 %a, 134217728 83 %1 = icmp eq i32 %and, 0 84 %2 = icmp sgt i32 %a, -1 85 %or.cond = and i1 %1, %2 86 br i1 %or.cond, label %if.then, label %if.end 87 88; CHECK: @test5 89; CHECK-NEXT: %1 = and i32 %a, -2013265920 90; CHECK-NEXT: %2 = icmp eq i32 %1, 0 91; CHECK-NEXT: br i1 %2, label %if.then, label %if.end 92 93if.then: 94 tail call void @foo() nounwind 95 ret void 96 97if.end: 98 ret void 99} 100 101define void @test6(i32 %a) nounwind { 102 %1 = icmp sgt i32 %a, -1 103 %and = and i32 %a, 134217728 104 %2 = icmp eq i32 %and, 0 105 %or.cond = and i1 %1, %2 106 br i1 %or.cond, label %if.then, label %if.end 107 108; CHECK: @test6 109; CHECK-NEXT: %1 = and i32 %a, -2013265920 110; CHECK-NEXT: %2 = icmp eq i32 %1, 0 111; CHECK-NEXT: br i1 %2, label %if.then, label %if.end 112 113if.then: 114 tail call void @foo() nounwind 115 ret void 116 117if.end: 118 ret void 119} 120 121define void @test7(i32 %a) nounwind { 122 %and = and i32 %a, 134217728 123 %1 = icmp ne i32 %and, 0 124 %2 = icmp slt i32 %a, 0 125 %or.cond = or i1 %1, %2 126 br i1 %or.cond, label %if.then, label %if.end 127 128; CHECK: @test7 129; CHECK-NEXT: %1 = and i32 %a, -2013265920 130; CHECK-NEXT: %2 = icmp eq i32 %1, 0 131; CHECK-NEXT: br i1 %2, label %if.end, label %if.the 132 133if.then: 134 tail call void @foo() nounwind 135 ret void 136 137if.end: 138 ret void 139} 140 141define void @test8(i32 %a) nounwind { 142 %1 = icmp slt i32 %a, 0 143 %and = and i32 %a, 134217728 144 %2 = icmp ne i32 %and, 0 145 %or.cond = or i1 %1, %2 146 br i1 %or.cond, label %if.then, label %if.end 147 148; CHECK: @test8 149; CHECK-NEXT: %1 = and i32 %a, -2013265920 150; CHECK-NEXT: %2 = icmp eq i32 %1, 0 151; CHECK-NEXT: br i1 %2, label %if.end, label %if.the 152 153if.then: 154 tail call void @foo() nounwind 155 ret void 156 157if.end: 158 ret void 159} 160 161define void @test9(i32 %a) nounwind { 162 %1 = and i32 %a, 1073741824 163 %2 = icmp ne i32 %1, 0 164 %3 = icmp sgt i32 %a, -1 165 %or.cond = and i1 %2, %3 166 br i1 %or.cond, label %if.then, label %if.end 167 168; CHECK: @test9 169; CHECK-NEXT: %1 = and i32 %a, -1073741824 170; CHECK-NEXT: %2 = icmp eq i32 %1, 1073741824 171; CHECK-NEXT: br i1 %2, label %if.then, label %if.end 172 173if.then: 174 tail call void @foo() nounwind 175 ret void 176 177if.end: 178 ret void 179} 180