1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs -mattr=+isel | FileCheck %s --check-prefix=ALL --check-prefix=ISEL 3; RUN: llc < %s -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs -mattr=-isel | FileCheck %s --check-prefix=ALL --check-prefix=NO_ISEL 4 5; Select of constants: control flow / conditional moves can always be replaced by logic+math (but may not be worth it?). 6; Test the zeroext/signext variants of each pattern to see if that makes a difference. 7 8; select Cond, 0, 1 --> zext (!Cond) 9 10define i32 @select_0_or_1(i1 %cond) { 11; ALL-LABEL: select_0_or_1: 12; ALL: # %bb.0: 13; ALL-NEXT: not 3, 3 14; ALL-NEXT: clrldi 3, 3, 63 15; ALL-NEXT: blr 16 %sel = select i1 %cond, i32 0, i32 1 17 ret i32 %sel 18} 19 20define i32 @select_0_or_1_zeroext(i1 zeroext %cond) { 21; ALL-LABEL: select_0_or_1_zeroext: 22; ALL: # %bb.0: 23; ALL-NEXT: xori 3, 3, 1 24; ALL-NEXT: blr 25 %sel = select i1 %cond, i32 0, i32 1 26 ret i32 %sel 27} 28 29define i32 @select_0_or_1_signext(i1 signext %cond) { 30; ALL-LABEL: select_0_or_1_signext: 31; ALL: # %bb.0: 32; ALL-NEXT: not 3, 3 33; ALL-NEXT: clrldi 3, 3, 63 34; ALL-NEXT: blr 35 %sel = select i1 %cond, i32 0, i32 1 36 ret i32 %sel 37} 38 39; select Cond, 1, 0 --> zext (Cond) 40 41define i32 @select_1_or_0(i1 %cond) { 42; ALL-LABEL: select_1_or_0: 43; ALL: # %bb.0: 44; ALL-NEXT: clrldi 3, 3, 63 45; ALL-NEXT: blr 46 %sel = select i1 %cond, i32 1, i32 0 47 ret i32 %sel 48} 49 50define i32 @select_1_or_0_zeroext(i1 zeroext %cond) { 51; ALL-LABEL: select_1_or_0_zeroext: 52; ALL: # %bb.0: 53; ALL-NEXT: blr 54 %sel = select i1 %cond, i32 1, i32 0 55 ret i32 %sel 56} 57 58define i32 @select_1_or_0_signext(i1 signext %cond) { 59; ALL-LABEL: select_1_or_0_signext: 60; ALL: # %bb.0: 61; ALL-NEXT: clrldi 3, 3, 63 62; ALL-NEXT: blr 63 %sel = select i1 %cond, i32 1, i32 0 64 ret i32 %sel 65} 66 67; select Cond, 0, -1 --> sext (!Cond) 68 69define i32 @select_0_or_neg1(i1 %cond) { 70; ISEL-LABEL: select_0_or_neg1: 71; ISEL: # %bb.0: 72; ISEL-NEXT: li 4, 0 73; ISEL-NEXT: andi. 3, 3, 1 74; ISEL-NEXT: oris 3, 4, 65535 75; ISEL-NEXT: ori 3, 3, 65535 76; ISEL-NEXT: isel 3, 0, 3, 1 77; ISEL-NEXT: blr 78; 79; NO_ISEL-LABEL: select_0_or_neg1: 80; NO_ISEL: # %bb.0: 81; NO_ISEL-NEXT: li 4, 0 82; NO_ISEL-NEXT: andi. 3, 3, 1 83; NO_ISEL-NEXT: oris 3, 4, 65535 84; NO_ISEL-NEXT: ori 3, 3, 65535 85; NO_ISEL-NEXT: bc 12, 1, .LBB6_1 86; NO_ISEL-NEXT: blr 87; NO_ISEL-NEXT: .LBB6_1: 88; NO_ISEL-NEXT: addi 3, 0, 0 89; NO_ISEL-NEXT: blr 90 %sel = select i1 %cond, i32 0, i32 -1 91 ret i32 %sel 92} 93 94define i32 @select_0_or_neg1_zeroext(i1 zeroext %cond) { 95; ISEL-LABEL: select_0_or_neg1_zeroext: 96; ISEL: # %bb.0: 97; ISEL-NEXT: li 4, 0 98; ISEL-NEXT: andi. 3, 3, 1 99; ISEL-NEXT: oris 3, 4, 65535 100; ISEL-NEXT: ori 3, 3, 65535 101; ISEL-NEXT: isel 3, 0, 3, 1 102; ISEL-NEXT: blr 103; 104; NO_ISEL-LABEL: select_0_or_neg1_zeroext: 105; NO_ISEL: # %bb.0: 106; NO_ISEL-NEXT: li 4, 0 107; NO_ISEL-NEXT: andi. 3, 3, 1 108; NO_ISEL-NEXT: oris 3, 4, 65535 109; NO_ISEL-NEXT: ori 3, 3, 65535 110; NO_ISEL-NEXT: bc 12, 1, .LBB7_1 111; NO_ISEL-NEXT: blr 112; NO_ISEL-NEXT: .LBB7_1: 113; NO_ISEL-NEXT: addi 3, 0, 0 114; NO_ISEL-NEXT: blr 115 %sel = select i1 %cond, i32 0, i32 -1 116 ret i32 %sel 117} 118 119define i32 @select_0_or_neg1_signext(i1 signext %cond) { 120; ISEL-LABEL: select_0_or_neg1_signext: 121; ISEL: # %bb.0: 122; ISEL-NEXT: li 4, 0 123; ISEL-NEXT: andi. 3, 3, 1 124; ISEL-NEXT: oris 3, 4, 65535 125; ISEL-NEXT: ori 3, 3, 65535 126; ISEL-NEXT: isel 3, 0, 3, 1 127; ISEL-NEXT: blr 128; 129; NO_ISEL-LABEL: select_0_or_neg1_signext: 130; NO_ISEL: # %bb.0: 131; NO_ISEL-NEXT: li 4, 0 132; NO_ISEL-NEXT: andi. 3, 3, 1 133; NO_ISEL-NEXT: oris 3, 4, 65535 134; NO_ISEL-NEXT: ori 3, 3, 65535 135; NO_ISEL-NEXT: bc 12, 1, .LBB8_1 136; NO_ISEL-NEXT: blr 137; NO_ISEL-NEXT: .LBB8_1: 138; NO_ISEL-NEXT: addi 3, 0, 0 139; NO_ISEL-NEXT: blr 140 %sel = select i1 %cond, i32 0, i32 -1 141 ret i32 %sel 142} 143 144; select Cond, -1, 0 --> sext (Cond) 145 146define i32 @select_neg1_or_0(i1 %cond) { 147; ISEL-LABEL: select_neg1_or_0: 148; ISEL: # %bb.0: 149; ISEL-NEXT: li 4, 0 150; ISEL-NEXT: andi. 3, 3, 1 151; ISEL-NEXT: oris 3, 4, 65535 152; ISEL-NEXT: ori 3, 3, 65535 153; ISEL-NEXT: isel 3, 3, 4, 1 154; ISEL-NEXT: blr 155; 156; NO_ISEL-LABEL: select_neg1_or_0: 157; NO_ISEL: # %bb.0: 158; NO_ISEL-NEXT: li 4, 0 159; NO_ISEL-NEXT: andi. 3, 3, 1 160; NO_ISEL-NEXT: oris 3, 4, 65535 161; NO_ISEL-NEXT: ori 3, 3, 65535 162; NO_ISEL-NEXT: bclr 12, 1, 0 163; NO_ISEL-NEXT: # %bb.1: 164; NO_ISEL-NEXT: ori 3, 4, 0 165; NO_ISEL-NEXT: blr 166 %sel = select i1 %cond, i32 -1, i32 0 167 ret i32 %sel 168} 169 170define i32 @select_neg1_or_0_zeroext(i1 zeroext %cond) { 171; ISEL-LABEL: select_neg1_or_0_zeroext: 172; ISEL: # %bb.0: 173; ISEL-NEXT: li 4, 0 174; ISEL-NEXT: andi. 3, 3, 1 175; ISEL-NEXT: oris 3, 4, 65535 176; ISEL-NEXT: ori 3, 3, 65535 177; ISEL-NEXT: isel 3, 3, 4, 1 178; ISEL-NEXT: blr 179; 180; NO_ISEL-LABEL: select_neg1_or_0_zeroext: 181; NO_ISEL: # %bb.0: 182; NO_ISEL-NEXT: li 4, 0 183; NO_ISEL-NEXT: andi. 3, 3, 1 184; NO_ISEL-NEXT: oris 3, 4, 65535 185; NO_ISEL-NEXT: ori 3, 3, 65535 186; NO_ISEL-NEXT: bclr 12, 1, 0 187; NO_ISEL-NEXT: # %bb.1: 188; NO_ISEL-NEXT: ori 3, 4, 0 189; NO_ISEL-NEXT: blr 190 %sel = select i1 %cond, i32 -1, i32 0 191 ret i32 %sel 192} 193 194define i32 @select_neg1_or_0_signext(i1 signext %cond) { 195; ISEL-LABEL: select_neg1_or_0_signext: 196; ISEL: # %bb.0: 197; ISEL-NEXT: li 4, 0 198; ISEL-NEXT: andi. 3, 3, 1 199; ISEL-NEXT: oris 3, 4, 65535 200; ISEL-NEXT: ori 3, 3, 65535 201; ISEL-NEXT: isel 3, 3, 4, 1 202; ISEL-NEXT: blr 203; 204; NO_ISEL-LABEL: select_neg1_or_0_signext: 205; NO_ISEL: # %bb.0: 206; NO_ISEL-NEXT: li 4, 0 207; NO_ISEL-NEXT: andi. 3, 3, 1 208; NO_ISEL-NEXT: oris 3, 4, 65535 209; NO_ISEL-NEXT: ori 3, 3, 65535 210; NO_ISEL-NEXT: bclr 12, 1, 0 211; NO_ISEL-NEXT: # %bb.1: 212; NO_ISEL-NEXT: ori 3, 4, 0 213; NO_ISEL-NEXT: blr 214 %sel = select i1 %cond, i32 -1, i32 0 215 ret i32 %sel 216} 217 218; select Cond, C+1, C --> add (zext Cond), C 219 220define i32 @select_Cplus1_C(i1 %cond) { 221; ALL-LABEL: select_Cplus1_C: 222; ALL: # %bb.0: 223; ALL-NEXT: clrldi 3, 3, 63 224; ALL-NEXT: addi 3, 3, 41 225; ALL-NEXT: blr 226 %sel = select i1 %cond, i32 42, i32 41 227 ret i32 %sel 228} 229 230define i32 @select_Cplus1_C_zeroext(i1 zeroext %cond) { 231; ALL-LABEL: select_Cplus1_C_zeroext: 232; ALL: # %bb.0: 233; ALL-NEXT: addi 3, 3, 41 234; ALL-NEXT: blr 235 %sel = select i1 %cond, i32 42, i32 41 236 ret i32 %sel 237} 238 239define i32 @select_Cplus1_C_signext(i1 signext %cond) { 240; ALL-LABEL: select_Cplus1_C_signext: 241; ALL: # %bb.0: 242; ALL-NEXT: subfic 3, 3, 41 243; ALL-NEXT: blr 244 %sel = select i1 %cond, i32 42, i32 41 245 ret i32 %sel 246} 247 248; select Cond, C, C+1 --> add (sext Cond), C 249 250define i32 @select_C_Cplus1(i1 %cond) { 251; ALL-LABEL: select_C_Cplus1: 252; ALL: # %bb.0: 253; ALL-NEXT: clrldi 3, 3, 63 254; ALL-NEXT: subfic 3, 3, 42 255; ALL-NEXT: blr 256 %sel = select i1 %cond, i32 41, i32 42 257 ret i32 %sel 258} 259 260define i32 @select_C_Cplus1_zeroext(i1 zeroext %cond) { 261; ALL-LABEL: select_C_Cplus1_zeroext: 262; ALL: # %bb.0: 263; ALL-NEXT: subfic 3, 3, 42 264; ALL-NEXT: blr 265 %sel = select i1 %cond, i32 41, i32 42 266 ret i32 %sel 267} 268 269define i32 @select_C_Cplus1_signext(i1 signext %cond) { 270; ALL-LABEL: select_C_Cplus1_signext: 271; ALL: # %bb.0: 272; ALL-NEXT: addi 3, 3, 42 273; ALL-NEXT: blr 274 %sel = select i1 %cond, i32 41, i32 42 275 ret i32 %sel 276} 277 278; In general, select of 2 constants could be: 279; select Cond, C1, C2 --> add (mul (zext Cond), C1-C2), C2 --> add (and (sext Cond), C1-C2), C2 280 281define i32 @select_C1_C2(i1 %cond) { 282; ISEL-LABEL: select_C1_C2: 283; ISEL: # %bb.0: 284; ISEL-NEXT: andi. 3, 3, 1 285; ISEL-NEXT: li 4, 421 286; ISEL-NEXT: li 3, 42 287; ISEL-NEXT: isel 3, 4, 3, 1 288; ISEL-NEXT: blr 289; 290; NO_ISEL-LABEL: select_C1_C2: 291; NO_ISEL: # %bb.0: 292; NO_ISEL-NEXT: andi. 3, 3, 1 293; NO_ISEL-NEXT: li 4, 421 294; NO_ISEL-NEXT: li 3, 42 295; NO_ISEL-NEXT: bc 12, 1, .LBB18_1 296; NO_ISEL-NEXT: blr 297; NO_ISEL-NEXT: .LBB18_1: 298; NO_ISEL-NEXT: addi 3, 4, 0 299; NO_ISEL-NEXT: blr 300 %sel = select i1 %cond, i32 421, i32 42 301 ret i32 %sel 302} 303 304define i32 @select_C1_C2_zeroext(i1 zeroext %cond) { 305; ISEL-LABEL: select_C1_C2_zeroext: 306; ISEL: # %bb.0: 307; ISEL-NEXT: andi. 3, 3, 1 308; ISEL-NEXT: li 4, 421 309; ISEL-NEXT: li 3, 42 310; ISEL-NEXT: isel 3, 4, 3, 1 311; ISEL-NEXT: blr 312; 313; NO_ISEL-LABEL: select_C1_C2_zeroext: 314; NO_ISEL: # %bb.0: 315; NO_ISEL-NEXT: andi. 3, 3, 1 316; NO_ISEL-NEXT: li 4, 421 317; NO_ISEL-NEXT: li 3, 42 318; NO_ISEL-NEXT: bc 12, 1, .LBB19_1 319; NO_ISEL-NEXT: blr 320; NO_ISEL-NEXT: .LBB19_1: 321; NO_ISEL-NEXT: addi 3, 4, 0 322; NO_ISEL-NEXT: blr 323 %sel = select i1 %cond, i32 421, i32 42 324 ret i32 %sel 325} 326 327define i32 @select_C1_C2_signext(i1 signext %cond) { 328; ISEL-LABEL: select_C1_C2_signext: 329; ISEL: # %bb.0: 330; ISEL-NEXT: andi. 3, 3, 1 331; ISEL-NEXT: li 4, 421 332; ISEL-NEXT: li 3, 42 333; ISEL-NEXT: isel 3, 4, 3, 1 334; ISEL-NEXT: blr 335; 336; NO_ISEL-LABEL: select_C1_C2_signext: 337; NO_ISEL: # %bb.0: 338; NO_ISEL-NEXT: andi. 3, 3, 1 339; NO_ISEL-NEXT: li 4, 421 340; NO_ISEL-NEXT: li 3, 42 341; NO_ISEL-NEXT: bc 12, 1, .LBB20_1 342; NO_ISEL-NEXT: blr 343; NO_ISEL-NEXT: .LBB20_1: 344; NO_ISEL-NEXT: addi 3, 4, 0 345; NO_ISEL-NEXT: blr 346 %sel = select i1 %cond, i32 421, i32 42 347 ret i32 %sel 348} 349 350; A binary operator with constant after the select should always get folded into the select. 351 352define i8 @sel_constants_add_constant(i1 %cond) { 353; ISEL-LABEL: sel_constants_add_constant: 354; ISEL: # %bb.0: 355; ISEL-NEXT: andi. 3, 3, 1 356; ISEL-NEXT: li 4, 1 357; ISEL-NEXT: li 3, 28 358; ISEL-NEXT: isel 3, 4, 3, 1 359; ISEL-NEXT: blr 360; 361; NO_ISEL-LABEL: sel_constants_add_constant: 362; NO_ISEL: # %bb.0: 363; NO_ISEL-NEXT: andi. 3, 3, 1 364; NO_ISEL-NEXT: li 4, 1 365; NO_ISEL-NEXT: li 3, 28 366; NO_ISEL-NEXT: bc 12, 1, .LBB21_1 367; NO_ISEL-NEXT: blr 368; NO_ISEL-NEXT: .LBB21_1: 369; NO_ISEL-NEXT: addi 3, 4, 0 370; NO_ISEL-NEXT: blr 371 %sel = select i1 %cond, i8 -4, i8 23 372 %bo = add i8 %sel, 5 373 ret i8 %bo 374} 375 376define i8 @sel_constants_sub_constant(i1 %cond) { 377; ISEL-LABEL: sel_constants_sub_constant: 378; ISEL: # %bb.0: 379; ISEL-NEXT: li 4, 0 380; ISEL-NEXT: andi. 3, 3, 1 381; ISEL-NEXT: oris 3, 4, 65535 382; ISEL-NEXT: li 4, 18 383; ISEL-NEXT: ori 3, 3, 65527 384; ISEL-NEXT: isel 3, 3, 4, 1 385; ISEL-NEXT: blr 386; 387; NO_ISEL-LABEL: sel_constants_sub_constant: 388; NO_ISEL: # %bb.0: 389; NO_ISEL-NEXT: li 4, 0 390; NO_ISEL-NEXT: andi. 3, 3, 1 391; NO_ISEL-NEXT: oris 3, 4, 65535 392; NO_ISEL-NEXT: li 4, 18 393; NO_ISEL-NEXT: ori 3, 3, 65527 394; NO_ISEL-NEXT: bclr 12, 1, 0 395; NO_ISEL-NEXT: # %bb.1: 396; NO_ISEL-NEXT: ori 3, 4, 0 397; NO_ISEL-NEXT: blr 398 %sel = select i1 %cond, i8 -4, i8 23 399 %bo = sub i8 %sel, 5 400 ret i8 %bo 401} 402 403define i8 @sel_constants_sub_constant_sel_constants(i1 %cond) { 404; ISEL-LABEL: sel_constants_sub_constant_sel_constants: 405; ISEL: # %bb.0: 406; ISEL-NEXT: andi. 3, 3, 1 407; ISEL-NEXT: li 4, 9 408; ISEL-NEXT: li 3, 2 409; ISEL-NEXT: isel 3, 4, 3, 1 410; ISEL-NEXT: blr 411; 412; NO_ISEL-LABEL: sel_constants_sub_constant_sel_constants: 413; NO_ISEL: # %bb.0: 414; NO_ISEL-NEXT: andi. 3, 3, 1 415; NO_ISEL-NEXT: li 4, 9 416; NO_ISEL-NEXT: li 3, 2 417; NO_ISEL-NEXT: bc 12, 1, .LBB23_1 418; NO_ISEL-NEXT: blr 419; NO_ISEL-NEXT: .LBB23_1: 420; NO_ISEL-NEXT: addi 3, 4, 0 421; NO_ISEL-NEXT: blr 422 %sel = select i1 %cond, i8 -4, i8 3 423 %bo = sub i8 5, %sel 424 ret i8 %bo 425} 426 427define i8 @sel_constants_mul_constant(i1 %cond) { 428; ISEL-LABEL: sel_constants_mul_constant: 429; ISEL: # %bb.0: 430; ISEL-NEXT: lis 4, 16383 431; ISEL-NEXT: andi. 3, 3, 1 432; ISEL-NEXT: ori 3, 4, 65531 433; ISEL-NEXT: li 4, 115 434; ISEL-NEXT: sldi 3, 3, 2 435; ISEL-NEXT: isel 3, 3, 4, 1 436; ISEL-NEXT: blr 437; 438; NO_ISEL-LABEL: sel_constants_mul_constant: 439; NO_ISEL: # %bb.0: 440; NO_ISEL-NEXT: lis 4, 16383 441; NO_ISEL-NEXT: andi. 3, 3, 1 442; NO_ISEL-NEXT: ori 3, 4, 65531 443; NO_ISEL-NEXT: li 4, 115 444; NO_ISEL-NEXT: sldi 3, 3, 2 445; NO_ISEL-NEXT: bclr 12, 1, 0 446; NO_ISEL-NEXT: # %bb.1: 447; NO_ISEL-NEXT: ori 3, 4, 0 448; NO_ISEL-NEXT: blr 449 %sel = select i1 %cond, i8 -4, i8 23 450 %bo = mul i8 %sel, 5 451 ret i8 %bo 452} 453 454define i8 @sel_constants_sdiv_constant(i1 %cond) { 455; ISEL-LABEL: sel_constants_sdiv_constant: 456; ISEL: # %bb.0: 457; ISEL-NEXT: andi. 3, 3, 1 458; ISEL-NEXT: li 3, 4 459; ISEL-NEXT: isel 3, 0, 3, 1 460; ISEL-NEXT: blr 461; 462; NO_ISEL-LABEL: sel_constants_sdiv_constant: 463; NO_ISEL: # %bb.0: 464; NO_ISEL-NEXT: andi. 3, 3, 1 465; NO_ISEL-NEXT: li 3, 4 466; NO_ISEL-NEXT: bc 12, 1, .LBB25_1 467; NO_ISEL-NEXT: blr 468; NO_ISEL-NEXT: .LBB25_1: 469; NO_ISEL-NEXT: addi 3, 0, 0 470; NO_ISEL-NEXT: blr 471 %sel = select i1 %cond, i8 -4, i8 23 472 %bo = sdiv i8 %sel, 5 473 ret i8 %bo 474} 475 476define i8 @sdiv_constant_sel_constants(i1 %cond) { 477; ISEL-LABEL: sdiv_constant_sel_constants: 478; ISEL: # %bb.0: 479; ISEL-NEXT: andi. 3, 3, 1 480; ISEL-NEXT: li 3, 5 481; ISEL-NEXT: isel 3, 0, 3, 1 482; ISEL-NEXT: blr 483; 484; NO_ISEL-LABEL: sdiv_constant_sel_constants: 485; NO_ISEL: # %bb.0: 486; NO_ISEL-NEXT: andi. 3, 3, 1 487; NO_ISEL-NEXT: li 3, 5 488; NO_ISEL-NEXT: bc 12, 1, .LBB26_1 489; NO_ISEL-NEXT: blr 490; NO_ISEL-NEXT: .LBB26_1: 491; NO_ISEL-NEXT: addi 3, 0, 0 492; NO_ISEL-NEXT: blr 493 %sel = select i1 %cond, i8 121, i8 23 494 %bo = sdiv i8 120, %sel 495 ret i8 %bo 496} 497 498define i8 @sel_constants_udiv_constant(i1 %cond) { 499; ISEL-LABEL: sel_constants_udiv_constant: 500; ISEL: # %bb.0: 501; ISEL-NEXT: andi. 3, 3, 1 502; ISEL-NEXT: li 4, 50 503; ISEL-NEXT: li 3, 4 504; ISEL-NEXT: isel 3, 4, 3, 1 505; ISEL-NEXT: blr 506; 507; NO_ISEL-LABEL: sel_constants_udiv_constant: 508; NO_ISEL: # %bb.0: 509; NO_ISEL-NEXT: andi. 3, 3, 1 510; NO_ISEL-NEXT: li 4, 50 511; NO_ISEL-NEXT: li 3, 4 512; NO_ISEL-NEXT: bc 12, 1, .LBB27_1 513; NO_ISEL-NEXT: blr 514; NO_ISEL-NEXT: .LBB27_1: 515; NO_ISEL-NEXT: addi 3, 4, 0 516; NO_ISEL-NEXT: blr 517 %sel = select i1 %cond, i8 -4, i8 23 518 %bo = udiv i8 %sel, 5 519 ret i8 %bo 520} 521 522define i8 @udiv_constant_sel_constants(i1 %cond) { 523; ISEL-LABEL: udiv_constant_sel_constants: 524; ISEL: # %bb.0: 525; ISEL-NEXT: andi. 3, 3, 1 526; ISEL-NEXT: li 3, 5 527; ISEL-NEXT: isel 3, 0, 3, 1 528; ISEL-NEXT: blr 529; 530; NO_ISEL-LABEL: udiv_constant_sel_constants: 531; NO_ISEL: # %bb.0: 532; NO_ISEL-NEXT: andi. 3, 3, 1 533; NO_ISEL-NEXT: li 3, 5 534; NO_ISEL-NEXT: bc 12, 1, .LBB28_1 535; NO_ISEL-NEXT: blr 536; NO_ISEL-NEXT: .LBB28_1: 537; NO_ISEL-NEXT: addi 3, 0, 0 538; NO_ISEL-NEXT: blr 539 %sel = select i1 %cond, i8 -4, i8 23 540 %bo = udiv i8 120, %sel 541 ret i8 %bo 542} 543 544define i8 @sel_constants_srem_constant(i1 %cond) { 545; ISEL-LABEL: sel_constants_srem_constant: 546; ISEL: # %bb.0: 547; ISEL-NEXT: lis 4, 16383 548; ISEL-NEXT: andi. 3, 3, 1 549; ISEL-NEXT: ori 3, 4, 65535 550; ISEL-NEXT: li 4, 3 551; ISEL-NEXT: sldi 3, 3, 2 552; ISEL-NEXT: isel 3, 3, 4, 1 553; ISEL-NEXT: blr 554; 555; NO_ISEL-LABEL: sel_constants_srem_constant: 556; NO_ISEL: # %bb.0: 557; NO_ISEL-NEXT: lis 4, 16383 558; NO_ISEL-NEXT: andi. 3, 3, 1 559; NO_ISEL-NEXT: ori 3, 4, 65535 560; NO_ISEL-NEXT: li 4, 3 561; NO_ISEL-NEXT: sldi 3, 3, 2 562; NO_ISEL-NEXT: bclr 12, 1, 0 563; NO_ISEL-NEXT: # %bb.1: 564; NO_ISEL-NEXT: ori 3, 4, 0 565; NO_ISEL-NEXT: blr 566 %sel = select i1 %cond, i8 -4, i8 23 567 %bo = srem i8 %sel, 5 568 ret i8 %bo 569} 570 571define i8 @srem_constant_sel_constants(i1 %cond) { 572; ISEL-LABEL: srem_constant_sel_constants: 573; ISEL: # %bb.0: 574; ISEL-NEXT: andi. 3, 3, 1 575; ISEL-NEXT: li 4, 120 576; ISEL-NEXT: li 3, 5 577; ISEL-NEXT: isel 3, 4, 3, 1 578; ISEL-NEXT: blr 579; 580; NO_ISEL-LABEL: srem_constant_sel_constants: 581; NO_ISEL: # %bb.0: 582; NO_ISEL-NEXT: andi. 3, 3, 1 583; NO_ISEL-NEXT: li 4, 120 584; NO_ISEL-NEXT: li 3, 5 585; NO_ISEL-NEXT: bc 12, 1, .LBB30_1 586; NO_ISEL-NEXT: blr 587; NO_ISEL-NEXT: .LBB30_1: 588; NO_ISEL-NEXT: addi 3, 4, 0 589; NO_ISEL-NEXT: blr 590 %sel = select i1 %cond, i8 121, i8 23 591 %bo = srem i8 120, %sel 592 ret i8 %bo 593} 594 595define i8 @sel_constants_urem_constant(i1 %cond) { 596; ALL-LABEL: sel_constants_urem_constant: 597; ALL: # %bb.0: 598; ALL-NEXT: rlwinm 3, 3, 0, 31, 31 599; ALL-NEXT: subfic 3, 3, 3 600; ALL-NEXT: blr 601 %sel = select i1 %cond, i8 -4, i8 23 602 %bo = urem i8 %sel, 5 603 ret i8 %bo 604} 605 606define i8 @urem_constant_sel_constants(i1 %cond) { 607; ISEL-LABEL: urem_constant_sel_constants: 608; ISEL: # %bb.0: 609; ISEL-NEXT: andi. 3, 3, 1 610; ISEL-NEXT: li 4, 120 611; ISEL-NEXT: li 3, 5 612; ISEL-NEXT: isel 3, 4, 3, 1 613; ISEL-NEXT: blr 614; 615; NO_ISEL-LABEL: urem_constant_sel_constants: 616; NO_ISEL: # %bb.0: 617; NO_ISEL-NEXT: andi. 3, 3, 1 618; NO_ISEL-NEXT: li 4, 120 619; NO_ISEL-NEXT: li 3, 5 620; NO_ISEL-NEXT: bc 12, 1, .LBB32_1 621; NO_ISEL-NEXT: blr 622; NO_ISEL-NEXT: .LBB32_1: 623; NO_ISEL-NEXT: addi 3, 4, 0 624; NO_ISEL-NEXT: blr 625 %sel = select i1 %cond, i8 -4, i8 23 626 %bo = urem i8 120, %sel 627 ret i8 %bo 628} 629 630define i8 @sel_constants_and_constant(i1 %cond) { 631; ALL-LABEL: sel_constants_and_constant: 632; ALL: # %bb.0: 633; ALL-NEXT: rlwinm 3, 3, 0, 31, 31 634; ALL-NEXT: subfic 3, 3, 5 635; ALL-NEXT: blr 636 %sel = select i1 %cond, i8 -4, i8 23 637 %bo = and i8 %sel, 5 638 ret i8 %bo 639} 640 641define i8 @sel_constants_or_constant(i1 %cond) { 642; ISEL-LABEL: sel_constants_or_constant: 643; ISEL: # %bb.0: 644; ISEL-NEXT: li 4, 0 645; ISEL-NEXT: andi. 3, 3, 1 646; ISEL-NEXT: oris 3, 4, 65535 647; ISEL-NEXT: li 4, 23 648; ISEL-NEXT: ori 3, 3, 65533 649; ISEL-NEXT: isel 3, 3, 4, 1 650; ISEL-NEXT: blr 651; 652; NO_ISEL-LABEL: sel_constants_or_constant: 653; NO_ISEL: # %bb.0: 654; NO_ISEL-NEXT: li 4, 0 655; NO_ISEL-NEXT: andi. 3, 3, 1 656; NO_ISEL-NEXT: oris 3, 4, 65535 657; NO_ISEL-NEXT: li 4, 23 658; NO_ISEL-NEXT: ori 3, 3, 65533 659; NO_ISEL-NEXT: bclr 12, 1, 0 660; NO_ISEL-NEXT: # %bb.1: 661; NO_ISEL-NEXT: ori 3, 4, 0 662; NO_ISEL-NEXT: blr 663 %sel = select i1 %cond, i8 -4, i8 23 664 %bo = or i8 %sel, 5 665 ret i8 %bo 666} 667 668define i8 @sel_constants_xor_constant(i1 %cond) { 669; ISEL-LABEL: sel_constants_xor_constant: 670; ISEL: # %bb.0: 671; ISEL-NEXT: li 4, 0 672; ISEL-NEXT: andi. 3, 3, 1 673; ISEL-NEXT: oris 3, 4, 65535 674; ISEL-NEXT: li 4, 18 675; ISEL-NEXT: ori 3, 3, 65529 676; ISEL-NEXT: isel 3, 3, 4, 1 677; ISEL-NEXT: blr 678; 679; NO_ISEL-LABEL: sel_constants_xor_constant: 680; NO_ISEL: # %bb.0: 681; NO_ISEL-NEXT: li 4, 0 682; NO_ISEL-NEXT: andi. 3, 3, 1 683; NO_ISEL-NEXT: oris 3, 4, 65535 684; NO_ISEL-NEXT: li 4, 18 685; NO_ISEL-NEXT: ori 3, 3, 65529 686; NO_ISEL-NEXT: bclr 12, 1, 0 687; NO_ISEL-NEXT: # %bb.1: 688; NO_ISEL-NEXT: ori 3, 4, 0 689; NO_ISEL-NEXT: blr 690 %sel = select i1 %cond, i8 -4, i8 23 691 %bo = xor i8 %sel, 5 692 ret i8 %bo 693} 694 695define i8 @sel_constants_shl_constant(i1 %cond) { 696; ISEL-LABEL: sel_constants_shl_constant: 697; ISEL: # %bb.0: 698; ISEL-NEXT: lis 4, 2047 699; ISEL-NEXT: lis 5, 511 700; ISEL-NEXT: andi. 3, 3, 1 701; ISEL-NEXT: ori 3, 4, 65535 702; ISEL-NEXT: ori 4, 5, 65535 703; ISEL-NEXT: sldi 3, 3, 5 704; ISEL-NEXT: sldi 4, 4, 7 705; ISEL-NEXT: isel 3, 4, 3, 1 706; ISEL-NEXT: blr 707; 708; NO_ISEL-LABEL: sel_constants_shl_constant: 709; NO_ISEL: # %bb.0: 710; NO_ISEL-NEXT: lis 4, 2047 711; NO_ISEL-NEXT: lis 5, 511 712; NO_ISEL-NEXT: andi. 3, 3, 1 713; NO_ISEL-NEXT: ori 3, 4, 65535 714; NO_ISEL-NEXT: ori 4, 5, 65535 715; NO_ISEL-NEXT: sldi 3, 3, 5 716; NO_ISEL-NEXT: sldi 4, 4, 7 717; NO_ISEL-NEXT: bc 12, 1, .LBB36_1 718; NO_ISEL-NEXT: blr 719; NO_ISEL-NEXT: .LBB36_1: 720; NO_ISEL-NEXT: addi 3, 4, 0 721; NO_ISEL-NEXT: blr 722 %sel = select i1 %cond, i8 -4, i8 23 723 %bo = shl i8 %sel, 5 724 ret i8 %bo 725} 726 727define i8 @shl_constant_sel_constants(i1 %cond) { 728; ALL-LABEL: shl_constant_sel_constants: 729; ALL: # %bb.0: 730; ALL-NEXT: rlwinm 3, 3, 0, 31, 31 731; ALL-NEXT: li 4, 1 732; ALL-NEXT: subfic 3, 3, 3 733; ALL-NEXT: slw 3, 4, 3 734; ALL-NEXT: blr 735 %sel = select i1 %cond, i8 2, i8 3 736 %bo = shl i8 1, %sel 737 ret i8 %bo 738} 739 740define i8 @sel_constants_lshr_constant(i1 %cond) { 741; ISEL-LABEL: sel_constants_lshr_constant: 742; ISEL: # %bb.0: 743; ISEL-NEXT: andi. 3, 3, 1 744; ISEL-NEXT: li 4, 7 745; ISEL-NEXT: li 3, 0 746; ISEL-NEXT: isel 3, 4, 3, 1 747; ISEL-NEXT: blr 748; 749; NO_ISEL-LABEL: sel_constants_lshr_constant: 750; NO_ISEL: # %bb.0: 751; NO_ISEL-NEXT: andi. 3, 3, 1 752; NO_ISEL-NEXT: li 4, 7 753; NO_ISEL-NEXT: li 3, 0 754; NO_ISEL-NEXT: bc 12, 1, .LBB38_1 755; NO_ISEL-NEXT: blr 756; NO_ISEL-NEXT: .LBB38_1: 757; NO_ISEL-NEXT: addi 3, 4, 0 758; NO_ISEL-NEXT: blr 759 %sel = select i1 %cond, i8 -4, i8 23 760 %bo = lshr i8 %sel, 5 761 ret i8 %bo 762} 763 764define i8 @lshr_constant_sel_constants(i1 %cond) { 765; ALL-LABEL: lshr_constant_sel_constants: 766; ALL: # %bb.0: 767; ALL-NEXT: rlwinm 3, 3, 0, 31, 31 768; ALL-NEXT: li 4, 64 769; ALL-NEXT: subfic 3, 3, 3 770; ALL-NEXT: srw 3, 4, 3 771; ALL-NEXT: blr 772 %sel = select i1 %cond, i8 2, i8 3 773 %bo = lshr i8 64, %sel 774 ret i8 %bo 775} 776 777 778define i8 @sel_constants_ashr_constant(i1 %cond) { 779; ALL-LABEL: sel_constants_ashr_constant: 780; ALL: # %bb.0: 781; ALL-NEXT: clrldi 3, 3, 63 782; ALL-NEXT: neg 3, 3 783; ALL-NEXT: blr 784 %sel = select i1 %cond, i8 -4, i8 23 785 %bo = ashr i8 %sel, 5 786 ret i8 %bo 787} 788 789define i8 @ashr_constant_sel_constants(i1 %cond) { 790; ALL-LABEL: ashr_constant_sel_constants: 791; ALL: # %bb.0: 792; ALL-NEXT: rlwinm 3, 3, 0, 31, 31 793; ALL-NEXT: li 4, -128 794; ALL-NEXT: subfic 3, 3, 3 795; ALL-NEXT: sraw 3, 4, 3 796; ALL-NEXT: blr 797 %sel = select i1 %cond, i8 2, i8 3 798 %bo = ashr i8 128, %sel 799 ret i8 %bo 800} 801 802define double @sel_constants_fadd_constant(i1 %cond) { 803; ISEL-LABEL: sel_constants_fadd_constant: 804; ISEL: # %bb.0: 805; ISEL-NEXT: andi. 3, 3, 1 806; ISEL-NEXT: addis 4, 2, .LCPI42_0@toc@ha 807; ISEL-NEXT: addis 3, 2, .LCPI42_1@toc@ha 808; ISEL-NEXT: addi 4, 4, .LCPI42_0@toc@l 809; ISEL-NEXT: addi 3, 3, .LCPI42_1@toc@l 810; ISEL-NEXT: isel 3, 3, 4, 1 811; ISEL-NEXT: lfdx 1, 0, 3 812; ISEL-NEXT: blr 813; 814; NO_ISEL-LABEL: sel_constants_fadd_constant: 815; NO_ISEL: # %bb.0: 816; NO_ISEL-NEXT: andi. 3, 3, 1 817; NO_ISEL-NEXT: addis 4, 2, .LCPI42_0@toc@ha 818; NO_ISEL-NEXT: addis 3, 2, .LCPI42_1@toc@ha 819; NO_ISEL-NEXT: addi 4, 4, .LCPI42_0@toc@l 820; NO_ISEL-NEXT: addi 3, 3, .LCPI42_1@toc@l 821; NO_ISEL-NEXT: bc 12, 1, .LBB42_2 822; NO_ISEL-NEXT: # %bb.1: 823; NO_ISEL-NEXT: ori 3, 4, 0 824; NO_ISEL-NEXT: b .LBB42_2 825; NO_ISEL-NEXT: .LBB42_2: 826; NO_ISEL-NEXT: lfdx 1, 0, 3 827; NO_ISEL-NEXT: blr 828 %sel = select i1 %cond, double -4.0, double 23.3 829 %bo = fadd double %sel, 5.1 830 ret double %bo 831} 832 833define double @sel_constants_fsub_constant(i1 %cond) { 834; ISEL-LABEL: sel_constants_fsub_constant: 835; ISEL: # %bb.0: 836; ISEL-NEXT: andi. 3, 3, 1 837; ISEL-NEXT: addis 4, 2, .LCPI43_0@toc@ha 838; ISEL-NEXT: addis 3, 2, .LCPI43_1@toc@ha 839; ISEL-NEXT: addi 4, 4, .LCPI43_0@toc@l 840; ISEL-NEXT: addi 3, 3, .LCPI43_1@toc@l 841; ISEL-NEXT: isel 3, 3, 4, 1 842; ISEL-NEXT: lfdx 1, 0, 3 843; ISEL-NEXT: blr 844; 845; NO_ISEL-LABEL: sel_constants_fsub_constant: 846; NO_ISEL: # %bb.0: 847; NO_ISEL-NEXT: andi. 3, 3, 1 848; NO_ISEL-NEXT: addis 4, 2, .LCPI43_0@toc@ha 849; NO_ISEL-NEXT: addis 3, 2, .LCPI43_1@toc@ha 850; NO_ISEL-NEXT: addi 4, 4, .LCPI43_0@toc@l 851; NO_ISEL-NEXT: addi 3, 3, .LCPI43_1@toc@l 852; NO_ISEL-NEXT: bc 12, 1, .LBB43_2 853; NO_ISEL-NEXT: # %bb.1: 854; NO_ISEL-NEXT: ori 3, 4, 0 855; NO_ISEL-NEXT: b .LBB43_2 856; NO_ISEL-NEXT: .LBB43_2: 857; NO_ISEL-NEXT: lfdx 1, 0, 3 858; NO_ISEL-NEXT: blr 859 %sel = select i1 %cond, double -4.0, double 23.3 860 %bo = fsub double %sel, 5.1 861 ret double %bo 862} 863 864define double @fsub_constant_sel_constants(i1 %cond) { 865; ISEL-LABEL: fsub_constant_sel_constants: 866; ISEL: # %bb.0: 867; ISEL-NEXT: andi. 3, 3, 1 868; ISEL-NEXT: addis 4, 2, .LCPI44_0@toc@ha 869; ISEL-NEXT: addis 3, 2, .LCPI44_1@toc@ha 870; ISEL-NEXT: addi 4, 4, .LCPI44_0@toc@l 871; ISEL-NEXT: addi 3, 3, .LCPI44_1@toc@l 872; ISEL-NEXT: isel 3, 3, 4, 1 873; ISEL-NEXT: lfdx 1, 0, 3 874; ISEL-NEXT: blr 875; 876; NO_ISEL-LABEL: fsub_constant_sel_constants: 877; NO_ISEL: # %bb.0: 878; NO_ISEL-NEXT: andi. 3, 3, 1 879; NO_ISEL-NEXT: addis 4, 2, .LCPI44_0@toc@ha 880; NO_ISEL-NEXT: addis 3, 2, .LCPI44_1@toc@ha 881; NO_ISEL-NEXT: addi 4, 4, .LCPI44_0@toc@l 882; NO_ISEL-NEXT: addi 3, 3, .LCPI44_1@toc@l 883; NO_ISEL-NEXT: bc 12, 1, .LBB44_2 884; NO_ISEL-NEXT: # %bb.1: 885; NO_ISEL-NEXT: ori 3, 4, 0 886; NO_ISEL-NEXT: b .LBB44_2 887; NO_ISEL-NEXT: .LBB44_2: 888; NO_ISEL-NEXT: lfdx 1, 0, 3 889; NO_ISEL-NEXT: blr 890 %sel = select i1 %cond, double -4.0, double 23.3 891 %bo = fsub double 5.1, %sel 892 ret double %bo 893} 894 895define double @sel_constants_fmul_constant(i1 %cond) { 896; ISEL-LABEL: sel_constants_fmul_constant: 897; ISEL: # %bb.0: 898; ISEL-NEXT: andi. 3, 3, 1 899; ISEL-NEXT: addis 4, 2, .LCPI45_0@toc@ha 900; ISEL-NEXT: addis 3, 2, .LCPI45_1@toc@ha 901; ISEL-NEXT: addi 4, 4, .LCPI45_0@toc@l 902; ISEL-NEXT: addi 3, 3, .LCPI45_1@toc@l 903; ISEL-NEXT: isel 3, 3, 4, 1 904; ISEL-NEXT: lfdx 1, 0, 3 905; ISEL-NEXT: blr 906; 907; NO_ISEL-LABEL: sel_constants_fmul_constant: 908; NO_ISEL: # %bb.0: 909; NO_ISEL-NEXT: andi. 3, 3, 1 910; NO_ISEL-NEXT: addis 4, 2, .LCPI45_0@toc@ha 911; NO_ISEL-NEXT: addis 3, 2, .LCPI45_1@toc@ha 912; NO_ISEL-NEXT: addi 4, 4, .LCPI45_0@toc@l 913; NO_ISEL-NEXT: addi 3, 3, .LCPI45_1@toc@l 914; NO_ISEL-NEXT: bc 12, 1, .LBB45_2 915; NO_ISEL-NEXT: # %bb.1: 916; NO_ISEL-NEXT: ori 3, 4, 0 917; NO_ISEL-NEXT: b .LBB45_2 918; NO_ISEL-NEXT: .LBB45_2: 919; NO_ISEL-NEXT: lfdx 1, 0, 3 920; NO_ISEL-NEXT: blr 921 %sel = select i1 %cond, double -4.0, double 23.3 922 %bo = fmul double %sel, 5.1 923 ret double %bo 924} 925 926define double @sel_constants_fdiv_constant(i1 %cond) { 927; ISEL-LABEL: sel_constants_fdiv_constant: 928; ISEL: # %bb.0: 929; ISEL-NEXT: andi. 3, 3, 1 930; ISEL-NEXT: addis 4, 2, .LCPI46_0@toc@ha 931; ISEL-NEXT: addis 3, 2, .LCPI46_1@toc@ha 932; ISEL-NEXT: addi 4, 4, .LCPI46_0@toc@l 933; ISEL-NEXT: addi 3, 3, .LCPI46_1@toc@l 934; ISEL-NEXT: isel 3, 3, 4, 1 935; ISEL-NEXT: lfdx 1, 0, 3 936; ISEL-NEXT: blr 937; 938; NO_ISEL-LABEL: sel_constants_fdiv_constant: 939; NO_ISEL: # %bb.0: 940; NO_ISEL-NEXT: andi. 3, 3, 1 941; NO_ISEL-NEXT: addis 4, 2, .LCPI46_0@toc@ha 942; NO_ISEL-NEXT: addis 3, 2, .LCPI46_1@toc@ha 943; NO_ISEL-NEXT: addi 4, 4, .LCPI46_0@toc@l 944; NO_ISEL-NEXT: addi 3, 3, .LCPI46_1@toc@l 945; NO_ISEL-NEXT: bc 12, 1, .LBB46_2 946; NO_ISEL-NEXT: # %bb.1: 947; NO_ISEL-NEXT: ori 3, 4, 0 948; NO_ISEL-NEXT: b .LBB46_2 949; NO_ISEL-NEXT: .LBB46_2: 950; NO_ISEL-NEXT: lfdx 1, 0, 3 951; NO_ISEL-NEXT: blr 952 %sel = select i1 %cond, double -4.0, double 23.3 953 %bo = fdiv double %sel, 5.1 954 ret double %bo 955} 956 957define double @fdiv_constant_sel_constants(i1 %cond) { 958; ISEL-LABEL: fdiv_constant_sel_constants: 959; ISEL: # %bb.0: 960; ISEL-NEXT: andi. 3, 3, 1 961; ISEL-NEXT: addis 4, 2, .LCPI47_0@toc@ha 962; ISEL-NEXT: addis 3, 2, .LCPI47_1@toc@ha 963; ISEL-NEXT: addi 4, 4, .LCPI47_0@toc@l 964; ISEL-NEXT: addi 3, 3, .LCPI47_1@toc@l 965; ISEL-NEXT: isel 3, 3, 4, 1 966; ISEL-NEXT: lfdx 1, 0, 3 967; ISEL-NEXT: blr 968; 969; NO_ISEL-LABEL: fdiv_constant_sel_constants: 970; NO_ISEL: # %bb.0: 971; NO_ISEL-NEXT: andi. 3, 3, 1 972; NO_ISEL-NEXT: addis 4, 2, .LCPI47_0@toc@ha 973; NO_ISEL-NEXT: addis 3, 2, .LCPI47_1@toc@ha 974; NO_ISEL-NEXT: addi 4, 4, .LCPI47_0@toc@l 975; NO_ISEL-NEXT: addi 3, 3, .LCPI47_1@toc@l 976; NO_ISEL-NEXT: bc 12, 1, .LBB47_2 977; NO_ISEL-NEXT: # %bb.1: 978; NO_ISEL-NEXT: ori 3, 4, 0 979; NO_ISEL-NEXT: b .LBB47_2 980; NO_ISEL-NEXT: .LBB47_2: 981; NO_ISEL-NEXT: lfdx 1, 0, 3 982; NO_ISEL-NEXT: blr 983 %sel = select i1 %cond, double -4.0, double 23.3 984 %bo = fdiv double 5.1, %sel 985 ret double %bo 986} 987 988define double @sel_constants_frem_constant(i1 %cond) { 989; ALL-LABEL: sel_constants_frem_constant: 990; ALL: # %bb.0: 991; ALL-NEXT: andi. 3, 3, 1 992; ALL-NEXT: bc 12, 1, .LBB48_2 993; ALL-NEXT: # %bb.1: 994; ALL-NEXT: addis 3, 2, .LCPI48_0@toc@ha 995; ALL-NEXT: lfd 1, .LCPI48_0@toc@l(3) 996; ALL-NEXT: blr 997; ALL-NEXT: .LBB48_2: 998; ALL-NEXT: addis 3, 2, .LCPI48_1@toc@ha 999; ALL-NEXT: lfs 1, .LCPI48_1@toc@l(3) 1000; ALL-NEXT: blr 1001 %sel = select i1 %cond, double -4.0, double 23.3 1002 %bo = frem double %sel, 5.1 1003 ret double %bo 1004} 1005 1006define double @frem_constant_sel_constants(i1 %cond) { 1007; ISEL-LABEL: frem_constant_sel_constants: 1008; ISEL: # %bb.0: 1009; ISEL-NEXT: andi. 3, 3, 1 1010; ISEL-NEXT: addis 4, 2, .LCPI49_0@toc@ha 1011; ISEL-NEXT: addis 3, 2, .LCPI49_1@toc@ha 1012; ISEL-NEXT: addi 4, 4, .LCPI49_0@toc@l 1013; ISEL-NEXT: addi 3, 3, .LCPI49_1@toc@l 1014; ISEL-NEXT: isel 3, 3, 4, 1 1015; ISEL-NEXT: lfdx 1, 0, 3 1016; ISEL-NEXT: blr 1017; 1018; NO_ISEL-LABEL: frem_constant_sel_constants: 1019; NO_ISEL: # %bb.0: 1020; NO_ISEL-NEXT: andi. 3, 3, 1 1021; NO_ISEL-NEXT: addis 4, 2, .LCPI49_0@toc@ha 1022; NO_ISEL-NEXT: addis 3, 2, .LCPI49_1@toc@ha 1023; NO_ISEL-NEXT: addi 4, 4, .LCPI49_0@toc@l 1024; NO_ISEL-NEXT: addi 3, 3, .LCPI49_1@toc@l 1025; NO_ISEL-NEXT: bc 12, 1, .LBB49_2 1026; NO_ISEL-NEXT: # %bb.1: 1027; NO_ISEL-NEXT: ori 3, 4, 0 1028; NO_ISEL-NEXT: b .LBB49_2 1029; NO_ISEL-NEXT: .LBB49_2: 1030; NO_ISEL-NEXT: lfdx 1, 0, 3 1031; NO_ISEL-NEXT: blr 1032 %sel = select i1 %cond, double -4.0, double 23.3 1033 %bo = frem double 5.1, %sel 1034 ret double %bo 1035} 1036