Files
clang-p2996/llvm/test/CodeGen/X86/align-basic-block-sections.mir
Jeremy Morse e6bf48d110 [X86] Don't request 0x90 nop filling in p2align directives (#110134)
As of rev ea222be0d, LLVMs assembler will actually try to honour the
"fill value" part of p2align directives. X86 printed these as 0x90, which
isn't actually what it wanted: we want multi-byte nops for .text
padding. Compiling via a textual assembly file produces single-byte
nop padding since ea222be0d but the built-in assembler will produce
multi-byte nops. This divergent behaviour is undesirable.

To fix: don't set the byte padding field for x86, which allows the
assembler to pick multi-byte nops. Test that we get the same multi-byte
padding when compiled via textual assembly or directly to object file.
Added same-align-bytes-with-llasm-llobj.ll to that effect, updated
numerous other tests to not contain check-lines for the explicit padding.
2024-10-02 11:14:05 +01:00

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