diff options
Diffstat (limited to 'src/passes/OptimizeInstructions.cpp')
-rw-r--r-- | src/passes/OptimizeInstructions.cpp | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp index ec646d89f..8381a0e1f 100644 --- a/src/passes/OptimizeInstructions.cpp +++ b/src/passes/OptimizeInstructions.cpp @@ -214,37 +214,41 @@ struct OptimizeInstructions : public WalkerPass<PostWalker<OptimizeInstructions, if (get && get->name == set->name) { ExpressionManipulator::nop(curr); } + } else if (auto* iff = curr->dynCast<If>()) { + iff->condition = optimizeBoolean(iff->condition); } else if (auto* select = curr->dynCast<Select>()) { + select->condition = optimizeBoolean(select->condition); auto* condition = select->condition->dynCast<Unary>(); if (condition && condition->op == EqZInt32) { - auto* condition2 = condition->value->dynCast<Unary>(); - if (condition2 && condition2->op == EqZInt32) { - // double eqz - select->condition = condition2->value; - } else { - // flip select, eqz input and flippable - EffectAnalyzer ifTrue(select->ifTrue); - EffectAnalyzer ifFalse(select->ifFalse); - if (!ifTrue.invalidates(ifFalse)) { - select->condition = condition->value; - std::swap(select->ifTrue, select->ifFalse); - } + // flip select to remove eqz, if we can reorder + EffectAnalyzer ifTrue(select->ifTrue); + EffectAnalyzer ifFalse(select->ifFalse); + if (!ifTrue.invalidates(ifFalse)) { + select->condition = condition->value; + std::swap(select->ifTrue, select->ifFalse); } } } else if (auto* br = curr->dynCast<Break>()) { if (br->condition) { - auto* condition = br->condition->dynCast<Unary>(); - if (condition && condition->op == EqZInt32) { - auto* condition2 = condition->value->dynCast<Unary>(); - if (condition2 && condition2->op == EqZInt32) { - // double eqz - br->condition = condition2->value; - } - } + br->condition = optimizeBoolean(br->condition); } } return nullptr; } + +private: + + Expression* optimizeBoolean(Expression* boolean) { + auto* condition = boolean->dynCast<Unary>(); + if (condition && condition->op == EqZInt32) { + auto* condition2 = condition->value->dynCast<Unary>(); + if (condition2 && condition2->op == EqZInt32) { + // double eqz + return condition2->value; + } + } + return boolean; + } }; Pass *createOptimizeInstructionsPass() { |