xref: /llvm-project/llvm/test/CodeGen/RISCV/machine-outliner-and-machine-copy-propagation.ll (revision eabaee0c59110d0e11b33a69db54ccda526b35fd)
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