# 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
# CHECK-NEXT: test.__part.2: # %entry