diff options
| -rw-r--r-- | llvm/lib/Transforms/Scalar/EarlyCSE.cpp | 6 | ||||
| -rw-r--r-- | llvm/test/Transforms/EarlyCSE/basic.ll | 14 |
2 files changed, 18 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/EarlyCSE.cpp b/llvm/lib/Transforms/Scalar/EarlyCSE.cpp index 9d0ef42e039..0b16e2703dc 100644 --- a/llvm/lib/Transforms/Scalar/EarlyCSE.cpp +++ b/llvm/lib/Transforms/Scalar/EarlyCSE.cpp @@ -582,6 +582,7 @@ bool EarlyCSE::processNode(DomTreeNode *Node) { // its simpler value. if (Value *V = SimplifyInstruction(Inst, DL, &TLI, &DT, &AC)) { DEBUG(dbgs() << "EarlyCSE Simplify: " << *Inst << " to: " << *V << '\n'); + bool Killed = false; if (!Inst->use_empty()) { Inst->replaceAllUsesWith(V); Changed = true; @@ -589,11 +590,12 @@ bool EarlyCSE::processNode(DomTreeNode *Node) { if (isInstructionTriviallyDead(Inst, &TLI)) { Inst->eraseFromParent(); Changed = true; + Killed = true; } - if (Changed) { + if (Changed) ++NumSimplify; + if (Killed) continue; - } } // If this is a simple instruction that we can value number, process it. diff --git a/llvm/test/Transforms/EarlyCSE/basic.ll b/llvm/test/Transforms/EarlyCSE/basic.ll index fa1a7059db9..3c427d899f6 100644 --- a/llvm/test/Transforms/EarlyCSE/basic.ll +++ b/llvm/test/Transforms/EarlyCSE/basic.ll @@ -276,3 +276,17 @@ define void @dse_neg2(i32 *%P) { ret void } +@c = external global i32, align 4 +declare i32 @reads_c(i32 returned) +define void @pr28763() { +entry: +; CHECK-LABEL: @pr28763( +; CHECK: store i32 0, i32* @c, align 4 +; CHECK: call i32 @reads_c(i32 0) +; CHECK: store i32 2, i32* @c, align 4 + %load = load i32, i32* @c, align 4 + store i32 0, i32* @c, align 4 + %call = call i32 @reads_c(i32 0) + store i32 2, i32* @c, align 4 + ret void +} |

