From 353be4a0537de508f45ee72624d1af65bd5597dd Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 26 Apr 2018 14:42:40 -0700 Subject: Improve precompute-propagate (#1514) Propagate constants through a tee_local. Found by Souper. Details in patch comments - basically we didn't differentiate precomputing a value and an expression. --- src/passes/Precompute.cpp | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/passes/Precompute.cpp b/src/passes/Precompute.cpp index ed3d51701..db7d8b772 100644 --- a/src/passes/Precompute.cpp +++ b/src/passes/Precompute.cpp @@ -38,8 +38,15 @@ class StandaloneExpressionRunner : public ExpressionRunnertype)) { + assert(curr->isTee()); + return visit(curr->value); + } + } return Flow(NONSTANDALONE_FLOW); } Flow visitGetGlobal(GetGlobal *curr) { @@ -130,7 +145,7 @@ struct Precompute : public WalkerPassis() || curr->is()) return; // try to evaluate this into a const - Flow flow = precomputeFlow(curr); + Flow flow = precomputeExpression(curr); if (flow.breaking()) { if (flow.breakTo == NONSTANDALONE_FLOW) return; if (flow.breakTo == RETURN_FLOW) { @@ -194,16 +209,27 @@ struct Precompute : public WalkerPass