From 62f254df04a78bf93ac9fa5859a9e7275867e853 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 12 Sep 2005 22:00:15 +0000 Subject: [PATCH] Implement a trivial form of store->load forwarding where the store and the load are exactly consequtive. This is picked up by other passes, but this triggers thousands of times in fortran programs that use static locals (and is thus a compile-time speedup). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23320 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/InstructionCombining.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 67dca06a420..67144b93cfe 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -4925,6 +4925,15 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) { // None of the following transforms are legal for volatile loads. if (LI.isVolatile()) return 0; + + // If the instruction immediately before this is a store to the same address, + // do a simple form of store->load forwarding. + if (&LI.getParent()->front() != &LI) { + BasicBlock::iterator BBI = &LI; --BBI; + if (StoreInst *SI = dyn_cast(BBI)) + if (SI->getOperand(1) == LI.getOperand(0)) + return ReplaceInstUsesWith(LI, SI->getOperand(0)); + } if (GetElementPtrInst *GEPI = dyn_cast(Op)) if (isa(GEPI->getOperand(0)) ||