summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils
diff options
context:
space:
mode:
authorJeremy Morse <jeremy.morse.llvm@gmail.com>2019-02-12 10:54:30 +0000
committerJeremy Morse <jeremy.morse.llvm@gmail.com>2019-02-12 10:54:30 +0000
commitb33a5c7347fce57f58ce5f0dbb086a11caa5220f (patch)
treeede3fb1ffcf119335d0a8f79059d6f151ca58ddb /llvm/lib/Transforms/Utils
parentbbd2f972930e4ae99d5fff68122b5b7cec6aace7 (diff)
downloadbcm5719-llvm-b33a5c7347fce57f58ce5f0dbb086a11caa5220f.tar.gz
bcm5719-llvm-b33a5c7347fce57f58ce5f0dbb086a11caa5220f.zip
[DebugInfo] Don't salvage load operations (PR40628).
Salvaging a redundant load instruction into a debug expression hides a memory read from optimisation passes. Passes that alter memory behaviour (such as LICM promoting memory to a register) aren't aware of these debug memory reads and leave them unaltered, making the debug variable location point somewhere unsafe. Teaching passes to know about these debug memory reads would be challenging and probably incomplete. Finding dbg.value instructions that need to be fixed would likely be computationally expensive too, as more analysis would be required. It's better to not generate debug-memory-reads instead, alas. Changed tests: * DeadStoreElim: test for salvaging of intermediate operations contributing to the dead store, instead of salvaging of the redundant load, * GVN: remove debuginfo behaviour checks completely, this behaviour is still covered by other tests, * InstCombine: don't test for salvaged loads, we're removing that behaviour. Differential Revision: https://reviews.llvm.org/D57962 llvm-svn: 353824
Diffstat (limited to 'llvm/lib/Transforms/Utils')
-rw-r--r--llvm/lib/Transforms/Utils/Local.cpp6
1 files changed, 3 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp
index f10bc6520a8..12c4ff1e37c 100644
--- a/llvm/lib/Transforms/Utils/Local.cpp
+++ b/llvm/lib/Transforms/Utils/Local.cpp
@@ -1714,9 +1714,9 @@ DIExpression *llvm::salvageDebugInfoImpl(Instruction &I,
// TODO: Salvage constants from each kind of binop we know about.
return nullptr;
}
- } else if (isa<LoadInst>(&I)) {
- // Rewrite the load into DW_OP_deref.
- return DIExpression::prepend(SrcDIExpr, DIExpression::WithDeref);
+ // *Not* to do: we should not attempt to salvage load instructions,
+ // because the validity and lifetime of a dbg.value containing
+ // DW_OP_deref becomes difficult to analyze. See PR40628 for examples.
}
return nullptr;
}
OpenPOWER on IntegriCloud