summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuozhi Wei <carrot@google.com>2017-02-17 22:29:39 +0000
committerGuozhi Wei <carrot@google.com>2017-02-17 22:29:39 +0000
commit7ec2c72095649a67fe5b7e56fec29113650a2274 (patch)
tree611504a1d2baad9a3637c7fe8a5e431c3e5a41aa
parentbe37db1882d16e1a1554e079348301f6a6274834 (diff)
downloadbcm5719-llvm-7ec2c72095649a67fe5b7e56fec29113650a2274.tar.gz
bcm5719-llvm-7ec2c72095649a67fe5b7e56fec29113650a2274.zip
[PPC] Give unaligned memory access lower cost on processor that supports it
Newer ppc supports unaligned memory access, it reduces the cost of unaligned memory access significantly. This patch handles this case in PPCTTIImpl::getMemoryOpCost. This patch fixes pr31492. Differential Revision: https://reviews.llvm.org/D28630 This is resubmit of r292680, which was reverted by r293092. The internal application failures were actually caused by a source code bug. llvm-svn: 295506
-rw-r--r--llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp4
-rw-r--r--llvm/test/Analysis/CostModel/PowerPC/load_store.ll2
-rw-r--r--llvm/test/Analysis/CostModel/PowerPC/unaligned_ld_st.ll26
3 files changed, 31 insertions, 1 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp b/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp
index f94d1eab097..2f1bceaa481 100644
--- a/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp
+++ b/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp
@@ -401,6 +401,10 @@ int PPCTTIImpl::getMemoryOpCost(unsigned Opcode, Type *Src, unsigned Alignment,
if (IsVSXType || (ST->hasVSX() && IsAltivecType))
return Cost;
+ // Newer PPC supports unaligned memory access.
+ if (TLI->allowsMisalignedMemoryAccesses(LT.second, 0))
+ return Cost;
+
// PPC in general does not support unaligned loads and stores. They'll need
// to be decomposed based on the alignment factor.
diff --git a/llvm/test/Analysis/CostModel/PowerPC/load_store.ll b/llvm/test/Analysis/CostModel/PowerPC/load_store.ll
index d48be5b5f62..b77dd444774 100644
--- a/llvm/test/Analysis/CostModel/PowerPC/load_store.ll
+++ b/llvm/test/Analysis/CostModel/PowerPC/load_store.ll
@@ -1,4 +1,4 @@
-; RUN: opt < %s -cost-model -analyze -mtriple=powerpc64-unknown-linux-gnu -mcpu=g5 | FileCheck %s
+; RUN: opt < %s -cost-model -analyze -mtriple=powerpc64-unknown-linux-gnu -mcpu=g5 -disable-ppc-unaligned | 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"
diff --git a/llvm/test/Analysis/CostModel/PowerPC/unaligned_ld_st.ll b/llvm/test/Analysis/CostModel/PowerPC/unaligned_ld_st.ll
new file mode 100644
index 00000000000..6addf25949e
--- /dev/null
+++ b/llvm/test/Analysis/CostModel/PowerPC/unaligned_ld_st.ll
@@ -0,0 +1,26 @@
+; RUN: opt < %s -cost-model -analyze -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 -mattr=+vsx | 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 i32 @test(i32 %arg) {
+
+ ; CHECK: cost of 1 {{.*}} load
+ load i8, i8* undef, align 1
+ ; CHECK: cost of 1 {{.*}} load
+ load i16, i16* undef, align 1
+ ; CHECK: cost of 1 {{.*}} load
+ load i32, i32* undef, align 1
+ ; CHECK: cost of 1 {{.*}} load
+ load i64, i64* undef, align 1
+
+ ; CHECK: cost of 1 {{.*}} store
+ store i8 undef, i8* undef, align 1
+ ; CHECK: cost of 1 {{.*}} store
+ store i16 undef, i16* undef, align 1
+ ; CHECK: cost of 1 {{.*}} store
+ store i32 undef, i32* undef, align 1
+ ; CHECK: cost of 1 {{.*}} store
+ store i64 undef, i64* undef, align 1
+
+ ret i32 undef
+}
OpenPOWER on IntegriCloud