From 4be7ec00157250ca83b61a2e1885645c67c6369c Mon Sep 17 00:00:00 2001 From: "Alon Zakai (kripken)" Date: Mon, 10 Jul 2017 18:48:02 -0700 Subject: handle unary and binary nodes that have implicit traps in vacuum --- src/passes/Vacuum.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src/passes/Vacuum.cpp') diff --git a/src/passes/Vacuum.cpp b/src/passes/Vacuum.cpp index 70230e502..40f4a6e59 100644 --- a/src/passes/Vacuum.cpp +++ b/src/passes/Vacuum.cpp @@ -93,8 +93,14 @@ struct Vacuum : public WalkerPass> { if (resultUsed) { return curr; // used, keep it } - // for unary, binary, and select, we need to check their arguments for side effects + // for unary, binary, and select, we need to check their arguments for side effects, + // as well as the node itself, as some unaries and binaries have implicit traps if (auto* unary = curr->dynCast()) { + EffectAnalyzer tester(getPassOptions()); + tester.visitUnary(unary); + if (tester.hasSideEffects()) { + return curr; + } if (EffectAnalyzer(getPassOptions(), unary->value).hasSideEffects()) { curr = unary->value; continue; @@ -102,6 +108,11 @@ struct Vacuum : public WalkerPass> { return nullptr; } } else if (auto* binary = curr->dynCast()) { + EffectAnalyzer tester(getPassOptions()); + tester.visitBinary(binary); + if (tester.hasSideEffects()) { + return curr; + } if (EffectAnalyzer(getPassOptions(), binary->left).hasSideEffects()) { if (EffectAnalyzer(getPassOptions(), binary->right).hasSideEffects()) { return curr; // leave them -- cgit v1.2.3