1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 03:02:36 +01:00

[PowerPC] Folding XForm to DForm loads requires alignment for some DForm loads.

Going from XForm Load to DSForm Load requires that the immediate be 4 byte
aligned.
If we are not aligned we must leave the load as LDX (XForm).
This bug is causing a compile-time failure in the benchmark h264ref.

Differential Revision: https://reviews.llvm.org/D51988

llvm-svn: 343525
This commit is contained in:
Stefan Pintilie 2018-10-01 20:16:27 +00:00
parent d53fbb1b78
commit f45c7d8ff9
2 changed files with 24 additions and 0 deletions

View File

@ -3150,6 +3150,14 @@ bool PPCInstrInfo::isImmElgibleForForwarding(const MachineOperand &ImmMO,
III.TruncateImmTo || III.ImmWidth != 16)
return false;
// Going from XForm to DForm loads means that the displacement needs to be
// not just an immediate but also a multiple of 4, or 16 depending on the
// load. A DForm load cannot be represented if it is a multiple of say 2.
// XForm loads do not have this restriction.
if (ImmMO.isGlobal() &&
ImmMO.getGlobal()->getAlignment() < III.ImmMustBeMultipleOf)
return false;
return true;
}

View File

@ -0,0 +1,16 @@
; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown \
; RUN: -verify-machineinstrs -ppc-asm-full-reg-names \
; RUN: -ppc-vsr-nums-as-vr < %s | FileCheck %s
@best8x8mode = external dso_local local_unnamed_addr global [4 x i16], align 2
define dso_local void @AlignDSForm() local_unnamed_addr {
entry:
%0 = load <4 x i16>, <4 x i16>* bitcast ([4 x i16]* @best8x8mode to <4 x i16>*), align 2
store <4 x i16> %0, <4 x i16>* undef, align 4
unreachable
; CHECK-LABEL: AlignDSForm
; CHECK: addis r{{[0-9]+}}, r{{[0-9]+}}, best8x8mode@toc@ha
; CHECK: addi r[[REG:[0-9]+]], r{{[0-9]+}}, best8x8mode@toc@l
; CHECK: ldx r{{[0-9]+}}, 0, r[[REG]]
}