aboutsummaryrefslogtreecommitdiffstats
path: root/test/CodeGen/PowerPC/2013-05-15-preinc-fold.ll
diff options
context:
space:
mode:
authorUlrich Weigand <ulrich.weigand@de.ibm.com>2013-05-16 14:53:05 +0000
committerUlrich Weigand <ulrich.weigand@de.ibm.com>2013-05-16 14:53:05 +0000
commitf0ef882828bd9ba13cefce9869bde8be5e854956 (patch)
treeaffa6d56b6e84a6fe82147aa332a517203f54890 /test/CodeGen/PowerPC/2013-05-15-preinc-fold.ll
parent26bca5816db8bce2cd40d0548c5d79438038ed16 (diff)
downloadexternal_llvm-f0ef882828bd9ba13cefce9869bde8be5e854956.zip
external_llvm-f0ef882828bd9ba13cefce9869bde8be5e854956.tar.gz
external_llvm-f0ef882828bd9ba13cefce9869bde8be5e854956.tar.bz2
[PowerPC] Report true displacement value from getPreIndexedAddressParts
DAGCombiner::CombineToPreIndexedLoadStore calls a target routine to decompose a memory address into a base/offset pair. It expects the offset (if constant) to be the true displacement value in order to perform optional additional optimizations; in particular, to convert other uses of the original pointer into uses of the new base pointer after pre-increment. The PowerPC implementation of getPreIndexedAddressParts, however, simply calls SelectAddressRegImm, which returns a TargetConstant. This value is appropriate for encoding into the instruction, but it is not always usable as true displacement value: - Its type is always MVT::i32, even on 64-bit, where addresses ought to be i64 ... this causes the optimization to simply always fail on 64-bit due to this line in DAGCombiner: // FIXME: In some cases, we can be smarter about this. if (Op1.getValueType() != Offset.getValueType()) { - Its value is truncated to an unsigned 16-bit value if negative. This causes the above opimization to generate wrong code. This patch fixes both problems by simply returning the true displacement value (in its original type). This doesn't affect any other user of the displacement. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@182012 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/PowerPC/2013-05-15-preinc-fold.ll')
-rw-r--r--test/CodeGen/PowerPC/2013-05-15-preinc-fold.ll19
1 files changed, 19 insertions, 0 deletions
diff --git a/test/CodeGen/PowerPC/2013-05-15-preinc-fold.ll b/test/CodeGen/PowerPC/2013-05-15-preinc-fold.ll
new file mode 100644
index 0000000..b75337d
--- /dev/null
+++ b/test/CodeGen/PowerPC/2013-05-15-preinc-fold.ll
@@ -0,0 +1,19 @@
+; RUN: llc < %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-f128:128:128-v128:128:128-n32:64"
+target triple = "powerpc64-unknown-linux-gnu"
+
+define i8* @test(i8* %base, i8 %val) {
+entry:
+ %arrayidx = getelementptr inbounds i8* %base, i32 -1
+ store i8 %val, i8* %arrayidx, align 1
+ %arrayidx2 = getelementptr inbounds i8* %base, i32 1
+ store i8 %val, i8* %arrayidx2, align 1
+ ret i8* %arrayidx
+}
+; CHECK: @test
+; CHECK: %entry
+; CHECK-NEXT: stbu 4, -1(3)
+; CHECK-NEXT: stb 4, 2(3)
+; CHECK-NEXT: blr
+