@@ -214,37 +214,41 @@ struct OptimizeInstructions : public WalkerPass<PostWalker<OptimizeInstructions,
214214 if (get && get->name == set->name ) {
215215 ExpressionManipulator::nop (curr);
216216 }
217+ } else if (auto * iff = curr->dynCast <If>()) {
218+ iff->condition = optimizeBoolean (iff->condition );
217219 } else if (auto * select = curr->dynCast <Select>()) {
220+ select->condition = optimizeBoolean (select->condition );
218221 auto * condition = select->condition ->dynCast <Unary>();
219222 if (condition && condition->op == EqZInt32) {
220- auto * condition2 = condition->value ->dynCast <Unary>();
221- if (condition2 && condition2->op == EqZInt32) {
222- // double eqz
223- select->condition = condition2->value ;
224- } else {
225- // flip select, eqz input and flippable
226- EffectAnalyzer ifTrue (select->ifTrue );
227- EffectAnalyzer ifFalse (select->ifFalse );
228- if (!ifTrue.invalidates (ifFalse)) {
229- select->condition = condition->value ;
230- std::swap (select->ifTrue , select->ifFalse );
231- }
223+ // flip select to remove eqz, if we can reorder
224+ EffectAnalyzer ifTrue (select->ifTrue );
225+ EffectAnalyzer ifFalse (select->ifFalse );
226+ if (!ifTrue.invalidates (ifFalse)) {
227+ select->condition = condition->value ;
228+ std::swap (select->ifTrue , select->ifFalse );
232229 }
233230 }
234231 } else if (auto * br = curr->dynCast <Break>()) {
235232 if (br->condition ) {
236- auto * condition = br->condition ->dynCast <Unary>();
237- if (condition && condition->op == EqZInt32) {
238- auto * condition2 = condition->value ->dynCast <Unary>();
239- if (condition2 && condition2->op == EqZInt32) {
240- // double eqz
241- br->condition = condition2->value ;
242- }
243- }
233+ br->condition = optimizeBoolean (br->condition );
244234 }
245235 }
246236 return nullptr ;
247237 }
238+
239+ private:
240+
241+ Expression* optimizeBoolean (Expression* boolean) {
242+ auto * condition = boolean->dynCast <Unary>();
243+ if (condition && condition->op == EqZInt32) {
244+ auto * condition2 = condition->value ->dynCast <Unary>();
245+ if (condition2 && condition2->op == EqZInt32) {
246+ // double eqz
247+ return condition2->value ;
248+ }
249+ }
250+ return boolean;
251+ }
248252};
249253
250254Pass *createOptimizeInstructionsPass () {
0 commit comments