
In review of bbde6b, I had originally proposed that we support the legacy text format. As review evolved, it bacame clear this had been a bad idea (too much complexity), but in order to let that patch finally move forward, I approved the change with the variant. This change undoes the variant, and updates all the tests to just use the array form.
190 lines
6.0 KiB
YAML
190 lines
6.0 KiB
YAML
# RUN: llc -run-pass=tailduplication -tail-dup-size=4 %s -o - | FileCheck %s
|
|
# RUN: llc -passes=tailduplication -tail-dup-size=4 %s -o - | FileCheck %s
|
|
|
|
# JumpTableDest32 uses an `adr` to a temporary label (itself). If duplicated we
|
|
# cannot guarantee reachability for any uses after the first.
|
|
|
|
# CHECK: JumpTableDest32
|
|
# CHECK-NOT: JumpTableDest32
|
|
|
|
|
|
--- |
|
|
; ModuleID = 'jump-table.ll'
|
|
source_filename = "jump-table.ll"
|
|
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
|
|
target triple = "arm64-apple-ios"
|
|
|
|
define i32 @test_jumptable32(i32 %in, i1 %tst) {
|
|
br i1 %tst, label %true, label %false
|
|
|
|
true: ; preds = %0
|
|
call void @foo()
|
|
br label %switch
|
|
|
|
false: ; preds = %0
|
|
call void @bar()
|
|
br label %switch
|
|
|
|
lbl1: ; preds = %lbl4, %lbl3, %def, %switch
|
|
%merge = phi i32 [ 1, %switch ], [ 0, %def ], [ 4, %lbl3 ], [ 8, %lbl4 ]
|
|
ret i32 %merge
|
|
|
|
switch: ; preds = %false, %true
|
|
switch i32 %in, label %def [
|
|
i32 0, label %lbl1
|
|
i32 1, label %lbl2
|
|
i32 2, label %lbl3
|
|
i32 4, label %lbl4
|
|
]
|
|
|
|
def: ; preds = %switch
|
|
br label %lbl1
|
|
|
|
lbl2: ; preds = %switch
|
|
%1 = call i64 @llvm.aarch64.space(i32 262144, i64 undef)
|
|
ret i32 2
|
|
|
|
lbl3: ; preds = %switch
|
|
br label %lbl1
|
|
|
|
lbl4: ; preds = %switch
|
|
br label %lbl1
|
|
}
|
|
|
|
declare void @foo()
|
|
|
|
declare void @bar()
|
|
|
|
; Function Attrs: nounwind
|
|
declare i64 @llvm.aarch64.space(i32, i64) #0
|
|
|
|
attributes #0 = { nounwind }
|
|
|
|
...
|
|
---
|
|
name: test_jumptable32
|
|
alignment: 4
|
|
exposesReturnsTwice: false
|
|
legalized: false
|
|
regBankSelected: false
|
|
selected: false
|
|
failedISel: false
|
|
tracksRegLiveness: true
|
|
hasWinCFI: false
|
|
registers: []
|
|
liveins:
|
|
- { reg: '$w0', virtual-reg: '' }
|
|
- { reg: '$w1', virtual-reg: '' }
|
|
frameInfo:
|
|
isFrameAddressTaken: false
|
|
isReturnAddressTaken: false
|
|
hasStackMap: false
|
|
hasPatchPoint: false
|
|
stackSize: 32
|
|
offsetAdjustment: 0
|
|
maxAlignment: 8
|
|
adjustsStack: true
|
|
hasCalls: true
|
|
stackProtector: ''
|
|
maxCallFrameSize: 0
|
|
cvBytesOfCalleeSavedRegisters: 0
|
|
hasOpaqueSPAdjustment: false
|
|
hasVAStart: false
|
|
hasMustTailInVarArgFunc: false
|
|
localFrameSize: 0
|
|
savePoint: []
|
|
restorePoint: []
|
|
fixedStack: []
|
|
stack:
|
|
- { id: 0, name: '', type: spill-slot, offset: -8, size: 8, alignment: 8,
|
|
stack-id: default, callee-saved-register: '$lr', callee-saved-restored: true,
|
|
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
|
|
- { id: 1, name: '', type: spill-slot, offset: -16, size: 8, alignment: 8,
|
|
stack-id: default, callee-saved-register: '$fp', callee-saved-restored: true,
|
|
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
|
|
- { id: 2, name: '', type: spill-slot, offset: -24, size: 8, alignment: 8,
|
|
stack-id: default, callee-saved-register: '$x19', callee-saved-restored: true,
|
|
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
|
|
- { id: 3, name: '', type: spill-slot, offset: -32, size: 8, alignment: 8,
|
|
stack-id: default, callee-saved-register: '$x20', callee-saved-restored: true,
|
|
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
|
|
callSites: []
|
|
constants: []
|
|
machineFunctionInfo:
|
|
hasRedZone: false
|
|
jumpTable:
|
|
kind: label-difference32
|
|
entries:
|
|
- id: 0
|
|
blocks: [ '%bb.9', '%bb.6', '%bb.7', '%bb.5', '%bb.8' ]
|
|
body: |
|
|
bb.0 (%ir-block.0):
|
|
successors: %bb.1(0x40000000), %bb.2(0x40000000)
|
|
liveins: $w0, $w1, $x19, $x20, $lr
|
|
|
|
early-clobber $sp = frame-setup STPXpre killed $x20, killed $x19, $sp, -4 :: (store (s64) into %stack.3), (store (s64) into %stack.2)
|
|
frame-setup STPXi killed $fp, killed $lr, $sp, 2 :: (store (s64) into %stack.1), (store (s64) into %stack.0)
|
|
frame-setup CFI_INSTRUCTION def_cfa_offset 32
|
|
frame-setup CFI_INSTRUCTION offset $w30, -8
|
|
frame-setup CFI_INSTRUCTION offset $w29, -16
|
|
frame-setup CFI_INSTRUCTION offset $w19, -24
|
|
frame-setup CFI_INSTRUCTION offset $w20, -32
|
|
renamable $w19 = COPY $w0
|
|
TBZW killed renamable $w1, 0, %bb.2
|
|
|
|
bb.1.true:
|
|
successors: %bb.3(0x80000000)
|
|
liveins: $w19
|
|
|
|
BL @foo, csr_darwin_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp
|
|
B %bb.3
|
|
|
|
bb.2.false:
|
|
successors: %bb.3(0x80000000)
|
|
liveins: $w19
|
|
|
|
BL @bar, csr_darwin_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp
|
|
B %bb.3
|
|
|
|
bb.3.switch:
|
|
successors: %bb.9(0x1c71c71c), %bb.6(0x1c71c71c), %bb.7(0x1c71c71c), %bb.5(0x0e38e38e), %bb.8(0x1c71c71c)
|
|
liveins: $w19
|
|
|
|
renamable $w8 = ORRWrs $wzr, killed renamable $w19, 0, implicit-def $x8
|
|
renamable $x9 = MOVaddrJT target-flags(aarch64-page) %jump-table.0, target-flags(aarch64-pageoff, aarch64-nc) %jump-table.0
|
|
early-clobber renamable $x10, dead early-clobber renamable $x11 = JumpTableDest32 killed renamable $x9, killed renamable $x8, %jump-table.0
|
|
BR killed renamable $x10
|
|
|
|
bb.5.def:
|
|
successors: %bb.9(0x80000000)
|
|
|
|
renamable $w0 = COPY $wzr
|
|
B %bb.9
|
|
|
|
bb.6.lbl2:
|
|
successors: %bb.9(0x80000000)
|
|
|
|
dead $xzr = SPACE 262144, undef renamable $x8
|
|
$w0 = MOVi32imm 2
|
|
B %bb.9
|
|
|
|
bb.7.lbl3:
|
|
successors: %bb.9(0x80000000)
|
|
|
|
renamable $w0 = MOVi32imm 4
|
|
B %bb.9
|
|
|
|
bb.8.lbl4:
|
|
successors: %bb.9(0x80000000)
|
|
|
|
renamable $w0 = MOVi32imm 8
|
|
|
|
bb.9.lbl1:
|
|
liveins: $w0
|
|
|
|
$fp, $lr = frame-destroy LDPXi $sp, 2 :: (load (s64) from %stack.1), (load (s64) from %stack.0)
|
|
early-clobber $sp, $x20, $x19 = frame-destroy LDPXpost $sp, 4 :: (load (s64) from %stack.3), (load (s64) from %stack.2)
|
|
RET_ReallyLR implicit $w0
|
|
|
|
...
|