summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/ConstantMerge
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-11-12 20:21:43 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-11-12 20:21:43 +0000
commitdd8757abbc4be37297a20a5c65e6dc121630e6fb (patch)
tree9d35cd3f85b71fd9d2edd679579d328503a7d8f2 /llvm/test/Transforms/ConstantMerge
parent813432f1ae8b6e5dd2953dec749c5e6fe8946889 (diff)
downloadbcm5719-llvm-dd8757abbc4be37297a20a5c65e6dc121630e6fb.tar.gz
bcm5719-llvm-dd8757abbc4be37297a20a5c65e6dc121630e6fb.zip
Corruptly merge constants with explicit and implicit alignments.
Constant merge can merge a constant with implicit alignment with one that has explicit alignment. Before this change it was assuming that the explicit alignment was higher than the implicit one, causing the result to be under aligned in some cases. Fixes pr17815. Patch by Chris Smowton! llvm-svn: 194506
Diffstat (limited to 'llvm/test/Transforms/ConstantMerge')
-rw-r--r--llvm/test/Transforms/ConstantMerge/align.ll28
1 files changed, 28 insertions, 0 deletions
diff --git a/llvm/test/Transforms/ConstantMerge/align.ll b/llvm/test/Transforms/ConstantMerge/align.ll
new file mode 100644
index 00000000000..c1cbcb3c652
--- /dev/null
+++ b/llvm/test/Transforms/ConstantMerge/align.ll
@@ -0,0 +1,28 @@
+; RUN: opt -constmerge -S < %s | FileCheck %s
+
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
+
+
+; Test that with a TD we do merge and mark the alignment as 4
+@T1A = internal unnamed_addr constant i32 1
+@T1B = internal unnamed_addr constant i32 1, align 2
+; CHECK: @T1B = internal unnamed_addr constant i32 1, align 4
+
+define void @test1(i32** %P1, i32** %P2) {
+ store i32* @T1A, i32** %P1
+ store i32* @T1B, i32** %P2
+ ret void
+}
+
+
+; Test that even with a TD we set the alignment to the maximum if both constants
+; have explicit alignments.
+@T2A = internal unnamed_addr constant i32 2, align 1
+@T2B = internal unnamed_addr constant i32 2, align 2
+; CHECK: @T2B = internal unnamed_addr constant i32 2, align 2
+
+define void @test2(i32** %P1, i32** %P2) {
+ store i32* @T2A, i32** %P1
+ store i32* @T2B, i32** %P2
+ ret void
+}
OpenPOWER on IntegriCloud