1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=powerpc64le-unknown-linux -mcpu=pwr8 -O0 < %s | \ 3; RUN: FileCheck %s -check-prefix=P8 4; RUN: llc -mtriple=powerpc64le-unknown-linux -mcpu=pwr9 -O0 < %s | \ 5; RUN: FileCheck %s -check-prefix=P9 6 7define i32 @test_choice1(fp128 %a, fp128 %b) #0 { 8; P8-LABEL: test_choice1: 9; P8: # %bb.0: # %entry 10; P8-NEXT: mflr 0 11; P8-NEXT: stdu 1, -112(1) 12; P8-NEXT: std 0, 128(1) 13; P8-NEXT: bl __nekf2 14; P8-NEXT: nop 15; P8-NEXT: # kill: def $r3 killed $r3 killed $x3 16; P8-NEXT: cmplwi 3, 0 17; P8-NEXT: bne 0, .LBB0_2 18; P8-NEXT: b .LBB0_1 19; P8-NEXT: .LBB0_1: # %if.true 20; P8-NEXT: bl foo 21; P8-NEXT: nop 22; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill 23; P8-NEXT: b .LBB0_3 24; P8-NEXT: .LBB0_2: # %if.false 25; P8-NEXT: bl bar 26; P8-NEXT: nop 27; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill 28; P8-NEXT: .LBB0_3: # %final 29; P8-NEXT: lwz 3, 108(1) # 4-byte Folded Reload 30; P8-NEXT: clrldi 3, 3, 32 31; P8-NEXT: addi 1, 1, 112 32; P8-NEXT: ld 0, 16(1) 33; P8-NEXT: mtlr 0 34; P8-NEXT: blr 35; 36; P9-LABEL: test_choice1: 37; P9: # %bb.0: # %entry 38; P9-NEXT: mflr 0 39; P9-NEXT: stdu 1, -112(1) 40; P9-NEXT: std 0, 128(1) 41; P9-NEXT: xscmpuqp 0, 2, 3 42; P9-NEXT: bne 0, .LBB0_2 43; P9-NEXT: b .LBB0_1 44; P9-NEXT: .LBB0_1: # %if.true 45; P9-NEXT: bl foo 46; P9-NEXT: nop 47; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill 48; P9-NEXT: b .LBB0_3 49; P9-NEXT: .LBB0_2: # %if.false 50; P9-NEXT: bl bar 51; P9-NEXT: nop 52; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill 53; P9-NEXT: .LBB0_3: # %final 54; P9-NEXT: lwz 3, 108(1) # 4-byte Folded Reload 55; P9-NEXT: clrldi 3, 3, 32 56; P9-NEXT: addi 1, 1, 112 57; P9-NEXT: ld 0, 16(1) 58; P9-NEXT: mtlr 0 59; P9-NEXT: blr 60entry: 61 %cmp = fcmp oeq fp128 %a, %b 62 br i1 %cmp, label %if.true, label %if.false 63 64if.true: 65 %res1 = call i32 @foo() 66 br label %final 67 68if.false: 69 %res2 = call i32 @bar() 70 br label %final 71 72final: 73 %result = phi i32 [%res1, %if.true], [%res2, %if.false] 74 ret i32 %result 75} 76 77define i32 @test_choice2(fp128 %a, fp128 %b) #0 { 78; P8-LABEL: test_choice2: 79; P8: # %bb.0: # %entry 80; P8-NEXT: mflr 0 81; P8-NEXT: stdu 1, -112(1) 82; P8-NEXT: std 0, 128(1) 83; P8-NEXT: bl __lekf2 84; P8-NEXT: nop 85; P8-NEXT: # kill: def $r3 killed $r3 killed $x3 86; P8-NEXT: cmpwi 3, 1 87; P8-NEXT: blt 0, .LBB1_2 88; P8-NEXT: b .LBB1_1 89; P8-NEXT: .LBB1_1: # %if.true 90; P8-NEXT: bl foo 91; P8-NEXT: nop 92; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill 93; P8-NEXT: b .LBB1_3 94; P8-NEXT: .LBB1_2: # %if.false 95; P8-NEXT: bl bar 96; P8-NEXT: nop 97; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill 98; P8-NEXT: .LBB1_3: # %final 99; P8-NEXT: lwz 3, 108(1) # 4-byte Folded Reload 100; P8-NEXT: clrldi 3, 3, 32 101; P8-NEXT: addi 1, 1, 112 102; P8-NEXT: ld 0, 16(1) 103; P8-NEXT: mtlr 0 104; P8-NEXT: blr 105; 106; P9-LABEL: test_choice2: 107; P9: # %bb.0: # %entry 108; P9-NEXT: mflr 0 109; P9-NEXT: stdu 1, -112(1) 110; P9-NEXT: std 0, 128(1) 111; P9-NEXT: xscmpuqp 0, 2, 3 112; P9-NEXT: crmove 20, 3 113; P9-NEXT: crnot 21, 20 114; P9-NEXT: crmove 20, 1 115; P9-NEXT: crnot 20, 20 116; P9-NEXT: crand 20, 20, 21 117; P9-NEXT: crxor 21, 21, 21 118; P9-NEXT: crxor 20, 20, 21 119; P9-NEXT: bc 12, 20, .LBB1_2 120; P9-NEXT: b .LBB1_1 121; P9-NEXT: .LBB1_1: # %if.true 122; P9-NEXT: bl foo 123; P9-NEXT: nop 124; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill 125; P9-NEXT: b .LBB1_3 126; P9-NEXT: .LBB1_2: # %if.false 127; P9-NEXT: bl bar 128; P9-NEXT: nop 129; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill 130; P9-NEXT: .LBB1_3: # %final 131; P9-NEXT: lwz 3, 108(1) # 4-byte Folded Reload 132; P9-NEXT: clrldi 3, 3, 32 133; P9-NEXT: addi 1, 1, 112 134; P9-NEXT: ld 0, 16(1) 135; P9-NEXT: mtlr 0 136; P9-NEXT: blr 137entry: 138 %cmp = fcmp ugt fp128 %a, %b 139 br i1 %cmp, label %if.true, label %if.false 140 141if.true: 142 %res1 = call i32 @foo() 143 br label %final 144 145if.false: 146 %res2 = call i32 @bar() 147 br label %final 148 149final: 150 %result = phi i32 [%res1, %if.true], [%res2, %if.false] 151 ret i32 %result 152} 153 154define i32 @test_choice3(fp128 %a, fp128 %b) #0 { 155; P8-LABEL: test_choice3: 156; P8: # %bb.0: # %entry 157; P8-NEXT: mflr 0 158; P8-NEXT: stdu 1, -112(1) 159; P8-NEXT: std 0, 128(1) 160; P8-NEXT: bl __ltkf2 161; P8-NEXT: nop 162; P8-NEXT: # kill: def $r3 killed $r3 killed $x3 163; P8-NEXT: cmpwi 3, -1 164; P8-NEXT: bgt 0, .LBB2_2 165; P8-NEXT: b .LBB2_1 166; P8-NEXT: .LBB2_1: # %if.true 167; P8-NEXT: bl foo 168; P8-NEXT: nop 169; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill 170; P8-NEXT: b .LBB2_3 171; P8-NEXT: .LBB2_2: # %if.false 172; P8-NEXT: bl bar 173; P8-NEXT: nop 174; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill 175; P8-NEXT: .LBB2_3: # %final 176; P8-NEXT: lwz 3, 108(1) # 4-byte Folded Reload 177; P8-NEXT: clrldi 3, 3, 32 178; P8-NEXT: addi 1, 1, 112 179; P8-NEXT: ld 0, 16(1) 180; P8-NEXT: mtlr 0 181; P8-NEXT: blr 182; 183; P9-LABEL: test_choice3: 184; P9: # %bb.0: # %entry 185; P9-NEXT: mflr 0 186; P9-NEXT: stdu 1, -112(1) 187; P9-NEXT: std 0, 128(1) 188; P9-NEXT: xscmpuqp 0, 2, 3 189; P9-NEXT: bge 0, .LBB2_2 190; P9-NEXT: b .LBB2_1 191; P9-NEXT: .LBB2_1: # %if.true 192; P9-NEXT: bl foo 193; P9-NEXT: nop 194; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill 195; P9-NEXT: b .LBB2_3 196; P9-NEXT: .LBB2_2: # %if.false 197; P9-NEXT: bl bar 198; P9-NEXT: nop 199; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill 200; P9-NEXT: .LBB2_3: # %final 201; P9-NEXT: lwz 3, 108(1) # 4-byte Folded Reload 202; P9-NEXT: clrldi 3, 3, 32 203; P9-NEXT: addi 1, 1, 112 204; P9-NEXT: ld 0, 16(1) 205; P9-NEXT: mtlr 0 206; P9-NEXT: blr 207entry: 208 %cmp = fcmp olt fp128 %a, %b 209 br i1 %cmp, label %if.true, label %if.false 210 211if.true: 212 %res1 = call i32 @foo() 213 br label %final 214 215if.false: 216 %res2 = call i32 @bar() 217 br label %final 218 219final: 220 %result = phi i32 [%res1, %if.true], [%res2, %if.false] 221 ret i32 %result 222} 223 224define i32 @test_choice4(fp128 %a, fp128 %b) #0 { 225; P8-LABEL: test_choice4: 226; P8: # %bb.0: # %entry 227; P8-NEXT: mflr 0 228; P8-NEXT: stdu 1, -112(1) 229; P8-NEXT: std 0, 128(1) 230; P8-NEXT: bl __eqkf2 231; P8-NEXT: nop 232; P8-NEXT: # kill: def $r3 killed $r3 killed $x3 233; P8-NEXT: cmplwi 3, 0 234; P8-NEXT: beq 0, .LBB3_2 235; P8-NEXT: b .LBB3_1 236; P8-NEXT: .LBB3_1: # %if.true 237; P8-NEXT: bl foo 238; P8-NEXT: nop 239; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill 240; P8-NEXT: b .LBB3_3 241; P8-NEXT: .LBB3_2: # %if.false 242; P8-NEXT: bl bar 243; P8-NEXT: nop 244; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill 245; P8-NEXT: .LBB3_3: # %final 246; P8-NEXT: lwz 3, 108(1) # 4-byte Folded Reload 247; P8-NEXT: clrldi 3, 3, 32 248; P8-NEXT: addi 1, 1, 112 249; P8-NEXT: ld 0, 16(1) 250; P8-NEXT: mtlr 0 251; P8-NEXT: blr 252; 253; P9-LABEL: test_choice4: 254; P9: # %bb.0: # %entry 255; P9-NEXT: mflr 0 256; P9-NEXT: stdu 1, -112(1) 257; P9-NEXT: std 0, 128(1) 258; P9-NEXT: xscmpuqp 0, 2, 3 259; P9-NEXT: beq 0, .LBB3_2 260; P9-NEXT: b .LBB3_1 261; P9-NEXT: .LBB3_1: # %if.true 262; P9-NEXT: bl foo 263; P9-NEXT: nop 264; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill 265; P9-NEXT: b .LBB3_3 266; P9-NEXT: .LBB3_2: # %if.false 267; P9-NEXT: bl bar 268; P9-NEXT: nop 269; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill 270; P9-NEXT: .LBB3_3: # %final 271; P9-NEXT: lwz 3, 108(1) # 4-byte Folded Reload 272; P9-NEXT: clrldi 3, 3, 32 273; P9-NEXT: addi 1, 1, 112 274; P9-NEXT: ld 0, 16(1) 275; P9-NEXT: mtlr 0 276; P9-NEXT: blr 277entry: 278 %cmp = fcmp une fp128 %a, %b 279 br i1 %cmp, label %if.true, label %if.false 280 281if.true: 282 %res1 = call i32 @foo() 283 br label %final 284 285 if.false: 286 %res2 = call i32 @bar() 287 br label %final 288 289final: 290 %result = phi i32 [%res1, %if.true], [%res2, %if.false] 291 ret i32 %result 292} 293 294attributes #0 = { nounwind } 295 296declare i32 @foo() 297declare i32 @bar() 298