From 4d5bc8795188d62846132815bd521bd4b60c6cad Mon Sep 17 00:00:00 2001 From: Guozhi Wei Date: Fri, 17 Feb 2017 22:29:39 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295506 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/PowerPC/PPCTargetTransformInfo.cpp | 4 ++++ test/Analysis/CostModel/PowerPC/load_store.ll | 2 +- test/Analysis/CostModel/PowerPC/unaligned_ld_st.ll | 26 ++++++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 test/Analysis/CostModel/PowerPC/unaligned_ld_st.ll diff --git a/lib/Target/PowerPC/PPCTargetTransformInfo.cpp b/lib/Target/PowerPC/PPCTargetTransformInfo.cpp index f94d1eab097..2f1bceaa481 100644 --- a/lib/Target/PowerPC/PPCTargetTransformInfo.cpp +++ b/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/test/Analysis/CostModel/PowerPC/load_store.ll b/test/Analysis/CostModel/PowerPC/load_store.ll index d48be5b5f62..b77dd444774 100644 --- a/test/Analysis/CostModel/PowerPC/load_store.ll +++ b/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/test/Analysis/CostModel/PowerPC/unaligned_ld_st.ll b/test/Analysis/CostModel/PowerPC/unaligned_ld_st.ll new file mode 100644 index 00000000000..6addf25949e --- /dev/null +++ b/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 +} -- 2.11.0