154 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2## Check that the delay-slot filler does not attempt to split BUNDLE instructions3# RUN: llc %s -start-before=mips-delay-slot-filler -stop-after=mips-delay-slot-filler \4# RUN: -verify-machineinstrs -o - | FileCheck %s5## Check that we can emit assembly for input with BUNDLE instructions:6# RUN: llc %s -start-before=mips-delay-slot-filler -verify-machineinstrs -o - | FileCheck %s -check-prefix ASM7 8# ASM: # %bb.0:9# ASM-NEXT: daddiu $sp, $sp, -1610# ASM-NEXT: sd $ra, 8($sp)11## BUNDLE should be emitted in order:12# ASM-NEXT: daddiu $sp, $sp, -1613# ASM-NEXT: daddiu $sp, $sp, 1614# ASM-NEXT: beqz $4, .LBB0_215# ASM-NEXT: nop16--- |17 target datalayout = "E-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128"18 target triple = "mips64-unknown-freebsd"19 declare ptr @func_a(i64 zeroext)20 declare ptr @func_b(i64 zeroext)21 ; Function Attrs: nounwind22 define ptr @test(i64 zeroext %nbytes) local_unnamed_addr #0 {23 entry:24 %cmp = icmp eq i64 %nbytes, 025 br i1 %cmp, label %if.else, label %if.then26 27 if.then: ; preds = %entry28 %call = tail call ptr @func_a(i64 zeroext %nbytes)29 br label %return30 31 if.else: ; preds = %entry32 %call1 = tail call ptr @func_b(i64 zeroext 0)33 br label %return34 35 return: ; preds = %if.else, %if.then36 %retval.0 = phi ptr [ %call, %if.then ], [ %call1, %if.else ]37 ret ptr %retval.038 }39 ; Function Attrs: nounwind40 declare void @llvm.stackprotector(ptr, ptr) #041 42 attributes #0 = { nounwind }43 44...45---46name: test47alignment: 848exposesReturnsTwice: false49legalized: false50regBankSelected: false51selected: false52failedISel: false53tracksRegLiveness: true54hasWinCFI: false55registers: []56liveins:57 - { reg: '$a0_64', virtual-reg: '' }58frameInfo:59 isFrameAddressTaken: false60 isReturnAddressTaken: false61 hasStackMap: false62 hasPatchPoint: false63 stackSize: 1664 offsetAdjustment: 065 maxAlignment: 866 adjustsStack: true67 hasCalls: true68 stackProtector: ''69 maxCallFrameSize: 070 cvBytesOfCalleeSavedRegisters: 071 hasOpaqueSPAdjustment: false72 hasVAStart: false73 hasMustTailInVarArgFunc: false74 localFrameSize: 075 savePoint: []76 restorePoint: []77fixedStack: []78stack:79 - { id: 0, name: '', type: spill-slot, offset: -8, size: 8, alignment: 8,80 stack-id: default, callee-saved-register: '$ra_64', callee-saved-restored: true,81 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }82callSites: []83constants: []84machineFunctionInfo: {}85body: |86 ; CHECK-LABEL: name: test87 ; CHECK: bb.0.entry:88 ; CHECK: successors: %bb.2(0x30000000), %bb.1(0x50000000)89 ; CHECK: $sp_64 = DADDiu $sp_64, -1690 ; CHECK: CFI_INSTRUCTION def_cfa_offset 1691 ; CHECK: SD killed $ra_64, $sp_64, 8 :: (store (s64) into %stack.0)92 ; CHECK: CFI_INSTRUCTION offset $ra_64, -893 ; CHECK: BUNDLE {94 ; CHECK: $sp_64 = DADDiu $sp_64, -1695 ; CHECK: $sp_64 = DADDiu $sp_64, 1696 ; CHECK: }97 ; CHECK: BEQ64 renamable $a0_64, $zero_64, %bb.2, implicit-def $at {98 ; CHECK: $zero = SLL $zero, 099 ; CHECK: }100 ; CHECK: bb.1.if.then:101 ; CHECK: successors: %bb.3(0x80000000)102 ; CHECK: JAL @func_a, csr_n64, implicit-def dead $ra, implicit $a0_64, implicit-def $sp, implicit-def $v0_64 {103 ; CHECK: $zero = SLL $zero, 0104 ; CHECK: }105 ; CHECK: J %bb.3, implicit-def dead $at {106 ; CHECK: $zero = SLL $zero, 0107 ; CHECK: }108 ; CHECK: bb.2.if.else:109 ; CHECK: successors: %bb.3(0x80000000)110 ; CHECK: JAL @func_b, csr_n64, implicit-def dead $ra, implicit $a0_64, implicit-def $sp, implicit-def $v0_64 {111 ; CHECK: $a0_64 = DADDiu $zero_64, 0112 ; CHECK: }113 ; CHECK: bb.3.return:114 ; CHECK: $ra_64 = LD $sp_64, 8 :: (load (s64) from %stack.0)115 ; CHECK: PseudoReturn64 undef $ra_64, implicit $v0_64 {116 ; CHECK: $sp_64 = DADDiu $sp_64, 16117 ; CHECK: }118 bb.0.entry:119 successors: %bb.2(0x30000000), %bb.1(0x50000000)120 liveins: $a0_64, $ra_64121 122 $sp_64 = DADDiu $sp_64, -16123 CFI_INSTRUCTION def_cfa_offset 16124 SD killed $ra_64, $sp_64, 8 :: (store (s64) into %stack.0)125 CFI_INSTRUCTION offset $ra_64, -8126 ; This BUNDLE instruction must not be split by the delay slot filler:127 BUNDLE {128 $sp_64 = DADDiu $sp_64, -16129 $sp_64 = DADDiu $sp_64, 16130 }131 BEQ64 renamable $a0_64, $zero_64, %bb.2, implicit-def $at132 133 bb.1.if.then:134 successors: %bb.3(0x80000000)135 liveins: $a0_64136 137 JAL @func_a, csr_n64, implicit-def dead $ra, implicit $a0_64, implicit-def $sp, implicit-def $v0_64138 J %bb.3, implicit-def dead $at139 140 bb.2.if.else:141 successors: %bb.3(0x80000000)142 143 $a0_64 = DADDiu $zero_64, 0144 JAL @func_b, csr_n64, implicit-def dead $ra, implicit $a0_64, implicit-def $sp, implicit-def $v0_64145 146 bb.3.return:147 liveins: $v0_64148 149 $ra_64 = LD $sp_64, 8 :: (load (s64) from %stack.0)150 $sp_64 = DADDiu $sp_64, 16151 PseudoReturn64 undef $ra_64, implicit $v0_64152 153...154