mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
[PowerPC] Compute the MMO offset for an unaligned load with signed arithmetic
If you compute the MMO offset using unsigned arithmetic, you end up with a large positive offset instead of a small negative one. In theory, this could cause bad instruction-scheduling decisions later. I noticed this by inspection from the debug output, and using that for the regression test is the best I can do right now. llvm-svn: 246805
This commit is contained in:
parent
fcf9557461
commit
e53c76127a
@ -10302,7 +10302,8 @@ SDValue PPCTargetLowering::PerformDAGCombine(SDNode *N,
|
||||
// original unaligned load.
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MachineMemOperand *BaseMMO =
|
||||
MF.getMachineMemOperand(LD->getMemOperand(), -MemVT.getStoreSize()+1,
|
||||
MF.getMachineMemOperand(LD->getMemOperand(),
|
||||
-(long)MemVT.getStoreSize()+1,
|
||||
2*MemVT.getStoreSize()-1);
|
||||
|
||||
// Create the new base load.
|
||||
|
17
test/CodeGen/PowerPC/unal-vec-negarith.ll
Normal file
17
test/CodeGen/PowerPC/unal-vec-negarith.ll
Normal file
@ -0,0 +1,17 @@
|
||||
; RUN: llc -debug-only=isel <%s >%t 2>&1 && FileCheck <%t %s
|
||||
; REQUIRES: asserts
|
||||
|
||||
target datalayout = "E-m:e-i64:64-n32:64"
|
||||
target triple = "powerpc64-unknown-linux-gnu"
|
||||
|
||||
define <16 x i8> @test_l_v16i8(<16 x i8>* %p) #0 {
|
||||
entry:
|
||||
%r = load <16 x i8>, <16 x i8>* %p, align 1
|
||||
ret <16 x i8> %r
|
||||
|
||||
; CHECK-NOT: v4i32,ch = llvm.ppc.altivec.lvx{{.*}}<LD31[%p+4294967281](align=1)>
|
||||
; CHECK: v4i32,ch = llvm.ppc.altivec.lvx{{.*}}<LD31[%p+-15](align=1)>
|
||||
}
|
||||
|
||||
attributes #0 = { nounwind "target-cpu"="pwr7" }
|
||||
|
Loading…
Reference in New Issue
Block a user