ARM: Only enforce 4-byte alignment on Thumb-2 functions with constant pools.

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.

Differential Revision: http://reviews.llvm.org/D9138

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235636 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Peter Collingbourne
2015-04-23 20:31:22 +00:00
parent ab740d1e40
commit b28abbf98b
3 changed files with 18 additions and 20 deletions

View File

@@ -53,11 +53,6 @@ static cl::opt<bool>
AdjustJumpTableBlocks("arm-adjust-jump-tables", cl::Hidden, cl::init(true), AdjustJumpTableBlocks("arm-adjust-jump-tables", cl::Hidden, cl::init(true),
cl::desc("Adjust basic block layout to better use TB[BH]")); 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 /// UnknownPadding - Return the worst case padding that could result from
/// unknown offset bits. This does not include alignment padding caused by /// unknown offset bits. This does not include alignment padding caused by
/// known offset bits. /// known offset bits.
@@ -412,13 +407,6 @@ bool ARMConstantIslands::runOnMachineFunction(MachineFunction &mf) {
MF->RenumberBlocks(); 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, // Perform the initial placement of the constant pool entries. To start with,
// we put them all at the end of the function. // we put them all at the end of the function.
std::vector<MachineInstr*> CPEMIs; std::vector<MachineInstr*> CPEMIs;
@@ -513,8 +501,7 @@ ARMConstantIslands::doInitialPlacement(std::vector<MachineInstr*> &CPEMIs) {
unsigned MaxAlign = Log2_32(MCP->getConstantPoolAlignment()); unsigned MaxAlign = Log2_32(MCP->getConstantPoolAlignment());
// Mark the basic block as required by the const-pool. // Mark the basic block as required by the const-pool.
// If AlignConstantIslands isn't set, use 4-byte alignment for everything. BB->setAlignment(MaxAlign);
BB->setAlignment(AlignConstantIslands ? MaxAlign : 2);
// The function needs to be as aligned as the basic blocks. The linker may // The function needs to be as aligned as the basic blocks. The linker may
// move functions around based on their alignment. // move functions around based on their alignment.
@@ -604,10 +591,6 @@ ARMConstantIslands::CPEntry
unsigned ARMConstantIslands::getCPELogAlign(const MachineInstr *CPEMI) { unsigned ARMConstantIslands::getCPELogAlign(const MachineInstr *CPEMI) {
assert(CPEMI && CPEMI->getOpcode() == ARM::CONSTPOOL_ENTRY); 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(); unsigned CPI = CPEMI->getOperand(1).getIndex();
assert(CPI < MCP->getConstants().size() && "Invalid constant pool index."); assert(CPI < MCP->getConstants().size() && "Invalid constant pool index.");
unsigned Align = MCP->getConstants()[CPI].getAlignment(); unsigned Align = MCP->getConstants()[CPI].getAlignment();

View File

@@ -0,0 +1,15 @@
; RUN: llc -relocation-model=pic -mtriple=thumbv7-unknown-linux -o - %s | FileCheck %s
@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
}

View File

@@ -24,13 +24,13 @@ entry:
; make sure that bl 0 <foo> (fff7feff) is correctly encoded ; make sure that bl 0 <foo> (fff7feff) is correctly encoded
; CHECK: Sections [ ; CHECK: Sections [
; CHECK: SectionData ( ; CHECK: SectionData (
; CHECK: 0000: 704700BF 2DE90048 FFF7FEFF BDE80088 ; CHECK: 0000: 70472DE9 0048FFF7 FEFFBDE8 0088
; CHECK: ) ; CHECK: )
; CHECK: ] ; CHECK: ]
; CHECK: Relocations [ ; CHECK: Relocations [
; CHECK-NEXT: Section {{.*}} .rel.text { ; CHECK-NEXT: Section {{.*}} .rel.text {
; CHECK-NEXT: 0x8 R_ARM_THM_CALL foo 0x0 ; CHECK-NEXT: 0x6 R_ARM_THM_CALL foo 0x0
; CHECK-NEXT: } ; CHECK-NEXT: }
; CHECK-NEXT: Section {{.*}} .rel.ARM.exidx { ; CHECK-NEXT: Section {{.*}} .rel.ARM.exidx {
; CHECK-NEXT: 0x0 R_ARM_PREL31 .text 0x0 ; CHECK-NEXT: 0x0 R_ARM_PREL31 .text 0x0