Compare commits

...

6 commits

Author SHA1 Message Date
Anders Hejlsberg 85a3b2c0e5 Accept new baselines 2019-04-14 23:26:08 -07:00
Anders Hejlsberg 7dcb3ca69a Add regression test 2019-04-14 23:25:46 -07:00
Anders Hejlsberg c01064e628 Record flow analysis errors in NodeLinks 2019-04-14 23:24:31 -07:00
Anders Hejlsberg 93b1c53261 Accept new baselines 2019-04-14 09:16:04 -07:00
Anders Hejlsberg f623325d77 Improve error message 2019-04-14 09:14:58 -07:00
Anders Hejlsberg f9a99a02a6 Add control flow complexity limiter 2019-04-14 09:03:01 -07:00
9 changed files with 3416 additions and 17 deletions

View file

@ -540,7 +540,8 @@ namespace ts {
let flowLoopStart = 0;
let flowLoopCount = 0;
let sharedFlowCount = 0;
let flowAnalysisDisabled = false;
let flowNodeCount = -1;
let flowAnalysisErrors = false;
const emptyStringType = getLiteralType("");
const zeroType = getLiteralType(0);
@ -15949,17 +15950,14 @@ namespace ts {
return false;
}
function reportFlowControlError(node: Node) {
const block = <Block | ModuleBlock | SourceFile>findAncestor(node, isFunctionOrModuleBlock);
const sourceFile = getSourceFileOfNode(node);
const span = getSpanOfTokenAtPosition(sourceFile, block.statements.pos);
diagnostics.add(createFileDiagnostic(sourceFile, span.start, span.length, Diagnostics.The_containing_function_or_module_body_is_too_large_for_control_flow_analysis));
function getContainingBlock(node: Node) {
return <Block | ModuleBlock | SourceFile>findAncestor(node, isFunctionOrModuleBlock);
}
function getFlowTypeOfReference(reference: Node, declaredType: Type, initialType = declaredType, flowContainer?: Node, couldBeUninitialized?: boolean) {
let key: string | undefined;
let flowDepth = 0;
if (flowAnalysisDisabled) {
if (flowAnalysisErrors && getNodeLinks(getContainingBlock(reference)).flags & NodeCheckFlags.FlowAnalysisError) {
return errorType;
}
if (!reference.flowNode || !couldBeUninitialized && !(declaredType.flags & TypeFlags.Narrowable)) {
@ -15979,14 +15977,23 @@ namespace ts {
return resultType;
function getTypeAtFlowNode(flow: FlowNode): FlowType {
if (flowDepth === 2000) {
// We have made 2000 recursive invocations. To avoid overflowing the call stack we report an error
// and disable further control flow analysis in the containing function or module body.
flowAnalysisDisabled = true;
reportFlowControlError(reference);
if (flowDepth === 2000 || flowNodeCount === 500000) {
// We have made 2000 recursive invocations or visited 500000 control flow nodes while analyzing
// the containing function or module body, the limit at which we consider the function or module
// body is too complex and disable further control flow analysis.
const block = getContainingBlock(reference);
const nodeLinks = getNodeLinks(block);
if (!(nodeLinks.flags & NodeCheckFlags.FlowAnalysisError)) {
nodeLinks.flags |= NodeCheckFlags.FlowAnalysisError;
const sourceFile = getSourceFileOfNode(block);
const span = getSpanOfTokenAtPosition(sourceFile, block.statements.pos);
diagnostics.add(createFileDiagnostic(sourceFile, span.start, span.length, Diagnostics.The_containing_function_or_module_body_is_too_complex_for_control_flow_analysis));
flowAnalysisErrors = true;
}
return errorType;
}
flowDepth++;
if (flowNodeCount >= 0) flowNodeCount++;
while (true) {
const flags = flow.flags;
if (flags & FlowFlags.Shared) {
@ -26026,9 +26033,10 @@ namespace ts {
checkGrammarStatementInAmbientContext(node);
}
if (isFunctionOrModuleBlock(node)) {
const saveFlowAnalysisDisabled = flowAnalysisDisabled;
const saveFlowNodeCount = flowNodeCount;
flowNodeCount = 0;
forEach(node.statements, checkSourceElement);
flowAnalysisDisabled = saveFlowAnalysisDisabled;
flowNodeCount = saveFlowNodeCount;
}
else {
forEach(node.statements, checkSourceElement);
@ -28861,7 +28869,9 @@ namespace ts {
function checkSourceFile(node: SourceFile) {
performance.mark("beforeCheck");
flowNodeCount = 0;
checkSourceFileWorker(node);
flowNodeCount = -1;
performance.mark("afterCheck");
performance.measure("Check", "beforeCheck", "afterCheck");
}

View file

@ -2044,7 +2044,7 @@
"category": "Error",
"code": 2562
},
"The containing function or module body is too large for control flow analysis.": {
"The containing function or module body is too complex for control flow analysis.": {
"category": "Error",
"code": 2563
},

View file

@ -3855,6 +3855,7 @@ namespace ts {
AssignmentsMarked = 0x00800000, // Parameter assignments have been marked
ClassWithConstructorReference = 0x01000000, // Class that contains a binding to its constructor inside of the class body.
ConstructorReferenceInClass = 0x02000000, // Binding to a class constructor inside of the class's body.
FlowAnalysisError = 0x04000000, // Control flow analysis error in this block
}
/* @internal */

View file

@ -0,0 +1,163 @@
tests/cases/compiler/complexControlFlowGraph.ts(4,3): error TS2563: The containing function or module body is too complex for control flow analysis.
==== tests/cases/compiler/complexControlFlowGraph.ts (1 errors) ====
// Repro from #29926
const foo = function (this: any) {
var a, b, c, d, ab, bc, cd, da, blocks = this.blocks;
~~~
!!! error TS2563: The containing function or module body is too complex for control flow analysis.
if (this.first) {
a = blocks[0] - 1;
a = (a << 3) | (a >>> 29);
d = ((a & 0xefcdab89) | (~a & 0x98badcfe)) + blocks[1] + 271733878;
d = (d << 7) | (d >>> 25);
c = ((d & a) | (~d & 0xefcdab89)) + blocks[2] - 1732584194;
c = (c << 11) | (c >>> 21);
b = ((c & d) | (~c & a)) + blocks[3] - 271733879;
b = (b << 19) | (b >>> 13);
} else {
a = this.h0;
b = this.h1;
c = this.h2;
d = this.h3;
a += ((b & c) | (~b & d)) + blocks[0];
a = (a << 3) | (a >>> 29);
d += ((a & b) | (~a & c)) + blocks[1];
d = (d << 7) | (d >>> 25);
c += ((d & a) | (~d & b)) + blocks[2];
c = (c << 11) | (c >>> 21);
b += ((c & d) | (~c & a)) + blocks[3];
b = (b << 19) | (b >>> 13);
}
a += ((b & c) | (~b & d)) + blocks[4];
a = (a << 3) | (a >>> 29);
d += ((a & b) | (~a & c)) + blocks[5];
d = (d << 7) | (d >>> 25);
c += ((d & a) | (~d & b)) + blocks[6];
c = (c << 11) | (c >>> 21);
b += ((c & d) | (~c & a)) + blocks[7];
b = (b << 19) | (b >>> 13);
a += ((b & c) | (~b & d)) + blocks[8];
a = (a << 3) | (a >>> 29);
d += ((a & b) | (~a & c)) + blocks[9];
d = (d << 7) | (d >>> 25);
c += ((d & a) | (~d & b)) + blocks[10];
c = (c << 11) | (c >>> 21);
b += ((c & d) | (~c & a)) + blocks[11];
b = (b << 19) | (b >>> 13);
a += ((b & c) | (~b & d)) + blocks[12];
a = (a << 3) | (a >>> 29);
d += ((a & b) | (~a & c)) + blocks[13];
d = (d << 7) | (d >>> 25);
c += ((d & a) | (~d & b)) + blocks[14];
c = (c << 11) | (c >>> 21);
b += ((c & d) | (~c & a)) + blocks[15];
b = (b << 19) | (b >>> 13);
bc = b & c;
a += (bc | (b & d) | (c & d)) + blocks[0] + 1518500249;
a = (a << 3) | (a >>> 29);
ab = a & b;
d += (ab | (a & c) | bc) + blocks[4] + 1518500249;
d = (d << 5) | (d >>> 27);
da = d & a;
c += (da | (d & b) | ab) + blocks[8] + 1518500249;
c = (c << 9) | (c >>> 23);
cd = c & d;
b += (cd | (c & a) | da) + blocks[12] + 1518500249;
b = (b << 13) | (b >>> 19);
bc = b & c;
a += (bc | (b & d) | cd) + blocks[1] + 1518500249;
a = (a << 3) | (a >>> 29);
ab = a & b;
d += (ab | (a & c) | bc) + blocks[5] + 1518500249;
d = (d << 5) | (d >>> 27);
da = d & a;
c += (da | (d & b) | ab) + blocks[9] + 1518500249;
c = (c << 9) | (c >>> 23);
cd = c & d;
b += (cd | (c & a) | da) + blocks[13] + 1518500249;
b = (b << 13) | (b >>> 19);
bc = b & c;
a += (bc | (b & d) | cd) + blocks[2] + 1518500249;
a = (a << 3) | (a >>> 29);
ab = a & b;
d += (ab | (a & c) | bc) + blocks[6] + 1518500249;
d = (d << 5) | (d >>> 27);
da = d & a;
c += (da | (d & b) | ab) + blocks[10] + 1518500249;
c = (c << 9) | (c >>> 23);
cd = c & d;
b += (cd | (c & a) | da) + blocks[14] + 1518500249;
b = (b << 13) | (b >>> 19);
bc = b & c;
a += (bc | (b & d) | cd) + blocks[3] + 1518500249;
a = (a << 3) | (a >>> 29);
ab = a & b;
d += (ab | (a & c) | bc) + blocks[7] + 1518500249;
d = (d << 5) | (d >>> 27);
da = d & a;
c += (da | (d & b) | ab) + blocks[11] + 1518500249;
c = (c << 9) | (c >>> 23);
b += ((c & d) | (c & a) | da) + blocks[15] + 1518500249;
b = (b << 13) | (b >>> 19);
bc = b ^ c;
a += (bc ^ d) + blocks[0] + 1859775393;
a = (a << 3) | (a >>> 29);
d += (bc ^ a) + blocks[8] + 1859775393;
d = (d << 9) | (d >>> 23);
da = d ^ a;
c += (da ^ b) + blocks[4] + 1859775393;
c = (c << 11) | (c >>> 21);
b += (da ^ c) + blocks[12] + 1859775393;
b = (b << 15) | (b >>> 17);
bc = b ^ c;
a += (bc ^ d) + blocks[2] + 1859775393;
a = (a << 3) | (a >>> 29);
d += (bc ^ a) + blocks[10] + 1859775393;
d = (d << 9) | (d >>> 23);
da = d ^ a;
c += (da ^ b) + blocks[6] + 1859775393;
c = (c << 11) | (c >>> 21);
b += (da ^ c) + blocks[14] + 1859775393;
b = (b << 15) | (b >>> 17);
bc = b ^ c;
a += (bc ^ d) + blocks[1] + 1859775393;
a = (a << 3) | (a >>> 29);
d += (bc ^ a) + blocks[9] + 1859775393;
d = (d << 9) | (d >>> 23);
da = d ^ a;
c += (da ^ b) + blocks[5] + 1859775393;
c = (c << 11) | (c >>> 21);
b += (da ^ c) + blocks[13] + 1859775393;
b = (b << 15) | (b >>> 17);
bc = b ^ c;
a += (bc ^ d) + blocks[3] + 1859775393;
a = (a << 3) | (a >>> 29);
d += (bc ^ a) + blocks[11] + 1859775393;
d = (d << 9) | (d >>> 23);
da = d ^ a;
c += (da ^ b) + blocks[7] + 1859775393;
c = (c << 11) | (c >>> 21);
b += (da ^ c) + blocks[15] + 1859775393;
b = (b << 15) | (b >>> 17);
if (this.first) {
this.h0 = a + 1732584193 << 0;
this.h1 = b - 271733879 << 0;
this.h2 = c - 1732584194 << 0;
this.h3 = d + 271733878 << 0;
this.first = false;
} else {
this.h0 = this.h0 + a << 0;
this.h1 = this.h1 + b << 0;
this.h2 = this.h2 + c << 0;
this.h3 = this.h3 + d << 0;
}
};

View file

@ -0,0 +1,313 @@
//// [complexControlFlowGraph.ts]
// Repro from #29926
const foo = function (this: any) {
var a, b, c, d, ab, bc, cd, da, blocks = this.blocks;
if (this.first) {
a = blocks[0] - 1;
a = (a << 3) | (a >>> 29);
d = ((a & 0xefcdab89) | (~a & 0x98badcfe)) + blocks[1] + 271733878;
d = (d << 7) | (d >>> 25);
c = ((d & a) | (~d & 0xefcdab89)) + blocks[2] - 1732584194;
c = (c << 11) | (c >>> 21);
b = ((c & d) | (~c & a)) + blocks[3] - 271733879;
b = (b << 19) | (b >>> 13);
} else {
a = this.h0;
b = this.h1;
c = this.h2;
d = this.h3;
a += ((b & c) | (~b & d)) + blocks[0];
a = (a << 3) | (a >>> 29);
d += ((a & b) | (~a & c)) + blocks[1];
d = (d << 7) | (d >>> 25);
c += ((d & a) | (~d & b)) + blocks[2];
c = (c << 11) | (c >>> 21);
b += ((c & d) | (~c & a)) + blocks[3];
b = (b << 19) | (b >>> 13);
}
a += ((b & c) | (~b & d)) + blocks[4];
a = (a << 3) | (a >>> 29);
d += ((a & b) | (~a & c)) + blocks[5];
d = (d << 7) | (d >>> 25);
c += ((d & a) | (~d & b)) + blocks[6];
c = (c << 11) | (c >>> 21);
b += ((c & d) | (~c & a)) + blocks[7];
b = (b << 19) | (b >>> 13);
a += ((b & c) | (~b & d)) + blocks[8];
a = (a << 3) | (a >>> 29);
d += ((a & b) | (~a & c)) + blocks[9];
d = (d << 7) | (d >>> 25);
c += ((d & a) | (~d & b)) + blocks[10];
c = (c << 11) | (c >>> 21);
b += ((c & d) | (~c & a)) + blocks[11];
b = (b << 19) | (b >>> 13);
a += ((b & c) | (~b & d)) + blocks[12];
a = (a << 3) | (a >>> 29);
d += ((a & b) | (~a & c)) + blocks[13];
d = (d << 7) | (d >>> 25);
c += ((d & a) | (~d & b)) + blocks[14];
c = (c << 11) | (c >>> 21);
b += ((c & d) | (~c & a)) + blocks[15];
b = (b << 19) | (b >>> 13);
bc = b & c;
a += (bc | (b & d) | (c & d)) + blocks[0] + 1518500249;
a = (a << 3) | (a >>> 29);
ab = a & b;
d += (ab | (a & c) | bc) + blocks[4] + 1518500249;
d = (d << 5) | (d >>> 27);
da = d & a;
c += (da | (d & b) | ab) + blocks[8] + 1518500249;
c = (c << 9) | (c >>> 23);
cd = c & d;
b += (cd | (c & a) | da) + blocks[12] + 1518500249;
b = (b << 13) | (b >>> 19);
bc = b & c;
a += (bc | (b & d) | cd) + blocks[1] + 1518500249;
a = (a << 3) | (a >>> 29);
ab = a & b;
d += (ab | (a & c) | bc) + blocks[5] + 1518500249;
d = (d << 5) | (d >>> 27);
da = d & a;
c += (da | (d & b) | ab) + blocks[9] + 1518500249;
c = (c << 9) | (c >>> 23);
cd = c & d;
b += (cd | (c & a) | da) + blocks[13] + 1518500249;
b = (b << 13) | (b >>> 19);
bc = b & c;
a += (bc | (b & d) | cd) + blocks[2] + 1518500249;
a = (a << 3) | (a >>> 29);
ab = a & b;
d += (ab | (a & c) | bc) + blocks[6] + 1518500249;
d = (d << 5) | (d >>> 27);
da = d & a;
c += (da | (d & b) | ab) + blocks[10] + 1518500249;
c = (c << 9) | (c >>> 23);
cd = c & d;
b += (cd | (c & a) | da) + blocks[14] + 1518500249;
b = (b << 13) | (b >>> 19);
bc = b & c;
a += (bc | (b & d) | cd) + blocks[3] + 1518500249;
a = (a << 3) | (a >>> 29);
ab = a & b;
d += (ab | (a & c) | bc) + blocks[7] + 1518500249;
d = (d << 5) | (d >>> 27);
da = d & a;
c += (da | (d & b) | ab) + blocks[11] + 1518500249;
c = (c << 9) | (c >>> 23);
b += ((c & d) | (c & a) | da) + blocks[15] + 1518500249;
b = (b << 13) | (b >>> 19);
bc = b ^ c;
a += (bc ^ d) + blocks[0] + 1859775393;
a = (a << 3) | (a >>> 29);
d += (bc ^ a) + blocks[8] + 1859775393;
d = (d << 9) | (d >>> 23);
da = d ^ a;
c += (da ^ b) + blocks[4] + 1859775393;
c = (c << 11) | (c >>> 21);
b += (da ^ c) + blocks[12] + 1859775393;
b = (b << 15) | (b >>> 17);
bc = b ^ c;
a += (bc ^ d) + blocks[2] + 1859775393;
a = (a << 3) | (a >>> 29);
d += (bc ^ a) + blocks[10] + 1859775393;
d = (d << 9) | (d >>> 23);
da = d ^ a;
c += (da ^ b) + blocks[6] + 1859775393;
c = (c << 11) | (c >>> 21);
b += (da ^ c) + blocks[14] + 1859775393;
b = (b << 15) | (b >>> 17);
bc = b ^ c;
a += (bc ^ d) + blocks[1] + 1859775393;
a = (a << 3) | (a >>> 29);
d += (bc ^ a) + blocks[9] + 1859775393;
d = (d << 9) | (d >>> 23);
da = d ^ a;
c += (da ^ b) + blocks[5] + 1859775393;
c = (c << 11) | (c >>> 21);
b += (da ^ c) + blocks[13] + 1859775393;
b = (b << 15) | (b >>> 17);
bc = b ^ c;
a += (bc ^ d) + blocks[3] + 1859775393;
a = (a << 3) | (a >>> 29);
d += (bc ^ a) + blocks[11] + 1859775393;
d = (d << 9) | (d >>> 23);
da = d ^ a;
c += (da ^ b) + blocks[7] + 1859775393;
c = (c << 11) | (c >>> 21);
b += (da ^ c) + blocks[15] + 1859775393;
b = (b << 15) | (b >>> 17);
if (this.first) {
this.h0 = a + 1732584193 << 0;
this.h1 = b - 271733879 << 0;
this.h2 = c - 1732584194 << 0;
this.h3 = d + 271733878 << 0;
this.first = false;
} else {
this.h0 = this.h0 + a << 0;
this.h1 = this.h1 + b << 0;
this.h2 = this.h2 + c << 0;
this.h3 = this.h3 + d << 0;
}
};
//// [complexControlFlowGraph.js]
"use strict";
// Repro from #29926
var foo = function () {
var a, b, c, d, ab, bc, cd, da, blocks = this.blocks;
if (this.first) {
a = blocks[0] - 1;
a = (a << 3) | (a >>> 29);
d = ((a & 0xefcdab89) | (~a & 0x98badcfe)) + blocks[1] + 271733878;
d = (d << 7) | (d >>> 25);
c = ((d & a) | (~d & 0xefcdab89)) + blocks[2] - 1732584194;
c = (c << 11) | (c >>> 21);
b = ((c & d) | (~c & a)) + blocks[3] - 271733879;
b = (b << 19) | (b >>> 13);
}
else {
a = this.h0;
b = this.h1;
c = this.h2;
d = this.h3;
a += ((b & c) | (~b & d)) + blocks[0];
a = (a << 3) | (a >>> 29);
d += ((a & b) | (~a & c)) + blocks[1];
d = (d << 7) | (d >>> 25);
c += ((d & a) | (~d & b)) + blocks[2];
c = (c << 11) | (c >>> 21);
b += ((c & d) | (~c & a)) + blocks[3];
b = (b << 19) | (b >>> 13);
}
a += ((b & c) | (~b & d)) + blocks[4];
a = (a << 3) | (a >>> 29);
d += ((a & b) | (~a & c)) + blocks[5];
d = (d << 7) | (d >>> 25);
c += ((d & a) | (~d & b)) + blocks[6];
c = (c << 11) | (c >>> 21);
b += ((c & d) | (~c & a)) + blocks[7];
b = (b << 19) | (b >>> 13);
a += ((b & c) | (~b & d)) + blocks[8];
a = (a << 3) | (a >>> 29);
d += ((a & b) | (~a & c)) + blocks[9];
d = (d << 7) | (d >>> 25);
c += ((d & a) | (~d & b)) + blocks[10];
c = (c << 11) | (c >>> 21);
b += ((c & d) | (~c & a)) + blocks[11];
b = (b << 19) | (b >>> 13);
a += ((b & c) | (~b & d)) + blocks[12];
a = (a << 3) | (a >>> 29);
d += ((a & b) | (~a & c)) + blocks[13];
d = (d << 7) | (d >>> 25);
c += ((d & a) | (~d & b)) + blocks[14];
c = (c << 11) | (c >>> 21);
b += ((c & d) | (~c & a)) + blocks[15];
b = (b << 19) | (b >>> 13);
bc = b & c;
a += (bc | (b & d) | (c & d)) + blocks[0] + 1518500249;
a = (a << 3) | (a >>> 29);
ab = a & b;
d += (ab | (a & c) | bc) + blocks[4] + 1518500249;
d = (d << 5) | (d >>> 27);
da = d & a;
c += (da | (d & b) | ab) + blocks[8] + 1518500249;
c = (c << 9) | (c >>> 23);
cd = c & d;
b += (cd | (c & a) | da) + blocks[12] + 1518500249;
b = (b << 13) | (b >>> 19);
bc = b & c;
a += (bc | (b & d) | cd) + blocks[1] + 1518500249;
a = (a << 3) | (a >>> 29);
ab = a & b;
d += (ab | (a & c) | bc) + blocks[5] + 1518500249;
d = (d << 5) | (d >>> 27);
da = d & a;
c += (da | (d & b) | ab) + blocks[9] + 1518500249;
c = (c << 9) | (c >>> 23);
cd = c & d;
b += (cd | (c & a) | da) + blocks[13] + 1518500249;
b = (b << 13) | (b >>> 19);
bc = b & c;
a += (bc | (b & d) | cd) + blocks[2] + 1518500249;
a = (a << 3) | (a >>> 29);
ab = a & b;
d += (ab | (a & c) | bc) + blocks[6] + 1518500249;
d = (d << 5) | (d >>> 27);
da = d & a;
c += (da | (d & b) | ab) + blocks[10] + 1518500249;
c = (c << 9) | (c >>> 23);
cd = c & d;
b += (cd | (c & a) | da) + blocks[14] + 1518500249;
b = (b << 13) | (b >>> 19);
bc = b & c;
a += (bc | (b & d) | cd) + blocks[3] + 1518500249;
a = (a << 3) | (a >>> 29);
ab = a & b;
d += (ab | (a & c) | bc) + blocks[7] + 1518500249;
d = (d << 5) | (d >>> 27);
da = d & a;
c += (da | (d & b) | ab) + blocks[11] + 1518500249;
c = (c << 9) | (c >>> 23);
b += ((c & d) | (c & a) | da) + blocks[15] + 1518500249;
b = (b << 13) | (b >>> 19);
bc = b ^ c;
a += (bc ^ d) + blocks[0] + 1859775393;
a = (a << 3) | (a >>> 29);
d += (bc ^ a) + blocks[8] + 1859775393;
d = (d << 9) | (d >>> 23);
da = d ^ a;
c += (da ^ b) + blocks[4] + 1859775393;
c = (c << 11) | (c >>> 21);
b += (da ^ c) + blocks[12] + 1859775393;
b = (b << 15) | (b >>> 17);
bc = b ^ c;
a += (bc ^ d) + blocks[2] + 1859775393;
a = (a << 3) | (a >>> 29);
d += (bc ^ a) + blocks[10] + 1859775393;
d = (d << 9) | (d >>> 23);
da = d ^ a;
c += (da ^ b) + blocks[6] + 1859775393;
c = (c << 11) | (c >>> 21);
b += (da ^ c) + blocks[14] + 1859775393;
b = (b << 15) | (b >>> 17);
bc = b ^ c;
a += (bc ^ d) + blocks[1] + 1859775393;
a = (a << 3) | (a >>> 29);
d += (bc ^ a) + blocks[9] + 1859775393;
d = (d << 9) | (d >>> 23);
da = d ^ a;
c += (da ^ b) + blocks[5] + 1859775393;
c = (c << 11) | (c >>> 21);
b += (da ^ c) + blocks[13] + 1859775393;
b = (b << 15) | (b >>> 17);
bc = b ^ c;
a += (bc ^ d) + blocks[3] + 1859775393;
a = (a << 3) | (a >>> 29);
d += (bc ^ a) + blocks[11] + 1859775393;
d = (d << 9) | (d >>> 23);
da = d ^ a;
c += (da ^ b) + blocks[7] + 1859775393;
c = (c << 11) | (c >>> 21);
b += (da ^ c) + blocks[15] + 1859775393;
b = (b << 15) | (b >>> 17);
if (this.first) {
this.h0 = a + 1732584193 << 0;
this.h1 = b - 271733879 << 0;
this.h2 = c - 1732584194 << 0;
this.h3 = d + 271733878 << 0;
this.first = false;
}
else {
this.h0 = this.h0 + a << 0;
this.h1 = this.h1 + b << 0;
this.h2 = this.h2 + c << 0;
this.h3 = this.h3 + d << 0;
}
};

View file

@ -0,0 +1,839 @@
=== tests/cases/compiler/complexControlFlowGraph.ts ===
// Repro from #29926
const foo = function (this: any) {
>foo : Symbol(foo, Decl(complexControlFlowGraph.ts, 2, 5))
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
var a, b, c, d, ab, bc, cd, da, blocks = this.blocks;
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>ab : Symbol(ab, Decl(complexControlFlowGraph.ts, 3, 17))
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>cd : Symbol(cd, Decl(complexControlFlowGraph.ts, 3, 25))
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
if (this.first) {
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
a = blocks[0] - 1;
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
a = (a << 3) | (a >>> 29);
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
d = ((a & 0xefcdab89) | (~a & 0x98badcfe)) + blocks[1] + 271733878;
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
d = (d << 7) | (d >>> 25);
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
c = ((d & a) | (~d & 0xefcdab89)) + blocks[2] - 1732584194;
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
c = (c << 11) | (c >>> 21);
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
b = ((c & d) | (~c & a)) + blocks[3] - 271733879;
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
b = (b << 19) | (b >>> 13);
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
} else {
a = this.h0;
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
b = this.h1;
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
c = this.h2;
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
d = this.h3;
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
a += ((b & c) | (~b & d)) + blocks[0];
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
a = (a << 3) | (a >>> 29);
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
d += ((a & b) | (~a & c)) + blocks[1];
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
d = (d << 7) | (d >>> 25);
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
c += ((d & a) | (~d & b)) + blocks[2];
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
c = (c << 11) | (c >>> 21);
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
b += ((c & d) | (~c & a)) + blocks[3];
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
b = (b << 19) | (b >>> 13);
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
}
a += ((b & c) | (~b & d)) + blocks[4];
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
a = (a << 3) | (a >>> 29);
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
d += ((a & b) | (~a & c)) + blocks[5];
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
d = (d << 7) | (d >>> 25);
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
c += ((d & a) | (~d & b)) + blocks[6];
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
c = (c << 11) | (c >>> 21);
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
b += ((c & d) | (~c & a)) + blocks[7];
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
b = (b << 19) | (b >>> 13);
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
a += ((b & c) | (~b & d)) + blocks[8];
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
a = (a << 3) | (a >>> 29);
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
d += ((a & b) | (~a & c)) + blocks[9];
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
d = (d << 7) | (d >>> 25);
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
c += ((d & a) | (~d & b)) + blocks[10];
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
c = (c << 11) | (c >>> 21);
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
b += ((c & d) | (~c & a)) + blocks[11];
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
b = (b << 19) | (b >>> 13);
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
a += ((b & c) | (~b & d)) + blocks[12];
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
a = (a << 3) | (a >>> 29);
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
d += ((a & b) | (~a & c)) + blocks[13];
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
d = (d << 7) | (d >>> 25);
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
c += ((d & a) | (~d & b)) + blocks[14];
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
c = (c << 11) | (c >>> 21);
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
b += ((c & d) | (~c & a)) + blocks[15];
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
b = (b << 19) | (b >>> 13);
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
bc = b & c;
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
a += (bc | (b & d) | (c & d)) + blocks[0] + 1518500249;
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
a = (a << 3) | (a >>> 29);
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
ab = a & b;
>ab : Symbol(ab, Decl(complexControlFlowGraph.ts, 3, 17))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
d += (ab | (a & c) | bc) + blocks[4] + 1518500249;
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>ab : Symbol(ab, Decl(complexControlFlowGraph.ts, 3, 17))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
d = (d << 5) | (d >>> 27);
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
da = d & a;
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
c += (da | (d & b) | ab) + blocks[8] + 1518500249;
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>ab : Symbol(ab, Decl(complexControlFlowGraph.ts, 3, 17))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
c = (c << 9) | (c >>> 23);
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
cd = c & d;
>cd : Symbol(cd, Decl(complexControlFlowGraph.ts, 3, 25))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
b += (cd | (c & a) | da) + blocks[12] + 1518500249;
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>cd : Symbol(cd, Decl(complexControlFlowGraph.ts, 3, 25))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
b = (b << 13) | (b >>> 19);
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
bc = b & c;
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
a += (bc | (b & d) | cd) + blocks[1] + 1518500249;
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>cd : Symbol(cd, Decl(complexControlFlowGraph.ts, 3, 25))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
a = (a << 3) | (a >>> 29);
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
ab = a & b;
>ab : Symbol(ab, Decl(complexControlFlowGraph.ts, 3, 17))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
d += (ab | (a & c) | bc) + blocks[5] + 1518500249;
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>ab : Symbol(ab, Decl(complexControlFlowGraph.ts, 3, 17))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
d = (d << 5) | (d >>> 27);
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
da = d & a;
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
c += (da | (d & b) | ab) + blocks[9] + 1518500249;
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>ab : Symbol(ab, Decl(complexControlFlowGraph.ts, 3, 17))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
c = (c << 9) | (c >>> 23);
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
cd = c & d;
>cd : Symbol(cd, Decl(complexControlFlowGraph.ts, 3, 25))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
b += (cd | (c & a) | da) + blocks[13] + 1518500249;
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>cd : Symbol(cd, Decl(complexControlFlowGraph.ts, 3, 25))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
b = (b << 13) | (b >>> 19);
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
bc = b & c;
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
a += (bc | (b & d) | cd) + blocks[2] + 1518500249;
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>cd : Symbol(cd, Decl(complexControlFlowGraph.ts, 3, 25))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
a = (a << 3) | (a >>> 29);
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
ab = a & b;
>ab : Symbol(ab, Decl(complexControlFlowGraph.ts, 3, 17))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
d += (ab | (a & c) | bc) + blocks[6] + 1518500249;
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>ab : Symbol(ab, Decl(complexControlFlowGraph.ts, 3, 17))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
d = (d << 5) | (d >>> 27);
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
da = d & a;
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
c += (da | (d & b) | ab) + blocks[10] + 1518500249;
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>ab : Symbol(ab, Decl(complexControlFlowGraph.ts, 3, 17))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
c = (c << 9) | (c >>> 23);
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
cd = c & d;
>cd : Symbol(cd, Decl(complexControlFlowGraph.ts, 3, 25))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
b += (cd | (c & a) | da) + blocks[14] + 1518500249;
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>cd : Symbol(cd, Decl(complexControlFlowGraph.ts, 3, 25))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
b = (b << 13) | (b >>> 19);
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
bc = b & c;
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
a += (bc | (b & d) | cd) + blocks[3] + 1518500249;
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>cd : Symbol(cd, Decl(complexControlFlowGraph.ts, 3, 25))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
a = (a << 3) | (a >>> 29);
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
ab = a & b;
>ab : Symbol(ab, Decl(complexControlFlowGraph.ts, 3, 17))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
d += (ab | (a & c) | bc) + blocks[7] + 1518500249;
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>ab : Symbol(ab, Decl(complexControlFlowGraph.ts, 3, 17))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
d = (d << 5) | (d >>> 27);
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
da = d & a;
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
c += (da | (d & b) | ab) + blocks[11] + 1518500249;
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>ab : Symbol(ab, Decl(complexControlFlowGraph.ts, 3, 17))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
c = (c << 9) | (c >>> 23);
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
b += ((c & d) | (c & a) | da) + blocks[15] + 1518500249;
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
b = (b << 13) | (b >>> 19);
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
bc = b ^ c;
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
a += (bc ^ d) + blocks[0] + 1859775393;
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
a = (a << 3) | (a >>> 29);
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
d += (bc ^ a) + blocks[8] + 1859775393;
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
d = (d << 9) | (d >>> 23);
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
da = d ^ a;
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
c += (da ^ b) + blocks[4] + 1859775393;
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
c = (c << 11) | (c >>> 21);
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
b += (da ^ c) + blocks[12] + 1859775393;
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
b = (b << 15) | (b >>> 17);
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
bc = b ^ c;
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
a += (bc ^ d) + blocks[2] + 1859775393;
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
a = (a << 3) | (a >>> 29);
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
d += (bc ^ a) + blocks[10] + 1859775393;
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
d = (d << 9) | (d >>> 23);
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
da = d ^ a;
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
c += (da ^ b) + blocks[6] + 1859775393;
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
c = (c << 11) | (c >>> 21);
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
b += (da ^ c) + blocks[14] + 1859775393;
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
b = (b << 15) | (b >>> 17);
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
bc = b ^ c;
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
a += (bc ^ d) + blocks[1] + 1859775393;
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
a = (a << 3) | (a >>> 29);
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
d += (bc ^ a) + blocks[9] + 1859775393;
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
d = (d << 9) | (d >>> 23);
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
da = d ^ a;
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
c += (da ^ b) + blocks[5] + 1859775393;
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
c = (c << 11) | (c >>> 21);
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
b += (da ^ c) + blocks[13] + 1859775393;
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
b = (b << 15) | (b >>> 17);
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
bc = b ^ c;
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
a += (bc ^ d) + blocks[3] + 1859775393;
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
a = (a << 3) | (a >>> 29);
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
d += (bc ^ a) + blocks[11] + 1859775393;
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>bc : Symbol(bc, Decl(complexControlFlowGraph.ts, 3, 21))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
d = (d << 9) | (d >>> 23);
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
da = d ^ a;
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
c += (da ^ b) + blocks[7] + 1859775393;
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
c = (c << 11) | (c >>> 21);
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
b += (da ^ c) + blocks[15] + 1859775393;
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>da : Symbol(da, Decl(complexControlFlowGraph.ts, 3, 29))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
>blocks : Symbol(blocks, Decl(complexControlFlowGraph.ts, 3, 33))
b = (b << 15) | (b >>> 17);
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
if (this.first) {
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
this.h0 = a + 1732584193 << 0;
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
this.h1 = b - 271733879 << 0;
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
this.h2 = c - 1732584194 << 0;
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
this.h3 = d + 271733878 << 0;
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
this.first = false;
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
} else {
this.h0 = this.h0 + a << 0;
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
>a : Symbol(a, Decl(complexControlFlowGraph.ts, 3, 5))
this.h1 = this.h1 + b << 0;
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
>b : Symbol(b, Decl(complexControlFlowGraph.ts, 3, 8))
this.h2 = this.h2 + c << 0;
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
>c : Symbol(c, Decl(complexControlFlowGraph.ts, 3, 11))
this.h3 = this.h3 + d << 0;
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
>this : Symbol(this, Decl(complexControlFlowGraph.ts, 2, 22))
>d : Symbol(d, Decl(complexControlFlowGraph.ts, 3, 14))
}
};

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,4 @@
tests/cases/compiler/largeControlFlowGraph.ts(3,1): error TS2563: The containing function or module body is too large for control flow analysis.
tests/cases/compiler/largeControlFlowGraph.ts(3,1): error TS2563: The containing function or module body is too complex for control flow analysis.
==== tests/cases/compiler/largeControlFlowGraph.ts (1 errors) ====
@ -6,7 +6,7 @@ tests/cases/compiler/largeControlFlowGraph.ts(3,1): error TS2563: The containing
// we gracefully handle this, possibly by issuing an error.
const data = [];
~~~~~
!!! error TS2563: The containing function or module body is too large for control flow analysis.
!!! error TS2563: The containing function or module body is too complex for control flow analysis.
data[0] = 0;
data[0] = 0;
data[0] = 0;

View file

@ -0,0 +1,158 @@
// @strict: true
// Repro from #29926
const foo = function (this: any) {
var a, b, c, d, ab, bc, cd, da, blocks = this.blocks;
if (this.first) {
a = blocks[0] - 1;
a = (a << 3) | (a >>> 29);
d = ((a & 0xefcdab89) | (~a & 0x98badcfe)) + blocks[1] + 271733878;
d = (d << 7) | (d >>> 25);
c = ((d & a) | (~d & 0xefcdab89)) + blocks[2] - 1732584194;
c = (c << 11) | (c >>> 21);
b = ((c & d) | (~c & a)) + blocks[3] - 271733879;
b = (b << 19) | (b >>> 13);
} else {
a = this.h0;
b = this.h1;
c = this.h2;
d = this.h3;
a += ((b & c) | (~b & d)) + blocks[0];
a = (a << 3) | (a >>> 29);
d += ((a & b) | (~a & c)) + blocks[1];
d = (d << 7) | (d >>> 25);
c += ((d & a) | (~d & b)) + blocks[2];
c = (c << 11) | (c >>> 21);
b += ((c & d) | (~c & a)) + blocks[3];
b = (b << 19) | (b >>> 13);
}
a += ((b & c) | (~b & d)) + blocks[4];
a = (a << 3) | (a >>> 29);
d += ((a & b) | (~a & c)) + blocks[5];
d = (d << 7) | (d >>> 25);
c += ((d & a) | (~d & b)) + blocks[6];
c = (c << 11) | (c >>> 21);
b += ((c & d) | (~c & a)) + blocks[7];
b = (b << 19) | (b >>> 13);
a += ((b & c) | (~b & d)) + blocks[8];
a = (a << 3) | (a >>> 29);
d += ((a & b) | (~a & c)) + blocks[9];
d = (d << 7) | (d >>> 25);
c += ((d & a) | (~d & b)) + blocks[10];
c = (c << 11) | (c >>> 21);
b += ((c & d) | (~c & a)) + blocks[11];
b = (b << 19) | (b >>> 13);
a += ((b & c) | (~b & d)) + blocks[12];
a = (a << 3) | (a >>> 29);
d += ((a & b) | (~a & c)) + blocks[13];
d = (d << 7) | (d >>> 25);
c += ((d & a) | (~d & b)) + blocks[14];
c = (c << 11) | (c >>> 21);
b += ((c & d) | (~c & a)) + blocks[15];
b = (b << 19) | (b >>> 13);
bc = b & c;
a += (bc | (b & d) | (c & d)) + blocks[0] + 1518500249;
a = (a << 3) | (a >>> 29);
ab = a & b;
d += (ab | (a & c) | bc) + blocks[4] + 1518500249;
d = (d << 5) | (d >>> 27);
da = d & a;
c += (da | (d & b) | ab) + blocks[8] + 1518500249;
c = (c << 9) | (c >>> 23);
cd = c & d;
b += (cd | (c & a) | da) + blocks[12] + 1518500249;
b = (b << 13) | (b >>> 19);
bc = b & c;
a += (bc | (b & d) | cd) + blocks[1] + 1518500249;
a = (a << 3) | (a >>> 29);
ab = a & b;
d += (ab | (a & c) | bc) + blocks[5] + 1518500249;
d = (d << 5) | (d >>> 27);
da = d & a;
c += (da | (d & b) | ab) + blocks[9] + 1518500249;
c = (c << 9) | (c >>> 23);
cd = c & d;
b += (cd | (c & a) | da) + blocks[13] + 1518500249;
b = (b << 13) | (b >>> 19);
bc = b & c;
a += (bc | (b & d) | cd) + blocks[2] + 1518500249;
a = (a << 3) | (a >>> 29);
ab = a & b;
d += (ab | (a & c) | bc) + blocks[6] + 1518500249;
d = (d << 5) | (d >>> 27);
da = d & a;
c += (da | (d & b) | ab) + blocks[10] + 1518500249;
c = (c << 9) | (c >>> 23);
cd = c & d;
b += (cd | (c & a) | da) + blocks[14] + 1518500249;
b = (b << 13) | (b >>> 19);
bc = b & c;
a += (bc | (b & d) | cd) + blocks[3] + 1518500249;
a = (a << 3) | (a >>> 29);
ab = a & b;
d += (ab | (a & c) | bc) + blocks[7] + 1518500249;
d = (d << 5) | (d >>> 27);
da = d & a;
c += (da | (d & b) | ab) + blocks[11] + 1518500249;
c = (c << 9) | (c >>> 23);
b += ((c & d) | (c & a) | da) + blocks[15] + 1518500249;
b = (b << 13) | (b >>> 19);
bc = b ^ c;
a += (bc ^ d) + blocks[0] + 1859775393;
a = (a << 3) | (a >>> 29);
d += (bc ^ a) + blocks[8] + 1859775393;
d = (d << 9) | (d >>> 23);
da = d ^ a;
c += (da ^ b) + blocks[4] + 1859775393;
c = (c << 11) | (c >>> 21);
b += (da ^ c) + blocks[12] + 1859775393;
b = (b << 15) | (b >>> 17);
bc = b ^ c;
a += (bc ^ d) + blocks[2] + 1859775393;
a = (a << 3) | (a >>> 29);
d += (bc ^ a) + blocks[10] + 1859775393;
d = (d << 9) | (d >>> 23);
da = d ^ a;
c += (da ^ b) + blocks[6] + 1859775393;
c = (c << 11) | (c >>> 21);
b += (da ^ c) + blocks[14] + 1859775393;
b = (b << 15) | (b >>> 17);
bc = b ^ c;
a += (bc ^ d) + blocks[1] + 1859775393;
a = (a << 3) | (a >>> 29);
d += (bc ^ a) + blocks[9] + 1859775393;
d = (d << 9) | (d >>> 23);
da = d ^ a;
c += (da ^ b) + blocks[5] + 1859775393;
c = (c << 11) | (c >>> 21);
b += (da ^ c) + blocks[13] + 1859775393;
b = (b << 15) | (b >>> 17);
bc = b ^ c;
a += (bc ^ d) + blocks[3] + 1859775393;
a = (a << 3) | (a >>> 29);
d += (bc ^ a) + blocks[11] + 1859775393;
d = (d << 9) | (d >>> 23);
da = d ^ a;
c += (da ^ b) + blocks[7] + 1859775393;
c = (c << 11) | (c >>> 21);
b += (da ^ c) + blocks[15] + 1859775393;
b = (b << 15) | (b >>> 17);
if (this.first) {
this.h0 = a + 1732584193 << 0;
this.h1 = b - 271733879 << 0;
this.h2 = c - 1732584194 << 0;
this.h3 = d + 271733878 << 0;
this.first = false;
} else {
this.h0 = this.h0 + a << 0;
this.h1 = this.h1 + b << 0;
this.h2 = this.h2 + c << 0;
this.h3 = this.h3 + d << 0;
}
};