diff options
author | Jim Grosbach <grosbach@apple.com> | 2014-04-10 00:27:45 +0000 |
---|---|---|
committer | Jim Grosbach <grosbach@apple.com> | 2014-04-10 00:27:45 +0000 |
commit | 31689680ec032a694916d6f4d496b236185a685c (patch) | |
tree | 6481d418002e72114bb2f28aa2d81a5120c95c28 /lib/CodeGen/CodeGenPrepare.cpp | |
parent | 6472a514dc8db8414ddd86cfa3aefef84c45b41d (diff) | |
download | llvm-31689680ec032a694916d6f4d496b236185a685c.tar.gz llvm-31689680ec032a694916d6f4d496b236185a685c.tar.bz2 llvm-31689680ec032a694916d6f4d496b236185a685c.tar.xz |
Fix to support properly cleaning up failed address sinking against constants
As it turns out the source of the sunkaddr can be a constant, in which case
there is not an instruction to delete, causing the cleanup code introduced in
r204833 to crash. This patch adds a dynamic check to ensure the deleted value is
in fact an instruction and not a constant.
Patch by Louis Gerbarg <lgg@apple.com>
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205941 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CodeGenPrepare.cpp')
-rw-r--r-- | lib/CodeGen/CodeGenPrepare.cpp | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/lib/CodeGen/CodeGenPrepare.cpp b/lib/CodeGen/CodeGenPrepare.cpp index e82a30617d..9765485b5d 100644 --- a/lib/CodeGen/CodeGenPrepare.cpp +++ b/lib/CodeGen/CodeGenPrepare.cpp @@ -2459,8 +2459,9 @@ bool CodeGenPrepare::OptimizeMemoryInst(Instruction *MemoryInst, Value *Addr, // the original IR value was tossed in favor of a constant back when // the AddrMode was created we need to bail out gracefully if widths // do not match instead of extending it. - if (Result != AddrMode.BaseReg) - cast<Instruction>(Result)->eraseFromParent(); + Instruction *I = dyn_cast<Instruction>(Result); + if (I && (Result != AddrMode.BaseReg)) + I->eraseFromParent(); return false; } if (AddrMode.Scale != 1) |