|
@@ -63,9 +63,9 @@ class Dce {
|
|
|
}
|
|
|
|
|
|
for( f in vertex.funs )
|
|
|
- f.expr = mapExpr(f.expr);
|
|
|
+ f.expr = mapExpr(f.expr, false);
|
|
|
for( f in fragment.funs )
|
|
|
- f.expr = mapExpr(f.expr);
|
|
|
+ f.expr = mapExpr(f.expr, false);
|
|
|
|
|
|
|
|
|
return {
|
|
@@ -142,26 +142,27 @@ class Dce {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- function mapExpr( e : TExpr ) : TExpr {
|
|
|
+ function mapExpr( e : TExpr, isVar ) : TExpr {
|
|
|
switch( e.e ) {
|
|
|
case TBlock(el):
|
|
|
var out = [];
|
|
|
var count = 0;
|
|
|
for( e in el ) {
|
|
|
- var e = mapExpr(e);
|
|
|
- switch( e.e ) {
|
|
|
- case TConst(_) if( count < el.length ):
|
|
|
- case TBlock([]):
|
|
|
- default:
|
|
|
+ var e = mapExpr(e, isVar);
|
|
|
+ if( e.hasSideEffect() || (isVar && count == el.length - 1) )
|
|
|
out.push(e);
|
|
|
- }
|
|
|
count++;
|
|
|
}
|
|
|
return { e : TBlock(out), p : e.p, t : e.t };
|
|
|
case TVarDecl(v,_) | TBinop(OpAssign | OpAssignOp(_), { e : (TVar(v) | TSwiz( { e : TVar(v) }, _)) }, _) if( !get(v).used ):
|
|
|
return { e : TConst(CNull), t : e.t, p : e.p };
|
|
|
+ case TIf(e, econd, eelse):
|
|
|
+ var e = mapExpr(e, true);
|
|
|
+ var econd = mapExpr(econd, isVar);
|
|
|
+ var eelse = eelse == null ? null : mapExpr(eelse, isVar);
|
|
|
+ return { e : TIf(e, econd, eelse), p : e.p, t : e.t };
|
|
|
default:
|
|
|
- return e.map(mapExpr);
|
|
|
+ return e.map(function(e) return mapExpr(e,true));
|
|
|
}
|
|
|
}
|
|
|
|