# 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