159 lines
5.2 KiB
Plaintext
159 lines
5.2 KiB
Plaintext
|
# RUN: llc -march=mips64 -mcpu=mips64r6 -start-after=block-placement -o - %s | FileCheck %s
|
||
|
|
||
|
# Check that MipsHazardSchedule sees through basic blocks with transient instructions.
|
||
|
# The mir code in this file isn't representative of the llvm-ir.
|
||
|
|
||
|
--- |
|
||
|
; ModuleID = 'test.ll'
|
||
|
source_filename = "test.c"
|
||
|
target datalayout = "E-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128"
|
||
|
target triple = "mips64-img-linux-gnu"
|
||
|
|
||
|
; Function Attrs: nounwind
|
||
|
define i32 @f(i32 signext %a) {
|
||
|
entry:
|
||
|
%retval = alloca i32, align 4
|
||
|
%a.addr = alloca i32, align 4
|
||
|
store i32 %a, i32* %a.addr, align 4
|
||
|
%0 = load i32, i32* %a.addr, align 4
|
||
|
%cmp = icmp sgt i32 %0, 5
|
||
|
br i1 %cmp, label %if.then, label %if.else
|
||
|
|
||
|
if.then: ; preds = %entry
|
||
|
%1 = load i32, i32* %a.addr, align 4
|
||
|
%2 = load i32, i32* %a.addr, align 4
|
||
|
%add = add nsw i32 %1, %2
|
||
|
store i32 %add, i32* %retval, align 4
|
||
|
br label %return
|
||
|
|
||
|
if.else: ; preds = %entry
|
||
|
%3 = load i32, i32* %a.addr, align 4
|
||
|
%call = call i32 @g(i32 signext %3)
|
||
|
store i32 %call, i32* %retval, align 4
|
||
|
br label %return
|
||
|
|
||
|
return: ; preds = %if.else, %if.then
|
||
|
%4 = load i32, i32* %retval, align 4
|
||
|
ret i32 %4
|
||
|
}
|
||
|
|
||
|
declare i32 @g(i32 signext)
|
||
|
|
||
|
; Function Attrs: nounwind
|
||
|
declare void @llvm.stackprotector(i8*, i8**)
|
||
|
|
||
|
!llvm.ident = !{!0}
|
||
|
|
||
|
!0 = !{!"clang version 4.0.0 "}
|
||
|
|
||
|
...
|
||
|
---
|
||
|
# CHECK-LABEL: f:
|
||
|
# CHECK: bgtzc
|
||
|
# CHECK-NEXT: nop
|
||
|
# CHECK: bltzc
|
||
|
# CHECK-NEXT: nop
|
||
|
# CHECK: blezc
|
||
|
name: f
|
||
|
alignment: 8
|
||
|
exposesReturnsTwice: false
|
||
|
legalized: false
|
||
|
regBankSelected: false
|
||
|
selected: false
|
||
|
tracksRegLiveness: true
|
||
|
liveins:
|
||
|
- { reg: '$a0_64' }
|
||
|
- { reg: '$t9_64' }
|
||
|
calleeSavedRegisters: [ '$fp', '$gp', '$ra', '$d12', '$d13', '$d14', '$d15',
|
||
|
'$f24', '$f25', '$f26', '$f27', '$f28', '$f29',
|
||
|
'$f30', '$f31', '$fp_64', '$f_hi24', '$f_hi25',
|
||
|
'$f_hi26', '$f_hi27', '$f_hi28', '$f_hi29', '$f_hi30',
|
||
|
'$f_hi31', '$gp_64', '$ra_64', '$s0', '$s1', '$s2',
|
||
|
'$s3', '$s4', '$s5', '$s6', '$s7', '$d24_64', '$d25_64',
|
||
|
'$d26_64', '$d27_64', '$d28_64', '$d29_64', '$d30_64',
|
||
|
'$d31_64', '$s0_64', '$s1_64', '$s2_64', '$s3_64',
|
||
|
'$s4_64', '$s5_64', '$s6_64', '$s7_64' ]
|
||
|
frameInfo:
|
||
|
isFrameAddressTaken: false
|
||
|
isReturnAddressTaken: false
|
||
|
hasStackMap: false
|
||
|
hasPatchPoint: false
|
||
|
stackSize: 32
|
||
|
offsetAdjustment: 0
|
||
|
maxAlignment: 8
|
||
|
adjustsStack: true
|
||
|
hasCalls: true
|
||
|
maxCallFrameSize: 0
|
||
|
hasOpaqueSPAdjustment: false
|
||
|
hasVAStart: false
|
||
|
hasMustTailInVarArgFunc: false
|
||
|
stack:
|
||
|
- { id: 0, name: retval, offset: -28, size: 4, alignment: 4 }
|
||
|
- { id: 1, name: a.addr, offset: -32, size: 4, alignment: 4 }
|
||
|
- { id: 2, type: spill-slot, offset: -8, size: 8, alignment: 8, callee-saved-register: '$ra_64' }
|
||
|
- { id: 3, type: spill-slot, offset: -16, size: 8, alignment: 8, callee-saved-register: '$fp_64' }
|
||
|
- { id: 4, type: spill-slot, offset: -24, size: 8, alignment: 8, callee-saved-register: '$gp_64' }
|
||
|
body: |
|
||
|
bb.0.entry:
|
||
|
successors: %bb.1.if.then(0x40000000), %bb.5.if.else(0x40000000)
|
||
|
liveins: $a0_64, $t9_64, $ra_64, $fp_64, $gp_64
|
||
|
|
||
|
$sp_64 = DADDiu $sp_64, -32
|
||
|
CFI_INSTRUCTION def_cfa_offset 32
|
||
|
SD killed $ra_64, $sp_64, 24 :: (store 8 into %stack.2)
|
||
|
SD killed $fp_64, $sp_64, 16 :: (store 8 into %stack.3)
|
||
|
SD killed $gp_64, $sp_64, 8 :: (store 8 into %stack.4)
|
||
|
CFI_INSTRUCTION offset $ra_64, -8
|
||
|
CFI_INSTRUCTION offset $fp_64, -16
|
||
|
CFI_INSTRUCTION offset $gp_64, -24
|
||
|
CFI_INSTRUCTION def_cfa_register $fp_64
|
||
|
$at_64 = LUi64 @f
|
||
|
$v0_64 = DADDu killed $at_64, $t9_64
|
||
|
SW $a0, $sp_64, 0 :: (store 4 into %ir.a.addr)
|
||
|
BGTZC $a0, %bb.5.if.else, implicit-def $at
|
||
|
|
||
|
bb.1.if.then:
|
||
|
successors: %bb.6.return(0x40000000), %bb.2.if.then(0x40000000)
|
||
|
liveins: $a0
|
||
|
|
||
|
BLTZC $a0, %bb.6.return, implicit-def $at
|
||
|
|
||
|
bb.2.if.then:
|
||
|
successors: %bb.3.if.else(0x80000000)
|
||
|
$t8 = IMPLICIT_DEF
|
||
|
|
||
|
bb.3.if.else:
|
||
|
successors: %bb.6.return(0x40000000), %bb.4.if.else(0x40000000)
|
||
|
liveins: $t8
|
||
|
|
||
|
BLEZC $t8, %bb.6.return, implicit-def $at
|
||
|
|
||
|
bb.4.if.else:
|
||
|
successors: %bb.6.return(0x80000000)
|
||
|
liveins: $t8
|
||
|
|
||
|
$at = LW $sp_64, 0 :: (dereferenceable load 4 from %ir.a.addr)
|
||
|
$at = ADDu killed $at, $t8
|
||
|
SW killed $at, $sp_64, 4 :: (store 4 into %ir.retval)
|
||
|
J %bb.6.return, implicit-def dead $at
|
||
|
|
||
|
bb.5.if.else:
|
||
|
successors: %bb.6.return(0x80000000)
|
||
|
liveins: $v0_64
|
||
|
|
||
|
$gp_64 = DADDiu killed $v0_64, @f
|
||
|
$a0_64 = LW64 $sp_64, 0 :: (dereferenceable load 4 from %ir.a.addr)
|
||
|
$t9_64 = LD $gp_64, @g :: (load 8 from call-entry @g)
|
||
|
JALR64Pseudo $t9_64, csr_n64, implicit-def dead $ra, implicit $a0_64, implicit $gp_64, implicit-def $sp, implicit-def $v0
|
||
|
SW killed $v0, $sp_64, 4 :: (store 4 into %ir.retval)
|
||
|
|
||
|
bb.6.return:
|
||
|
$v0 = LW $sp_64, 4 :: (dereferenceable load 4 from %ir.retval)
|
||
|
$gp_64 = LD $sp_64, 8 :: (load 8 from %stack.4)
|
||
|
$fp_64 = LD $sp_64, 16 :: (load 8 from %stack.3)
|
||
|
$ra_64 = LD $sp_64, 24 :: (load 8 from %stack.2)
|
||
|
$sp_64 = DADDiu $sp_64, 32
|
||
|
PseudoReturn64 $ra_64
|
||
|
|
||
|
...
|