now that loads are in their own table, we can implement

store->load forwarding.  This allows EarlyCSE to zap 600 more
loads from 176.gcc.

llvm-svn: 122732
This commit is contained in:
Chris Lattner 2011-01-03 03:46:34 +00:00
parent 92bb0f9f9d
commit e0e32a9ef0
2 changed files with 21 additions and 1 deletions

View File

@ -380,8 +380,19 @@ bool EarlyCSE::processNode(DomTreeNode *Node) {
// Okay, this isn't something we can CSE at all. Check to see if it is
// something that could modify memory. If so, our available memory values
// cannot be used so bump the generation count.
if (Inst->mayWriteToMemory())
if (Inst->mayWriteToMemory()) {
++CurrentGeneration;
// Okay, we just invalidated anything we knew about loaded values. Try to
// salvage *something* by remembering that the stored value is a live
// version of the pointer. It is safe to forward from volatile stores to
// non-volatile loads, so we don't have to check for volatility of the
// store.
if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
AvailableLoads->insert(SI->getPointerOperand(),
std::pair<Value*, unsigned>(SI->getValueOperand(), CurrentGeneration));
}
}
}
unsigned LiveOutGeneration = CurrentGeneration;

View File

@ -87,3 +87,12 @@ define i32 @test5(i32 *%P) {
ret i32 %Diff
; CHECK: ret i32 0
}
;; Trivial Store->load forwarding
; CHECK: @test6
define i32 @test6(i32 *%P) {
store i32 42, i32* %P
%V1 = load i32* %P
ret i32 %V1
; CHECK: ret i32 42
}