typedef
struct {
- enum { Ut, Btt, Btc, Cf64i } tag;
+ enum { Ut, Btt, Btc, Cf64i, Ld } tag;
union {
/* unop(tmp) */
struct {
struct {
ULong f64i;
} Cf64i;
+ /* LoadLE(tmp):ty */
+ struct {
+ IRTemp addr;
+ IRType ty;
+ } Ld;
} u;
}
AvailExpr;
&& a1->u.Btc.arg1 == a2->u.Btc.arg1
&& eqIRConst(&a1->u.Btc.con2, &a2->u.Btc.con2);
case Cf64i: return a1->u.Cf64i.f64i == a2->u.Cf64i.f64i;
+ case Ld: return a1->u.Ld.ty == a2->u.Ld.ty
+ && a1->u.Ld.addr == a2->u.Ld.addr;
default: vpanic("eq_AvailExpr");
}
}
IRExpr_Tmp(ae->u.Btc.arg1), IRExpr_Const(con) );
case Cf64i:
return IRExpr_Const(IRConst_F64i(ae->u.Cf64i.f64i));
+ case Ld:
+ return IRExpr_LDle( ae->u.Ld.ty, IRExpr_Tmp(ae->u.Ld.addr) );
default:
vpanic("availExpr_to_IRExpr");
}
break;
case Cf64i:
break;
+ case Ld:
+ ae->u.Ld.addr = subst_AvailExpr_Temp( env, ae->u.Ld.addr );
+ break;
default:
vpanic("subst_AvailExpr");
}
return ae;
}
+ if (e->tag == Iex_LDle
+ && e->Iex.LDle.addr->tag == Iex_Tmp) {
+ vex_printf("\ndsssssssssssssssssssssssssssssssssssssssssssss\n");
+ ae = LibVEX_Alloc(sizeof(AvailExpr));
+ ae->tag = Ld;
+ ae->u.Ld.addr = e->Iex.LDle.addr->Iex.Tmp.tmp;
+ ae->u.Ld.ty = e->Iex.LDle.ty;
+ return ae;
+ }
+
return NULL;
}
if (!eprime)
continue;
- /* vex_printf("considering: " ); ppIRStmt(st); vex_printf("\n"); */
+ vex_printf("considering: " ); ppIRStmt(st); vex_printf("\n");
/* apply tenv */
subst_AvailExpr( tenv, eprime );
bb2 = maybe_loop_unroll_BB( bb, guest_addr );
if (bb2) {
- show_res = True;
+ show_res = True;
bb = cheap_transformations( bb2, specHelper );
if (do_expensive) {
bb = expensive_transformations( bb );
bb = cheap_transformations( bb, specHelper );
+ } else {
+ /* at least do CSE and dead code removal */
+ cse_BB( bb );
+ dead_BB( bb );
}
}