From: Mark Wielaard Date: Sun, 15 Dec 2024 20:26:21 +0000 (+0100) Subject: VEX/priv/ir_opt.c: Also fold Iop_And1 expressions when possible X-Git-Tag: VALGRIND_3_25_0~198 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1f8a81cc2493670a82334bd5b4bc1ffa6d02174b;p=thirdparty%2Fvalgrind.git VEX/priv/ir_opt.c: Also fold Iop_And1 expressions when possible Treat Iop_And1 just like And16/And32/And64. Fold fully constant And1 expressions and handle And1(x,True), And1(True,x), And1(x,False), And1(False,x) and And1(x,x). Make sure isOnesU handles Ico_U1 (isZerosU and sameIRExprs already did). https://bugs.kde.org/show_bug.cgi?id=468575#c52 --- diff --git a/VEX/priv/ir_opt.c b/VEX/priv/ir_opt.c index 6453f4fdf..656537865 100644 --- a/VEX/priv/ir_opt.c +++ b/VEX/priv/ir_opt.c @@ -1239,6 +1239,7 @@ static Bool isOnesU ( IRExpr* e ) { if (e->tag != Iex_Const) return False; switch (e->Iex.Const.con->tag) { + case Ico_U1: return toBool( e->Iex.Const.con->Ico.U1 == True); case Ico_U8: return toBool( e->Iex.Const.con->Ico.U8 == 0xFF); case Ico_U16: return toBool( e->Iex.Const.con->Ico.U16 == 0xFFFF); case Ico_U32: return toBool( e->Iex.Const.con->Ico.U32 @@ -1832,6 +1833,11 @@ static IRExpr* fold_Expr_WRK ( IRExpr** env, IRExpr* e ) break; /* -- And -- */ + case Iop_And1: + e2 = IRExpr_Const(IRConst_U1(toBool( + (e->Iex.Binop.arg1->Iex.Const.con->Ico.U1 + & e->Iex.Binop.arg2->Iex.Const.con->Ico.U1)))); + break; case Iop_And8: e2 = IRExpr_Const(IRConst_U8(toUChar( (e->Iex.Binop.arg1->Iex.Const.con->Ico.U8 @@ -2274,31 +2280,32 @@ static IRExpr* fold_Expr_WRK ( IRExpr** env, IRExpr* e ) } break; + case Iop_And1: case Iop_And8: case Iop_And16: case Iop_And32: case Iop_And64: - /* And8/And16/And32/And64(x,1---1b) ==> x */ + /* And1/And8/And16/And32/And64(x,1---1b) ==> x */ if (isOnesU(e->Iex.Binop.arg2)) { e2 = e->Iex.Binop.arg1; break; } - /* And8/And16/And32/And64(1---1b,x) ==> x */ + /* And1/And8/And16/And32/And64(1---1b,x) ==> x */ if (isOnesU(e->Iex.Binop.arg1)) { e2 = e->Iex.Binop.arg2; break; } - /* And8/And16/And32/And64(x,0) ==> 0 */ + /* And1/And8/And16/And32/And64(x,0) ==> 0 */ if (isZeroU(e->Iex.Binop.arg2)) { e2 = e->Iex.Binop.arg2; break; } - /* And8/And16/And32/And64(0,x) ==> 0 */ + /* And1/And8/And16/And32/And64(0,x) ==> 0 */ if (isZeroU(e->Iex.Binop.arg1)) { e2 = e->Iex.Binop.arg1; break; } - /* And8/And16/And32/And64(t,t) ==> t, for some IRTemp t */ + /* And1/And8/And16/And32/And64(t,t) ==> t, for some IRTemp t */ if (sameIRExprs(env, e->Iex.Binop.arg1, e->Iex.Binop.arg2)) { e2 = e->Iex.Binop.arg1; break;