1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -instsimplify -S | FileCheck %s 3 4; TODO: the instructions having poison operands should be folded to poison 5 6declare i3 @llvm.uadd.sat.i3(i3, i3) 7declare i8 @llvm.uadd.sat.i8(i8, i8) 8declare <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8>, <2 x i8>) 9declare <2 x i9> @llvm.uadd.sat.v2i9(<2 x i9>, <2 x i9>) 10 11declare i8 @llvm.sadd.sat.i8(i8, i8) 12declare <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8>, <2 x i8>) 13 14declare i8 @llvm.usub.sat.i8(i8, i8) 15declare i8 @llvm.ssub.sat.i8(i8, i8) 16declare <2 x i8> @llvm.usub.sat.v2i8(<2 x i8>, <2 x i8>) 17declare <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8>, <2 x i8>) 18 19define i8 @uadd_scalar_0(i8 %a) { 20; CHECK-LABEL: @uadd_scalar_0( 21; CHECK-NEXT: ret i8 [[A:%.*]] 22; 23 %x1 = call i8 @llvm.uadd.sat.i8(i8 %a, i8 0) 24 ret i8 %x1 25} 26 27define <2 x i8> @uadd_vector_0(<2 x i8> %a) { 28; CHECK-LABEL: @uadd_vector_0( 29; CHECK-NEXT: ret <2 x i8> [[A:%.*]] 30; 31 %x1v = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> %a, <2 x i8> zeroinitializer) 32 ret <2 x i8> %x1v 33} 34 35define i3 @uadd_scalar_0_commute(i3 %a) { 36; CHECK-LABEL: @uadd_scalar_0_commute( 37; CHECK-NEXT: ret i3 [[A:%.*]] 38; 39 %x2 = call i3 @llvm.uadd.sat.i3(i3 0, i3 %a) 40 ret i3 %x2 41} 42 43define <2 x i8> @uadd_vector_0_commute(<2 x i8> %a) { 44; CHECK-LABEL: @uadd_vector_0_commute( 45; CHECK-NEXT: ret <2 x i8> [[A:%.*]] 46; 47 %x2v = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> <i8 0, i8 undef>, <2 x i8> %a) 48 ret <2 x i8> %x2v 49} 50 51define i8 @uadd_scalar_maxval(i8 %a) { 52; CHECK-LABEL: @uadd_scalar_maxval( 53; CHECK-NEXT: ret i8 -1 54; 55 %x3 = call i8 @llvm.uadd.sat.i8(i8 %a, i8 255) 56 ret i8 %x3 57} 58 59define <2 x i9> @uadd_vector_maxval(<2 x i9> %a) { 60; CHECK-LABEL: @uadd_vector_maxval( 61; CHECK-NEXT: ret <2 x i9> <i9 -1, i9 -1> 62; 63 %x3v = call <2 x i9> @llvm.uadd.sat.v2i9(<2 x i9> %a, <2 x i9> <i9 511, i9 511>) 64 ret <2 x i9> %x3v 65} 66 67define i3 @uadd_scalar_maxval_commute(i3 %a) { 68; CHECK-LABEL: @uadd_scalar_maxval_commute( 69; CHECK-NEXT: ret i3 -1 70; 71 %x4 = call i3 @llvm.uadd.sat.i3(i3 7, i3 %a) 72 ret i3 %x4 73} 74 75define <2 x i8> @uadd_vector_maxval_commute(<2 x i8> %a) { 76; CHECK-LABEL: @uadd_vector_maxval_commute( 77; CHECK-NEXT: ret <2 x i8> <i8 -1, i8 -1> 78; 79 %x4v = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> <i8 255, i8 255>, <2 x i8> %a) 80 ret <2 x i8> %x4v 81} 82 83define i8 @uadd_scalar_undef(i8 %a) { 84; CHECK-LABEL: @uadd_scalar_undef( 85; CHECK-NEXT: ret i8 -1 86; 87 %x5 = call i8 @llvm.uadd.sat.i8(i8 %a, i8 undef) 88 ret i8 %x5 89} 90 91define i8 @uadd_scalar_poison(i8 %a) { 92; CHECK-LABEL: @uadd_scalar_poison( 93; CHECK-NEXT: ret i8 -1 94; 95 %x5 = call i8 @llvm.uadd.sat.i8(i8 %a, i8 poison) 96 ret i8 %x5 97} 98 99define <2 x i8> @uadd_vector_undef(<2 x i8> %a) { 100; CHECK-LABEL: @uadd_vector_undef( 101; CHECK-NEXT: ret <2 x i8> <i8 -1, i8 -1> 102; 103 %x5v = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 undef, i8 undef>) 104 ret <2 x i8> %x5v 105} 106 107define <2 x i8> @uadd_vector_poison(<2 x i8> %a) { 108; CHECK-LABEL: @uadd_vector_poison( 109; CHECK-NEXT: ret <2 x i8> <i8 -1, i8 -1> 110; 111 %x5v = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 poison, i8 poison>) 112 ret <2 x i8> %x5v 113} 114 115define i8 @uadd_scalar_undef_commute(i8 %a) { 116; CHECK-LABEL: @uadd_scalar_undef_commute( 117; CHECK-NEXT: ret i8 -1 118; 119 %x6 = call i8 @llvm.uadd.sat.i8(i8 undef, i8 %a) 120 ret i8 %x6 121} 122 123define i8 @uadd_scalar_poison_commute(i8 %a) { 124; CHECK-LABEL: @uadd_scalar_poison_commute( 125; CHECK-NEXT: ret i8 -1 126; 127 %x6 = call i8 @llvm.uadd.sat.i8(i8 poison, i8 %a) 128 ret i8 %x6 129} 130 131define <2 x i8> @uadd_vector_undef_commute(<2 x i8> %a) { 132; CHECK-LABEL: @uadd_vector_undef_commute( 133; CHECK-NEXT: ret <2 x i8> <i8 -1, i8 -1> 134; 135 %x5v = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> undef, <2 x i8> %a) 136 ret <2 x i8> %x5v 137} 138 139define <2 x i8> @uadd_vector_poison_commute(<2 x i8> %a) { 140; CHECK-LABEL: @uadd_vector_poison_commute( 141; CHECK-NEXT: ret <2 x i8> <i8 -1, i8 -1> 142; 143 %x5v = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> poison, <2 x i8> %a) 144 ret <2 x i8> %x5v 145} 146 147define i8 @sadd_scalar_0(i8 %a) { 148; CHECK-LABEL: @sadd_scalar_0( 149; CHECK-NEXT: ret i8 [[A:%.*]] 150; 151 %y1 = call i8 @llvm.sadd.sat.i8(i8 %a, i8 0) 152 ret i8 %y1 153} 154 155define <2 x i8> @sadd_vector_0(<2 x i8> %a) { 156; CHECK-LABEL: @sadd_vector_0( 157; CHECK-NEXT: ret <2 x i8> [[A:%.*]] 158; 159 %y1v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 undef, i8 0>) 160 ret <2 x i8> %y1v 161} 162 163define i8 @sadd_scalar_0_commute(i8 %a) { 164; CHECK-LABEL: @sadd_scalar_0_commute( 165; CHECK-NEXT: ret i8 [[A:%.*]] 166; 167 %y2 = call i8 @llvm.sadd.sat.i8(i8 0, i8 %a) 168 ret i8 %y2 169} 170 171define <2 x i8> @sadd_vector_0_commute(<2 x i8> %a) { 172; CHECK-LABEL: @sadd_vector_0_commute( 173; CHECK-NEXT: ret <2 x i8> [[A:%.*]] 174; 175 %y2v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> zeroinitializer, <2 x i8> %a) 176 ret <2 x i8> %y2v 177} 178 179define i8 @sadd_scalar_maxval(i8 %a) { 180; CHECK-LABEL: @sadd_scalar_maxval( 181; CHECK-NEXT: [[Y3:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[A:%.*]], i8 127) 182; CHECK-NEXT: ret i8 [[Y3]] 183; 184 %y3 = call i8 @llvm.sadd.sat.i8(i8 %a, i8 127) 185 ret i8 %y3 186} 187 188define <2 x i8> @sadd_vector_maxval(<2 x i8> %a) { 189; CHECK-LABEL: @sadd_vector_maxval( 190; CHECK-NEXT: [[Y3V:%.*]] = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> [[A:%.*]], <2 x i8> <i8 127, i8 127>) 191; CHECK-NEXT: ret <2 x i8> [[Y3V]] 192; 193 %y3v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 127, i8 127>) 194 ret <2 x i8> %y3v 195} 196 197define i8 @sadd_scalar_maxval_commute(i8 %a) { 198; CHECK-LABEL: @sadd_scalar_maxval_commute( 199; CHECK-NEXT: [[Y4:%.*]] = call i8 @llvm.sadd.sat.i8(i8 127, i8 [[A:%.*]]) 200; CHECK-NEXT: ret i8 [[Y4]] 201; 202 %y4 = call i8 @llvm.sadd.sat.i8(i8 127, i8 %a) 203 ret i8 %y4 204} 205 206define <2 x i8> @sadd_vector_maxval_commute(<2 x i8> %a) { 207; CHECK-LABEL: @sadd_vector_maxval_commute( 208; CHECK-NEXT: [[Y4V:%.*]] = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> <i8 undef, i8 127>, <2 x i8> [[A:%.*]]) 209; CHECK-NEXT: ret <2 x i8> [[Y4V]] 210; 211 %y4v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> <i8 undef, i8 127>, <2 x i8> %a) 212 ret <2 x i8> %y4v 213} 214 215define i8 @sadd_scalar_undef(i8 %a) { 216; CHECK-LABEL: @sadd_scalar_undef( 217; CHECK-NEXT: ret i8 -1 218; 219 %y5 = call i8 @llvm.sadd.sat.i8(i8 %a, i8 undef) 220 ret i8 %y5 221} 222 223define i8 @sadd_scalar_poison(i8 %a) { 224; CHECK-LABEL: @sadd_scalar_poison( 225; CHECK-NEXT: ret i8 -1 226; 227 %y5 = call i8 @llvm.sadd.sat.i8(i8 %a, i8 poison) 228 ret i8 %y5 229} 230 231define <2 x i8> @sadd_vector_undef(<2 x i8> %a) { 232; CHECK-LABEL: @sadd_vector_undef( 233; CHECK-NEXT: ret <2 x i8> <i8 -1, i8 -1> 234; 235 %y5v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> %a, <2 x i8> undef) 236 ret <2 x i8> %y5v 237} 238 239define <2 x i8> @sadd_vector_poison(<2 x i8> %a) { 240; CHECK-LABEL: @sadd_vector_poison( 241; CHECK-NEXT: ret <2 x i8> <i8 -1, i8 -1> 242; 243 %y5v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> %a, <2 x i8> poison) 244 ret <2 x i8> %y5v 245} 246 247define i8 @sadd_scalar_undef_commute(i8 %a) { 248; CHECK-LABEL: @sadd_scalar_undef_commute( 249; CHECK-NEXT: ret i8 -1 250; 251 %y6 = call i8 @llvm.sadd.sat.i8(i8 undef, i8 %a) 252 ret i8 %y6 253} 254 255define i8 @sadd_scalar_poison_commute(i8 %a) { 256; CHECK-LABEL: @sadd_scalar_poison_commute( 257; CHECK-NEXT: ret i8 -1 258; 259 %y6 = call i8 @llvm.sadd.sat.i8(i8 poison, i8 %a) 260 ret i8 %y6 261} 262 263define <2 x i8> @sadd_vector_undef_commute(<2 x i8> %a) { 264; CHECK-LABEL: @sadd_vector_undef_commute( 265; CHECK-NEXT: ret <2 x i8> <i8 -1, i8 -1> 266; 267 %y6v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> undef, <2 x i8> %a) 268 ret <2 x i8> %y6v 269} 270 271define <2 x i8> @sadd_vector_poison_commute(<2 x i8> %a) { 272; CHECK-LABEL: @sadd_vector_poison_commute( 273; CHECK-NEXT: ret <2 x i8> <i8 -1, i8 -1> 274; 275 %y6v = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> poison, <2 x i8> %a) 276 ret <2 x i8> %y6v 277} 278 279define i8 @usub_scalar_0(i8 %a) { 280; CHECK-LABEL: @usub_scalar_0( 281; CHECK-NEXT: ret i8 [[A:%.*]] 282; 283 %x1 = call i8 @llvm.usub.sat.i8(i8 %a, i8 0) 284 ret i8 %x1 285} 286 287define <2 x i8> @usub_vector_0(<2 x i8> %a) { 288; CHECK-LABEL: @usub_vector_0( 289; CHECK-NEXT: ret <2 x i8> [[A:%.*]] 290; 291 %x1v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 0, i8 0>) 292 ret <2 x i8> %x1v 293} 294 295define i8 @usub_scalar_0_commute(i8 %a) { 296; CHECK-LABEL: @usub_scalar_0_commute( 297; CHECK-NEXT: ret i8 0 298; 299 %x2 = call i8 @llvm.usub.sat.i8(i8 0, i8 %a) 300 ret i8 %x2 301} 302 303define <2 x i8> @usub_vector_0_commute(<2 x i8> %a) { 304; CHECK-LABEL: @usub_vector_0_commute( 305; CHECK-NEXT: ret <2 x i8> zeroinitializer 306; 307 %x2v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> <i8 0, i8 0>, <2 x i8> %a) 308 ret <2 x i8> %x2v 309} 310 311define i8 @usub_scalar_maxval(i8 %a) { 312; CHECK-LABEL: @usub_scalar_maxval( 313; CHECK-NEXT: ret i8 0 314; 315 %x3 = call i8 @llvm.usub.sat.i8(i8 %a, i8 255) 316 ret i8 %x3 317} 318 319define <2 x i8> @usub_vector_maxval(<2 x i8> %a) { 320; CHECK-LABEL: @usub_vector_maxval( 321; CHECK-NEXT: ret <2 x i8> zeroinitializer 322; 323 %x3v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 255, i8 255>) 324 ret <2 x i8> %x3v 325} 326 327define i8 @usub_scalar_undef(i8 %a) { 328; CHECK-LABEL: @usub_scalar_undef( 329; CHECK-NEXT: ret i8 0 330; 331 %x4 = call i8 @llvm.usub.sat.i8(i8 %a, i8 undef) 332 ret i8 %x4 333} 334 335define i8 @usub_scalar_poison(i8 %a) { 336; CHECK-LABEL: @usub_scalar_poison( 337; CHECK-NEXT: ret i8 0 338; 339 %x4 = call i8 @llvm.usub.sat.i8(i8 %a, i8 poison) 340 ret i8 %x4 341} 342 343define <2 x i8> @usub_vector_undef(<2 x i8> %a) { 344; CHECK-LABEL: @usub_vector_undef( 345; CHECK-NEXT: ret <2 x i8> zeroinitializer 346; 347 %x4v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 undef, i8 undef>) 348 ret <2 x i8> %x4v 349} 350 351define <2 x i8> @usub_vector_poison(<2 x i8> %a) { 352; CHECK-LABEL: @usub_vector_poison( 353; CHECK-NEXT: ret <2 x i8> zeroinitializer 354; 355 %x4v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 poison, i8 poison>) 356 ret <2 x i8> %x4v 357} 358 359define i8 @usub_scalar_undef_commute(i8 %a) { 360; CHECK-LABEL: @usub_scalar_undef_commute( 361; CHECK-NEXT: ret i8 0 362; 363 %x5 = call i8 @llvm.usub.sat.i8(i8 undef, i8 %a) 364 ret i8 %x5 365} 366 367define i8 @usub_scalar_poison_commute(i8 %a) { 368; CHECK-LABEL: @usub_scalar_poison_commute( 369; CHECK-NEXT: ret i8 0 370; 371 %x5 = call i8 @llvm.usub.sat.i8(i8 poison, i8 %a) 372 ret i8 %x5 373} 374 375define <2 x i8> @usub_vector_undef_commute(<2 x i8> %a) { 376; CHECK-LABEL: @usub_vector_undef_commute( 377; CHECK-NEXT: ret <2 x i8> zeroinitializer 378; 379 %x5v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> <i8 undef, i8 undef>, <2 x i8> %a) 380 ret <2 x i8> %x5v 381} 382 383define <2 x i8> @usub_vector_poison_commute(<2 x i8> %a) { 384; CHECK-LABEL: @usub_vector_poison_commute( 385; CHECK-NEXT: ret <2 x i8> zeroinitializer 386; 387 %x5v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> <i8 poison, i8 poison>, <2 x i8> %a) 388 ret <2 x i8> %x5v 389} 390 391define i8 @usub_scalar_same(i8 %a) { 392; CHECK-LABEL: @usub_scalar_same( 393; CHECK-NEXT: ret i8 0 394; 395 %x6 = call i8 @llvm.usub.sat.i8(i8 %a, i8 %a) 396 ret i8 %x6 397} 398 399define <2 x i8> @usub_vector_same(<2 x i8> %a) { 400; CHECK-LABEL: @usub_vector_same( 401; CHECK-NEXT: ret <2 x i8> zeroinitializer 402; 403 %x6v = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %a, <2 x i8> %a) 404 ret <2 x i8> %x6v 405} 406 407define i8 @ssub_scalar_0(i8 %a) { 408; CHECK-LABEL: @ssub_scalar_0( 409; CHECK-NEXT: ret i8 [[A:%.*]] 410; 411 %y1 = call i8 @llvm.ssub.sat.i8(i8 %a, i8 0) 412 ret i8 %y1 413} 414 415define <2 x i8> @ssub_vector_0(<2 x i8> %a) { 416; CHECK-LABEL: @ssub_vector_0( 417; CHECK-NEXT: ret <2 x i8> [[A:%.*]] 418; 419 %y1v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 0, i8 0>) 420 ret <2 x i8> %y1v 421} 422 423define i8 @ssub_scalar_0_commute(i8 %a) { 424; CHECK-LABEL: @ssub_scalar_0_commute( 425; CHECK-NEXT: [[Y2:%.*]] = call i8 @llvm.ssub.sat.i8(i8 0, i8 [[A:%.*]]) 426; CHECK-NEXT: ret i8 [[Y2]] 427; 428 %y2 = call i8 @llvm.ssub.sat.i8(i8 0, i8 %a) 429 ret i8 %y2 430} 431 432define <2 x i8> @ssub_vector_0_commute(<2 x i8> %a) { 433; CHECK-LABEL: @ssub_vector_0_commute( 434; CHECK-NEXT: [[Y2V:%.*]] = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> zeroinitializer, <2 x i8> [[A:%.*]]) 435; CHECK-NEXT: ret <2 x i8> [[Y2V]] 436; 437 %y2v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> <i8 0, i8 0>, <2 x i8> %a) 438 ret <2 x i8> %y2v 439} 440 441define i8 @ssub_scalar_maxval(i8 %a) { 442; CHECK-LABEL: @ssub_scalar_maxval( 443; CHECK-NEXT: [[Y3:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[A:%.*]], i8 127) 444; CHECK-NEXT: ret i8 [[Y3]] 445; 446 %y3 = call i8 @llvm.ssub.sat.i8(i8 %a, i8 127) 447 ret i8 %y3 448} 449 450define <2 x i8> @ssub_vector_maxval(<2 x i8> %a) { 451; CHECK-LABEL: @ssub_vector_maxval( 452; CHECK-NEXT: [[Y3V:%.*]] = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> [[A:%.*]], <2 x i8> <i8 127, i8 127>) 453; CHECK-NEXT: ret <2 x i8> [[Y3V]] 454; 455 %y3v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %a, <2 x i8> <i8 127, i8 127>) 456 ret <2 x i8> %y3v 457} 458 459define i8 @ssub_scalar_undef(i8 %a) { 460; CHECK-LABEL: @ssub_scalar_undef( 461; CHECK-NEXT: ret i8 0 462; 463 %y4 = call i8 @llvm.ssub.sat.i8(i8 %a, i8 undef) 464 ret i8 %y4 465} 466 467define i8 @ssub_scalar_poison(i8 %a) { 468; CHECK-LABEL: @ssub_scalar_poison( 469; CHECK-NEXT: ret i8 0 470; 471 %y4 = call i8 @llvm.ssub.sat.i8(i8 %a, i8 poison) 472 ret i8 %y4 473} 474 475define <2 x i8> @ssub_vector_undef(<2 x i8> %a) { 476; CHECK-LABEL: @ssub_vector_undef( 477; CHECK-NEXT: ret <2 x i8> zeroinitializer 478; 479 %y4v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %a, <2 x i8> undef) 480 ret <2 x i8> %y4v 481} 482 483define <2 x i8> @ssub_vector_poison(<2 x i8> %a) { 484; CHECK-LABEL: @ssub_vector_poison( 485; CHECK-NEXT: ret <2 x i8> zeroinitializer 486; 487 %y4v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %a, <2 x i8> poison) 488 ret <2 x i8> %y4v 489} 490 491define i8 @ssub_scalar_undef_commute(i8 %a) { 492; CHECK-LABEL: @ssub_scalar_undef_commute( 493; CHECK-NEXT: ret i8 0 494; 495 %y5 = call i8 @llvm.ssub.sat.i8(i8 undef, i8 %a) 496 ret i8 %y5 497} 498 499define i8 @ssub_scalar_poison_commute(i8 %a) { 500; CHECK-LABEL: @ssub_scalar_poison_commute( 501; CHECK-NEXT: ret i8 0 502; 503 %y5 = call i8 @llvm.ssub.sat.i8(i8 poison, i8 %a) 504 ret i8 %y5 505} 506 507define <2 x i8> @ssub_vector_undef_commute(<2 x i8> %a) { 508; CHECK-LABEL: @ssub_vector_undef_commute( 509; CHECK-NEXT: ret <2 x i8> zeroinitializer 510; 511 %y5v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> <i8 undef, i8 undef>, <2 x i8> %a) 512 ret <2 x i8> %y5v 513} 514 515define <2 x i8> @ssub_vector_poison_commute(<2 x i8> %a) { 516; CHECK-LABEL: @ssub_vector_poison_commute( 517; CHECK-NEXT: ret <2 x i8> zeroinitializer 518; 519 %y5v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> <i8 poison, i8 poison>, <2 x i8> %a) 520 ret <2 x i8> %y5v 521} 522 523define i8 @ssub_scalar_same(i8 %a) { 524; CHECK-LABEL: @ssub_scalar_same( 525; CHECK-NEXT: ret i8 0 526; 527 %y6 = call i8 @llvm.ssub.sat.i8(i8 %a, i8 %a) 528 ret i8 %y6 529} 530 531define <2 x i8> @ssub_vector_same(<2 x i8> %a) { 532; CHECK-LABEL: @ssub_vector_same( 533; CHECK-NEXT: ret <2 x i8> zeroinitializer 534; 535 %y6v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %a, <2 x i8> %a) 536 ret <2 x i8> %y6v 537} 538 539define i1 @uadd_icmp_op0_known(i8 %a) { 540; CHECK-LABEL: @uadd_icmp_op0_known( 541; CHECK-NEXT: ret i1 true 542; 543 %b = call i8 @llvm.uadd.sat.i8(i8 10, i8 %a) 544 %c = icmp uge i8 %b, 10 545 ret i1 %c 546} 547 548define i1 @uadd_icmp_op0_unknown(i8 %a) { 549; CHECK-LABEL: @uadd_icmp_op0_unknown( 550; CHECK-NEXT: [[B:%.*]] = call i8 @llvm.uadd.sat.i8(i8 10, i8 [[A:%.*]]) 551; CHECK-NEXT: [[C:%.*]] = icmp ugt i8 [[B]], 10 552; CHECK-NEXT: ret i1 [[C]] 553; 554 %b = call i8 @llvm.uadd.sat.i8(i8 10, i8 %a) 555 %c = icmp ugt i8 %b, 10 556 ret i1 %c 557} 558 559define i1 @uadd_icmp_op1_known(i8 %a) { 560; CHECK-LABEL: @uadd_icmp_op1_known( 561; CHECK-NEXT: ret i1 true 562; 563 %b = call i8 @llvm.uadd.sat.i8(i8 %a, i8 10) 564 %c = icmp uge i8 %b, 10 565 ret i1 %c 566} 567 568define i1 @uadd_icmp_op1_unknown(i8 %a) { 569; CHECK-LABEL: @uadd_icmp_op1_unknown( 570; CHECK-NEXT: [[B:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[A:%.*]], i8 10) 571; CHECK-NEXT: [[C:%.*]] = icmp ugt i8 [[B]], 10 572; CHECK-NEXT: ret i1 [[C]] 573; 574 %b = call i8 @llvm.uadd.sat.i8(i8 %a, i8 10) 575 %c = icmp ugt i8 %b, 10 576 ret i1 %c 577} 578 579define i1 @sadd_icmp_op0_pos_known(i8 %a) { 580; CHECK-LABEL: @sadd_icmp_op0_pos_known( 581; CHECK-NEXT: ret i1 true 582; 583 %b = call i8 @llvm.sadd.sat.i8(i8 10, i8 %a) 584 %c = icmp sge i8 %b, -118 585 ret i1 %c 586} 587 588define i1 @sadd_icmp_op0_pos_unknown(i8 %a) { 589; CHECK-LABEL: @sadd_icmp_op0_pos_unknown( 590; CHECK-NEXT: [[B:%.*]] = call i8 @llvm.sadd.sat.i8(i8 10, i8 [[A:%.*]]) 591; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[B]], -118 592; CHECK-NEXT: ret i1 [[C]] 593; 594 %b = call i8 @llvm.sadd.sat.i8(i8 10, i8 %a) 595 %c = icmp sgt i8 %b, -118 596 ret i1 %c 597} 598 599define i1 @sadd_icmp_op0_neg_known(i8 %a) { 600; CHECK-LABEL: @sadd_icmp_op0_neg_known( 601; CHECK-NEXT: ret i1 true 602; 603 %b = call i8 @llvm.sadd.sat.i8(i8 -10, i8 %a) 604 %c = icmp sle i8 %b, 117 605 ret i1 %c 606} 607 608define i1 @sadd_icmp_op0_neg_unknown(i8 %a) { 609; CHECK-LABEL: @sadd_icmp_op0_neg_unknown( 610; CHECK-NEXT: [[B:%.*]] = call i8 @llvm.sadd.sat.i8(i8 -10, i8 [[A:%.*]]) 611; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[B]], 117 612; CHECK-NEXT: ret i1 [[C]] 613; 614 %b = call i8 @llvm.sadd.sat.i8(i8 -10, i8 %a) 615 %c = icmp slt i8 %b, 117 616 ret i1 %c 617} 618 619define i1 @sadd_icmp_op1_pos_known(i8 %a) { 620; CHECK-LABEL: @sadd_icmp_op1_pos_known( 621; CHECK-NEXT: ret i1 true 622; 623 %b = call i8 @llvm.sadd.sat.i8(i8 %a, i8 10) 624 %c = icmp sge i8 %b, -118 625 ret i1 %c 626} 627 628define i1 @sadd_icmp_op1_pos_unknown(i8 %a) { 629; CHECK-LABEL: @sadd_icmp_op1_pos_unknown( 630; CHECK-NEXT: [[B:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[A:%.*]], i8 10) 631; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[B]], -118 632; CHECK-NEXT: ret i1 [[C]] 633; 634 %b = call i8 @llvm.sadd.sat.i8(i8 %a, i8 10) 635 %c = icmp sgt i8 %b, -118 636 ret i1 %c 637} 638 639define i1 @sadd_icmp_op1_neg_known(i8 %a) { 640; CHECK-LABEL: @sadd_icmp_op1_neg_known( 641; CHECK-NEXT: ret i1 true 642; 643 %b = call i8 @llvm.sadd.sat.i8(i8 %a, i8 -10) 644 %c = icmp sle i8 %b, 117 645 ret i1 %c 646} 647 648define i1 @sadd_icmp_op1_neg_unknown(i8 %a) { 649; CHECK-LABEL: @sadd_icmp_op1_neg_unknown( 650; CHECK-NEXT: [[B:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[A:%.*]], i8 -10) 651; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[B]], 117 652; CHECK-NEXT: ret i1 [[C]] 653; 654 %b = call i8 @llvm.sadd.sat.i8(i8 %a, i8 -10) 655 %c = icmp slt i8 %b, 117 656 ret i1 %c 657} 658 659define i1 @usub_icmp_op0_known(i8 %a) { 660; CHECK-LABEL: @usub_icmp_op0_known( 661; CHECK-NEXT: ret i1 true 662; 663 %b = call i8 @llvm.usub.sat.i8(i8 10, i8 %a) 664 %c = icmp ule i8 %b, 10 665 ret i1 %c 666} 667 668define i1 @usub_icmp_op0_unknown(i8 %a) { 669; CHECK-LABEL: @usub_icmp_op0_unknown( 670; CHECK-NEXT: [[B:%.*]] = call i8 @llvm.usub.sat.i8(i8 10, i8 [[A:%.*]]) 671; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[B]], 10 672; CHECK-NEXT: ret i1 [[C]] 673; 674 %b = call i8 @llvm.usub.sat.i8(i8 10, i8 %a) 675 %c = icmp ult i8 %b, 10 676 ret i1 %c 677} 678 679define i1 @usub_icmp_op1_known(i8 %a) { 680; CHECK-LABEL: @usub_icmp_op1_known( 681; CHECK-NEXT: ret i1 true 682; 683 %b = call i8 @llvm.usub.sat.i8(i8 %a, i8 10) 684 %c = icmp ule i8 %b, 245 685 ret i1 %c 686} 687 688define i1 @usub_icmp_op1_unknown(i8 %a) { 689; CHECK-LABEL: @usub_icmp_op1_unknown( 690; CHECK-NEXT: [[B:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[A:%.*]], i8 10) 691; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[B]], -11 692; CHECK-NEXT: ret i1 [[C]] 693; 694 %b = call i8 @llvm.usub.sat.i8(i8 %a, i8 10) 695 %c = icmp ult i8 %b, 245 696 ret i1 %c 697} 698 699define i1 @ssub_icmp_op0_pos_known(i8 %a) { 700; CHECK-LABEL: @ssub_icmp_op0_pos_known( 701; CHECK-NEXT: ret i1 true 702; 703 %b = call i8 @llvm.ssub.sat.i8(i8 10, i8 %a) 704 %c = icmp sge i8 %b, -117 705 ret i1 %c 706} 707 708define i1 @ssub_icmp_op0_pos_unknown(i8 %a) { 709; CHECK-LABEL: @ssub_icmp_op0_pos_unknown( 710; CHECK-NEXT: [[B:%.*]] = call i8 @llvm.ssub.sat.i8(i8 10, i8 [[A:%.*]]) 711; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[B]], -117 712; CHECK-NEXT: ret i1 [[C]] 713; 714 %b = call i8 @llvm.ssub.sat.i8(i8 10, i8 %a) 715 %c = icmp sgt i8 %b, -117 716 ret i1 %c 717} 718 719define i1 @ssub_icmp_op0_neg_known(i8 %a) { 720; CHECK-LABEL: @ssub_icmp_op0_neg_known( 721; CHECK-NEXT: ret i1 true 722; 723 %b = call i8 @llvm.ssub.sat.i8(i8 -10, i8 %a) 724 %c = icmp sle i8 %b, 118 725 ret i1 %c 726} 727 728define i1 @ssub_icmp_op0_neg_unknown(i8 %a) { 729; CHECK-LABEL: @ssub_icmp_op0_neg_unknown( 730; CHECK-NEXT: [[B:%.*]] = call i8 @llvm.ssub.sat.i8(i8 -10, i8 [[A:%.*]]) 731; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[B]], 118 732; CHECK-NEXT: ret i1 [[C]] 733; 734 %b = call i8 @llvm.ssub.sat.i8(i8 -10, i8 %a) 735 %c = icmp slt i8 %b, 118 736 ret i1 %c 737} 738 739; Peculiar case: ssub.sat(0, x) is never signed min. 740define i1 @ssub_icmp_op0_zero(i8 %a) { 741; CHECK-LABEL: @ssub_icmp_op0_zero( 742; CHECK-NEXT: ret i1 true 743; 744 %b = call i8 @llvm.ssub.sat.i8(i8 0, i8 %a) 745 %c = icmp ne i8 %b, -128 746 ret i1 %c 747} 748 749define i1 @ssub_icmp_op1_pos_known(i8 %a) { 750; CHECK-LABEL: @ssub_icmp_op1_pos_known( 751; CHECK-NEXT: ret i1 true 752; 753 %b = call i8 @llvm.ssub.sat.i8(i8 %a, i8 10) 754 %c = icmp sle i8 %b, 117 755 ret i1 %c 756} 757 758define i1 @ssub_icmp_op1_pos_unknown(i8 %a) { 759; CHECK-LABEL: @ssub_icmp_op1_pos_unknown( 760; CHECK-NEXT: [[B:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[A:%.*]], i8 10) 761; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[B]], 117 762; CHECK-NEXT: ret i1 [[C]] 763; 764 %b = call i8 @llvm.ssub.sat.i8(i8 %a, i8 10) 765 %c = icmp slt i8 %b, 117 766 ret i1 %c 767} 768 769define i1 @ssub_icmp_op1_neg_known(i8 %a) { 770; CHECK-LABEL: @ssub_icmp_op1_neg_known( 771; CHECK-NEXT: ret i1 true 772; 773 %b = call i8 @llvm.ssub.sat.i8(i8 %a, i8 -10) 774 %c = icmp sge i8 %b, -118 775 ret i1 %c 776} 777 778define i1 @ssub_icmp_op1_neg_unknown(i8 %a) { 779; CHECK-LABEL: @ssub_icmp_op1_neg_unknown( 780; CHECK-NEXT: [[B:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[A:%.*]], i8 -10) 781; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[B]], -118 782; CHECK-NEXT: ret i1 [[C]] 783; 784 %b = call i8 @llvm.ssub.sat.i8(i8 %a, i8 -10) 785 %c = icmp sgt i8 %b, -118 786 ret i1 %c 787} 788 789define i1 @ssub_icmp_op1_smin(i8 %a) { 790; CHECK-LABEL: @ssub_icmp_op1_smin( 791; CHECK-NEXT: ret i1 true 792; 793 %b = call i8 @llvm.ssub.sat.i8(i8 %a, i8 -128) 794 %c = icmp sge i8 %b, 0 795 ret i1 %c 796} 797