From 718eb2e3e6d3555af1e077e4115a46e968e4fef4 Mon Sep 17 00:00:00 2001 From: Max Graey Date: Tue, 3 Aug 2021 15:49:29 +0300 Subject: [OptimizeForJS] Refactor rewritePopcntEqualOne (#4050) --- src/passes/OptimizeForJS.cpp | 34 ++++++++-------------------------- 1 file changed, 8 insertions(+), 26 deletions(-) (limited to 'src') diff --git a/src/passes/OptimizeForJS.cpp b/src/passes/OptimizeForJS.cpp index 976a16f94..b5ba84d90 100644 --- a/src/passes/OptimizeForJS.cpp +++ b/src/passes/OptimizeForJS.cpp @@ -44,30 +44,11 @@ struct OptimizeForJSPass : public WalkerPass> { void rewritePopcntEqualOne(Expression* expr) { // popcnt(x) == 1 ==> !!x & !(x & (x - 1)) - BinaryOp andOp, subOp; - UnaryOp eqzOp; - Literal litOne; - Type type = expr->type; - - switch (type.getBasic()) { - case Type::i32: - eqzOp = EqZInt32; - andOp = AndInt32; - subOp = SubInt32; - litOne = Literal::makeOne(Type::i32); - break; - - case Type::i64: - eqzOp = EqZInt64; - andOp = AndInt64; - subOp = SubInt64; - litOne = Literal::makeOne(Type::i64); - break; + using namespace Abstract; - default: - return; - } + Type type = expr->type; + UnaryOp eqzOp = getUnary(type, EqZ); Localizer temp(expr, getFunction(), getModule()); Builder builder(*getModule()); @@ -79,11 +60,12 @@ struct OptimizeForJSPass : public WalkerPass> { builder.makeUnary( eqzOp, builder.makeBinary( - andOp, + getBinary(type, And), builder.makeLocalGet(temp.index, type), - builder.makeBinary(subOp, - builder.makeLocalGet(temp.index, type), - builder.makeConst(litOne)))))); + builder.makeBinary( + getBinary(type, Sub), + builder.makeLocalGet(temp.index, type), + builder.makeConst(Literal::makeOne(type.getBasic()))))))); } }; -- cgit v1.2.3