reenable load address insertion in load pre. This allows us to

handle cases like this:
void test(int N, double* G) {
  long j;
  for (j = 1; j < N - 1; j++)
      G[j+1] = G[j] + G[j+1];
}

where G[1] isn't live into the loop.

llvm-svn: 90041
This commit is contained in:
Chris Lattner 2009-11-28 16:08:18 +00:00
parent 930de0aeaf
commit 32140312ca
2 changed files with 33 additions and 25 deletions

View File

@ -1438,16 +1438,19 @@ bool GVN::processNonLocalLoad(LoadInst *LI,
// FIXME: This may insert a computation, but we don't tell scalar GVN
// optimization stuff about it. How do we do this?
SmallVector<Instruction*, 8> NewInsts;
#if 0
Value *LoadPtr =
MD->InsertPHITranslatedPointer(LI->getOperand(0), LoadBB,
UnavailablePred, TD, *DT, NewInsts);
#else
Value *LoadPtr =
MD->GetAvailablePHITranslatedValue(LI->getOperand(0), LoadBB,
UnavailablePred, TD, *DT);
#endif
Value *LoadPtr = 0;
// If all preds have a single successor, then we know it is safe to insert the
// load on the pred (?!?), so we can insert code to materialize the pointer if
// it is not available.
if (allSingleSucc) {
LoadPtr = MD->InsertPHITranslatedPointer(LI->getOperand(0), LoadBB,
UnavailablePred, TD, *DT,NewInsts);
} else {
LoadPtr = MD->GetAvailablePHITranslatedValue(LI->getOperand(0), LoadBB,
UnavailablePred, TD, *DT);
}
// If we couldn't find or insert a computation of this phi translated value,
// we fail PRE.
if (LoadPtr == 0) {
@ -1467,14 +1470,19 @@ bool GVN::processNonLocalLoad(LoadInst *LI,
// put anywhere; this can be improved, but should be conservatively safe.
if (!allSingleSucc &&
// FIXME: REEVALUTE THIS.
!isSafeToLoadUnconditionally(LoadPtr, UnavailablePred->getTerminator()))
!isSafeToLoadUnconditionally(LoadPtr, UnavailablePred->getTerminator())) {
assert(NewInsts.empty() && "Should not have inserted instructions");
return false;
}
// Okay, we can eliminate this load by inserting a reload in the predecessor
// and using PHI construction to get the value in the other predecessors, do
// it.
DEBUG(errs() << "GVN REMOVING PRE LOAD: " << *LI << '\n');
DEBUG(if (!NewInsts.empty())
errs() << "INSERTED " << NewInsts.size() << " INSTS: "
<< *NewInsts.back() << '\n');
Value *NewLoad = new LoadInst(LoadPtr, LI->getName()+".pre", false,
LI->getAlignment(),
UnavailablePred->getTerminator());

View File

@ -86,9 +86,9 @@ block1:
block2:
br label %block4
; HECK: block2:
; HECK: load i32*
; HECK: br label %block4
; CHECK: block2:
; CHECK: load i32*
; CHECK: br label %block4
block3:
%B = getelementptr i32* %q, i32 1
@ -103,10 +103,10 @@ block4:
%P3 = getelementptr i32* %P2, i32 1
%PRE = load i32* %P3
ret i32 %PRE
; HECK: block4:
; HECK-NEXT: phi i32 [
; HECK-NOT: load
; HECK: ret i32
; CHECK: block4:
; CHECK-NEXT: phi i32 [
; CHECK-NOT: load
; CHECK: ret i32
}
;void test5(int N, double *G) {
@ -248,9 +248,9 @@ block1:
block2:
br label %block4
; HECK: block2:
; HECK: load i32*
; HECK: br label %block4
; CHECK: block2:
; CHECK: load i32*
; CHECK: br label %block4
block3:
%A = getelementptr i32* %p, i32 1
@ -262,10 +262,10 @@ block4:
%P3 = getelementptr i32* %P2, i32 1
%PRE = load i32* %P3
ret i32 %PRE
; HECK: block4:
; HECK-NEXT: phi i32 [
; HECK-NOT: load
; HECK: ret i32
; CHECK: block4:
; CHECK-NEXT: phi i32 [
; CHECK-NOT: load
; CHECK: ret i32
}