]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
VEX/priv/ir_opt.c: Also fold Iop_And1 expressions when possible
authorMark Wielaard <mark@klomp.org>
Sun, 15 Dec 2024 20:26:21 +0000 (21:26 +0100)
committerMark Wielaard <mark@klomp.org>
Sat, 21 Dec 2024 00:47:42 +0000 (01:47 +0100)
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

VEX/priv/ir_opt.c

index 6453f4fdf51a4c187fc43d88b5f08c4141244b93..6565378654b2bdb64c3f66516a2d72575445d76d 100644 (file)
@@ -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;