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; ISEL-LABEL: select_Cplus1_C: 222; ISEL: # BB#0: 223; ISEL-NEXT: andi. 3, 3, 1 224; ISEL-NEXT: li 4, 42 225; ISEL-NEXT: li 3, 41 226; ISEL-NEXT: isel 3, 4, 3, 1 227; ISEL-NEXT: blr 228; 229; NO_ISEL-LABEL: select_Cplus1_C: 230; NO_ISEL: # BB#0: 231; NO_ISEL-NEXT: andi. 3, 3, 1 232; NO_ISEL-NEXT: li 4, 42 233; NO_ISEL-NEXT: li 3, 41 234; NO_ISEL-NEXT: bc 12, 1, .LBB12_1 235; NO_ISEL-NEXT: blr 236; NO_ISEL-NEXT: .LBB12_1: 237; NO_ISEL-NEXT: addi 3, 4, 0 238; NO_ISEL-NEXT: blr 239 %sel = select i1 %cond, i32 42, i32 41 240 ret i32 %sel 241} 242 243define i32 @select_Cplus1_C_zeroext(i1 zeroext %cond) { 244; ISEL-LABEL: select_Cplus1_C_zeroext: 245; ISEL: # BB#0: 246; ISEL-NEXT: andi. 3, 3, 1 247; ISEL-NEXT: li 4, 42 248; ISEL-NEXT: li 3, 41 249; ISEL-NEXT: isel 3, 4, 3, 1 250; ISEL-NEXT: blr 251; 252; NO_ISEL-LABEL: select_Cplus1_C_zeroext: 253; NO_ISEL: # BB#0: 254; NO_ISEL-NEXT: andi. 3, 3, 1 255; NO_ISEL-NEXT: li 4, 42 256; NO_ISEL-NEXT: li 3, 41 257; NO_ISEL-NEXT: bc 12, 1, .LBB13_1 258; NO_ISEL-NEXT: blr 259; NO_ISEL-NEXT: .LBB13_1: 260; NO_ISEL-NEXT: addi 3, 4, 0 261; NO_ISEL-NEXT: blr 262 %sel = select i1 %cond, i32 42, i32 41 263 ret i32 %sel 264} 265 266define i32 @select_Cplus1_C_signext(i1 signext %cond) { 267; ISEL-LABEL: select_Cplus1_C_signext: 268; ISEL: # BB#0: 269; ISEL-NEXT: andi. 3, 3, 1 270; ISEL-NEXT: li 4, 42 271; ISEL-NEXT: li 3, 41 272; ISEL-NEXT: isel 3, 4, 3, 1 273; ISEL-NEXT: blr 274; 275; NO_ISEL-LABEL: select_Cplus1_C_signext: 276; NO_ISEL: # BB#0: 277; NO_ISEL-NEXT: andi. 3, 3, 1 278; NO_ISEL-NEXT: li 4, 42 279; NO_ISEL-NEXT: li 3, 41 280; NO_ISEL-NEXT: bc 12, 1, .LBB14_1 281; NO_ISEL-NEXT: blr 282; NO_ISEL-NEXT: .LBB14_1: 283; NO_ISEL-NEXT: addi 3, 4, 0 284; NO_ISEL-NEXT: blr 285 %sel = select i1 %cond, i32 42, i32 41 286 ret i32 %sel 287} 288 289; select Cond, C, C+1 --> add (sext Cond), C 290 291define i32 @select_C_Cplus1(i1 %cond) { 292; ISEL-LABEL: select_C_Cplus1: 293; ISEL: # BB#0: 294; ISEL-NEXT: andi. 3, 3, 1 295; ISEL-NEXT: li 4, 41 296; ISEL-NEXT: li 3, 42 297; ISEL-NEXT: isel 3, 4, 3, 1 298; ISEL-NEXT: blr 299; 300; NO_ISEL-LABEL: select_C_Cplus1: 301; NO_ISEL: # BB#0: 302; NO_ISEL-NEXT: andi. 3, 3, 1 303; NO_ISEL-NEXT: li 4, 41 304; NO_ISEL-NEXT: li 3, 42 305; NO_ISEL-NEXT: bc 12, 1, .LBB15_1 306; NO_ISEL-NEXT: blr 307; NO_ISEL-NEXT: .LBB15_1: 308; NO_ISEL-NEXT: addi 3, 4, 0 309; NO_ISEL-NEXT: blr 310 %sel = select i1 %cond, i32 41, i32 42 311 ret i32 %sel 312} 313 314define i32 @select_C_Cplus1_zeroext(i1 zeroext %cond) { 315; ISEL-LABEL: select_C_Cplus1_zeroext: 316; ISEL: # BB#0: 317; ISEL-NEXT: andi. 3, 3, 1 318; ISEL-NEXT: li 4, 41 319; ISEL-NEXT: li 3, 42 320; ISEL-NEXT: isel 3, 4, 3, 1 321; ISEL-NEXT: blr 322; 323; NO_ISEL-LABEL: select_C_Cplus1_zeroext: 324; NO_ISEL: # BB#0: 325; NO_ISEL-NEXT: andi. 3, 3, 1 326; NO_ISEL-NEXT: li 4, 41 327; NO_ISEL-NEXT: li 3, 42 328; NO_ISEL-NEXT: bc 12, 1, .LBB16_1 329; NO_ISEL-NEXT: blr 330; NO_ISEL-NEXT: .LBB16_1: 331; NO_ISEL-NEXT: addi 3, 4, 0 332; NO_ISEL-NEXT: blr 333 %sel = select i1 %cond, i32 41, i32 42 334 ret i32 %sel 335} 336 337define i32 @select_C_Cplus1_signext(i1 signext %cond) { 338; ISEL-LABEL: select_C_Cplus1_signext: 339; ISEL: # BB#0: 340; ISEL-NEXT: andi. 3, 3, 1 341; ISEL-NEXT: li 4, 41 342; ISEL-NEXT: li 3, 42 343; ISEL-NEXT: isel 3, 4, 3, 1 344; ISEL-NEXT: blr 345; 346; NO_ISEL-LABEL: select_C_Cplus1_signext: 347; NO_ISEL: # BB#0: 348; NO_ISEL-NEXT: andi. 3, 3, 1 349; NO_ISEL-NEXT: li 4, 41 350; NO_ISEL-NEXT: li 3, 42 351; NO_ISEL-NEXT: bc 12, 1, .LBB17_1 352; NO_ISEL-NEXT: blr 353; NO_ISEL-NEXT: .LBB17_1: 354; NO_ISEL-NEXT: addi 3, 4, 0 355; NO_ISEL-NEXT: blr 356 %sel = select i1 %cond, i32 41, i32 42 357 ret i32 %sel 358} 359 360; In general, select of 2 constants could be: 361; select Cond, C1, C2 --> add (mul (zext Cond), C1-C2), C2 --> add (and (sext Cond), C1-C2), C2 362 363define i32 @select_C1_C2(i1 %cond) { 364; ISEL-LABEL: select_C1_C2: 365; ISEL: # BB#0: 366; ISEL-NEXT: andi. 3, 3, 1 367; ISEL-NEXT: li 4, 421 368; ISEL-NEXT: li 3, 42 369; ISEL-NEXT: isel 3, 4, 3, 1 370; ISEL-NEXT: blr 371; 372; NO_ISEL-LABEL: select_C1_C2: 373; NO_ISEL: # BB#0: 374; NO_ISEL-NEXT: andi. 3, 3, 1 375; NO_ISEL-NEXT: li 4, 421 376; NO_ISEL-NEXT: li 3, 42 377; NO_ISEL-NEXT: bc 12, 1, .LBB18_1 378; NO_ISEL-NEXT: blr 379; NO_ISEL-NEXT: .LBB18_1: 380; NO_ISEL-NEXT: addi 3, 4, 0 381; NO_ISEL-NEXT: blr 382 %sel = select i1 %cond, i32 421, i32 42 383 ret i32 %sel 384} 385 386define i32 @select_C1_C2_zeroext(i1 zeroext %cond) { 387; ISEL-LABEL: select_C1_C2_zeroext: 388; ISEL: # BB#0: 389; ISEL-NEXT: andi. 3, 3, 1 390; ISEL-NEXT: li 4, 421 391; ISEL-NEXT: li 3, 42 392; ISEL-NEXT: isel 3, 4, 3, 1 393; ISEL-NEXT: blr 394; 395; NO_ISEL-LABEL: select_C1_C2_zeroext: 396; NO_ISEL: # BB#0: 397; NO_ISEL-NEXT: andi. 3, 3, 1 398; NO_ISEL-NEXT: li 4, 421 399; NO_ISEL-NEXT: li 3, 42 400; NO_ISEL-NEXT: bc 12, 1, .LBB19_1 401; NO_ISEL-NEXT: blr 402; NO_ISEL-NEXT: .LBB19_1: 403; NO_ISEL-NEXT: addi 3, 4, 0 404; NO_ISEL-NEXT: blr 405 %sel = select i1 %cond, i32 421, i32 42 406 ret i32 %sel 407} 408 409define i32 @select_C1_C2_signext(i1 signext %cond) { 410; ISEL-LABEL: select_C1_C2_signext: 411; ISEL: # BB#0: 412; ISEL-NEXT: andi. 3, 3, 1 413; ISEL-NEXT: li 4, 421 414; ISEL-NEXT: li 3, 42 415; ISEL-NEXT: isel 3, 4, 3, 1 416; ISEL-NEXT: blr 417; 418; NO_ISEL-LABEL: select_C1_C2_signext: 419; NO_ISEL: # BB#0: 420; NO_ISEL-NEXT: andi. 3, 3, 1 421; NO_ISEL-NEXT: li 4, 421 422; NO_ISEL-NEXT: li 3, 42 423; NO_ISEL-NEXT: bc 12, 1, .LBB20_1 424; NO_ISEL-NEXT: blr 425; NO_ISEL-NEXT: .LBB20_1: 426; NO_ISEL-NEXT: addi 3, 4, 0 427; NO_ISEL-NEXT: blr 428 %sel = select i1 %cond, i32 421, i32 42 429 ret i32 %sel 430} 431 432; A binary operator with constant after the select should always get folded into the select. 433 434define i8 @sel_constants_add_constant(i1 %cond) { 435; ISEL-LABEL: sel_constants_add_constant: 436; ISEL: # BB#0: 437; ISEL-NEXT: andi. 3, 3, 1 438; ISEL-NEXT: li 4, 1 439; ISEL-NEXT: li 3, 28 440; ISEL-NEXT: isel 3, 4, 3, 1 441; ISEL-NEXT: blr 442; 443; NO_ISEL-LABEL: sel_constants_add_constant: 444; NO_ISEL: # BB#0: 445; NO_ISEL-NEXT: andi. 3, 3, 1 446; NO_ISEL-NEXT: li 4, 1 447; NO_ISEL-NEXT: li 3, 28 448; NO_ISEL-NEXT: bc 12, 1, .LBB21_1 449; NO_ISEL-NEXT: blr 450; NO_ISEL-NEXT: .LBB21_1: 451; NO_ISEL-NEXT: addi 3, 4, 0 452; NO_ISEL-NEXT: blr 453 %sel = select i1 %cond, i8 -4, i8 23 454 %bo = add i8 %sel, 5 455 ret i8 %bo 456} 457 458define i8 @sel_constants_sub_constant(i1 %cond) { 459; ISEL-LABEL: sel_constants_sub_constant: 460; ISEL: # BB#0: 461; ISEL-NEXT: li 4, 0 462; ISEL-NEXT: andi. 3, 3, 1 463; ISEL-NEXT: oris 3, 4, 65535 464; ISEL-NEXT: li 4, 18 465; ISEL-NEXT: ori 3, 3, 65527 466; ISEL-NEXT: isel 3, 3, 4, 1 467; ISEL-NEXT: blr 468; 469; NO_ISEL-LABEL: sel_constants_sub_constant: 470; NO_ISEL: # BB#0: 471; NO_ISEL-NEXT: li 4, 0 472; NO_ISEL-NEXT: andi. 3, 3, 1 473; NO_ISEL-NEXT: oris 3, 4, 65535 474; NO_ISEL-NEXT: li 4, 18 475; NO_ISEL-NEXT: ori 3, 3, 65527 476; NO_ISEL-NEXT: bclr 12, 1, 0 477; NO_ISEL-NEXT: # BB#1: 478; NO_ISEL-NEXT: ori 3, 4, 0 479; NO_ISEL-NEXT: blr 480 %sel = select i1 %cond, i8 -4, i8 23 481 %bo = sub i8 %sel, 5 482 ret i8 %bo 483} 484 485define i8 @sel_constants_mul_constant(i1 %cond) { 486; ISEL-LABEL: sel_constants_mul_constant: 487; ISEL: # BB#0: 488; ISEL-NEXT: lis 4, 16383 489; ISEL-NEXT: andi. 3, 3, 1 490; ISEL-NEXT: ori 3, 4, 65531 491; ISEL-NEXT: li 4, 115 492; ISEL-NEXT: sldi 3, 3, 2 493; ISEL-NEXT: isel 3, 3, 4, 1 494; ISEL-NEXT: blr 495; 496; NO_ISEL-LABEL: sel_constants_mul_constant: 497; NO_ISEL: # BB#0: 498; NO_ISEL-NEXT: lis 4, 16383 499; NO_ISEL-NEXT: andi. 3, 3, 1 500; NO_ISEL-NEXT: ori 3, 4, 65531 501; NO_ISEL-NEXT: li 4, 115 502; NO_ISEL-NEXT: sldi 3, 3, 2 503; NO_ISEL-NEXT: bclr 12, 1, 0 504; NO_ISEL-NEXT: # BB#1: 505; NO_ISEL-NEXT: ori 3, 4, 0 506; NO_ISEL-NEXT: blr 507 %sel = select i1 %cond, i8 -4, i8 23 508 %bo = mul i8 %sel, 5 509 ret i8 %bo 510} 511 512define i8 @sel_constants_sdiv_constant(i1 %cond) { 513; ISEL-LABEL: sel_constants_sdiv_constant: 514; ISEL: # BB#0: 515; ISEL-NEXT: andi. 3, 3, 1 516; ISEL-NEXT: li 3, 4 517; ISEL-NEXT: isel 3, 0, 3, 1 518; ISEL-NEXT: blr 519; 520; NO_ISEL-LABEL: sel_constants_sdiv_constant: 521; NO_ISEL: # BB#0: 522; NO_ISEL-NEXT: andi. 3, 3, 1 523; NO_ISEL-NEXT: li 3, 4 524; NO_ISEL-NEXT: bc 12, 1, .LBB24_1 525; NO_ISEL-NEXT: blr 526; NO_ISEL-NEXT: .LBB24_1: 527; NO_ISEL-NEXT: addi 3, 0, 0 528; NO_ISEL-NEXT: blr 529 %sel = select i1 %cond, i8 -4, i8 23 530 %bo = sdiv i8 %sel, 5 531 ret i8 %bo 532} 533 534define i8 @sel_constants_udiv_constant(i1 %cond) { 535; ISEL-LABEL: sel_constants_udiv_constant: 536; ISEL: # BB#0: 537; ISEL-NEXT: andi. 3, 3, 1 538; ISEL-NEXT: li 4, 50 539; ISEL-NEXT: li 3, 4 540; ISEL-NEXT: isel 3, 4, 3, 1 541; ISEL-NEXT: blr 542; 543; NO_ISEL-LABEL: sel_constants_udiv_constant: 544; NO_ISEL: # BB#0: 545; NO_ISEL-NEXT: andi. 3, 3, 1 546; NO_ISEL-NEXT: li 4, 50 547; NO_ISEL-NEXT: li 3, 4 548; NO_ISEL-NEXT: bc 12, 1, .LBB25_1 549; NO_ISEL-NEXT: blr 550; NO_ISEL-NEXT: .LBB25_1: 551; NO_ISEL-NEXT: addi 3, 4, 0 552; NO_ISEL-NEXT: blr 553 %sel = select i1 %cond, i8 -4, i8 23 554 %bo = udiv i8 %sel, 5 555 ret i8 %bo 556} 557 558define i8 @sel_constants_srem_constant(i1 %cond) { 559; ISEL-LABEL: sel_constants_srem_constant: 560; ISEL: # BB#0: 561; ISEL-NEXT: lis 4, 16383 562; ISEL-NEXT: andi. 3, 3, 1 563; ISEL-NEXT: ori 3, 4, 65535 564; ISEL-NEXT: li 4, 3 565; ISEL-NEXT: sldi 3, 3, 2 566; ISEL-NEXT: isel 3, 3, 4, 1 567; ISEL-NEXT: blr 568; 569; NO_ISEL-LABEL: sel_constants_srem_constant: 570; NO_ISEL: # BB#0: 571; NO_ISEL-NEXT: lis 4, 16383 572; NO_ISEL-NEXT: andi. 3, 3, 1 573; NO_ISEL-NEXT: ori 3, 4, 65535 574; NO_ISEL-NEXT: li 4, 3 575; NO_ISEL-NEXT: sldi 3, 3, 2 576; NO_ISEL-NEXT: bclr 12, 1, 0 577; NO_ISEL-NEXT: # BB#1: 578; NO_ISEL-NEXT: ori 3, 4, 0 579; NO_ISEL-NEXT: blr 580 %sel = select i1 %cond, i8 -4, i8 23 581 %bo = srem i8 %sel, 5 582 ret i8 %bo 583} 584 585define i8 @sel_constants_urem_constant(i1 %cond) { 586; ISEL-LABEL: sel_constants_urem_constant: 587; ISEL: # BB#0: 588; ISEL-NEXT: andi. 3, 3, 1 589; ISEL-NEXT: li 4, 2 590; ISEL-NEXT: li 3, 3 591; ISEL-NEXT: isel 3, 4, 3, 1 592; ISEL-NEXT: blr 593; 594; NO_ISEL-LABEL: sel_constants_urem_constant: 595; NO_ISEL: # BB#0: 596; NO_ISEL-NEXT: andi. 3, 3, 1 597; NO_ISEL-NEXT: li 4, 2 598; NO_ISEL-NEXT: li 3, 3 599; NO_ISEL-NEXT: bc 12, 1, .LBB27_1 600; NO_ISEL-NEXT: blr 601; NO_ISEL-NEXT: .LBB27_1: 602; NO_ISEL-NEXT: addi 3, 4, 0 603; NO_ISEL-NEXT: blr 604 %sel = select i1 %cond, i8 -4, i8 23 605 %bo = urem i8 %sel, 5 606 ret i8 %bo 607} 608 609define i8 @sel_constants_and_constant(i1 %cond) { 610; ISEL-LABEL: sel_constants_and_constant: 611; ISEL: # BB#0: 612; ISEL-NEXT: andi. 3, 3, 1 613; ISEL-NEXT: li 4, 4 614; ISEL-NEXT: li 3, 5 615; ISEL-NEXT: isel 3, 4, 3, 1 616; ISEL-NEXT: blr 617; 618; NO_ISEL-LABEL: sel_constants_and_constant: 619; NO_ISEL: # BB#0: 620; NO_ISEL-NEXT: andi. 3, 3, 1 621; NO_ISEL-NEXT: li 4, 4 622; NO_ISEL-NEXT: li 3, 5 623; NO_ISEL-NEXT: bc 12, 1, .LBB28_1 624; NO_ISEL-NEXT: blr 625; NO_ISEL-NEXT: .LBB28_1: 626; NO_ISEL-NEXT: addi 3, 4, 0 627; NO_ISEL-NEXT: blr 628 %sel = select i1 %cond, i8 -4, i8 23 629 %bo = and i8 %sel, 5 630 ret i8 %bo 631} 632 633define i8 @sel_constants_or_constant(i1 %cond) { 634; ISEL-LABEL: sel_constants_or_constant: 635; ISEL: # BB#0: 636; ISEL-NEXT: li 4, 0 637; ISEL-NEXT: andi. 3, 3, 1 638; ISEL-NEXT: oris 3, 4, 65535 639; ISEL-NEXT: li 4, 23 640; ISEL-NEXT: ori 3, 3, 65533 641; ISEL-NEXT: isel 3, 3, 4, 1 642; ISEL-NEXT: blr 643; 644; NO_ISEL-LABEL: sel_constants_or_constant: 645; NO_ISEL: # BB#0: 646; NO_ISEL-NEXT: li 4, 0 647; NO_ISEL-NEXT: andi. 3, 3, 1 648; NO_ISEL-NEXT: oris 3, 4, 65535 649; NO_ISEL-NEXT: li 4, 23 650; NO_ISEL-NEXT: ori 3, 3, 65533 651; NO_ISEL-NEXT: bclr 12, 1, 0 652; NO_ISEL-NEXT: # BB#1: 653; NO_ISEL-NEXT: ori 3, 4, 0 654; NO_ISEL-NEXT: blr 655 %sel = select i1 %cond, i8 -4, i8 23 656 %bo = or i8 %sel, 5 657 ret i8 %bo 658} 659 660define i8 @sel_constants_xor_constant(i1 %cond) { 661; ISEL-LABEL: sel_constants_xor_constant: 662; ISEL: # BB#0: 663; ISEL-NEXT: li 4, 0 664; ISEL-NEXT: andi. 3, 3, 1 665; ISEL-NEXT: oris 3, 4, 65535 666; ISEL-NEXT: li 4, 18 667; ISEL-NEXT: ori 3, 3, 65529 668; ISEL-NEXT: isel 3, 3, 4, 1 669; ISEL-NEXT: blr 670; 671; NO_ISEL-LABEL: sel_constants_xor_constant: 672; NO_ISEL: # BB#0: 673; NO_ISEL-NEXT: li 4, 0 674; NO_ISEL-NEXT: andi. 3, 3, 1 675; NO_ISEL-NEXT: oris 3, 4, 65535 676; NO_ISEL-NEXT: li 4, 18 677; NO_ISEL-NEXT: ori 3, 3, 65529 678; NO_ISEL-NEXT: bclr 12, 1, 0 679; NO_ISEL-NEXT: # BB#1: 680; NO_ISEL-NEXT: ori 3, 4, 0 681; NO_ISEL-NEXT: blr 682 %sel = select i1 %cond, i8 -4, i8 23 683 %bo = xor i8 %sel, 5 684 ret i8 %bo 685} 686 687define i8 @sel_constants_shl_constant(i1 %cond) { 688; ISEL-LABEL: sel_constants_shl_constant: 689; ISEL: # BB#0: 690; ISEL-NEXT: lis 5, 511 691; ISEL-NEXT: lis 4, 2047 692; ISEL-NEXT: andi. 3, 3, 1 693; ISEL-NEXT: ori 3, 4, 65535 694; ISEL-NEXT: ori 12, 5, 65535 695; ISEL-NEXT: sldi 3, 3, 5 696; ISEL-NEXT: sldi 4, 12, 7 697; ISEL-NEXT: isel 3, 4, 3, 1 698; ISEL-NEXT: blr 699; 700; NO_ISEL-LABEL: sel_constants_shl_constant: 701; NO_ISEL: # BB#0: 702; NO_ISEL-NEXT: lis 5, 511 703; NO_ISEL-NEXT: lis 4, 2047 704; NO_ISEL-NEXT: andi. 3, 3, 1 705; NO_ISEL-NEXT: ori 3, 4, 65535 706; NO_ISEL-NEXT: ori 12, 5, 65535 707; NO_ISEL-NEXT: sldi 3, 3, 5 708; NO_ISEL-NEXT: sldi 4, 12, 7 709; NO_ISEL-NEXT: bc 12, 1, .LBB31_1 710; NO_ISEL-NEXT: blr 711; NO_ISEL-NEXT: .LBB31_1: 712; NO_ISEL-NEXT: addi 3, 4, 0 713; NO_ISEL-NEXT: blr 714 %sel = select i1 %cond, i8 -4, i8 23 715 %bo = shl i8 %sel, 5 716 ret i8 %bo 717} 718 719define i8 @sel_constants_lshr_constant(i1 %cond) { 720; ISEL-LABEL: sel_constants_lshr_constant: 721; ISEL: # BB#0: 722; ISEL-NEXT: andi. 3, 3, 1 723; ISEL-NEXT: li 4, 7 724; ISEL-NEXT: li 3, 0 725; ISEL-NEXT: isel 3, 4, 3, 1 726; ISEL-NEXT: blr 727; 728; NO_ISEL-LABEL: sel_constants_lshr_constant: 729; NO_ISEL: # BB#0: 730; NO_ISEL-NEXT: andi. 3, 3, 1 731; NO_ISEL-NEXT: li 4, 7 732; NO_ISEL-NEXT: li 3, 0 733; NO_ISEL-NEXT: bc 12, 1, .LBB32_1 734; NO_ISEL-NEXT: blr 735; NO_ISEL-NEXT: .LBB32_1: 736; NO_ISEL-NEXT: addi 3, 4, 0 737; NO_ISEL-NEXT: blr 738 %sel = select i1 %cond, i8 -4, i8 23 739 %bo = lshr i8 %sel, 5 740 ret i8 %bo 741} 742 743define i8 @sel_constants_ashr_constant(i1 %cond) { 744; ALL-LABEL: sel_constants_ashr_constant: 745; ALL: # BB#0: 746; ALL-NEXT: clrldi 3, 3, 63 747; ALL-NEXT: neg 3, 3 748; ALL-NEXT: blr 749 %sel = select i1 %cond, i8 -4, i8 23 750 %bo = ashr i8 %sel, 5 751 ret i8 %bo 752} 753 754define double @sel_constants_fadd_constant(i1 %cond) { 755; ISEL-LABEL: sel_constants_fadd_constant: 756; ISEL: # BB#0: 757; ISEL-NEXT: andi. 3, 3, 1 758; ISEL-NEXT: addis 4, 2, .LCPI34_0@toc@ha 759; ISEL-NEXT: addis 3, 2, .LCPI34_1@toc@ha 760; ISEL-NEXT: addi 4, 4, .LCPI34_0@toc@l 761; ISEL-NEXT: addi 3, 3, .LCPI34_1@toc@l 762; ISEL-NEXT: isel 3, 3, 4, 1 763; ISEL-NEXT: lxsdx 1, 0, 3 764; ISEL-NEXT: blr 765; 766; NO_ISEL-LABEL: sel_constants_fadd_constant: 767; NO_ISEL: # BB#0: 768; NO_ISEL-NEXT: andi. 3, 3, 1 769; NO_ISEL-NEXT: addis 4, 2, .LCPI34_0@toc@ha 770; NO_ISEL-NEXT: addis 3, 2, .LCPI34_1@toc@ha 771; NO_ISEL-NEXT: addi 4, 4, .LCPI34_0@toc@l 772; NO_ISEL-NEXT: addi 3, 3, .LCPI34_1@toc@l 773; NO_ISEL-NEXT: bc 12, 1, .LBB34_2 774; NO_ISEL-NEXT: # BB#1: 775; NO_ISEL-NEXT: ori 3, 4, 0 776; NO_ISEL-NEXT: b .LBB34_2 777; NO_ISEL-NEXT: .LBB34_2: 778; NO_ISEL-NEXT: lxsdx 1, 0, 3 779; NO_ISEL-NEXT: blr 780 %sel = select i1 %cond, double -4.0, double 23.3 781 %bo = fadd double %sel, 5.1 782 ret double %bo 783} 784 785define double @sel_constants_fsub_constant(i1 %cond) { 786; ISEL-LABEL: sel_constants_fsub_constant: 787; ISEL: # BB#0: 788; ISEL-NEXT: andi. 3, 3, 1 789; ISEL-NEXT: addis 4, 2, .LCPI35_0@toc@ha 790; ISEL-NEXT: addis 3, 2, .LCPI35_1@toc@ha 791; ISEL-NEXT: addi 4, 4, .LCPI35_0@toc@l 792; ISEL-NEXT: addi 3, 3, .LCPI35_1@toc@l 793; ISEL-NEXT: isel 3, 3, 4, 1 794; ISEL-NEXT: lxsdx 1, 0, 3 795; ISEL-NEXT: blr 796; 797; NO_ISEL-LABEL: sel_constants_fsub_constant: 798; NO_ISEL: # BB#0: 799; NO_ISEL-NEXT: andi. 3, 3, 1 800; NO_ISEL-NEXT: addis 4, 2, .LCPI35_0@toc@ha 801; NO_ISEL-NEXT: addis 3, 2, .LCPI35_1@toc@ha 802; NO_ISEL-NEXT: addi 4, 4, .LCPI35_0@toc@l 803; NO_ISEL-NEXT: addi 3, 3, .LCPI35_1@toc@l 804; NO_ISEL-NEXT: bc 12, 1, .LBB35_2 805; NO_ISEL-NEXT: # BB#1: 806; NO_ISEL-NEXT: ori 3, 4, 0 807; NO_ISEL-NEXT: b .LBB35_2 808; NO_ISEL-NEXT: .LBB35_2: 809; NO_ISEL-NEXT: lxsdx 1, 0, 3 810; NO_ISEL-NEXT: blr 811 %sel = select i1 %cond, double -4.0, double 23.3 812 %bo = fsub double %sel, 5.1 813 ret double %bo 814} 815 816define double @sel_constants_fmul_constant(i1 %cond) { 817; ISEL-LABEL: sel_constants_fmul_constant: 818; ISEL: # BB#0: 819; ISEL-NEXT: andi. 3, 3, 1 820; ISEL-NEXT: addis 4, 2, .LCPI36_0@toc@ha 821; ISEL-NEXT: addis 3, 2, .LCPI36_1@toc@ha 822; ISEL-NEXT: addi 4, 4, .LCPI36_0@toc@l 823; ISEL-NEXT: addi 3, 3, .LCPI36_1@toc@l 824; ISEL-NEXT: isel 3, 3, 4, 1 825; ISEL-NEXT: lxsdx 1, 0, 3 826; ISEL-NEXT: blr 827; 828; NO_ISEL-LABEL: sel_constants_fmul_constant: 829; NO_ISEL: # BB#0: 830; NO_ISEL-NEXT: andi. 3, 3, 1 831; NO_ISEL-NEXT: addis 4, 2, .LCPI36_0@toc@ha 832; NO_ISEL-NEXT: addis 3, 2, .LCPI36_1@toc@ha 833; NO_ISEL-NEXT: addi 4, 4, .LCPI36_0@toc@l 834; NO_ISEL-NEXT: addi 3, 3, .LCPI36_1@toc@l 835; NO_ISEL-NEXT: bc 12, 1, .LBB36_2 836; NO_ISEL-NEXT: # BB#1: 837; NO_ISEL-NEXT: ori 3, 4, 0 838; NO_ISEL-NEXT: b .LBB36_2 839; NO_ISEL-NEXT: .LBB36_2: 840; NO_ISEL-NEXT: lxsdx 1, 0, 3 841; NO_ISEL-NEXT: blr 842 %sel = select i1 %cond, double -4.0, double 23.3 843 %bo = fmul double %sel, 5.1 844 ret double %bo 845} 846 847define double @sel_constants_fdiv_constant(i1 %cond) { 848; ISEL-LABEL: sel_constants_fdiv_constant: 849; ISEL: # BB#0: 850; ISEL-NEXT: andi. 3, 3, 1 851; ISEL-NEXT: addis 4, 2, .LCPI37_0@toc@ha 852; ISEL-NEXT: addis 3, 2, .LCPI37_1@toc@ha 853; ISEL-NEXT: addi 4, 4, .LCPI37_0@toc@l 854; ISEL-NEXT: addi 3, 3, .LCPI37_1@toc@l 855; ISEL-NEXT: isel 3, 3, 4, 1 856; ISEL-NEXT: lxsdx 1, 0, 3 857; ISEL-NEXT: blr 858; 859; NO_ISEL-LABEL: sel_constants_fdiv_constant: 860; NO_ISEL: # BB#0: 861; NO_ISEL-NEXT: andi. 3, 3, 1 862; NO_ISEL-NEXT: addis 4, 2, .LCPI37_0@toc@ha 863; NO_ISEL-NEXT: addis 3, 2, .LCPI37_1@toc@ha 864; NO_ISEL-NEXT: addi 4, 4, .LCPI37_0@toc@l 865; NO_ISEL-NEXT: addi 3, 3, .LCPI37_1@toc@l 866; NO_ISEL-NEXT: bc 12, 1, .LBB37_2 867; NO_ISEL-NEXT: # BB#1: 868; NO_ISEL-NEXT: ori 3, 4, 0 869; NO_ISEL-NEXT: b .LBB37_2 870; NO_ISEL-NEXT: .LBB37_2: 871; NO_ISEL-NEXT: lxsdx 1, 0, 3 872; NO_ISEL-NEXT: blr 873 %sel = select i1 %cond, double -4.0, double 23.3 874 %bo = fdiv double %sel, 5.1 875 ret double %bo 876} 877 878define double @sel_constants_frem_constant(i1 %cond) { 879; ALL-LABEL: sel_constants_frem_constant: 880; ALL: # BB#0: 881; ALL-NEXT: andi. 3, 3, 1 882; ALL-NEXT: bc 12, 1, .LBB38_2 883; ALL-NEXT: # BB#1: 884; ALL-NEXT: addis 3, 2, .LCPI38_0@toc@ha 885; ALL-NEXT: addi 3, 3, .LCPI38_0@toc@l 886; ALL-NEXT: lxsdx 1, 0, 3 887; ALL-NEXT: blr 888; ALL-NEXT: .LBB38_2: 889; ALL-NEXT: addis 3, 2, .LCPI38_1@toc@ha 890; ALL-NEXT: addi 3, 3, .LCPI38_1@toc@l 891; ALL-NEXT: lxsspx 1, 0, 3 892; ALL-NEXT: blr 893 %sel = select i1 %cond, double -4.0, double 23.3 894 %bo = frem double %sel, 5.1 895 ret double %bo 896} 897 898