1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 11:02:59 +02:00

[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
This commit is contained in:
Guozhi Wei 2017-02-17 22:29:39 +00:00
parent 1e2948ea7e
commit ad2db4b935
3 changed files with 31 additions and 1 deletions

View File

@ -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.

View File

@ -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"

View File

@ -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
}