mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-15 04:08:07 +00:00
fix hte last remaining known (by me) phi translation bug. When we reanalyze
clobbers to forward pieces of large stores to small loads, we need to consider the properly phi translated pointer in the store block. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@90978 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b2c6ae8c0b
commit
af064aeee6
@ -1384,15 +1384,19 @@ bool GVN::processNonLocalLoad(LoadInst *LI,
|
||||
MemDepResult DepInfo = Deps[i].getResult();
|
||||
|
||||
if (DepInfo.isClobber()) {
|
||||
// The address being loaded in this non-local block may not be the same as
|
||||
// the pointer operand of the load if PHI translation occurs. Make sure
|
||||
// to consider the right address.
|
||||
Value *Address = Deps[i].getAddress();
|
||||
|
||||
// If the dependence is to a store that writes to a superset of the bits
|
||||
// read by the load, we can extract the bits we need for the load from the
|
||||
// stored value.
|
||||
if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInfo.getInst())) {
|
||||
if (TD == 0)
|
||||
TD = getAnalysisIfAvailable<TargetData>();
|
||||
if (TD) {
|
||||
int Offset = AnalyzeLoadFromClobberingStore(LI->getType(),
|
||||
LI->getPointerOperand(),
|
||||
if (TD && Address) {
|
||||
int Offset = AnalyzeLoadFromClobberingStore(LI->getType(), Address,
|
||||
DepSI, *TD);
|
||||
if (Offset != -1) {
|
||||
ValuesPerBlock.push_back(AvailableValueInBlock::get(DepBB,
|
||||
@ -1408,9 +1412,8 @@ bool GVN::processNonLocalLoad(LoadInst *LI,
|
||||
if (MemIntrinsic *DepMI = dyn_cast<MemIntrinsic>(DepInfo.getInst())) {
|
||||
if (TD == 0)
|
||||
TD = getAnalysisIfAvailable<TargetData>();
|
||||
if (TD) {
|
||||
int Offset = AnalyzeLoadFromClobberingMemInst(LI->getType(),
|
||||
LI->getPointerOperand(),
|
||||
if (TD && Address) {
|
||||
int Offset = AnalyzeLoadFromClobberingMemInst(LI->getType(), Address,
|
||||
DepMI, *TD);
|
||||
if (Offset != -1) {
|
||||
ValuesPerBlock.push_back(AvailableValueInBlock::getMI(DepBB, DepMI,
|
||||
|
@ -469,6 +469,9 @@ exit:
|
||||
define i8 @phi_trans4(i8* %p) {
|
||||
; CHECK: @phi_trans4
|
||||
entry:
|
||||
%X3 = getelementptr i8* %p, i32 192
|
||||
store i8 192, i8* %X3
|
||||
|
||||
%X = getelementptr i8* %p, i32 4
|
||||
%Y = load i8* %X
|
||||
br label %loop
|
||||
@ -476,11 +479,15 @@ entry:
|
||||
loop:
|
||||
%i = phi i32 [4, %entry], [192, %loop]
|
||||
%X2 = getelementptr i8* %p, i32 %i
|
||||
%Y2 = load i8* %X
|
||||
%Y2 = load i8* %X2
|
||||
|
||||
; CHECK: loop:
|
||||
; CHECK-NEXT: %Y2 = phi i8 [ %Y, %entry ], [ 0, %loop ]
|
||||
; CHECK-NOT: load i8
|
||||
|
||||
%cond = call i1 @cond2()
|
||||
|
||||
%Z = bitcast i8 *%X2 to i32*
|
||||
%Z = bitcast i8 *%X3 to i32*
|
||||
store i32 0, i32* %Z
|
||||
br i1 %cond, label %loop, label %out
|
||||
|
||||
@ -492,6 +499,7 @@ out:
|
||||
define i8 @phi_trans5(i8* %p) {
|
||||
; CHECK: @phi_trans5
|
||||
entry:
|
||||
|
||||
%X4 = getelementptr i8* %p, i32 2
|
||||
store i8 19, i8* %X4
|
||||
|
||||
@ -502,8 +510,7 @@ entry:
|
||||
loop:
|
||||
%i = phi i32 [4, %entry], [3, %cont]
|
||||
%X2 = getelementptr i8* %p, i32 %i
|
||||
%Y2 = load i8* %X2
|
||||
;; FIXME: This load is being incorrectly replaced!
|
||||
%Y2 = load i8* %X2 ; Ensure this load is not being incorrectly replaced.
|
||||
%cond = call i1 @cond2()
|
||||
br i1 %cond, label %cont, label %out
|
||||
|
||||
@ -511,6 +518,11 @@ cont:
|
||||
%Z = getelementptr i8* %X2, i32 -1
|
||||
%Z2 = bitcast i8 *%Z to i32*
|
||||
store i32 50462976, i32* %Z2 ;; (1 << 8) | (2 << 16) | (3 << 24)
|
||||
|
||||
|
||||
; CHECK: store i32
|
||||
; CHECK-NEXT: getelementptr i8* %p, i32 3
|
||||
; CHECK-NEXT: load i8*
|
||||
br label %loop
|
||||
|
||||
out:
|
||||
|
Loading…
Reference in New Issue
Block a user