1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -instcombine -S | FileCheck %s 3 4declare void @use(<2 x i1>) 5declare void @use2(i1) 6 7define i32 @select_xor_icmp(i32 %x, i32 %y, i32 %z) { 8; CHECK-LABEL: @select_xor_icmp( 9; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 0 10; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]] 11; CHECK-NEXT: ret i32 [[C]] 12; 13 %A = icmp eq i32 %x, 0 14 %B = xor i32 %x, %z 15 %C = select i1 %A, i32 %B, i32 %y 16 ret i32 %C 17} 18 19define i32 @select_xor_icmp2(i32 %x, i32 %y, i32 %z) { 20; CHECK-LABEL: @select_xor_icmp2( 21; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 0 22; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]] 23; CHECK-NEXT: ret i32 [[C]] 24; 25 %A = icmp ne i32 %x, 0 26 %B = xor i32 %x, %z 27 %C = select i1 %A, i32 %y, i32 %B 28 ret i32 %C 29} 30 31define i32 @select_xor_icmp_meta(i32 %x, i32 %y, i32 %z) { 32; CHECK-LABEL: @select_xor_icmp_meta( 33; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 0 34; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]], !prof !0 35; CHECK-NEXT: ret i32 [[C]] 36; 37 %A = icmp eq i32 %x, 0 38 %B = xor i32 %x, %z 39 %C = select i1 %A, i32 %B, i32 %y, !prof !0 40 ret i32 %C 41} 42 43define i32 @select_mul_icmp(i32 %x, i32 %y, i32 %z) { 44; CHECK-LABEL: @select_mul_icmp( 45; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 1 46; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]] 47; CHECK-NEXT: ret i32 [[C]] 48; 49 %A = icmp eq i32 %x, 1 50 %B = mul i32 %x, %z 51 %C = select i1 %A, i32 %B, i32 %y 52 ret i32 %C 53} 54 55define i32 @select_add_icmp(i32 %x, i32 %y, i32 %z) { 56; CHECK-LABEL: @select_add_icmp( 57; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 0 58; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]] 59; CHECK-NEXT: ret i32 [[C]] 60; 61 %A = icmp eq i32 %x, 0 62 %B = add i32 %x, %z 63 %C = select i1 %A, i32 %B, i32 %y 64 ret i32 %C 65} 66 67define i32 @select_or_icmp(i32 %x, i32 %y, i32 %z) { 68; CHECK-LABEL: @select_or_icmp( 69; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 0 70; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]] 71; CHECK-NEXT: ret i32 [[C]] 72; 73 %A = icmp eq i32 %x, 0 74 %B = or i32 %x, %z 75 %C = select i1 %A, i32 %B, i32 %y 76 ret i32 %C 77} 78 79define i32 @select_and_icmp(i32 %x, i32 %y, i32 %z) { 80; CHECK-LABEL: @select_and_icmp( 81; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], -1 82; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]] 83; CHECK-NEXT: ret i32 [[C]] 84; 85 %A = icmp eq i32 %x, -1 86 %B = and i32 %x, %z 87 %C = select i1 %A, i32 %B, i32 %y 88 ret i32 %C 89} 90 91define <2 x i8> @select_xor_icmp_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) { 92; CHECK-LABEL: @select_xor_icmp_vec( 93; CHECK-NEXT: [[A:%.*]] = icmp eq <2 x i8> [[X:%.*]], zeroinitializer 94; CHECK-NEXT: [[C:%.*]] = select <2 x i1> [[A]], <2 x i8> [[Z:%.*]], <2 x i8> [[Y:%.*]] 95; CHECK-NEXT: ret <2 x i8> [[C]] 96; 97 %A = icmp eq <2 x i8> %x, <i8 0, i8 0> 98 %B = xor <2 x i8> %x, %z 99 %C = select <2 x i1> %A, <2 x i8> %B, <2 x i8> %y 100 ret <2 x i8> %C 101} 102 103define <2 x i8> @select_xor_icmp_vec_use(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) { 104; CHECK-LABEL: @select_xor_icmp_vec_use( 105; CHECK-NEXT: [[A:%.*]] = icmp ne <2 x i8> [[X:%.*]], zeroinitializer 106; CHECK-NEXT: call void @use(<2 x i1> [[A]]) 107; CHECK-NEXT: [[C:%.*]] = select <2 x i1> [[A]], <2 x i8> [[Y:%.*]], <2 x i8> [[Z:%.*]] 108; CHECK-NEXT: ret <2 x i8> [[C]] 109; 110 %A = icmp ne <2 x i8> %x, <i8 0, i8 0> 111 call void @use(<2 x i1> %A) 112 %B = xor <2 x i8> %x, %z 113 %C = select <2 x i1> %A, <2 x i8> %y, <2 x i8> %B 114 ret <2 x i8> %C 115} 116 117define i32 @select_xor_inv_icmp(i32 %x, i32 %y, i32 %z) { 118; CHECK-LABEL: @select_xor_inv_icmp( 119; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 0 120; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]] 121; CHECK-NEXT: ret i32 [[C]] 122; 123 %A = icmp eq i32 %x, 0 124 %B = xor i32 %z, %x 125 %C = select i1 %A, i32 %B, i32 %y 126 ret i32 %C 127} 128 129define i32 @select_xor_inv_icmp2(i32 %x, i32 %y, i32 %z) { 130; CHECK-LABEL: @select_xor_inv_icmp2( 131; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], 0 132; CHECK-NEXT: call void @use2(i1 [[A]]) 133; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[Y:%.*]], i32 [[Z:%.*]] 134; CHECK-NEXT: ret i32 [[C]] 135; 136 %A = icmp ne i32 %x, 0 137 call void @use2(i1 %A) ; thwart predicate canonicalization 138 %B = xor i32 %x, %z 139 %C = select i1 %A, i32 %y, i32 %B 140 ret i32 %C 141} 142 143define float @select_fadd_fcmp(float %x, float %y, float %z) { 144; CHECK-LABEL: @select_fadd_fcmp( 145; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], -0.000000e+00 146; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Z:%.*]], float [[Y:%.*]] 147; CHECK-NEXT: ret float [[C]] 148; 149 %A = fcmp oeq float %x, -0.0 150 %B = fadd nsz float %x, %z 151 %C = select i1 %A, float %B, float %y 152 ret float %C 153} 154 155define float @select_fadd_fcmp_2(float %x, float %y, float %v) { 156; CHECK-LABEL: @select_fadd_fcmp_2( 157; CHECK-NEXT: [[A:%.*]] = fcmp une float [[X:%.*]], -0.000000e+00 158; CHECK-NEXT: [[Z:%.*]] = fadd float [[V:%.*]], 0.000000e+00 159; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[Z]] 160; CHECK-NEXT: ret float [[C]] 161; 162 %A = fcmp une float %x, -0.0 163 %z = fadd float %v, 0.0 ; cannot produce -0.0 164 %B = fadd float %z, %x 165 %C = select i1 %A, float %y, float %B 166 ret float %C 167} 168 169define float @select_fadd_fcmp_3(float %x, float %y) { 170; CHECK-LABEL: @select_fadd_fcmp_3( 171; CHECK-NEXT: [[A:%.*]] = fcmp une float [[X:%.*]], -0.000000e+00 172; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float 6.000000e+00 173; CHECK-NEXT: ret float [[C]] 174; 175 %A = fcmp une float %x, -0.0 176 %B = fadd float 6.0, %x 177 %C = select i1 %A, float %y, float %B 178 ret float %C 179} 180 181define float @select_fadd_fcmp_4(float %x, float %y, float %z) { 182; CHECK-LABEL: @select_fadd_fcmp_4( 183; CHECK-NEXT: [[A:%.*]] = fcmp une float [[X:%.*]], -0.000000e+00 184; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[Z:%.*]] 185; CHECK-NEXT: ret float [[C]] 186; 187 %A = fcmp une float %x, -0.0 188 %B = fadd nsz float %z, %x 189 %C = select i1 %A, float %y, float %B 190 ret float %C 191} 192 193define float @select_fadd_fcmp_5(float %x, float %y, float %v) { 194; CHECK-LABEL: @select_fadd_fcmp_5( 195; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], -0.000000e+00 196; CHECK-NEXT: [[Z:%.*]] = fadd float [[V:%.*]], 0.000000e+00 197; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Z]], float [[Y:%.*]] 198; CHECK-NEXT: ret float [[C]] 199; 200 %A = fcmp oeq float %x, -0.0 201 %z = fadd float %v, 0.0 ; cannot produce -0.0 202 %B = fadd float %z, %x 203 %C = select i1 %A, float %B, float %y 204 ret float %C 205} 206 207define float @select_fadd_fcmp_6(float %x, float %y, float %z) { 208; CHECK-LABEL: @select_fadd_fcmp_6( 209; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], -0.000000e+00 210; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float 6.000000e+00, float [[Y:%.*]] 211; CHECK-NEXT: ret float [[C]] 212; 213 %A = fcmp oeq float %x, -0.0 214 %B = fadd float %x, 6.0 215 %C = select i1 %A, float %B, float %y 216 ret float %C 217} 218 219define float @select_fmul_fcmp(float %x, float %y, float %z) { 220; CHECK-LABEL: @select_fmul_fcmp( 221; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], 1.000000e+00 222; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Z:%.*]], float [[Y:%.*]] 223; CHECK-NEXT: ret float [[C]] 224; 225 %A = fcmp oeq float %x, 1.0 226 %B = fmul nsz float %x, %z 227 %C = select i1 %A, float %B, float %y 228 ret float %C 229} 230 231define float @select_fsub_fcmp(float %x, float %y, float %z) { 232; CHECK-LABEL: @select_fsub_fcmp( 233; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 234; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Z:%.*]], float [[Y:%.*]] 235; CHECK-NEXT: ret float [[C]] 236; 237 %A = fcmp oeq float %x, 0.0 238 %B = fsub nsz float %z, %x 239 %C = select i1 %A, float %B, float %y 240 ret float %C 241} 242 243define float @select_fdiv_fcmp(float %x, float %y, float %z) { 244; CHECK-LABEL: @select_fdiv_fcmp( 245; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], 1.000000e+00 246; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Z:%.*]], float [[Y:%.*]] 247; CHECK-NEXT: ret float [[C]] 248; 249 %A = fcmp oeq float %x, 1.0 250 %B = fdiv nsz float %z, %x 251 %C = select i1 %A, float %B, float %y 252 ret float %C 253} 254 255define i32 @select_sub_icmp(i32 %x, i32 %y, i32 %z) { 256; CHECK-LABEL: @select_sub_icmp( 257; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 0 258; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]] 259; CHECK-NEXT: ret i32 [[C]] 260; 261 %A = icmp eq i32 %x, 0 262 %B = sub i32 %z, %x 263 %C = select i1 %A, i32 %B, i32 %y 264 ret i32 %C 265} 266 267define i32 @select_sub_icmp_2(i32 %x, i32 %y, i32 %z) { 268; CHECK-LABEL: @select_sub_icmp_2( 269; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 0 270; CHECK-NEXT: call void @use2(i1 [[A]]) 271; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]] 272; CHECK-NEXT: ret i32 [[C]] 273; 274 %A = icmp eq i32 %x, 0 275 call void @use2(i1 %A) 276 %B = sub i32 %z, %x 277 %C = select i1 %A, i32 %B, i32 %y 278 ret i32 %C 279} 280 281define i32 @select_sub_icmp_3(i32 %x, i32 %y, i32 %z) { 282; CHECK-LABEL: @select_sub_icmp_3( 283; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], 0 284; CHECK-NEXT: call void @use2(i1 [[A]]) 285; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[Y:%.*]], i32 [[Z:%.*]] 286; CHECK-NEXT: ret i32 [[C]] 287; 288 %A = icmp ne i32 %x, 0 289 call void @use2(i1 %A) 290 %B = sub i32 %z, %x 291 %C = select i1 %A, i32 %y, i32 %B 292 ret i32 %C 293} 294 295define <2 x i8> @select_sub_icmp_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) { 296; CHECK-LABEL: @select_sub_icmp_vec( 297; CHECK-NEXT: [[A:%.*]] = icmp eq <2 x i8> [[X:%.*]], zeroinitializer 298; CHECK-NEXT: [[C:%.*]] = select <2 x i1> [[A]], <2 x i8> [[Z:%.*]], <2 x i8> [[Y:%.*]] 299; CHECK-NEXT: ret <2 x i8> [[C]] 300; 301 %A = icmp eq <2 x i8> %x, <i8 0, i8 0> 302 %B = sub <2 x i8> %z, %x 303 %C = select <2 x i1> %A, <2 x i8> %B, <2 x i8> %y 304 ret <2 x i8> %C 305} 306 307define i32 @select_shl_icmp(i32 %x, i32 %y, i32 %z) { 308; CHECK-LABEL: @select_shl_icmp( 309; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], 0 310; CHECK-NEXT: call void @use2(i1 [[A]]) 311; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[Y:%.*]], i32 [[Z:%.*]] 312; CHECK-NEXT: ret i32 [[C]] 313; 314 %A = icmp ne i32 %x, 0 315 call void @use2(i1 %A) ; thwart predicate canonicalization 316 %B = shl i32 %z, %x 317 %C = select i1 %A, i32 %y, i32 %B 318 ret i32 %C 319} 320 321define i32 @select_lshr_icmp(i32 %x, i32 %y, i32 %z) { 322; CHECK-LABEL: @select_lshr_icmp( 323; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 0 324; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]] 325; CHECK-NEXT: ret i32 [[C]] 326; 327 %A = icmp eq i32 %x, 0 328 %B = lshr i32 %z, %x 329 %C = select i1 %A, i32 %B, i32 %y 330 ret i32 %C 331} 332 333define i32 @select_ashr_icmp(i32 %x, i32 %y, i32 %z) { 334; CHECK-LABEL: @select_ashr_icmp( 335; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], 0 336; CHECK-NEXT: call void @use2(i1 [[A]]) 337; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[Y:%.*]], i32 [[Z:%.*]] 338; CHECK-NEXT: ret i32 [[C]] 339; 340 %A = icmp ne i32 %x, 0 341 call void @use2(i1 %A) ; thwart predicate canonicalization 342 %B = ashr i32 %z, %x 343 %C = select i1 %A, i32 %y, i32 %B 344 ret i32 %C 345} 346 347define i32 @select_udiv_icmp(i32 %x, i32 %y, i32 %z) { 348; CHECK-LABEL: @select_udiv_icmp( 349; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 1 350; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]] 351; CHECK-NEXT: ret i32 [[C]] 352; 353 %A = icmp eq i32 %x, 1 354 %B = udiv i32 %z, %x 355 %C = select i1 %A, i32 %B, i32 %y 356 ret i32 %C 357} 358 359define i32 @select_sdiv_icmp(i32 %x, i32 %y, i32 %z) { 360; CHECK-LABEL: @select_sdiv_icmp( 361; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], 1 362; CHECK-NEXT: call void @use2(i1 [[A]]) 363; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[Y:%.*]], i32 [[Z:%.*]] 364; CHECK-NEXT: ret i32 [[C]] 365; 366 %A = icmp ne i32 %x, 1 367 call void @use2(i1 %A) ; thwart predicate canonicalization 368 %B = sdiv i32 %z, %x 369 %C = select i1 %A, i32 %y, i32 %B 370 ret i32 %C 371} 372 373; Negative tests 374define i32 @select_xor_icmp_bad_1(i32 %x, i32 %y, i32 %z, i32 %k) { 375; CHECK-LABEL: @select_xor_icmp_bad_1( 376; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[K:%.*]] 377; CHECK-NEXT: [[B:%.*]] = xor i32 [[X]], [[Z:%.*]] 378; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]] 379; CHECK-NEXT: ret i32 [[C]] 380; 381 %A = icmp eq i32 %x, %k 382 %B = xor i32 %x, %z 383 %C = select i1 %A, i32 %B, i32 %y 384 ret i32 %C 385} 386 387define i32 @select_xor_icmp_bad_2(i32 %x, i32 %y, i32 %z, i32 %k) { 388; CHECK-LABEL: @select_xor_icmp_bad_2( 389; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 0 390; CHECK-NEXT: [[B:%.*]] = xor i32 [[K:%.*]], [[Z:%.*]] 391; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]] 392; CHECK-NEXT: ret i32 [[C]] 393; 394 %A = icmp eq i32 %x, 0 395 %B = xor i32 %k, %z 396 %C = select i1 %A, i32 %B, i32 %y 397 ret i32 %C 398} 399 400define i32 @select_xor_icmp_bad_3(i32 %x, i32 %y, i32 %z) { 401; CHECK-LABEL: @select_xor_icmp_bad_3( 402; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 3 403; CHECK-NEXT: [[B:%.*]] = xor i32 [[X]], [[Z:%.*]] 404; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]] 405; CHECK-NEXT: ret i32 [[C]] 406; 407 %A = icmp eq i32 %x, 3 408 %B = xor i32 %x, %z 409 %C = select i1 %A, i32 %B, i32 %y 410 ret i32 %C 411} 412 413define i32 @select_xor_fcmp_bad_4(i32 %x, i32 %y, i32 %z, float %k) { 414; CHECK-LABEL: @select_xor_fcmp_bad_4( 415; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[K:%.*]], 0.000000e+00 416; CHECK-NEXT: [[B:%.*]] = xor i32 [[X:%.*]], [[Z:%.*]] 417; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]] 418; CHECK-NEXT: ret i32 [[C]] 419; 420 %A = fcmp oeq float %k, 0.0 421 %B = xor i32 %x, %z 422 %C = select i1 %A, i32 %B, i32 %y 423 ret i32 %C 424} 425 426define i32 @select_xor_icmp_bad_5(i32 %x, i32 %y, i32 %z) { 427; CHECK-LABEL: @select_xor_icmp_bad_5( 428; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 0 429; CHECK-NEXT: [[B:%.*]] = xor i32 [[X]], [[Z:%.*]] 430; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[Y:%.*]], i32 [[B]] 431; CHECK-NEXT: ret i32 [[C]] 432; 433 %A = icmp ne i32 %x, 0 434 %B = xor i32 %x, %z 435 %C = select i1 %A, i32 %B, i32 %y 436 ret i32 %C 437} 438 439define i32 @select_xor_icmp_bad_6(i32 %x, i32 %y, i32 %z) { 440; CHECK-LABEL: @select_xor_icmp_bad_6( 441; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 1 442; CHECK-NEXT: [[B:%.*]] = xor i32 [[X]], [[Z:%.*]] 443; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]] 444; CHECK-NEXT: ret i32 [[C]] 445; 446 %A = icmp ne i32 %x, 1 447 %B = xor i32 %x, %z 448 %C = select i1 %A, i32 %y, i32 %B 449 ret i32 %C 450} 451 452define <2 x i8> @select_xor_icmp_vec_bad(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) { 453; CHECK-LABEL: @select_xor_icmp_vec_bad( 454; CHECK-NEXT: [[A:%.*]] = icmp eq <2 x i8> [[X:%.*]], <i8 5, i8 3> 455; CHECK-NEXT: [[B:%.*]] = xor <2 x i8> [[X]], [[Z:%.*]] 456; CHECK-NEXT: [[C:%.*]] = select <2 x i1> [[A]], <2 x i8> [[B]], <2 x i8> [[Y:%.*]] 457; CHECK-NEXT: ret <2 x i8> [[C]] 458; 459 %A = icmp eq <2 x i8> %x, <i8 5, i8 3> 460 %B = xor <2 x i8> %x, %z 461 %C = select <2 x i1> %A, <2 x i8> %B, <2 x i8> %y 462 ret <2 x i8> %C 463} 464 465; TODO: support for undefs, check for an identity constant does not handle them yet 466define <2 x i8> @select_xor_icmp_vec_bad_2(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) { 467; CHECK-LABEL: @select_xor_icmp_vec_bad_2( 468; CHECK-NEXT: [[A:%.*]] = icmp eq <2 x i8> [[X:%.*]], <i8 0, i8 undef> 469; CHECK-NEXT: [[B:%.*]] = xor <2 x i8> [[X]], [[Z:%.*]] 470; CHECK-NEXT: [[C:%.*]] = select <2 x i1> [[A]], <2 x i8> [[B]], <2 x i8> [[Y:%.*]] 471; CHECK-NEXT: ret <2 x i8> [[C]] 472; 473 %A = icmp eq <2 x i8> %x, <i8 0, i8 undef> 474 %B = xor <2 x i8> %x, %z 475 %C = select <2 x i1> %A, <2 x i8> %B, <2 x i8> %y 476 ret <2 x i8> %C 477} 478 479define i32 @select_mul_icmp_bad(i32 %x, i32 %y, i32 %z, i32 %k) { 480; CHECK-LABEL: @select_mul_icmp_bad( 481; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 3 482; CHECK-NEXT: [[B:%.*]] = mul i32 [[X]], [[Z:%.*]] 483; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]] 484; CHECK-NEXT: ret i32 [[C]] 485; 486 %A = icmp eq i32 %x, 3 487 %B = mul i32 %x, %z 488 %C = select i1 %A, i32 %B, i32 %y 489 ret i32 %C 490} 491 492define i32 @select_add_icmp_bad(i32 %x, i32 %y, i32 %z) { 493; CHECK-LABEL: @select_add_icmp_bad( 494; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 1 495; CHECK-NEXT: [[B:%.*]] = add i32 [[X]], [[Z:%.*]] 496; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]] 497; CHECK-NEXT: ret i32 [[C]] 498; 499 %A = icmp eq i32 %x, 1 500 %B = add i32 %x, %z 501 %C = select i1 %A, i32 %B, i32 %y 502 ret i32 %C 503} 504 505define i32 @select_and_icmp_bad(i32 %x, i32 %y, i32 %z) { 506; CHECK-LABEL: @select_and_icmp_bad( 507; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 0 508; CHECK-NEXT: [[B:%.*]] = and i32 [[X]], [[Z:%.*]] 509; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]] 510; CHECK-NEXT: ret i32 [[C]] 511; 512 %A = icmp eq i32 %x, 0 513 %B = and i32 %x, %z 514 %C = select i1 %A, i32 %B, i32 %y 515 ret i32 %C 516} 517 518define i32 @select_or_icmp_bad(i32 %x, i32 %y, i32 %z) { 519; CHECK-LABEL: @select_or_icmp_bad( 520; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 3 521; CHECK-NEXT: [[B:%.*]] = or i32 [[X]], [[Z:%.*]] 522; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]] 523; CHECK-NEXT: ret i32 [[C]] 524; 525 %A = icmp eq i32 %x, 3 526 %B = or i32 %x, %z 527 %C = select i1 %A, i32 %B, i32 %y 528 ret i32 %C 529} 530 531; Invalid identity constant for FP op 532define float @select_fadd_fcmp_bad(float %x, float %y, float %z) { 533; CHECK-LABEL: @select_fadd_fcmp_bad( 534; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], -1.000000e+00 535; CHECK-NEXT: [[B:%.*]] = fadd nsz float [[X]], [[Z:%.*]] 536; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]] 537; CHECK-NEXT: ret float [[C]] 538; 539 %A = fcmp oeq float %x, -1.0 540 %B = fadd nsz float %x, %z 541 %C = select i1 %A, float %B, float %y 542 ret float %C 543} 544 545; Invalid comparison type 546define float @select_fadd_fcmp_bad_2(float %x, float %y, float %z) { 547; CHECK-LABEL: @select_fadd_fcmp_bad_2( 548; CHECK-NEXT: [[A:%.*]] = fcmp ueq float [[X:%.*]], -1.000000e+00 549; CHECK-NEXT: [[B:%.*]] = fadd float [[X]], [[Z:%.*]] 550; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]] 551; CHECK-NEXT: ret float [[C]] 552; 553 %A = fcmp ueq float %x, -1.0 554 %B = fadd float %x, %z 555 %C = select i1 %A, float %B, float %y 556 ret float %C 557} 558 559; Invalid comparison type 560define float @select_fadd_fcmp_bad_3(float %x, float %y, float %z, float %k) { 561; CHECK-LABEL: @select_fadd_fcmp_bad_3( 562; CHECK-NEXT: [[A:%.*]] = fcmp one float [[X:%.*]], [[K:%.*]] 563; CHECK-NEXT: [[B:%.*]] = fadd float [[X]], [[Z:%.*]] 564; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]] 565; CHECK-NEXT: ret float [[C]] 566; 567 %A = fcmp one float %x, %k 568 %B = fadd float %x, %z 569 %C = select i1 %A, float %y, float %B 570 ret float %C 571} 572 573; Invalid order of operands of select 574define float @select_fadd_fcmp_bad_4(float %x, float %y, float %z) { 575; CHECK-LABEL: @select_fadd_fcmp_bad_4( 576; CHECK-NEXT: [[A:%.*]] = fcmp une float [[X:%.*]], -0.000000e+00 577; CHECK-NEXT: [[B:%.*]] = fadd float [[X]], [[Z:%.*]] 578; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]] 579; CHECK-NEXT: ret float [[C]] 580; 581 %A = fcmp une float %x, -0.0 582 %B = fadd float %x, %z 583 %C = select i1 %A, float %B, float %y 584 ret float %C 585} 586 587; Invalid comparison type 588define float @select_fadd_fcmp_bad_5(float %x, float %y, float %z) { 589; CHECK-LABEL: @select_fadd_fcmp_bad_5( 590; CHECK-NEXT: [[A:%.*]] = fcmp one float [[X:%.*]], -0.000000e+00 591; CHECK-NEXT: [[B:%.*]] = fadd nsz float [[Z:%.*]], [[X]] 592; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]] 593; CHECK-NEXT: ret float [[C]] 594; 595 %A = fcmp one float %x, -0.0 596 %B = fadd nsz float %z, %x 597 %C = select i1 %A, float %y, float %B 598 ret float %C 599} 600 601; Invalid order of operands of select 602define float @select_fadd_fcmp_bad_6(float %x, float %y, float %z) { 603; CHECK-LABEL: @select_fadd_fcmp_bad_6( 604; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], -0.000000e+00 605; CHECK-NEXT: [[B:%.*]] = fadd nsz float [[Z:%.*]], [[X]] 606; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]] 607; CHECK-NEXT: ret float [[C]] 608; 609 %A = fcmp oeq float %x, -0.0 610 %B = fadd nsz float %z, %x 611 %C = select i1 %A, float %y, float %B 612 ret float %C 613} 614 615; Do not transform if we have signed zeros and if Z is possibly negative zero 616define float @select_fadd_fcmp_bad_7(float %x, float %y, float %z) { 617; CHECK-LABEL: @select_fadd_fcmp_bad_7( 618; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], -0.000000e+00 619; CHECK-NEXT: [[B:%.*]] = fadd float [[X]], [[Z:%.*]] 620; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]] 621; CHECK-NEXT: ret float [[C]] 622; 623 %A = fcmp oeq float %x, -0.0 624 %B = fadd float %x, %z 625 %C = select i1 %A, float %B, float %y 626 ret float %C 627} 628 629; Invalid comparison type 630define float @select_fadd_fcmp_bad_8(float %x, float %y, float %v) { 631; CHECK-LABEL: @select_fadd_fcmp_bad_8( 632; CHECK-NEXT: [[A:%.*]] = fcmp one float [[X:%.*]], -0.000000e+00 633; CHECK-NEXT: [[Z:%.*]] = fadd float [[V:%.*]], -1.000000e+00 634; CHECK-NEXT: [[B:%.*]] = fadd float [[Z]], [[X]] 635; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]] 636; CHECK-NEXT: ret float [[C]] 637; 638 %A = fcmp one float %x, -0.0 639 %z = fadd float %v, -1.0 640 %B = fadd float %z, %x 641 %C = select i1 %A, float %y, float %B 642 ret float %C 643} 644 645; Invalid comparison type 646define float @select_fadd_fcmp_bad_9(float %x, float %y, float %z) { 647; CHECK-LABEL: @select_fadd_fcmp_bad_9( 648; CHECK-NEXT: [[A:%.*]] = fcmp one float [[X:%.*]], -0.000000e+00 649; CHECK-NEXT: [[B:%.*]] = fadd nsz float [[Z:%.*]], [[X]] 650; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]] 651; CHECK-NEXT: ret float [[C]] 652; 653 %A = fcmp one float %x, -0.0 654 %B = fadd nsz float %z, %x 655 %C = select i1 %A, float %y, float %B 656 ret float %C 657} 658 659; Invalid comparison type 660define float @select_fadd_fcmp_bad_10(float %x, float %y, float %v) { 661; CHECK-LABEL: @select_fadd_fcmp_bad_10( 662; CHECK-NEXT: [[A:%.*]] = fcmp one float [[X:%.*]], -0.000000e+00 663; CHECK-NEXT: [[Z:%.*]] = fadd float [[V:%.*]], 0.000000e+00 664; CHECK-NEXT: [[B:%.*]] = fadd float [[Z]], [[X]] 665; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]] 666; CHECK-NEXT: ret float [[C]] 667; 668 %A = fcmp one float %x, -0.0 669 %z = fadd float %v, 0.0 ; cannot produce -0.0 670 %B = fadd float %z, %x 671 %C = select i1 %A, float %y, float %B 672 ret float %C 673} 674 675; Do not transform if Z is possibly negative zero 676define float @select_fadd_fcmp_bad_11(float %x, float %y, float %v) { 677; CHECK-LABEL: @select_fadd_fcmp_bad_11( 678; CHECK-NEXT: [[A:%.*]] = fcmp une float [[X:%.*]], -0.000000e+00 679; CHECK-NEXT: [[Z:%.*]] = fadd float [[V:%.*]], -1.000000e+00 680; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[Z]] 681; CHECK-NEXT: ret float [[C]] 682; 683 %A = fcmp une float %x, -0.0 684 %z = fadd float %v, -1.0 685 %B = fadd nsz float %z, %x 686 %C = select i1 %A, float %y, float %B 687 ret float %C 688} 689 690; Do not transform if we have signed zeros and if Z is possibly negative zero 691define float @select_fadd_fcmp_bad_12(float %x, float %y, float %z) { 692; CHECK-LABEL: @select_fadd_fcmp_bad_12( 693; CHECK-NEXT: [[A:%.*]] = fcmp une float [[X:%.*]], -0.000000e+00 694; CHECK-NEXT: [[B:%.*]] = fadd float [[Z:%.*]], [[X]] 695; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]] 696; CHECK-NEXT: ret float [[C]] 697; 698 %A = fcmp une float %x, -0.0 699 %B = fadd float %z, %x 700 %C = select i1 %A, float %y, float %B 701 ret float %C 702} 703 704; Invalid order of operands of select 705define float @select_fadd_fcmp_bad_13(float %x, float %y, float %z) { 706; CHECK-LABEL: @select_fadd_fcmp_bad_13( 707; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], -0.000000e+00 708; CHECK-NEXT: [[B:%.*]] = fadd nsz float [[X]], [[Z:%.*]] 709; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]] 710; CHECK-NEXT: ret float [[C]] 711; 712 %A = fcmp oeq float %x, -0.0 713 %B = fadd nsz float %x, %z 714 %C = select i1 %A, float %y, float %B 715 ret float %C 716} 717 718; Invalid identity constant for FP op 719define float @select_fadd_fcmp_bad_14(float %x, float %y, float %z) { 720; CHECK-LABEL: @select_fadd_fcmp_bad_14( 721; CHECK-NEXT: [[A:%.*]] = fcmp une float [[X:%.*]], -1.000000e+00 722; CHECK-NEXT: [[B:%.*]] = fadd nsz float [[X]], [[Z:%.*]] 723; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]] 724; CHECK-NEXT: ret float [[C]] 725; 726 %A = fcmp une float %x, -1.0 727 %B = fadd nsz float %x, %z 728 %C = select i1 %A, float %y, float %B 729 ret float %C 730} 731 732; Invalid identity constant for FP op 733define float @select_fadd_fcmp_bad_15(float %x, float %y, float %z) { 734; CHECK-LABEL: @select_fadd_fcmp_bad_15( 735; CHECK-NEXT: [[A:%.*]] = fcmp une float [[X:%.*]], 0.000000e+00 736; CHECK-NEXT: [[B:%.*]] = fadd nsz float [[Z:%.*]], [[X]] 737; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]] 738; CHECK-NEXT: ret float [[C]] 739; 740 %A = fcmp une float %x, 0.0 741 %B = fadd nsz float %z, %x 742 %C = select i1 %A, float %y, float %B 743 ret float %C 744} 745 746; Invalid identity constant for FP op 747define float @select_fadd_fcmp_bad_16(float %x, float %y, float %z) { 748; CHECK-LABEL: @select_fadd_fcmp_bad_16( 749; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 750; CHECK-NEXT: [[B:%.*]] = fadd nsz float [[Z:%.*]], [[X]] 751; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]] 752; CHECK-NEXT: ret float [[C]] 753; 754 %A = fcmp oeq float %x, 0.0 755 %B = fadd nsz float %z, %x 756 %C = select i1 %A, float %B, float %y 757 ret float %C 758} 759 760define float @select_fmul_fcmp_bad(float %x, float %y, float %z) { 761; CHECK-LABEL: @select_fmul_fcmp_bad( 762; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], 3.000000e+00 763; CHECK-NEXT: [[B:%.*]] = fmul nsz float [[X]], [[Z:%.*]] 764; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]] 765; CHECK-NEXT: ret float [[C]] 766; 767 %A = fcmp oeq float %x, 3.0 768 %B = fmul nsz float %x, %z 769 %C = select i1 %A, float %B, float %y 770 ret float %C 771} 772 773define float @select_fmul_fcmp_bad_2(float %x, float %y, float %z) { 774; CHECK-LABEL: @select_fmul_fcmp_bad_2( 775; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], 1.000000e+00 776; CHECK-NEXT: [[B:%.*]] = fmul float [[X]], [[Z:%.*]] 777; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]] 778; CHECK-NEXT: ret float [[C]] 779; 780 %A = fcmp oeq float %x, 1.0 781 %B = fmul float %x, %z 782 %C = select i1 %A, float %B, float %y 783 ret float %C 784} 785 786define float @select_fmul_icmp_bad(float %x, float %y, float %z, i32 %k) { 787; CHECK-LABEL: @select_fmul_icmp_bad( 788; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[K:%.*]], 0 789; CHECK-NEXT: [[B:%.*]] = fmul float [[X:%.*]], [[Z:%.*]] 790; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]] 791; CHECK-NEXT: ret float [[C]] 792; 793 %A = icmp eq i32 %k, 0 794 %B = fmul float %x, %z 795 %C = select i1 %A, float %B, float %y 796 ret float %C 797} 798 799define float @select_fmul_icmp_bad_2(float %x, float %y, float %z, i32 %k) { 800; CHECK-LABEL: @select_fmul_icmp_bad_2( 801; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[K:%.*]], 0 802; CHECK-NEXT: [[B:%.*]] = fmul nsz float [[X:%.*]], [[Z:%.*]] 803; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]] 804; CHECK-NEXT: ret float [[C]] 805; 806 %A = icmp eq i32 %k, 0 807 %B = fmul nsz float %x, %z 808 %C = select i1 %A, float %B, float %y 809 ret float %C 810} 811 812define float @select_fdiv_fcmp_bad(float %x, float %y, float %z) { 813; CHECK-LABEL: @select_fdiv_fcmp_bad( 814; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], 1.000000e+00 815; CHECK-NEXT: [[B:%.*]] = fdiv float [[X]], [[Z:%.*]] 816; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]] 817; CHECK-NEXT: ret float [[C]] 818; 819 %A = fcmp oeq float %x, 1.0 820 %B = fdiv float %x, %z 821 %C = select i1 %A, float %B, float %y 822 ret float %C 823} 824 825define float @select_fdiv_fcmp_bad_2(float %x, float %y, float %z) { 826; CHECK-LABEL: @select_fdiv_fcmp_bad_2( 827; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], 3.000000e+00 828; CHECK-NEXT: [[B:%.*]] = fdiv nsz float [[X]], [[Z:%.*]] 829; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]] 830; CHECK-NEXT: ret float [[C]] 831; 832 %A = fcmp oeq float %x, 3.0 833 %B = fdiv nsz float %x, %z 834 %C = select i1 %A, float %B, float %y 835 ret float %C 836} 837 838define float @select_fsub_fcmp_bad(float %x, float %y, float %z) { 839; CHECK-LABEL: @select_fsub_fcmp_bad( 840; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00 841; CHECK-NEXT: [[B:%.*]] = fsub float [[X]], [[Z:%.*]] 842; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]] 843; CHECK-NEXT: ret float [[C]] 844; 845 %A = fcmp oeq float %x, 0.0 846 %B = fsub float %x, %z 847 %C = select i1 %A, float %B, float %y 848 ret float %C 849} 850 851define float @select_fsub_fcmp_bad_2(float %x, float %y, float %z) { 852; CHECK-LABEL: @select_fsub_fcmp_bad_2( 853; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], 1.000000e+00 854; CHECK-NEXT: [[B:%.*]] = fsub nsz float [[X]], [[Z:%.*]] 855; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]] 856; CHECK-NEXT: ret float [[C]] 857; 858 %A = fcmp oeq float %x, 1.0 859 %B = fsub nsz float %x, %z 860 %C = select i1 %A, float %B, float %y 861 ret float %C 862} 863 864define i32 @select_sub_icmp_bad(i32 %x, i32 %y, i32 %z) { 865; CHECK-LABEL: @select_sub_icmp_bad( 866; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 0 867; CHECK-NEXT: [[B:%.*]] = sub i32 [[X]], [[Z:%.*]] 868; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]] 869; CHECK-NEXT: ret i32 [[C]] 870; 871 %A = icmp eq i32 %x, 0 872 %B = sub i32 %x, %z 873 %C = select i1 %A, i32 %B, i32 %y 874 ret i32 %C 875} 876 877define i32 @select_sub_icmp_bad_2(i32 %x, i32 %y, i32 %z) { 878; CHECK-LABEL: @select_sub_icmp_bad_2( 879; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 1 880; CHECK-NEXT: [[B:%.*]] = sub i32 [[Z:%.*]], [[X]] 881; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]] 882; CHECK-NEXT: ret i32 [[C]] 883; 884 %A = icmp eq i32 %x, 1 885 %B = sub i32 %z, %x 886 %C = select i1 %A, i32 %B, i32 %y 887 ret i32 %C 888} 889 890define i32 @select_sub_icmp_bad_3(i32 %x, i32 %y, i32 %z) { 891; CHECK-LABEL: @select_sub_icmp_bad_3( 892; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], 0 893; CHECK-NEXT: call void @use2(i1 [[A]]) 894; CHECK-NEXT: [[B:%.*]] = sub i32 [[Z:%.*]], [[X]] 895; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]] 896; CHECK-NEXT: ret i32 [[C]] 897; 898 %A = icmp ne i32 %x, 0 899 call void @use2(i1 %A) 900 %B = sub i32 %z, %x 901 %C = select i1 %A, i32 %B, i32 %y 902 ret i32 %C 903} 904 905define i32 @select_sub_icmp_4(i32 %x, i32 %y, i32 %z) { 906; CHECK-LABEL: @select_sub_icmp_4( 907; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], 0 908; CHECK-NEXT: call void @use2(i1 [[A]]) 909; CHECK-NEXT: [[B:%.*]] = sub i32 [[Z:%.*]], [[X]] 910; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]] 911; CHECK-NEXT: ret i32 [[C]] 912; 913 %A = icmp ne i32 %x, 0 914 call void @use2(i1 %A) 915 %B = sub i32 %z, %x 916 %C = select i1 %A, i32 %B, i32 %y 917 ret i32 %C 918} 919 920define i32 @select_sub_icmp_bad_4(i32 %x, i32 %y, i32 %z, i32 %k) { 921; CHECK-LABEL: @select_sub_icmp_bad_4( 922; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 0 923; CHECK-NEXT: [[B:%.*]] = sub i32 [[Z:%.*]], [[K:%.*]] 924; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]] 925; CHECK-NEXT: ret i32 [[C]] 926; 927 %A = icmp eq i32 %x, 0 928 %B = sub i32 %z, %k 929 %C = select i1 %A, i32 %B, i32 %y 930 ret i32 %C 931} 932 933define i32 @select_sub_icmp_bad_5(i32 %x, i32 %y, i32 %z, i32 %k) { 934; CHECK-LABEL: @select_sub_icmp_bad_5( 935; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[K:%.*]] 936; CHECK-NEXT: [[B:%.*]] = sub i32 [[Z:%.*]], [[X]] 937; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]] 938; CHECK-NEXT: ret i32 [[C]] 939; 940 %A = icmp eq i32 %x, %k 941 %B = sub i32 %z, %x 942 %C = select i1 %A, i32 %B, i32 %y 943 ret i32 %C 944} 945 946define i32 @select_shl_icmp_bad(i32 %x, i32 %y, i32 %z) { 947; CHECK-LABEL: @select_shl_icmp_bad( 948; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 1 949; CHECK-NEXT: [[B:%.*]] = shl i32 [[Z:%.*]], [[X]] 950; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]] 951; CHECK-NEXT: ret i32 [[C]] 952; 953 %A = icmp eq i32 %x, 1 954 %B = shl i32 %z, %x 955 %C = select i1 %A, i32 %B, i32 %y 956 ret i32 %C 957} 958 959define i32 @select_lshr_icmp_bad(i32 %x, i32 %y, i32 %z) { 960; CHECK-LABEL: @select_lshr_icmp_bad( 961; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 1 962; CHECK-NEXT: [[B:%.*]] = lshr i32 [[Z:%.*]], [[X]] 963; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]] 964; CHECK-NEXT: ret i32 [[C]] 965; 966 %A = icmp eq i32 %x, 1 967 %B = lshr i32 %z, %x 968 %C = select i1 %A, i32 %B, i32 %y 969 ret i32 %C 970} 971 972define i32 @select_ashr_icmp_bad(i32 %x, i32 %y, i32 %z) { 973; CHECK-LABEL: @select_ashr_icmp_bad( 974; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 1 975; CHECK-NEXT: [[B:%.*]] = ashr i32 [[Z:%.*]], [[X]] 976; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]] 977; CHECK-NEXT: ret i32 [[C]] 978; 979 %A = icmp eq i32 %x, 1 980 %B = ashr i32 %z, %x 981 %C = select i1 %A, i32 %B, i32 %y 982 ret i32 %C 983} 984 985define i32 @select_udiv_icmp_bad(i32 %x, i32 %y, i32 %z) { 986; CHECK-LABEL: @select_udiv_icmp_bad( 987; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 3 988; CHECK-NEXT: [[B:%.*]] = udiv i32 [[Z:%.*]], [[X]] 989; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]] 990; CHECK-NEXT: ret i32 [[C]] 991; 992 %A = icmp eq i32 %x, 3 993 %B = udiv i32 %z, %x 994 %C = select i1 %A, i32 %B, i32 %y 995 ret i32 %C 996} 997 998define i32 @select_sdiv_icmp_bad(i32 %x, i32 %y, i32 %z) { 999; CHECK-LABEL: @select_sdiv_icmp_bad( 1000; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], 3 1001; CHECK-NEXT: [[B:%.*]] = sdiv i32 [[Z:%.*]], [[X]] 1002; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]] 1003; CHECK-NEXT: ret i32 [[C]] 1004; 1005 %A = icmp eq i32 %x, 3 1006 %B = sdiv i32 %z, %x 1007 %C = select i1 %A, i32 %B, i32 %y 1008 ret i32 %C 1009} 1010 1011!0 = !{!"branch_weights", i32 2, i32 10} 1012