Browse Source

DCE keep variables of the while's conditionnal if the loop has side effect.

borisrp 3 months ago
parent
commit
a25b499451
1 changed files with 16 additions and 0 deletions
  1. 16 0
      hxsl/Dce.hx

+ 16 - 0
hxsl/Dce.hx

@@ -242,6 +242,12 @@ class Dce {
 			check(loop, writeTo, affect);
 			affect.appendTo(isAffected);
 			check(it, affect, isAffected);
+		case TWhile(e, loop, _):
+			var affect = new WriteTo();
+			check(loop, writeTo, affect);
+			affect.appendTo(isAffected);
+			writeTo.appendTo(affect);
+			check(e, affect, isAffected);
 		case TCall({ e : TGlobal(ChannelRead) }, [{ e : TVar(c) }, uv, { e : TConst(CInt(cid)) }]):
 			check(uv, writeTo, isAffected);
 			if( channelVars[cid] == null ) {
@@ -301,6 +307,10 @@ class Dce {
 			var writeTo = new WriteTo();
 			writeTo.append(null,0);
 			check(cond, writeTo, new WriteTo());
+		case TWhile(cond, loop, _):
+			var writeTo = new WriteTo();
+			writeTo.append(null,0);
+			check(cond, writeTo, new WriteTo());
 		default:
 		}
 		e.iter(checkBranches);
@@ -354,6 +364,12 @@ class Dce {
 			if( !loop.hasSideEffect() )
 				return { e : TConst(CNull), t : e.t, p : e.p };
 			return { e : TFor(v, it, loop), p : e.p, t : e.t };
+		case TWhile(e, loop, normalWhile):
+			var e = mapExpr(e, true);
+			var loop = mapExpr(loop, isVar);
+			if( !loop.hasSideEffect() )
+				return { e : TConst(CNull), t : e.t, p : e.p };
+			return { e : TWhile(e, loop, normalWhile), p : e.p, t : e.t };
 		case TMeta(m, args, em):
 			var em = mapExpr(em, isVar);
 			if( !isVar && !em.hasSideEffect() )