/*--- Constant propagation and folding ---*/
/*---------------------------------------------------------------*/
+/* The env in this section is a map from IRTemp to IRExpr*. */
+
/* Are both expressions simply the same IRTemp ? */
static Bool sameIRTemps ( IRExpr* e1, IRExpr* e2 )
{
occCount_Expr(env, e->Iex.CCall.args[i]);
return;
+ case Iex_GetI:
+ occCount_Expr(env, e->Iex.GetI.offset);
+ return;
+
case Iex_Const:
case Iex_Get:
return;
case Ist_Put:
occCount_Expr(env, st->Ist.Put.expr);
return;
+ case Ist_PutI:
+ occCount_Expr(env, st->Ist.PutI.offset);
+ occCount_Expr(env, st->Ist.PutI.expr);
+ return;
case Ist_STle:
occCount_Expr(env, st->Ist.STle.addr);
occCount_Expr(env, st->Ist.STle.data);
case Iex_LDle:
return IRExpr_LDle(
e->Iex.LDle.ty,
- tbSubst_Expr(env,e->Iex.LDle.addr)
+ tbSubst_Expr(env, e->Iex.LDle.addr)
);
+ case Iex_GetI:
+ return IRExpr_GetI(
+ tbSubst_Expr(env, e->Iex.GetI.offset),
+ e->Iex.GetI.ty,
+ e->Iex.GetI.minoff,
+ e->Iex.GetI.maxoff
+ );
case Iex_Const:
case Iex_Get:
return e;
st->Ist.Put.offset,
tbSubst_Expr(env, st->Ist.Put.expr)
);
+ case Ist_PutI:
+ return IRStmt_PutI(
+ tbSubst_Expr(env, st->Ist.PutI.offset),
+ tbSubst_Expr(env, st->Ist.PutI.expr),
+ st->Ist.PutI.minoff,
+ st->Ist.PutI.maxoff
+ );
+
case Ist_Exit:
return IRStmt_Exit(
tbSubst_Expr(env, st->Ist.Exit.cond),
case Iex_Get:
*doesGet |= True;
return;
+ case Iex_GetI:
+ *doesGet |= True;
+ setHints_Expr(doesLoad, doesGet, e->Iex.GetI.offset);
+ return;
case Iex_Tmp:
case Iex_Const:
return;