Short Circuit Evaluation

Split Nodes whenever an early jump is possible by short circuiting boolean
operations. Nodes are split after conservatively checking for side effects,
which include definition of multi block variables, function calls and
instructions involving memory.

BUG=None
R=stichnot@chromium.org

Review URL: https://codereview.chromium.org/2069923004 .
diff --git a/src/IceClFlags.def b/src/IceClFlags.def
index 7488698..bd0c20f 100644
--- a/src/IceClFlags.def
+++ b/src/IceClFlags.def
@@ -140,13 +140,16 @@
              "information to stdout at the end of program execution."),        \
     cl::init(false))                                                           \
                                                                                \
-  X(EnableExperimental, bool, dev_opt_flag, "enable-experimental",   \
+  X(EnableExperimental, bool, dev_opt_flag, "enable-experimental",             \
     cl::desc("Enable Optimizations not yet part of O2"),                       \
     cl::init(false))                                                           \
                                                                                \
   X(EnablePhiEdgeSplit, bool, dev_opt_flag, "phi-edge-split",                  \
     cl::desc("Enable edge splitting for Phi lowering"), cl::init(true))        \
                                                                                \
+  X(EnableShortCircuit, bool, dev_opt_flag, "enable-sc",                       \
+    cl::desc("Split Nodes for short circuit evaluation"), cl::init(false))     \
+                                                                               \
   X(ExcludedRegisters, std::string, dev_list_flag, "reg-exclude",              \
     cl::CommaSeparated, cl::desc("Don't use specified registers"))             \
                                                                                \