1; RUN: opt < %s -instsimplify -S | FileCheck %s 2 3define i64 @pow2(i32 %x) { 4; CHECK-LABEL: @pow2( 5 %negx = sub i32 0, %x 6 %x2 = and i32 %x, %negx 7 %e = zext i32 %x2 to i64 8 %nege = sub i64 0, %e 9 %e2 = and i64 %e, %nege 10 ret i64 %e2 11; CHECK: ret i64 %e 12} 13 14define i64 @pow2b(i32 %x) { 15; CHECK-LABEL: @pow2b( 16 %sh = shl i32 2, %x 17 %e = zext i32 %sh to i64 18 %nege = sub i64 0, %e 19 %e2 = and i64 %e, %nege 20 ret i64 %e2 21; CHECK: ret i64 %e 22} 23 24define i32 @sub_neg_nuw(i32 %x, i32 %y) { 25; CHECK-LABEL: @sub_neg_nuw( 26 %neg = sub nuw i32 0, %y 27 %sub = sub i32 %x, %neg 28 ret i32 %sub 29; CHECK: ret i32 %x 30} 31 32define i1 @and_of_icmps0(i32 %b) { 33; CHECK-LABEL: @and_of_icmps0( 34 %1 = add i32 %b, 2 35 %2 = icmp ult i32 %1, 4 36 %cmp3 = icmp sgt i32 %b, 2 37 %cmp = and i1 %2, %cmp3 38 ret i1 %cmp 39; CHECK: ret i1 false 40} 41 42define i1 @and_of_icmps1(i32 %b) { 43; CHECK-LABEL: @and_of_icmps1( 44 %1 = add nsw i32 %b, 2 45 %2 = icmp slt i32 %1, 4 46 %cmp3 = icmp sgt i32 %b, 2 47 %cmp = and i1 %2, %cmp3 48 ret i1 %cmp 49; CHECK: ret i1 false 50} 51 52define i1 @and_of_icmps2(i32 %b) { 53; CHECK-LABEL: @and_of_icmps2( 54 %1 = add i32 %b, 2 55 %2 = icmp ule i32 %1, 3 56 %cmp3 = icmp sgt i32 %b, 2 57 %cmp = and i1 %2, %cmp3 58 ret i1 %cmp 59; CHECK: ret i1 false 60} 61 62define i1 @and_of_icmps3(i32 %b) { 63; CHECK-LABEL: @and_of_icmps3( 64 %1 = add nsw i32 %b, 2 65 %2 = icmp sle i32 %1, 3 66 %cmp3 = icmp sgt i32 %b, 2 67 %cmp = and i1 %2, %cmp3 68 ret i1 %cmp 69; CHECK: ret i1 false 70} 71 72define i1 @and_of_icmps4(i32 %b) { 73; CHECK-LABEL: @and_of_icmps4( 74 %1 = add nuw i32 %b, 2 75 %2 = icmp ult i32 %1, 4 76 %cmp3 = icmp ugt i32 %b, 2 77 %cmp = and i1 %2, %cmp3 78 ret i1 %cmp 79; CHECK: ret i1 false 80} 81 82define i1 @and_of_icmps5(i32 %b) { 83; CHECK-LABEL: @and_of_icmps5( 84 %1 = add nuw i32 %b, 2 85 %2 = icmp ule i32 %1, 3 86 %cmp3 = icmp ugt i32 %b, 2 87 %cmp = and i1 %2, %cmp3 88 ret i1 %cmp 89; CHECK: ret i1 false 90} 91 92define i1 @or_of_icmps0(i32 %b) { 93; CHECK-LABEL: @or_of_icmps0( 94 %1 = add i32 %b, 2 95 %2 = icmp uge i32 %1, 4 96 %cmp3 = icmp sle i32 %b, 2 97 %cmp = or i1 %2, %cmp3 98 ret i1 %cmp 99; CHECK: ret i1 true 100} 101 102define i1 @or_of_icmps1(i32 %b) { 103; CHECK-LABEL: @or_of_icmps1( 104 %1 = add nsw i32 %b, 2 105 %2 = icmp sge i32 %1, 4 106 %cmp3 = icmp sle i32 %b, 2 107 %cmp = or i1 %2, %cmp3 108 ret i1 %cmp 109; CHECK: ret i1 true 110} 111 112define i1 @or_of_icmps2(i32 %b) { 113; CHECK-LABEL: @or_of_icmps2( 114 %1 = add i32 %b, 2 115 %2 = icmp ugt i32 %1, 3 116 %cmp3 = icmp sle i32 %b, 2 117 %cmp = or i1 %2, %cmp3 118 ret i1 %cmp 119; CHECK: ret i1 true 120} 121 122define i1 @or_of_icmps3(i32 %b) { 123; CHECK-LABEL: @or_of_icmps3( 124 %1 = add nsw i32 %b, 2 125 %2 = icmp sgt i32 %1, 3 126 %cmp3 = icmp sle i32 %b, 2 127 %cmp = or i1 %2, %cmp3 128 ret i1 %cmp 129; CHECK: ret i1 true 130} 131 132define i1 @or_of_icmps4(i32 %b) { 133; CHECK-LABEL: @or_of_icmps4( 134 %1 = add nuw i32 %b, 2 135 %2 = icmp uge i32 %1, 4 136 %cmp3 = icmp ule i32 %b, 2 137 %cmp = or i1 %2, %cmp3 138 ret i1 %cmp 139; CHECK: ret i1 true 140} 141 142define i1 @or_of_icmps5(i32 %b) { 143; CHECK-LABEL: @or_of_icmps5( 144 %1 = add nuw i32 %b, 2 145 %2 = icmp ugt i32 %1, 3 146 %cmp3 = icmp ule i32 %b, 2 147 %cmp = or i1 %2, %cmp3 148 ret i1 %cmp 149; CHECK: ret i1 true 150} 151 152define i32 @neg_nuw(i32 %x) { 153; CHECK-LABEL: @neg_nuw( 154 %neg = sub nuw i32 0, %x 155 ret i32 %neg 156; CHECK: ret i32 0 157} 158 159define i1 @and_icmp1(i32 %x, i32 %y) { 160 %1 = icmp ult i32 %x, %y 161 %2 = icmp ne i32 %y, 0 162 %3 = and i1 %1, %2 163 ret i1 %3 164} 165; CHECK-LABEL: @and_icmp1( 166; CHECK: %[[cmp:.*]] = icmp ult i32 %x, %y 167; CHECK: ret i1 %[[cmp]] 168 169define i1 @and_icmp2(i32 %x, i32 %y) { 170 %1 = icmp ult i32 %x, %y 171 %2 = icmp eq i32 %y, 0 172 %3 = and i1 %1, %2 173 ret i1 %3 174} 175; CHECK-LABEL: @and_icmp2( 176; CHECK: ret i1 false 177 178define i1 @or_icmp1(i32 %x, i32 %y) { 179 %1 = icmp ult i32 %x, %y 180 %2 = icmp ne i32 %y, 0 181 %3 = or i1 %1, %2 182 ret i1 %3 183} 184; CHECK-LABEL: @or_icmp1( 185; CHECK: %[[cmp:.*]] = icmp ne i32 %y, 0 186; CHECK: ret i1 %[[cmp]] 187 188define i1 @or_icmp2(i32 %x, i32 %y) { 189 %1 = icmp uge i32 %x, %y 190 %2 = icmp ne i32 %y, 0 191 %3 = or i1 %1, %2 192 ret i1 %3 193} 194; CHECK-LABEL: @or_icmp2( 195; CHECK: ret i1 true 196 197define i1 @or_icmp3(i32 %x, i32 %y) { 198 %1 = icmp uge i32 %x, %y 199 %2 = icmp eq i32 %y, 0 200 %3 = or i1 %1, %2 201 ret i1 %3 202} 203; CHECK-LABEL: @or_icmp3( 204; CHECK: %[[cmp:.*]] = icmp uge i32 %x, %y 205; CHECK: ret i1 %[[cmp]] 206