| # 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-before=x86-asm-printer %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 | |
| hasEHContTarget: 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 |