[PATCH] ARM: Do not enforce 4-byte alignment on Thumb-2 functions.
Peter Collingbourne
peter at pcc.me.uk
Mon Apr 20 19:54:46 PDT 2015
Hi t.p.northover,
This appears to have been introduced back in r76698 as part of an unrelated
change. I can find no official ARM documentation stating that Thumb-2 functions
require 4-byte alignment; in fact, ARM documentation appears to contradict
this (see, e.g., ARM Architecture Reference Manual Thumb-2 Supplement,
section 2.6.1: "Thumb-2 enforces 16-bit alignment on all instructions.").
Also remove code that sets alignment for ARM functions, which is redundant
with code in the MachineFunction constructor, and remove the hidden
-arm-align-constant-islands flag, which has been enabled by default since
r146739 (Dec 2011) and has probably received sufficient testing by now.
http://reviews.llvm.org/D9138
Files:
lib/Target/ARM/ARMConstantIslandPass.cpp
test/CodeGen/ARM/thumb-alignment.ll
test/MC/ARM/elf-thumbfunc-reloc.ll
Index: lib/Target/ARM/ARMConstantIslandPass.cpp
===================================================================
--- lib/Target/ARM/ARMConstantIslandPass.cpp
+++ lib/Target/ARM/ARMConstantIslandPass.cpp
@@ -53,11 +53,6 @@
AdjustJumpTableBlocks("arm-adjust-jump-tables", cl::Hidden, cl::init(true),
cl::desc("Adjust basic block layout to better use TB[BH]"));
-// FIXME: This option should be removed once it has received sufficient testing.
-static cl::opt<bool>
-AlignConstantIslands("arm-align-constant-islands", cl::Hidden, cl::init(true),
- cl::desc("Align constant islands in code"));
-
/// UnknownPadding - Return the worst case padding that could result from
/// unknown offset bits. This does not include alignment padding caused by
/// known offset bits.
@@ -412,13 +407,6 @@
MF->RenumberBlocks();
}
- // Thumb1 functions containing constant pools get 4-byte alignment.
- // This is so we can keep exact track of where the alignment padding goes.
-
- // ARM and Thumb2 functions need to be 4-byte aligned.
- if (!isThumb1)
- MF->ensureAlignment(2); // 2 = log2(4)
-
// Perform the initial placement of the constant pool entries. To start with,
// we put them all at the end of the function.
std::vector<MachineInstr*> CPEMIs;
@@ -513,8 +501,7 @@
unsigned MaxAlign = Log2_32(MCP->getConstantPoolAlignment());
// Mark the basic block as required by the const-pool.
- // If AlignConstantIslands isn't set, use 4-byte alignment for everything.
- BB->setAlignment(AlignConstantIslands ? MaxAlign : 2);
+ BB->setAlignment(MaxAlign);
// The function needs to be as aligned as the basic blocks. The linker may
// move functions around based on their alignment.
@@ -604,10 +591,6 @@
unsigned ARMConstantIslands::getCPELogAlign(const MachineInstr *CPEMI) {
assert(CPEMI && CPEMI->getOpcode() == ARM::CONSTPOOL_ENTRY);
- // Everything is 4-byte aligned unless AlignConstantIslands is set.
- if (!AlignConstantIslands)
- return 2;
-
unsigned CPI = CPEMI->getOperand(1).getIndex();
assert(CPI < MCP->getConstants().size() && "Invalid constant pool index.");
unsigned Align = MCP->getConstants()[CPI].getAlignment();
Index: test/CodeGen/ARM/thumb-alignment.ll
===================================================================
--- /dev/null
+++ test/CodeGen/ARM/thumb-alignment.ll
@@ -0,0 +1,15 @@
+; RUN: llc -relocation-model=pic -mtriple=thumbv7-unknown-linux -o - %s | FileCheck %s
+
+ at x = external global i32
+
+; CHECK: .globl foo
+; CHECK-NEXT: .align 2
+define i32* @foo() {
+ ret i32* @x
+}
+
+; CHECK: .globl bar
+; CHECK-NEXT: .align 1
+define i32* @bar() {
+ ret i32* zeroinitializer
+}
Index: test/MC/ARM/elf-thumbfunc-reloc.ll
===================================================================
--- test/MC/ARM/elf-thumbfunc-reloc.ll
+++ test/MC/ARM/elf-thumbfunc-reloc.ll
@@ -24,7 +24,7 @@
; make sure that bl 0 <foo> (fff7feff) is correctly encoded
; CHECK: Sections [
; CHECK: SectionData (
-; CHECK: 0000: 704700BF 2DE90048 FFF7FEFF BDE80088
+; CHECK: 0000: 70472DE9 0048FFF7 FEFFBDE8 0088
; CHECK: )
; CHECK: ]
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D9138.24094.patch
Type: text/x-patch
Size: 3144 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150421/911d045c/attachment.bin>
More information about the llvm-commits
mailing list