137 lines
3.3 KiB
YAML
137 lines
3.3 KiB
YAML
# Check if the alignment directive is put on the correct place when the basic block section option is used.
|
|
# RUN: llc -mtriple x86_64-unknown-linux-gnu -start-after=bbsections-prepare %s -o - | FileCheck %s -check-prefix=CHECK
|
|
|
|
# How to generate the input:
|
|
# foo.c
|
|
# int test(int a) {
|
|
# switch (a) {
|
|
# default:
|
|
# return 10;
|
|
# case 1:
|
|
# a += 1;
|
|
# case 2:
|
|
# a *= -1;
|
|
# case 8:
|
|
# break;
|
|
# }
|
|
# return a;
|
|
# }
|
|
#
|
|
# clang -O0 -S -emit-llvm test.c
|
|
# llc < test.ll -stop-after=bbsections-prepare -align-all-nofallthru-blocks=8 -basic-block-sections=all
|
|
|
|
|
|
--- |
|
|
define i32 @test(i32 noundef %a) {
|
|
entry:
|
|
switch i32 %a, label %return [
|
|
i32 1, label %sw.bb1
|
|
i32 2, label %sw.bb1
|
|
i32 8, label %sw.epilog
|
|
]
|
|
|
|
sw.bb1: ; preds = %entry, %entry
|
|
br label %sw.epilog
|
|
|
|
sw.epilog: ; preds = %sw.bb1, %entry
|
|
%a.addr.1 = phi i32 [ %a, %entry ], [ -2, %sw.bb1 ]
|
|
br label %return
|
|
|
|
return: ; preds = %sw.epilog, %entry
|
|
%retval.0 = phi i32 [ %a.addr.1, %sw.epilog ], [ 10, %entry ]
|
|
ret i32 %retval.0
|
|
}
|
|
|
|
|
|
...
|
|
---
|
|
name: test
|
|
alignment: 16
|
|
exposesReturnsTwice: false
|
|
legalized: false
|
|
regBankSelected: false
|
|
selected: false
|
|
failedISel: false
|
|
tracksRegLiveness: true
|
|
hasWinCFI: false
|
|
callsEHReturn: false
|
|
callsUnwindInit: false
|
|
hasEHCatchret: false
|
|
hasEHScopes: false
|
|
hasEHFunclets: false
|
|
failsVerification: false
|
|
tracksDebugUserValues: true
|
|
registers: []
|
|
liveins:
|
|
- { reg: '$edi', virtual-reg: '' }
|
|
frameInfo:
|
|
isFrameAddressTaken: false
|
|
isReturnAddressTaken: false
|
|
hasStackMap: false
|
|
hasPatchPoint: false
|
|
stackSize: 0
|
|
offsetAdjustment: 0
|
|
maxAlignment: 1
|
|
adjustsStack: false
|
|
hasCalls: false
|
|
stackProtector: ''
|
|
functionContext: ''
|
|
maxCallFrameSize: 0
|
|
cvBytesOfCalleeSavedRegisters: 0
|
|
hasOpaqueSPAdjustment: false
|
|
hasVAStart: false
|
|
hasMustTailInVarArgFunc: false
|
|
hasTailCall: false
|
|
localFrameSize: 0
|
|
savePoint: ''
|
|
restorePoint: ''
|
|
fixedStack: []
|
|
stack: []
|
|
callSites: []
|
|
debugValueSubstitutions: []
|
|
constants: []
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0.entry:
|
|
successors: %bb.1(0x40000000), %bb.2(0x40000000)
|
|
liveins: $edi
|
|
|
|
renamable $edi = KILL $edi, implicit-def $rdi
|
|
renamable $eax = LEA64_32r renamable $rdi, 1, $noreg, -1, $noreg
|
|
CMP32ri8 killed renamable $eax, 2, implicit-def $eflags
|
|
JCC_1 %bb.2, 3, implicit $eflags
|
|
JMP_1 %bb.1
|
|
|
|
bb.1.sw.bb1 (bbsections 1):
|
|
successors: %bb.3(0x80000000)
|
|
|
|
renamable $edi = MOV32ri -2, implicit-def $rdi
|
|
JMP_1 %bb.3
|
|
|
|
bb.2.entry (align 256, bbsections 2):
|
|
successors: %bb.3(0x40000000), %bb.4(0x40000000)
|
|
liveins: $rdi
|
|
|
|
renamable $eax = MOV32ri 10
|
|
CMP32ri8 renamable $edi, 8, implicit-def $eflags
|
|
JCC_1 %bb.4, 5, implicit $eflags
|
|
JMP_1 %bb.3
|
|
|
|
bb.3.sw.epilog (bbsections 3):
|
|
successors: %bb.4(0x80000000)
|
|
liveins: $rdi
|
|
|
|
$eax = MOV32rr $edi, implicit killed $rdi
|
|
JMP_1 %bb.4
|
|
|
|
bb.4.return (bbsections 4):
|
|
liveins: $eax
|
|
|
|
RET64 $eax
|
|
|
|
...
|
|
|
|
# CHECK: .section .text.test,"ax",@progbits,unique,2
|
|
# CHECK-NEXT: .p2align 8, 0x90
|
|
# CHECK-NEXT: test.__part.2: # %entry
|