Skip to content

Commit da468a9

Browse files
author
git apple-llvm automerger
committed
Merge commit '3c0def957715' from swift/release/5.5 into swift/main
2 parents 87dcd8c + 3c0def9 commit da468a9

File tree

9 files changed

+192
-6
lines changed

9 files changed

+192
-6
lines changed

llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ cl::opt<unsigned> X86PadMaxPrefixSize(
109109
cl::desc("Maximum number of prefixes to use for padding"));
110110

111111
cl::opt<bool> X86PadForAlign(
112-
"x86-pad-for-align", cl::init(true), cl::Hidden,
112+
"x86-pad-for-align", cl::init(false), cl::Hidden,
113113
cl::desc("Pad previous instructions to implement align directives"));
114114

115115
cl::opt<bool> X86PadForBranchAlign(
@@ -957,6 +957,9 @@ void X86AsmBackend::finishLayout(MCAssembler const &Asm,
957957
if (!X86PadForAlign && !X86PadForBranchAlign)
958958
return;
959959

960+
// The processed regions are delimitered by LabeledFragments. -g may have more
961+
// MCSymbols and therefore different relaxation results. X86PadForAlign is
962+
// disabled by default to eliminate the -g vs non -g difference.
960963
DenseSet<MCFragment *> LabeledFragments;
961964
for (const MCSymbol &S : Asm.symbols())
962965
LabeledFragments.insert(S.getFragment(false));
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# See PR48742.
2+
.text
3+
.p2align 4
4+
foo:
5+
.file 1 "foo.c"
6+
movq %rdi, %rax
7+
.p2align 4,,10
8+
.p2align 3
9+
L1:
10+
movzbl (%rax), %edx
11+
cmpb $10, %dl
12+
je L4
13+
L2:
14+
cmpb $100, %dl
15+
je L5
16+
cmpb $200, %dl
17+
je L5
18+
cmpb $300, %dl
19+
jne L5
20+
.p2align 4,,10
21+
.p2align 3
22+
L3:
23+
movq %rax, %rdx
24+
incq %rax
25+
cmpb $30, (%rax)
26+
jne L3
27+
leaq 2(%rdx), %rax
28+
movzbl (%rax), %edx
29+
.loc 1 1234 5
30+
cmpb $90, %dl
31+
jne L2
32+
.p2align 4,,10
33+
.p2align 3
34+
L4:
35+
cmpb $99, 4(%rax)
36+
je L7
37+
L5:
38+
incq %rax
39+
jmp L1
40+
.p2align 4,,10
41+
.p2align 3
42+
L6:
43+
ret
44+
L7:
45+
ret
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# See PR48742.
2+
.text
3+
.p2align 4
4+
foo:
5+
movq %rdi, %rax
6+
.p2align 4,,10
7+
.p2align 3
8+
L1:
9+
movzbl (%rax), %edx
10+
cmpb $10, %dl
11+
je L4
12+
L2:
13+
cmpb $100, %dl
14+
je L5
15+
cmpb $200, %dl
16+
je L5
17+
cmpb $300, %dl
18+
jne L5
19+
.p2align 4,,10
20+
.p2align 3
21+
L3:
22+
movq %rax, %rdx
23+
incq %rax
24+
cmpb $30, (%rax)
25+
jne L3
26+
leaq 2(%rdx), %rax
27+
movzbl (%rax), %edx
28+
cmpb $90, %dl
29+
jne L2
30+
.p2align 4,,10
31+
.p2align 3
32+
L4:
33+
cmpb $99, 4(%rax)
34+
je L7
35+
L5:
36+
incq %rax
37+
jmp L1
38+
.p2align 4,,10
39+
.p2align 3
40+
L6:
41+
ret
42+
L7:
43+
ret

llvm/test/MC/X86/align-via-padding-corner.s

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# RUN: llvm-mc -mcpu=skylake -filetype=obj -triple x86_64-pc-linux-gnu %s -x86-pad-max-prefix-size=5 | llvm-objdump -d - | FileCheck %s
1+
# RUN: llvm-mc -mcpu=skylake -filetype=obj -triple x86_64-pc-linux-gnu %s -x86-pad-max-prefix-size=5 -x86-pad-for-align=1 | llvm-objdump -d - | FileCheck %s
22

33

44
# The first test check the correctness cornercase - can't add prefixes on a

llvm/test/MC/X86/align-via-padding.s

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# RUN: llvm-mc -mcpu=skylake -filetype=obj -triple x86_64-pc-linux-gnu %s -x86-pad-max-prefix-size=5 | llvm-objdump -d --section=.text - | FileCheck %s
1+
# RUN: llvm-mc -mcpu=skylake -filetype=obj -triple x86_64-pc-linux-gnu %s -x86-pad-max-prefix-size=5 -x86-pad-for-align=1 | llvm-objdump -d - | FileCheck %s
22

33
# This test file highlights the interactions between prefix padding and
44
# relaxation padding.

llvm/test/MC/X86/align-via-relaxation.s

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,25 @@
1-
# RUN: llvm-mc -mcpu=skylake -filetype=obj -triple x86_64-pc-linux-gnu -x86-pad-max-prefix-size=0 %s | llvm-objdump -d --section=.text - | FileCheck %s
1+
# RUN: llvm-mc -mcpu=skylake -filetype=obj -triple x86_64-pc-linux-gnu -x86-pad-max-prefix-size=0 %s | llvm-objdump -d - | FileCheck %s --check-prefix=NOPAD
2+
# RUN: llvm-mc -mcpu=skylake -filetype=obj -triple x86_64-pc-linux-gnu -x86-pad-max-prefix-size=0 -x86-pad-for-align=1 %s | llvm-objdump -d - | FileCheck %s
23

34
# This test exercises only the padding via relaxation logic. The interaction
45
# etween prefix padding and relaxation logic can be seen in align-via-padding.s
56

67
.file "test.c"
78
.text
89
.section .text
10+
11+
# NOPAD-LABEL: <.text>:
12+
# NOPAD-NEXT: 0: eb 1f jmp 0x21 <foo>
13+
# NOPAD-NEXT: 2: eb 1d jmp 0x21 <foo>
14+
# NOPAD-NEXT: 4: eb 1b jmp 0x21 <foo>
15+
# NOPAD-NEXT: 6: eb 19 jmp 0x21 <foo>
16+
# NOPAD-NEXT: 8: eb 17 jmp 0x21 <foo>
17+
# NOPAD-NEXT: a: eb 15 jmp 0x21 <foo>
18+
# NOPAD-NEXT: c: eb 13 jmp 0x21 <foo>
19+
# NOPAD-NEXT: e: 66 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax)
20+
# NOPAD-NEXT: 1d: 0f 1f 00 nopl (%rax)
21+
# NOPAD-NEXT: 20: cc int3
22+
923
# Demonstrate that we can relax instructions to provide padding, not
1024
# just insert nops. jmps are being used for ease of demonstration.
1125
# CHECK: .text
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# RUN: llvm-mc -mcpu=skylake -filetype=obj -triple x86_64-apple-macos -x86-pad-for-align=true %S/Inputs/pad-align-with-debug.s | llvm-objdump -d - | FileCheck --check-prefix=CHECK --check-prefix=DEBUG %s
2+
# RUN: llvm-mc -mcpu=skylake -filetype=obj -triple x86_64-apple-macos -x86-pad-for-align=true %S/Inputs/pad-align-without-debug.s | llvm-objdump -d - | FileCheck --check-prefix=CHECK --check-prefix=NODEBUG %s
3+
# RUN: llvm-mc -mcpu=skylake -filetype=obj -triple x86_64-apple-macos %S/Inputs/pad-align-without-debug.s | llvm-objdump -d - | FileCheck --check-prefix=DEFAULT %s
4+
# RUN: llvm-mc -mcpu=skylake -filetype=obj -triple x86_64-apple-macos %S/Inputs/pad-align-with-debug.s | llvm-objdump -d - | FileCheck --check-prefix=DEFAULT %s
5+
6+
; Test case to show that -x86-pad-for-align causes binary differences in the
7+
; presence of debug locations. Inputs/pad-align-with-debug.s and
8+
; Inputs/pad-align-without-debug.s are equivalent, modulo a single .loc, which
9+
; cause the difference in the binary below. This should be fixed, before
10+
; x86-pad-for-align=true becomes the default.
11+
12+
; Also see PR48742.
13+
14+
15+
; CHECK-LABEL: 0000000000000000 <foo>:
16+
; CHECK: 0: 48 89 f8 movq %rdi, %rax
17+
; CHECK-NEXT: 3: 0f 1f 44 00 00 nopl (%rax,%rax)
18+
; CHECK-NEXT: 8: 0f b6 10 movzbl (%rax), %edx
19+
; CHECK-NEXT: b: 80 fa 0a cmpb $10, %dl
20+
; CHECK-NEXT: e: 74 30 je 0x40 <foo+0x40>
21+
; CHECK-NEXT: 10: 80 fa 64 cmpb $100, %dl
22+
; CHECK-NEXT: 13: 74 31 je 0x46 <foo+0x46>
23+
; CHECK-NEXT: 15: 80 fa c8 cmpb $-56, %dl
24+
; CHECK-NEXT: 18: 74 2c je 0x46 <foo+0x46>
25+
; CHECK-NEXT: 1a: 80 fa 2c cmpb $44, %dl
26+
; CHECK-NEXT: 1d: 75 27 jne 0x46 <foo+0x46>
27+
; CHECK-NEXT: 1f: 90 nop
28+
; CHECK-NEXT: 20: 48 89 c2 movq %rax, %rdx
29+
; CHECK-NEXT: 23: 48 ff c0 incq %rax
30+
; CHECK-NEXT: 26: 80 38 1e cmpb $30, (%rax)
31+
32+
; DEBUG-NEXT: 29: 75 f5 jne 0x20 <foo+0x20>
33+
; DEBUG-NEXT: 2b: 48 8d 42 02 leaq 2(%rdx), %rax
34+
; DEBUG-NEXT: 2f: 0f b6 10 movzbl (%rax), %edx
35+
; DEBUG-NEXT: 32: 80 fa 5a cmpb $90, %dl
36+
; DEBUG-NEXT: 35: 0f 85 d5 ff ff ff jne 0x10 <foo+0x10>
37+
; DEBUG-NEXT: 3b: 0f 1f 44 00 00 nopl (%rax,%rax)
38+
39+
; NODEBUG-NEXT: 29: 0f 85 f1 ff ff ff jne 0x20 <foo+0x20>
40+
; NODEBUG-NEXT: 2f: 48 8d 42 02 leaq 2(%rdx), %rax
41+
; NODEBUG-NEXT: 33: 0f b6 10 movzbl (%rax), %edx
42+
; NODEBUG-NEXT: 36: 80 fa 5a cmpb $90, %dl
43+
; NODEBUG-NEXT: 39: 0f 85 d1 ff ff ff jne 0x10 <foo+0x10>
44+
; NODEBUG-NEXT: 3f: 90 nop
45+
46+
; CHECK-NEXT: 40: 80 78 04 63 cmpb $99, 4(%rax)
47+
; CHECK-NEXT: 44: 74 0b je 0x51 <foo+0x51>
48+
; CHECK-NEXT: 46: 48 ff c0 incq %rax
49+
; CHECK-NEXT: 49: e9 ba ff ff ff jmp 0x8 <foo+0x8>
50+
; CHECK-NEXT: 4e: 66 90 nop
51+
; CHECK-NEXT: 50: c3 retq
52+
; CHECK-NEXT: 51: c3 retq
53+
54+
; DEFAULT: 0: 48 89 f8 movq %rdi, %rax
55+
; DEFAULT-NEXT: 3: 0f 1f 44 00 00 nopl (%rax,%rax)
56+
; DEFAULT-NEXT: 8: 0f b6 10 movzbl (%rax), %edx
57+
; DEFAULT-NEXT: b: 80 fa 0a cmpb $10, %dl
58+
; DEFAULT-NEXT: e: 74 30 je 0x40 <foo+0x40>
59+
; DEFAULT-NEXT: 10: 80 fa 64 cmpb $100, %dl
60+
; DEFAULT-NEXT: 13: 74 31 je 0x46 <foo+0x46>
61+
; DEFAULT-NEXT: 15: 80 fa c8 cmpb $-56, %dl
62+
; DEFAULT-NEXT: 18: 74 2c je 0x46 <foo+0x46>
63+
; DEFAULT-NEXT: 1a: 80 fa 2c cmpb $44, %dl
64+
; DEFAULT-NEXT: 1d: 75 27 jne 0x46 <foo+0x46>
65+
; DEFAULT-NEXT: 1f: 90 nop
66+
; DEFAULT-NEXT: 20: 48 89 c2 movq %rax, %rdx
67+
; DEFAULT-NEXT: 23: 48 ff c0 incq %rax
68+
; DEFAULT-NEXT: 26: 80 38 1e cmpb $30, (%rax)
69+
; DEFAULT-NEXT: 29: 75 f5 jne 0x20 <foo+0x20>
70+
; DEFAULT-NEXT: 2b: 48 8d 42 02 leaq 2(%rdx), %rax
71+
; DEFAULT-NEXT: 2f: 0f b6 10 movzbl (%rax), %edx
72+
; DEFAULT-NEXT: 32: 80 fa 5a cmpb $90, %dl
73+
; DEFAULT-NEXT: 35: 75 d9 jne 0x10 <foo+0x10>
74+
; DEFAULT-NEXT: 37: 66 0f 1f 84 00 00 00 00 00 nopw (%rax,%rax)
75+
; DEFAULT-NEXT: 40: 80 78 04 63 cmpb $99, 4(%rax)
76+
; DEFAULT-NEXT: 44: 74 0b je 0x51 <foo+0x51>
77+
; DEFAULT-NEXT: 46: 48 ff c0 incq %rax
78+
; DEFAULT-NEXT: 49: eb bd jmp 0x8 <foo+0x8>
79+
; DEFAULT-NEXT: 4b: 0f 1f 44 00 00 nopl (%rax,%rax)
80+
; DEFAULT-NEXT: 50: c3 retq
81+
; DEFAULT-NEXT: 51: c3 retq

llvm/test/MC/X86/prefix-padding-32.s

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# RUN: llvm-mc -filetype=obj -triple i386-pc-linux-gnu %s -x86-pad-max-prefix-size=15 | llvm-objdump -d --section=.text - | FileCheck %s
1+
# RUN: llvm-mc -filetype=obj -triple i386-pc-linux-gnu %s -x86-pad-max-prefix-size=15 -x86-pad-for-align=1 | llvm-objdump -d - | FileCheck %s
22

33
# Check prefix padding generation for all cases on 32 bit x86.
44

llvm/test/MC/X86/prefix-padding-64.s

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# RUN: llvm-mc -mcpu=skylake -filetype=obj -triple x86_64-pc-linux-gnu %s -x86-pad-max-prefix-size=15 | llvm-objdump -d --section=.text - | FileCheck %s
1+
# RUN: llvm-mc -mcpu=skylake -filetype=obj -triple x86_64-pc-linux-gnu %s -x86-pad-max-prefix-size=15 -x86-pad-for-align=1 | llvm-objdump -d - | FileCheck %s
22

33
# Check prefix padding generation for all cases on 64 bit x86.
44

0 commit comments

Comments
 (0)