diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgBuilder.java b/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgBuilder.java
index aeb0cf7..2de8465 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgBuilder.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgBuilder.java
@@ -22,6 +22,7 @@
 import com.google.gwt.dev.jjs.ast.JBlock;
 import com.google.gwt.dev.jjs.ast.JBreakStatement;
 import com.google.gwt.dev.jjs.ast.JCaseStatement;
+import com.google.gwt.dev.jjs.ast.JCastOperation;
 import com.google.gwt.dev.jjs.ast.JClassType;
 import com.google.gwt.dev.jjs.ast.JConditional;
 import com.google.gwt.dev.jjs.ast.JContinueStatement;
@@ -35,6 +36,7 @@
 import com.google.gwt.dev.jjs.ast.JIfStatement;
 import com.google.gwt.dev.jjs.ast.JLabeledStatement;
 import com.google.gwt.dev.jjs.ast.JMethodCall;
+import com.google.gwt.dev.jjs.ast.JNode;
 import com.google.gwt.dev.jjs.ast.JProgram;
 import com.google.gwt.dev.jjs.ast.JReboundEntryPoint;
 import com.google.gwt.dev.jjs.ast.JReturnStatement;
@@ -406,6 +408,26 @@
       return false;
     }
 
+      /**
+       * Each cast operation generates optional throw.
+       * Fixes http://code.google.com/p/google-web-toolkit/issues/detail?id=5739
+       */
+      @Override
+      public boolean visit(JCastOperation x, Context ctx) {
+          accept(x.getExpr());
+
+          CfgOptionalThrowNode node = addNode(new CfgOptionalThrowNode(parent, x));
+          addNormalExit(node, CfgOptionalThrowNode.NO_THROW);
+          JDeclaredType runtimeExceptionType =
+                  program.getFromTypeMap("java.lang.RuntimeException");
+          if (runtimeExceptionType != null) {
+              addExit(Exit.createThrow(node, runtimeExceptionType,
+                      CfgOptionalThrowNode.RUNTIME_EXCEPTION));
+          }
+          addNode(new CfgCastOperationNode(parent, x));
+          return false;
+      }
+
     @Override
     public boolean visit(JConditional x, Context ctx) {
       accept(x.getIfTest());
@@ -1186,6 +1208,23 @@
     }
   }
 
+  private static class CfgCastOperationNode extends CfgSimpleNode<JNode> {
+
+    public CfgCastOperationNode(CfgNode<?> parent, JNode jNode) {
+      super(parent, jNode);
+    }
+
+    @Override
+    public void accept(CfgVisitor visitor) {
+      visitor.visitSimpleNode(this);
+    }
+
+    @Override
+    protected CfgNode<?> cloneImpl() {
+      return new CfgCastOperationNode(getParent(), getJNode());
+    }
+  }
+
   /**
    * Special exception which is thrown when we encounter some syntactic 
    * construction which is not yet supported by CfgBuilder. 
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgOptionalThrowNode.java b/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgOptionalThrowNode.java
index 3c52d0f..33a0372 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgOptionalThrowNode.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgOptionalThrowNode.java
@@ -15,12 +15,13 @@
  */
 package com.google.gwt.dev.jjs.impl.gflow.cfg;
 
+import com.google.gwt.dev.jjs.ast.JExpression;
 import com.google.gwt.dev.jjs.ast.JMethodCall;
 
 /**
  * Node which might throw exception.
  */
-public class CfgOptionalThrowNode extends CfgNode<JMethodCall> {
+public class CfgOptionalThrowNode extends CfgNode<JExpression> {
   /**
    * Edge role for normal, no-throwing execution.
    */
@@ -34,7 +35,7 @@
    */
   public static final String ERROR = "E";
   
-  public CfgOptionalThrowNode(CfgNode<?> parent, JMethodCall node) {
+  public CfgOptionalThrowNode(CfgNode<?> parent, JExpression node) {
     super(parent, node);
   }
 
@@ -45,7 +46,10 @@
 
   @Override
   public String toDebugString() {
-    return "OPTTHROW(" + getJNode().getTarget().getName() + "())";
+      if (getJNode() instanceof JMethodCall) {
+          return "OPTTHROW(" + ((JMethodCall) getJNode()).getTarget().getName() + "())";
+      }
+      return "OPTTHROW(" +  getJNode().toSource() + ")";
   }
 
   @Override
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/DataflowOptimizerTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/DataflowOptimizerTest.java
index 60a1a00..9ee6e0d 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/DataflowOptimizerTest.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/DataflowOptimizerTest.java
@@ -301,6 +301,35 @@
       );
   }
 
+  /**
+   * Test fix for http://code.google.com/p/google-web-toolkit/issues/detail?id=5739
+   */
+  public void testExceptionInitializerFlow() throws Exception {
+    addSnippetClassDecl("static int foo() { return 0; }");
+    optimize("boolean", " int size = -1;\n" +
+            "  try {\n" +
+            "    size = ((Object[]) (Object)\"aaa\").length;\n" +
+            "  } catch (final Exception ex) {\n" +
+            "  }\n" +
+            "  if (size < 0) {\n" +
+            "    try {\n" +
+            "      size = 3;\n" +
+            "    } catch (final Exception ex) {\n" +
+            "    }\n" +
+            "  }\n" +
+            "  return size > 0;").into("int size = -1;\n" +
+            "  try {\n" +
+            "    size = ((Object[]) (Object)\"aaa\").length;\n" +
+            "  } catch (final Exception ex) {\n" +
+            "  }\n" +
+            "  if (size < 0) {\n" +
+            "    try {\n" +
+            "      size = 3;\n" +
+            "    } catch (final Exception ex) {\n" +
+            "    }\n" +
+            "  } return size > 0;");
+  }
+
   public void testImplicitConversion() throws Exception {
     optimize("long", 
         "int bar = 0x12345678;",
