[PATCH] ARM: Align functions containing Thumb-2 jump tables to 4 bytes.
Peter Collingbourne
peter at pcc.me.uk
Thu Apr 30 20:04:04 PDT 2015
Hi rengolin,
Functions with jump tables need an alignment of 4 because they use the ADR
instruction, which aligns the PC to 4 bytes before adding an offset.
http://reviews.llvm.org/D9424
Files:
lib/Target/ARM/ARMConstantIslandPass.cpp
test/CodeGen/ARM/thumb-alignment.ll
Index: lib/Target/ARM/ARMConstantIslandPass.cpp
===================================================================
--- lib/Target/ARM/ARMConstantIslandPass.cpp
+++ lib/Target/ARM/ARMConstantIslandPass.cpp
@@ -423,6 +423,10 @@
CPEMIs.clear();
DEBUG(dumpBBs());
+ // Functions with jump tables need an alignment of 4 because they use the ADR
+ // instruction, which aligns the PC to 4 bytes before adding an offset.
+ if (!T2JumpTables.empty())
+ MF->ensureAlignment(2);
/// Remove dead constant pool entries.
MadeChange |= removeUnusedCPEntries();
Index: test/CodeGen/ARM/thumb-alignment.ll
===================================================================
--- test/CodeGen/ARM/thumb-alignment.ll
+++ test/CodeGen/ARM/thumb-alignment.ll
@@ -13,3 +13,41 @@
define i32* @bar() {
ret i32* zeroinitializer
}
+
+ at a = external global i32
+ at b = external global i32
+ at c = external global i32
+ at d = external global i32
+
+; Create a Thumb-2 jump table, which should force alignment to 4 bytes.
+
+; CHECK: .globl baz
+; CHECK-NEXT: .align 2
+define i32 @baz() {
+ %1 = load i32, i32* @c, align 4
+ switch i32 %1, label %7 [
+ i32 1, label %2
+ i32 4, label %5
+ i32 9, label %5
+ i32 3, label %8
+ ]
+
+; <label>:2
+ %3 = load i32, i32* @a, align 4
+ %4 = tail call i32 bitcast (i32 (...)* @fn2 to i32 (i32 (...)*, i32, i32)*)(i32 (...)* bitcast (i32 ()* @baz to i32 (...)*), i32 0, i32 %3) #2
+ br label %8
+
+; <label>:5
+ %6 = load i32, i32* @d, align 4
+ store i32 %6, i32* @b, align 4
+ br label %8
+
+; <label>:7
+ br label %8
+
+; <label>:8
+ %e.0 = phi i32 [ 1, %7 ], [ 1, %2 ], [ 0, %0 ], [ 0, %5 ]
+ ret i32 %e.0
+}
+
+declare i32 @fn2(...)
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D9424.24788.patch
Type: text/x-patch
Size: 1695 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150501/43758714/attachment.bin>
More information about the llvm-commits
mailing list