1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -passes=instcombine < %s | FileCheck %s 3 4 5define i32 @and_umax_less(i32 %A) { 6; CHECK-LABEL: @and_umax_less( 7; CHECK-NEXT: [[X:%.*]] = and i32 [[A:%.*]], -32 8; CHECK-NEXT: ret i32 [[X]] 9; 10 %l0 = icmp ugt i32 31, %A 11 %l1 = select i1 %l0, i32 31, i32 %A 12 %x = and i32 %l1, -32 13 ret i32 %x 14} 15 16define i32 @and_umax_muchless(i32 %A) { 17; CHECK-LABEL: @and_umax_muchless( 18; CHECK-NEXT: [[X:%.*]] = and i32 [[A:%.*]], -32 19; CHECK-NEXT: ret i32 [[X]] 20; 21 %l0 = icmp ugt i32 12, %A 22 %l1 = select i1 %l0, i32 12, i32 %A 23 %x = and i32 %l1, -32 24 ret i32 %x 25} 26 27define i32 @and_umax_more(i32 %A) { 28; CHECK-LABEL: @and_umax_more( 29; CHECK-NEXT: [[L1:%.*]] = call i32 @llvm.umax.i32(i32 [[A:%.*]], i32 32) 30; CHECK-NEXT: [[X:%.*]] = and i32 [[L1]], -32 31; CHECK-NEXT: ret i32 [[X]] 32; 33 %l0 = icmp ugt i32 32, %A 34 %l1 = select i1 %l0, i32 32, i32 %A 35 %x = and i32 %l1, -32 36 ret i32 %x 37} 38 39define i32 @shr_umax(i32 %A) { 40; CHECK-LABEL: @shr_umax( 41; CHECK-NEXT: [[X:%.*]] = lshr i32 [[A:%.*]], 4 42; CHECK-NEXT: ret i32 [[X]] 43; 44 %l0 = icmp ugt i32 15, %A 45 %l1 = select i1 %l0, i32 15, i32 %A 46 %x = lshr i32 %l1, 4 47 ret i32 %x 48} 49 50; Various constants for C2 & umax(A, C1) 51 52define i8 @t_0_1(i8 %A) { 53; CHECK-LABEL: @t_0_1( 54; CHECK-NEXT: [[X:%.*]] = and i8 [[A:%.*]], 1 55; CHECK-NEXT: ret i8 [[X]] 56; 57 %l2 = icmp ugt i8 %A, 0 58 %l1 = select i1 %l2, i8 %A, i8 0 59 %x = and i8 %l1, 1 60 ret i8 %x 61} 62 63define i8 @t_0_10(i8 %A) { 64; CHECK-LABEL: @t_0_10( 65; CHECK-NEXT: [[X:%.*]] = and i8 [[A:%.*]], 10 66; CHECK-NEXT: ret i8 [[X]] 67; 68 %l2 = icmp ugt i8 %A, 0 69 %l1 = select i1 %l2, i8 %A, i8 0 70 %x = and i8 %l1, 10 71 ret i8 %x 72} 73 74define i8 @t_1_10(i8 %A) { 75; CHECK-LABEL: @t_1_10( 76; CHECK-NEXT: [[X:%.*]] = and i8 [[A:%.*]], 10 77; CHECK-NEXT: ret i8 [[X]] 78; 79 %l2 = icmp ugt i8 %A, 1 80 %l1 = select i1 %l2, i8 %A, i8 1 81 %x = and i8 %l1, 10 82 ret i8 %x 83} 84 85define i8 @t_2_4(i8 %A) { 86; CHECK-LABEL: @t_2_4( 87; CHECK-NEXT: [[X:%.*]] = and i8 [[A:%.*]], 4 88; CHECK-NEXT: ret i8 [[X]] 89; 90 %l2 = icmp ugt i8 %A, 2 91 %l1 = select i1 %l2, i8 %A, i8 2 92 %x = and i8 %l1, 4 93 ret i8 %x 94} 95 96define i8 @t_2_192(i8 %A) { 97; CHECK-LABEL: @t_2_192( 98; CHECK-NEXT: [[X:%.*]] = and i8 [[A:%.*]], -64 99; CHECK-NEXT: ret i8 [[X]] 100; 101 %l2 = icmp ugt i8 %A, 2 102 %l1 = select i1 %l2, i8 %A, i8 2 103 %x = and i8 %l1, -64 104 ret i8 %x 105} 106 107define i8 @t_2_63_or(i8 %A) { 108; CHECK-LABEL: @t_2_63_or( 109; CHECK-NEXT: [[X:%.*]] = or i8 [[A:%.*]], 63 110; CHECK-NEXT: ret i8 [[X]] 111; 112 %l2 = icmp ugt i8 %A, 2 113 %l1 = select i1 %l2, i8 %A, i8 2 114 %x = or i8 %l1, 63 115 ret i8 %x 116} 117 118define i8 @f_1_1(i8 %A) { 119; CHECK-LABEL: @f_1_1( 120; CHECK-NEXT: [[L1:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 1) 121; CHECK-NEXT: [[X:%.*]] = and i8 [[L1]], 1 122; CHECK-NEXT: ret i8 [[X]] 123; 124 %l2 = icmp ugt i8 %A, 1 125 %l1 = select i1 %l2, i8 %A, i8 1 126 %x = and i8 %l1, 1 127 ret i8 %x 128} 129 130define i8 @f_32_32(i8 %A) { 131; CHECK-LABEL: @f_32_32( 132; CHECK-NEXT: [[L1:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 32) 133; CHECK-NEXT: [[X:%.*]] = and i8 [[L1]], -32 134; CHECK-NEXT: ret i8 [[X]] 135; 136 %l2 = icmp ugt i8 %A, 32 137 %l1 = select i1 %l2, i8 %A, i8 32 138 %x = and i8 %l1, -32 139 ret i8 %x 140} 141 142define i8 @f_191_192(i8 %A) { 143; CHECK-LABEL: @f_191_192( 144; CHECK-NEXT: [[L1:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 -65) 145; CHECK-NEXT: [[X:%.*]] = and i8 [[L1]], -64 146; CHECK-NEXT: ret i8 [[X]] 147; 148 %l2 = icmp ugt i8 %A, 191 149 %l1 = select i1 %l2, i8 %A, i8 191 150 %x = and i8 %l1, 192 151 ret i8 %x 152} 153 154define i8 @f_10_1(i8 %A) { 155; CHECK-LABEL: @f_10_1( 156; CHECK-NEXT: [[L1:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 10) 157; CHECK-NEXT: [[X:%.*]] = and i8 [[L1]], 1 158; CHECK-NEXT: ret i8 [[X]] 159; 160 %l2 = icmp ugt i8 %A, 10 161 %l1 = select i1 %l2, i8 %A, i8 10 162 %x = and i8 %l1, 1 163 ret i8 %x 164} 165 166define i32 @and_umin(i32 %A) { 167; CHECK-LABEL: @and_umin( 168; CHECK-NEXT: ret i32 0 169; 170 %l0 = icmp ult i32 15, %A 171 %l1 = select i1 %l0, i32 15, i32 %A 172 %x = and i32 %l1, -32 173 ret i32 %x 174} 175 176define i32 @or_umin(i32 %A) { 177; CHECK-LABEL: @or_umin( 178; CHECK-NEXT: ret i32 31 179; 180 %l0 = icmp ult i32 15, %A 181 %l1 = select i1 %l0, i32 15, i32 %A 182 %x = or i32 %l1, 31 183 ret i32 %x 184} 185 186define i8 @or_min_31_30(i8 %A) { 187; CHECK-LABEL: @or_min_31_30( 188; CHECK-NEXT: [[R:%.*]] = or i8 [[A:%.*]], 31 189; CHECK-NEXT: ret i8 [[R]] 190; 191 %cmp = icmp ult i8 %A, -30 192 %min = select i1 %cmp, i8 %A, i8 -30 193 %r = or i8 %min, 31 194 ret i8 %r 195} 196 197define i8 @and_min_7_7(i8 %A) { 198; CHECK-LABEL: @and_min_7_7( 199; CHECK-NEXT: [[R:%.*]] = and i8 [[A:%.*]], -8 200; CHECK-NEXT: ret i8 [[R]] 201; 202 %l2 = icmp ult i8 %A, -7 203 %min = select i1 %l2, i8 %A, i8 -7 204 %r = and i8 %min, -8 205 ret i8 %r 206} 207 208define i8 @and_min_7_8(i8 %A) { 209; CHECK-LABEL: @and_min_7_8( 210; CHECK-NEXT: [[R:%.*]] = and i8 [[A:%.*]], -8 211; CHECK-NEXT: ret i8 [[R]] 212; 213 %l2 = icmp ult i8 %A, -8 214 %min = select i1 %l2, i8 %A, i8 -8 215 %r = and i8 %min, -8 216 ret i8 %r 217} 218 219define i8 @and_min_7_9(i8 %A) { 220; CHECK-LABEL: @and_min_7_9( 221; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.umin.i8(i8 [[A:%.*]], i8 -9) 222; CHECK-NEXT: [[R:%.*]] = and i8 [[MIN]], -8 223; CHECK-NEXT: ret i8 [[R]] 224; 225 %l2 = icmp ult i8 %A, -9 226 %min = select i1 %l2, i8 %A, i8 -9 227 %r = and i8 %min, -8 228 ret i8 %r 229} 230 231