1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -instsimplify -S | FileCheck %s 3 4define i8 @smax_min_limit(i8 %x) { 5; CHECK-LABEL: @smax_min_limit( 6; CHECK-NEXT: ret i8 [[X:%.*]] 7; 8 %cmp = icmp sgt i8 %x, -128 9 %sel = select i1 %cmp, i8 %x, i8 -128 10 ret i8 %sel 11} 12 13define i8 @smin_max_limit(i8 %x) { 14; CHECK-LABEL: @smin_max_limit( 15; CHECK-NEXT: ret i8 [[X:%.*]] 16; 17 %cmp = icmp slt i8 %x, 127 18 %sel = select i1 %cmp, i8 %x, i8 127 19 ret i8 %sel 20} 21 22define <2 x i8> @umax_min_limit(<2 x i8> %x) { 23; CHECK-LABEL: @umax_min_limit( 24; CHECK-NEXT: ret <2 x i8> [[X:%.*]] 25; 26 %cmp = icmp ugt <2 x i8> %x, zeroinitializer 27 %sel = select <2 x i1> %cmp, <2 x i8> %x, <2 x i8> zeroinitializer 28 ret <2 x i8> %sel 29} 30 31define i8 @umin_max_limit(i8 %x) { 32; CHECK-LABEL: @umin_max_limit( 33; CHECK-NEXT: ret i8 [[X:%.*]] 34; 35 %cmp = icmp ult i8 %x, 255 36 %sel = select i1 %cmp, i8 %x, i8 255 37 ret i8 %sel 38} 39 40; negative test - wrong limit 41 42define i8 @smax_not_min_limit(i8 %x) { 43; CHECK-LABEL: @smax_not_min_limit( 44; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], -127 45; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[X]], i8 -127 46; CHECK-NEXT: ret i8 [[SEL]] 47; 48 %cmp = icmp sgt i8 %x, -127 49 %sel = select i1 %cmp, i8 %x, i8 -127 50 ret i8 %sel 51} 52 53; negative test - wrong limit 54 55define i8 @smin_not_min_limit(i8 %x) { 56; CHECK-LABEL: @smin_not_min_limit( 57; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 0 58; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[X]], i8 0 59; CHECK-NEXT: ret i8 [[SEL]] 60; 61 %cmp = icmp slt i8 %x, 0 62 %sel = select i1 %cmp, i8 %x, i8 0 63 ret i8 %sel 64} 65 66define i1 @max1(i32 %x, i32 %y) { 67; CHECK-LABEL: @max1( 68; CHECK-NEXT: ret i1 false 69; 70 %c = icmp sgt i32 %x, %y 71 %m = select i1 %c, i32 %x, i32 %y 72 %r = icmp slt i32 %m, %x 73 ret i1 %r 74} 75 76define i1 @max2(i32 %x, i32 %y) { 77; CHECK-LABEL: @max2( 78; CHECK-NEXT: ret i1 true 79; 80 %c = icmp sge i32 %x, %y 81 %m = select i1 %c, i32 %x, i32 %y 82 %r = icmp sge i32 %m, %x 83 ret i1 %r 84} 85 86define i1 @max3(i32 %x, i32 %y) { 87; CHECK-LABEL: @max3( 88; CHECK-NEXT: ret i1 false 89; 90 %c = icmp ugt i32 %x, %y 91 %m = select i1 %c, i32 %x, i32 %y 92 %r = icmp ult i32 %m, %x 93 ret i1 %r 94} 95 96define i1 @max4(i32 %x, i32 %y) { 97; CHECK-LABEL: @max4( 98; CHECK-NEXT: ret i1 true 99; 100 %c = icmp uge i32 %x, %y 101 %m = select i1 %c, i32 %x, i32 %y 102 %r = icmp uge i32 %m, %x 103 ret i1 %r 104} 105 106define i1 @max5(i32 %x, i32 %y) { 107; CHECK-LABEL: @max5( 108; CHECK-NEXT: ret i1 false 109; 110 %c = icmp sgt i32 %x, %y 111 %m = select i1 %c, i32 %x, i32 %y 112 %r = icmp sgt i32 %x, %m 113 ret i1 %r 114} 115 116define i1 @max6(i32 %x, i32 %y) { 117; CHECK-LABEL: @max6( 118; CHECK-NEXT: ret i1 true 119; 120 %c = icmp sge i32 %x, %y 121 %m = select i1 %c, i32 %x, i32 %y 122 %r = icmp sle i32 %x, %m 123 ret i1 %r 124} 125 126define i1 @max7(i32 %x, i32 %y) { 127; CHECK-LABEL: @max7( 128; CHECK-NEXT: ret i1 false 129; 130 %c = icmp ugt i32 %x, %y 131 %m = select i1 %c, i32 %x, i32 %y 132 %r = icmp ugt i32 %x, %m 133 ret i1 %r 134} 135 136define i1 @max8(i32 %x, i32 %y) { 137; CHECK-LABEL: @max8( 138; CHECK-NEXT: ret i1 true 139; 140 %c = icmp uge i32 %x, %y 141 %m = select i1 %c, i32 %x, i32 %y 142 %r = icmp ule i32 %x, %m 143 ret i1 %r 144} 145 146define i1 @min1(i32 %x, i32 %y) { 147; CHECK-LABEL: @min1( 148; CHECK-NEXT: ret i1 false 149; 150 %c = icmp sgt i32 %x, %y 151 %m = select i1 %c, i32 %y, i32 %x 152 %r = icmp sgt i32 %m, %x 153 ret i1 %r 154} 155 156define i1 @min2(i32 %x, i32 %y) { 157; CHECK-LABEL: @min2( 158; CHECK-NEXT: ret i1 true 159; 160 %c = icmp sge i32 %x, %y 161 %m = select i1 %c, i32 %y, i32 %x 162 %r = icmp sle i32 %m, %x 163 ret i1 %r 164} 165 166define i1 @min3(i32 %x, i32 %y) { 167; CHECK-LABEL: @min3( 168; CHECK-NEXT: ret i1 false 169; 170 %c = icmp ugt i32 %x, %y 171 %m = select i1 %c, i32 %y, i32 %x 172 %r = icmp ugt i32 %m, %x 173 ret i1 %r 174} 175 176define i1 @min4(i32 %x, i32 %y) { 177; CHECK-LABEL: @min4( 178; CHECK-NEXT: ret i1 true 179; 180 %c = icmp uge i32 %x, %y 181 %m = select i1 %c, i32 %y, i32 %x 182 %r = icmp ule i32 %m, %x 183 ret i1 %r 184} 185 186define i1 @min5(i32 %x, i32 %y) { 187; CHECK-LABEL: @min5( 188; CHECK-NEXT: ret i1 false 189; 190 %c = icmp sgt i32 %x, %y 191 %m = select i1 %c, i32 %y, i32 %x 192 %r = icmp slt i32 %x, %m 193 ret i1 %r 194} 195 196define i1 @min6(i32 %x, i32 %y) { 197; CHECK-LABEL: @min6( 198; CHECK-NEXT: ret i1 true 199; 200 %c = icmp sge i32 %x, %y 201 %m = select i1 %c, i32 %y, i32 %x 202 %r = icmp sge i32 %x, %m 203 ret i1 %r 204} 205 206define i1 @min7(i32 %x, i32 %y) { 207; CHECK-LABEL: @min7( 208; CHECK-NEXT: ret i1 false 209; 210 %c = icmp ugt i32 %x, %y 211 %m = select i1 %c, i32 %y, i32 %x 212 %r = icmp ult i32 %x, %m 213 ret i1 %r 214} 215 216define i1 @min8(i32 %x, i32 %y) { 217; CHECK-LABEL: @min8( 218; CHECK-NEXT: ret i1 true 219; 220 %c = icmp uge i32 %x, %y 221 %m = select i1 %c, i32 %y, i32 %x 222 %r = icmp uge i32 %x, %m 223 ret i1 %r 224} 225 226define i1 @maxmin1(i32 %x, i32 %y, i32 %z) { 227; CHECK-LABEL: @maxmin1( 228; CHECK-NEXT: ret i1 true 229; 230 %c1 = icmp sge i32 %x, %y 231 %max = select i1 %c1, i32 %x, i32 %y 232 %c2 = icmp sge i32 %x, %z 233 %min = select i1 %c2, i32 %z, i32 %x 234 %c = icmp sge i32 %max, %min 235 ret i1 %c 236} 237 238define i1 @maxmin2(i32 %x, i32 %y, i32 %z) { 239; CHECK-LABEL: @maxmin2( 240; CHECK-NEXT: ret i1 false 241; 242 %c1 = icmp sge i32 %x, %y 243 %max = select i1 %c1, i32 %x, i32 %y 244 %c2 = icmp sge i32 %x, %z 245 %min = select i1 %c2, i32 %z, i32 %x 246 %c = icmp sgt i32 %min, %max 247 ret i1 %c 248} 249 250define i1 @maxmin3(i32 %x, i32 %y, i32 %z) { 251; CHECK-LABEL: @maxmin3( 252; CHECK-NEXT: ret i1 true 253; 254 %c1 = icmp sge i32 %x, %y 255 %max = select i1 %c1, i32 %x, i32 %y 256 %c2 = icmp sge i32 %x, %z 257 %min = select i1 %c2, i32 %z, i32 %x 258 %c = icmp sle i32 %min, %max 259 ret i1 %c 260} 261 262define i1 @maxmin4(i32 %x, i32 %y, i32 %z) { 263; CHECK-LABEL: @maxmin4( 264; CHECK-NEXT: ret i1 false 265; 266 %c1 = icmp sge i32 %x, %y 267 %max = select i1 %c1, i32 %x, i32 %y 268 %c2 = icmp sge i32 %x, %z 269 %min = select i1 %c2, i32 %z, i32 %x 270 %c = icmp slt i32 %max, %min 271 ret i1 %c 272} 273 274define i1 @maxmin5(i32 %x, i32 %y, i32 %z) { 275; CHECK-LABEL: @maxmin5( 276; CHECK-NEXT: ret i1 true 277; 278 %c1 = icmp uge i32 %x, %y 279 %max = select i1 %c1, i32 %x, i32 %y 280 %c2 = icmp uge i32 %x, %z 281 %min = select i1 %c2, i32 %z, i32 %x 282 %c = icmp uge i32 %max, %min 283 ret i1 %c 284} 285 286define i1 @maxmin6(i32 %x, i32 %y, i32 %z) { 287; CHECK-LABEL: @maxmin6( 288; CHECK-NEXT: ret i1 false 289; 290 %c1 = icmp uge i32 %x, %y 291 %max = select i1 %c1, i32 %x, i32 %y 292 %c2 = icmp uge i32 %x, %z 293 %min = select i1 %c2, i32 %z, i32 %x 294 %c = icmp ugt i32 %min, %max 295 ret i1 %c 296} 297 298define i1 @maxmin7(i32 %x, i32 %y, i32 %z) { 299; CHECK-LABEL: @maxmin7( 300; CHECK-NEXT: ret i1 true 301; 302 %c1 = icmp uge i32 %x, %y 303 %max = select i1 %c1, i32 %x, i32 %y 304 %c2 = icmp uge i32 %x, %z 305 %min = select i1 %c2, i32 %z, i32 %x 306 %c = icmp ule i32 %min, %max 307 ret i1 %c 308} 309 310define i1 @maxmin8(i32 %x, i32 %y, i32 %z) { 311; CHECK-LABEL: @maxmin8( 312; CHECK-NEXT: ret i1 false 313; 314 %c1 = icmp uge i32 %x, %y 315 %max = select i1 %c1, i32 %x, i32 %y 316 %c2 = icmp uge i32 %x, %z 317 %min = select i1 %c2, i32 %z, i32 %x 318 %c = icmp ult i32 %max, %min 319 ret i1 %c 320} 321 322define i1 @eqcmp1(i32 %x, i32 %y) { 323; CHECK-LABEL: @eqcmp1( 324; CHECK-NEXT: [[C:%.*]] = icmp sge i32 [[X:%.*]], [[Y:%.*]] 325; CHECK-NEXT: ret i1 [[C]] 326; 327 %c = icmp sge i32 %x, %y 328 %max = select i1 %c, i32 %x, i32 %y 329 %r = icmp eq i32 %max, %x 330 ret i1 %r 331} 332 333define i1 @eqcmp2(i32 %x, i32 %y) { 334; CHECK-LABEL: @eqcmp2( 335; CHECK-NEXT: [[C:%.*]] = icmp sge i32 [[X:%.*]], [[Y:%.*]] 336; CHECK-NEXT: ret i1 [[C]] 337; 338 %c = icmp sge i32 %x, %y 339 %max = select i1 %c, i32 %x, i32 %y 340 %r = icmp eq i32 %x, %max 341 ret i1 %r 342} 343 344define i1 @eqcmp3(i32 %x, i32 %y) { 345; CHECK-LABEL: @eqcmp3( 346; CHECK-NEXT: [[C:%.*]] = icmp uge i32 [[X:%.*]], [[Y:%.*]] 347; CHECK-NEXT: ret i1 [[C]] 348; 349 %c = icmp uge i32 %x, %y 350 %max = select i1 %c, i32 %x, i32 %y 351 %r = icmp eq i32 %max, %x 352 ret i1 %r 353} 354 355define i1 @eqcmp4(i32 %x, i32 %y) { 356; CHECK-LABEL: @eqcmp4( 357; CHECK-NEXT: [[C:%.*]] = icmp uge i32 [[X:%.*]], [[Y:%.*]] 358; CHECK-NEXT: ret i1 [[C]] 359; 360 %c = icmp uge i32 %x, %y 361 %max = select i1 %c, i32 %x, i32 %y 362 %r = icmp eq i32 %x, %max 363 ret i1 %r 364} 365