diff options
author | Chris Lattner <sabre@nondot.org> | 2009-02-12 06:56:08 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-02-12 06:56:08 +0000 |
commit | 5297c635656f43fec7877e3e5cc12c2b1933cd2b (patch) | |
tree | cea201e0f90954217a6602a38045d70aec5c8b1e /llvm/lib | |
parent | 1331d53c27a7ad00463bf1e4fd1e43e00d7ca334 (diff) | |
download | bcm5719-llvm-5297c635656f43fec7877e3e5cc12c2b1933cd2b.tar.gz bcm5719-llvm-5297c635656f43fec7877e3e5cc12c2b1933cd2b.zip |
fix PR3537: if resetting bbi back to the start of a block, we need to
forget about already inserted expressions.
llvm-svn: 64362
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp b/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp index 0a1c641e2bf..12c76e85251 100644 --- a/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp +++ b/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp @@ -1241,11 +1241,13 @@ bool CodeGenPrepare::OptimizeMemoryInst(Instruction *MemoryInst, Value *Addr, // computation. Value *&SunkAddr = SunkAddrs[Addr]; if (SunkAddr) { - DEBUG(cerr << "CGP: Reusing nonlocal addrmode: " << AddrMode << "\n"); + DEBUG(cerr << "CGP: Reusing nonlocal addrmode: " << AddrMode << " for " + << *MemoryInst); if (SunkAddr->getType() != Addr->getType()) SunkAddr = new BitCastInst(SunkAddr, Addr->getType(), "tmp", InsertPt); } else { - DEBUG(cerr << "CGP: SINKING nonlocal addrmode: " << AddrMode << "\n"); + DEBUG(cerr << "CGP: SINKING nonlocal addrmode: " << AddrMode << " for " + << *MemoryInst); const Type *IntPtrTy = TLI->getTargetData()->getIntPtrType(); Value *Result = 0; @@ -1505,9 +1507,12 @@ bool CodeGenPrepare::OptimizeBlock(BasicBlock &BB) { if (TLI && isa<InlineAsm>(CI->getCalledValue())) if (const TargetAsmInfo *TAI = TLI->getTargetMachine().getTargetAsmInfo()) { - if (TAI->ExpandInlineAsm(CI)) + if (TAI->ExpandInlineAsm(CI)) { BBI = BB.begin(); - else + // Avoid processing instructions out of order, which could cause + // reuse before a value is defined. + SunkAddrs.clear(); + } else // Sink address computing for memory operands into the block. MadeChange |= OptimizeInlineAsmInst(I, &(*CI), SunkAddrs); } |