; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=powerpc64le-unknown-linux -mcpu=pwr8 -O0 < %s | \ ; RUN: FileCheck %s -check-prefix=P8 ; RUN: llc -mtriple=powerpc64le-unknown-linux -mcpu=pwr9 -O0 < %s | \ ; RUN: FileCheck %s -check-prefix=P9 define i32 @test_choice1(fp128 %a, fp128 %b) #0 { ; P8-LABEL: test_choice1: ; P8: # %bb.0: # %entry ; P8-NEXT: mflr 0 ; P8-NEXT: std 0, 16(1) ; P8-NEXT: stdu 1, -112(1) ; P8-NEXT: bl __nekf2 ; P8-NEXT: nop ; P8-NEXT: # kill: def $r3 killed $r3 killed $x3 ; P8-NEXT: cmplwi 3, 0 ; P8-NEXT: bne 0, .LBB0_2 ; P8-NEXT: b .LBB0_1 ; P8-NEXT: .LBB0_1: # %if.true ; P8-NEXT: bl foo ; P8-NEXT: nop ; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill ; P8-NEXT: b .LBB0_3 ; P8-NEXT: .LBB0_2: # %if.false ; P8-NEXT: bl bar ; P8-NEXT: nop ; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill ; P8-NEXT: .LBB0_3: # %final ; P8-NEXT: lwz 3, 108(1) # 4-byte Folded Reload ; P8-NEXT: clrldi 3, 3, 32 ; P8-NEXT: addi 1, 1, 112 ; P8-NEXT: ld 0, 16(1) ; P8-NEXT: mtlr 0 ; P8-NEXT: blr ; ; P9-LABEL: test_choice1: ; P9: # %bb.0: # %entry ; P9-NEXT: mflr 0 ; P9-NEXT: std 0, 16(1) ; P9-NEXT: stdu 1, -112(1) ; P9-NEXT: xscmpuqp 0, 2, 3 ; P9-NEXT: bne 0, .LBB0_2 ; P9-NEXT: b .LBB0_1 ; P9-NEXT: .LBB0_1: # %if.true ; P9-NEXT: bl foo ; P9-NEXT: nop ; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill ; P9-NEXT: b .LBB0_3 ; P9-NEXT: .LBB0_2: # %if.false ; P9-NEXT: bl bar ; P9-NEXT: nop ; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill ; P9-NEXT: .LBB0_3: # %final ; P9-NEXT: lwz 3, 108(1) # 4-byte Folded Reload ; P9-NEXT: clrldi 3, 3, 32 ; P9-NEXT: addi 1, 1, 112 ; P9-NEXT: ld 0, 16(1) ; P9-NEXT: mtlr 0 ; P9-NEXT: blr entry: %cmp = fcmp oeq fp128 %a, %b br i1 %cmp, label %if.true, label %if.false if.true: %res1 = call i32 @foo() br label %final if.false: %res2 = call i32 @bar() br label %final final: %result = phi i32 [%res1, %if.true], [%res2, %if.false] ret i32 %result } define i32 @test_choice2(fp128 %a, fp128 %b) #0 { ; P8-LABEL: test_choice2: ; P8: # %bb.0: # %entry ; P8-NEXT: mflr 0 ; P8-NEXT: std 0, 16(1) ; P8-NEXT: stdu 1, -112(1) ; P8-NEXT: bl __lekf2 ; P8-NEXT: nop ; P8-NEXT: # kill: def $r3 killed $r3 killed $x3 ; P8-NEXT: cmpwi 3, 1 ; P8-NEXT: blt 0, .LBB1_2 ; P8-NEXT: b .LBB1_1 ; P8-NEXT: .LBB1_1: # %if.true ; P8-NEXT: bl foo ; P8-NEXT: nop ; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill ; P8-NEXT: b .LBB1_3 ; P8-NEXT: .LBB1_2: # %if.false ; P8-NEXT: bl bar ; P8-NEXT: nop ; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill ; P8-NEXT: .LBB1_3: # %final ; P8-NEXT: lwz 3, 108(1) # 4-byte Folded Reload ; P8-NEXT: clrldi 3, 3, 32 ; P8-NEXT: addi 1, 1, 112 ; P8-NEXT: ld 0, 16(1) ; P8-NEXT: mtlr 0 ; P8-NEXT: blr ; ; P9-LABEL: test_choice2: ; P9: # %bb.0: # %entry ; P9-NEXT: mflr 0 ; P9-NEXT: std 0, 16(1) ; P9-NEXT: stdu 1, -112(1) ; P9-NEXT: xscmpuqp 0, 2, 3 ; P9-NEXT: crmove 20, 3 ; P9-NEXT: crnot 21, 20 ; P9-NEXT: crmove 20, 1 ; P9-NEXT: crnot 20, 20 ; P9-NEXT: crand 20, 20, 21 ; P9-NEXT: crxor 21, 21, 21 ; P9-NEXT: crxor 20, 20, 21 ; P9-NEXT: bc 12, 20, .LBB1_2 ; P9-NEXT: b .LBB1_1 ; P9-NEXT: .LBB1_1: # %if.true ; P9-NEXT: bl foo ; P9-NEXT: nop ; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill ; P9-NEXT: b .LBB1_3 ; P9-NEXT: .LBB1_2: # %if.false ; P9-NEXT: bl bar ; P9-NEXT: nop ; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill ; P9-NEXT: .LBB1_3: # %final ; P9-NEXT: lwz 3, 108(1) # 4-byte Folded Reload ; P9-NEXT: clrldi 3, 3, 32 ; P9-NEXT: addi 1, 1, 112 ; P9-NEXT: ld 0, 16(1) ; P9-NEXT: mtlr 0 ; P9-NEXT: blr entry: %cmp = fcmp ugt fp128 %a, %b br i1 %cmp, label %if.true, label %if.false if.true: %res1 = call i32 @foo() br label %final if.false: %res2 = call i32 @bar() br label %final final: %result = phi i32 [%res1, %if.true], [%res2, %if.false] ret i32 %result } define i32 @test_choice3(fp128 %a, fp128 %b) #0 { ; P8-LABEL: test_choice3: ; P8: # %bb.0: # %entry ; P8-NEXT: mflr 0 ; P8-NEXT: std 0, 16(1) ; P8-NEXT: stdu 1, -112(1) ; P8-NEXT: bl __ltkf2 ; P8-NEXT: nop ; P8-NEXT: # kill: def $r3 killed $r3 killed $x3 ; P8-NEXT: cmpwi 3, -1 ; P8-NEXT: bgt 0, .LBB2_2 ; P8-NEXT: b .LBB2_1 ; P8-NEXT: .LBB2_1: # %if.true ; P8-NEXT: bl foo ; P8-NEXT: nop ; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill ; P8-NEXT: b .LBB2_3 ; P8-NEXT: .LBB2_2: # %if.false ; P8-NEXT: bl bar ; P8-NEXT: nop ; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill ; P8-NEXT: .LBB2_3: # %final ; P8-NEXT: lwz 3, 108(1) # 4-byte Folded Reload ; P8-NEXT: clrldi 3, 3, 32 ; P8-NEXT: addi 1, 1, 112 ; P8-NEXT: ld 0, 16(1) ; P8-NEXT: mtlr 0 ; P8-NEXT: blr ; ; P9-LABEL: test_choice3: ; P9: # %bb.0: # %entry ; P9-NEXT: mflr 0 ; P9-NEXT: std 0, 16(1) ; P9-NEXT: stdu 1, -112(1) ; P9-NEXT: xscmpuqp 0, 2, 3 ; P9-NEXT: bge 0, .LBB2_2 ; P9-NEXT: b .LBB2_1 ; P9-NEXT: .LBB2_1: # %if.true ; P9-NEXT: bl foo ; P9-NEXT: nop ; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill ; P9-NEXT: b .LBB2_3 ; P9-NEXT: .LBB2_2: # %if.false ; P9-NEXT: bl bar ; P9-NEXT: nop ; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill ; P9-NEXT: .LBB2_3: # %final ; P9-NEXT: lwz 3, 108(1) # 4-byte Folded Reload ; P9-NEXT: clrldi 3, 3, 32 ; P9-NEXT: addi 1, 1, 112 ; P9-NEXT: ld 0, 16(1) ; P9-NEXT: mtlr 0 ; P9-NEXT: blr entry: %cmp = fcmp olt fp128 %a, %b br i1 %cmp, label %if.true, label %if.false if.true: %res1 = call i32 @foo() br label %final if.false: %res2 = call i32 @bar() br label %final final: %result = phi i32 [%res1, %if.true], [%res2, %if.false] ret i32 %result } define i32 @test_choice4(fp128 %a, fp128 %b) #0 { ; P8-LABEL: test_choice4: ; P8: # %bb.0: # %entry ; P8-NEXT: mflr 0 ; P8-NEXT: std 0, 16(1) ; P8-NEXT: stdu 1, -112(1) ; P8-NEXT: bl __eqkf2 ; P8-NEXT: nop ; P8-NEXT: # kill: def $r3 killed $r3 killed $x3 ; P8-NEXT: cmplwi 3, 0 ; P8-NEXT: beq 0, .LBB3_2 ; P8-NEXT: b .LBB3_1 ; P8-NEXT: .LBB3_1: # %if.true ; P8-NEXT: bl foo ; P8-NEXT: nop ; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill ; P8-NEXT: b .LBB3_3 ; P8-NEXT: .LBB3_2: # %if.false ; P8-NEXT: bl bar ; P8-NEXT: nop ; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill ; P8-NEXT: .LBB3_3: # %final ; P8-NEXT: lwz 3, 108(1) # 4-byte Folded Reload ; P8-NEXT: clrldi 3, 3, 32 ; P8-NEXT: addi 1, 1, 112 ; P8-NEXT: ld 0, 16(1) ; P8-NEXT: mtlr 0 ; P8-NEXT: blr ; ; P9-LABEL: test_choice4: ; P9: # %bb.0: # %entry ; P9-NEXT: mflr 0 ; P9-NEXT: std 0, 16(1) ; P9-NEXT: stdu 1, -112(1) ; P9-NEXT: xscmpuqp 0, 2, 3 ; P9-NEXT: beq 0, .LBB3_2 ; P9-NEXT: b .LBB3_1 ; P9-NEXT: .LBB3_1: # %if.true ; P9-NEXT: bl foo ; P9-NEXT: nop ; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill ; P9-NEXT: b .LBB3_3 ; P9-NEXT: .LBB3_2: # %if.false ; P9-NEXT: bl bar ; P9-NEXT: nop ; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill ; P9-NEXT: .LBB3_3: # %final ; P9-NEXT: lwz 3, 108(1) # 4-byte Folded Reload ; P9-NEXT: clrldi 3, 3, 32 ; P9-NEXT: addi 1, 1, 112 ; P9-NEXT: ld 0, 16(1) ; P9-NEXT: mtlr 0 ; P9-NEXT: blr entry: %cmp = fcmp une fp128 %a, %b br i1 %cmp, label %if.true, label %if.false if.true: %res1 = call i32 @foo() br label %final if.false: %res2 = call i32 @bar() br label %final final: %result = phi i32 [%res1, %if.true], [%res2, %if.false] ret i32 %result } attributes #0 = { nounwind } declare i32 @foo() declare i32 @bar()