From: Florian Krohm Date: Fri, 18 Jul 2014 21:23:46 +0000 (+0000) Subject: Add a few more algebraic optimisations for Iop_And8/16. X-Git-Tag: svn/VALGRIND_3_10_1^2~66 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2e9c50e008a8da8d1a2df5c500d34d5f7bb0d747;p=thirdparty%2Fvalgrind.git Add a few more algebraic optimisations for Iop_And8/16. Observed on s390. git-svn-id: svn://svn.valgrind.org/vex/trunk@2905 --- diff --git a/VEX/priv/ir_opt.c b/VEX/priv/ir_opt.c index d1fe9ad20c..bc019dad6d 100644 --- a/VEX/priv/ir_opt.c +++ b/VEX/priv/ir_opt.c @@ -2163,32 +2163,37 @@ static IRExpr* fold_Expr ( IRExpr** env, IRExpr* e ) } break; - case Iop_And64: + case Iop_And8: + case Iop_And16: case Iop_And32: - /* And32/And64(x,1---1b) ==> x */ + case Iop_And64: + /* And8/And16/And32/And64(x,1---1b) ==> x */ if (isOnesU(e->Iex.Binop.arg2)) { e2 = e->Iex.Binop.arg1; break; } - /* And32/And64(x,0) ==> 0 */ + /* 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 */ if (isZeroU(e->Iex.Binop.arg2)) { e2 = e->Iex.Binop.arg2; break; } - /* And32/And64(0,x) ==> 0 */ + /* And8/And16/And32/And64(0,x) ==> 0 */ if (isZeroU(e->Iex.Binop.arg1)) { e2 = e->Iex.Binop.arg1; break; } - /* And32/And64(t,t) ==> t, for some IRTemp t */ + /* 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; } break; - case Iop_And8: - case Iop_And16: case Iop_AndV128: case Iop_AndV256: /* And8/And16/AndV128/AndV256(t,t)