10246c614SAlex Bradbury; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --include-generated-funcs --version 2 20246c614SAlex Bradbury; RUN: llc -mtriple=riscv64 -riscv-enable-copy-propagation -enable-machine-outliner -verify-machineinstrs < %s \ 30246c614SAlex Bradbury; RUN: | FileCheck %s -check-prefix=RV64I 40246c614SAlex Bradbury 50246c614SAlex Bradbury; The outlined function produced by this test case contains a register to 60246c614SAlex Bradbury; register copy, which is at risk of being removed by MachineCopyPropagation 70246c614SAlex Bradbury; if it can't see that the copy is used. At the time of writing this test 80246c614SAlex Bradbury; case, MCP will remove the copy if it is run after the machine outliner. 90246c614SAlex Bradbury 100246c614SAlex Bradburydefine signext i32 @nge(i32 signext %a, i32 signext %b) nounwind { 110246c614SAlex Bradburyentry: 120246c614SAlex Bradbury %cmp = icmp sge i32 %a, %b 130246c614SAlex Bradbury %conv.neg = sext i1 %cmp to i32 140246c614SAlex Bradbury ret i32 %conv.neg 150246c614SAlex Bradbury} 160246c614SAlex Bradbury 170246c614SAlex Bradburydefine signext i32 @ngt(i32 signext %a, i32 signext %b) nounwind { 180246c614SAlex Bradburyentry: 190246c614SAlex Bradbury %cmp = icmp sgt i32 %a, %b 200246c614SAlex Bradbury %conv.neg = sext i1 %cmp to i32 210246c614SAlex Bradbury ret i32 %conv.neg 220246c614SAlex Bradbury} 230246c614SAlex Bradbury 240246c614SAlex Bradburydefine signext i32 @nle(i32 signext %a, i32 signext %b) nounwind { 250246c614SAlex Bradburyentry: 260246c614SAlex Bradbury %cmp = icmp sle i32 %a, %b 270246c614SAlex Bradbury %conv.neg = sext i1 %cmp to i32 280246c614SAlex Bradbury ret i32 %conv.neg 290246c614SAlex Bradbury} 300246c614SAlex Bradbury 310246c614SAlex Bradburydefine signext i32 @nlt(i32 signext %a, i32 signext %b) nounwind { 320246c614SAlex Bradburyentry: 330246c614SAlex Bradbury %cmp = icmp slt i32 %a, %b 340246c614SAlex Bradbury %conv.neg = sext i1 %cmp to i32 350246c614SAlex Bradbury ret i32 %conv.neg 360246c614SAlex Bradbury} 370246c614SAlex Bradbury 380246c614SAlex Bradburydefine signext i32 @main() nounwind { 390246c614SAlex Bradburyentry: 400246c614SAlex Bradbury %call = tail call signext i32 @nge(i32 signext -2147483648, i32 signext 2147483647) 410246c614SAlex Bradbury %cmp.not = icmp eq i32 %call, 0 420246c614SAlex Bradbury br i1 %cmp.not, label %if.end, label %if.then 430246c614SAlex Bradbury 440246c614SAlex Bradburyif.then: 450246c614SAlex Bradbury tail call void @abort() 460246c614SAlex Bradbury unreachable 470246c614SAlex Bradbury 480246c614SAlex Bradburyif.end: 490246c614SAlex Bradbury %call1 = tail call signext i32 @nge(i32 signext 2147483647, i32 signext -2147483648) 500246c614SAlex Bradbury %cmp2.not = icmp eq i32 %call1, -1 510246c614SAlex Bradbury br i1 %cmp2.not, label %if.end4, label %if.then3 520246c614SAlex Bradbury 530246c614SAlex Bradburyif.then3: 540246c614SAlex Bradbury tail call void @abort() 550246c614SAlex Bradbury unreachable 560246c614SAlex Bradbury 570246c614SAlex Bradburyif.end4: 580246c614SAlex Bradbury %call5 = tail call signext i32 @ngt(i32 signext -2147483648, i32 signext 2147483647) 590246c614SAlex Bradbury %cmp6.not = icmp eq i32 %call5, 0 600246c614SAlex Bradbury br i1 %cmp6.not, label %if.end8, label %if.then7 610246c614SAlex Bradbury 620246c614SAlex Bradburyif.then7: 630246c614SAlex Bradbury tail call void @abort() 640246c614SAlex Bradbury unreachable 650246c614SAlex Bradbury 660246c614SAlex Bradburyif.end8: 670246c614SAlex Bradbury %call9 = tail call signext i32 @ngt(i32 signext 2147483647, i32 signext -2147483648) 680246c614SAlex Bradbury %cmp10.not = icmp eq i32 %call9, -1 690246c614SAlex Bradbury br i1 %cmp10.not, label %if.end12, label %if.then11 700246c614SAlex Bradbury 710246c614SAlex Bradburyif.then11: 720246c614SAlex Bradbury tail call void @abort() 730246c614SAlex Bradbury unreachable 740246c614SAlex Bradbury 750246c614SAlex Bradburyif.end12: 760246c614SAlex Bradbury %call13 = tail call signext i32 @nle(i32 signext -2147483648, i32 signext 2147483647) 770246c614SAlex Bradbury %cmp14.not = icmp eq i32 %call13, -1 780246c614SAlex Bradbury br i1 %cmp14.not, label %if.end16, label %if.then15 790246c614SAlex Bradbury 800246c614SAlex Bradburyif.then15: 810246c614SAlex Bradbury tail call void @abort() 820246c614SAlex Bradbury unreachable 830246c614SAlex Bradbury 840246c614SAlex Bradburyif.end16: 850246c614SAlex Bradbury %call17 = tail call signext i32 @nle(i32 signext 2147483647, i32 signext -2147483648) 860246c614SAlex Bradbury %cmp18.not = icmp eq i32 %call17, 0 870246c614SAlex Bradbury br i1 %cmp18.not, label %if.end20, label %if.then19 880246c614SAlex Bradbury 890246c614SAlex Bradburyif.then19: 900246c614SAlex Bradbury tail call void @abort() 910246c614SAlex Bradbury unreachable 920246c614SAlex Bradbury 930246c614SAlex Bradburyif.end20: 940246c614SAlex Bradbury %call21 = tail call signext i32 @nlt(i32 signext -2147483648, i32 signext 2147483647) 950246c614SAlex Bradbury %cmp22.not = icmp eq i32 %call21, -1 960246c614SAlex Bradbury br i1 %cmp22.not, label %if.end24, label %if.then23 970246c614SAlex Bradbury 980246c614SAlex Bradburyif.then23: 990246c614SAlex Bradbury tail call void @abort() 1000246c614SAlex Bradbury unreachable 1010246c614SAlex Bradbury 1020246c614SAlex Bradburyif.end24: 1030246c614SAlex Bradbury %call25 = tail call signext i32 @nlt(i32 signext 2147483647, i32 signext -2147483648) 1040246c614SAlex Bradbury %cmp26.not = icmp eq i32 %call25, 0 1050246c614SAlex Bradbury br i1 %cmp26.not, label %if.end28, label %if.then27 1060246c614SAlex Bradbury 1070246c614SAlex Bradburyif.then27: 1080246c614SAlex Bradbury tail call void @abort() 1090246c614SAlex Bradbury unreachable 1100246c614SAlex Bradbury 1110246c614SAlex Bradburyif.end28: 1120246c614SAlex Bradbury tail call void @exit(i32 signext 0) 1130246c614SAlex Bradbury unreachable 1140246c614SAlex Bradbury} 1150246c614SAlex Bradbury 1160246c614SAlex Bradburydeclare void @abort() noreturn 1170246c614SAlex Bradburydeclare void @exit(i32 signext) noreturn 1180246c614SAlex Bradbury 1190246c614SAlex Bradbury; RV64I-LABEL: nge: 1200246c614SAlex Bradbury; RV64I: # %bb.0: # %entry 1210246c614SAlex Bradbury; RV64I-NEXT: slt a0, a0, a1 1220246c614SAlex Bradbury; RV64I-NEXT: addi a0, a0, -1 1230246c614SAlex Bradbury; RV64I-NEXT: ret 1240246c614SAlex Bradbury; 1250246c614SAlex Bradbury; RV64I-LABEL: ngt: 1260246c614SAlex Bradbury; RV64I: # %bb.0: # %entry 1270246c614SAlex Bradbury; RV64I-NEXT: slt a0, a1, a0 1280246c614SAlex Bradbury; RV64I-NEXT: neg a0, a0 1290246c614SAlex Bradbury; RV64I-NEXT: ret 1300246c614SAlex Bradbury; 1310246c614SAlex Bradbury; RV64I-LABEL: nle: 1320246c614SAlex Bradbury; RV64I: # %bb.0: # %entry 1330246c614SAlex Bradbury; RV64I-NEXT: slt a0, a1, a0 1340246c614SAlex Bradbury; RV64I-NEXT: addi a0, a0, -1 1350246c614SAlex Bradbury; RV64I-NEXT: ret 1360246c614SAlex Bradbury; 1370246c614SAlex Bradbury; RV64I-LABEL: nlt: 1380246c614SAlex Bradbury; RV64I: # %bb.0: # %entry 1390246c614SAlex Bradbury; RV64I-NEXT: slt a0, a0, a1 1400246c614SAlex Bradbury; RV64I-NEXT: neg a0, a0 1410246c614SAlex Bradbury; RV64I-NEXT: ret 1420246c614SAlex Bradbury; 1430246c614SAlex Bradbury; RV64I-LABEL: main: 1440246c614SAlex Bradbury; RV64I: # %bb.0: # %entry 1450246c614SAlex Bradbury; RV64I-NEXT: addi sp, sp, -32 1460246c614SAlex Bradbury; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 1470246c614SAlex Bradbury; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 1480246c614SAlex Bradbury; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 1490246c614SAlex Bradbury; RV64I-NEXT: call t0, OUTLINED_FUNCTION_0 150*eabaee0cSFangrui Song; RV64I-NEXT: call nge 1510246c614SAlex Bradbury; RV64I-NEXT: bnez a0, .LBB4_9 1520246c614SAlex Bradbury; RV64I-NEXT: # %bb.1: # %if.end 1530246c614SAlex Bradbury; RV64I-NEXT: lui a1, 524288 1540246c614SAlex Bradbury; RV64I-NEXT: mv a0, s0 155*eabaee0cSFangrui Song; RV64I-NEXT: call nge 1560246c614SAlex Bradbury; RV64I-NEXT: li a1, -1 1570246c614SAlex Bradbury; RV64I-NEXT: bne a0, a1, .LBB4_9 1580246c614SAlex Bradbury; RV64I-NEXT: # %bb.2: # %if.end4 1590246c614SAlex Bradbury; RV64I-NEXT: call t0, OUTLINED_FUNCTION_0 160*eabaee0cSFangrui Song; RV64I-NEXT: call ngt 1610246c614SAlex Bradbury; RV64I-NEXT: bnez a0, .LBB4_9 1620246c614SAlex Bradbury; RV64I-NEXT: # %bb.3: # %if.end8 1630246c614SAlex Bradbury; RV64I-NEXT: lui a1, 524288 1640246c614SAlex Bradbury; RV64I-NEXT: mv a0, s0 165*eabaee0cSFangrui Song; RV64I-NEXT: call ngt 1660246c614SAlex Bradbury; RV64I-NEXT: li s1, -1 1670246c614SAlex Bradbury; RV64I-NEXT: bne a0, s1, .LBB4_9 1680246c614SAlex Bradbury; RV64I-NEXT: # %bb.4: # %if.end12 1690246c614SAlex Bradbury; RV64I-NEXT: call t0, OUTLINED_FUNCTION_0 170*eabaee0cSFangrui Song; RV64I-NEXT: call nle 1710246c614SAlex Bradbury; RV64I-NEXT: bne a0, s1, .LBB4_9 1720246c614SAlex Bradbury; RV64I-NEXT: # %bb.5: # %if.end16 1730246c614SAlex Bradbury; RV64I-NEXT: lui a1, 524288 1740246c614SAlex Bradbury; RV64I-NEXT: mv a0, s0 175*eabaee0cSFangrui Song; RV64I-NEXT: call nle 1760246c614SAlex Bradbury; RV64I-NEXT: bnez a0, .LBB4_9 1770246c614SAlex Bradbury; RV64I-NEXT: # %bb.6: # %if.end20 1780246c614SAlex Bradbury; RV64I-NEXT: call t0, OUTLINED_FUNCTION_0 179*eabaee0cSFangrui Song; RV64I-NEXT: call nlt 1800246c614SAlex Bradbury; RV64I-NEXT: li a1, -1 1810246c614SAlex Bradbury; RV64I-NEXT: bne a0, a1, .LBB4_9 1820246c614SAlex Bradbury; RV64I-NEXT: # %bb.7: # %if.end24 1830246c614SAlex Bradbury; RV64I-NEXT: lui a1, 524288 1840246c614SAlex Bradbury; RV64I-NEXT: mv a0, s0 185*eabaee0cSFangrui Song; RV64I-NEXT: call nlt 1860246c614SAlex Bradbury; RV64I-NEXT: bnez a0, .LBB4_9 1870246c614SAlex Bradbury; RV64I-NEXT: # %bb.8: # %if.end28 188*eabaee0cSFangrui Song; RV64I-NEXT: call exit 1890246c614SAlex Bradbury; RV64I-NEXT: .LBB4_9: # %if.then 190*eabaee0cSFangrui Song; RV64I-NEXT: call abort 1910246c614SAlex Bradbury; 1920246c614SAlex Bradbury; RV64I-LABEL: OUTLINED_FUNCTION_0: 1930246c614SAlex Bradbury; RV64I: # %bb.0: 1940246c614SAlex Bradbury; RV64I-NEXT: lui s0, 524288 1950246c614SAlex Bradbury; RV64I-NEXT: addiw s0, s0, -1 1960246c614SAlex Bradbury; RV64I-NEXT: lui a0, 524288 197084e4138SAlex Bradbury; RV64I-NEXT: mv a1, s0 1980246c614SAlex Bradbury; RV64I-NEXT: jr t0 199