@@ -41,6 +41,7 @@ function buildConditional(strandsContext, conditional) {
4141 const mergeBlock = CFG . createBasicBlock ( cfg , BlockType . MERGE ) ;
4242 const results = [ ] ;
4343 const branchBlocks = [ ] ;
44+ const branchEndBlocks = [ ] ;
4445 const mergedAssignments = { } ;
4546 const phiBlockDependencies = { } ;
4647 // Create a BRANCH block to handle phi node declarations
@@ -64,27 +65,28 @@ function buildConditional(strandsContext, conditional) {
6465 }
6566 const scopeStartBlock = CFG . createBasicBlock ( cfg , BlockType . SCOPE_START ) ;
6667 CFG . addEdge ( cfg , previousBlock , scopeStartBlock ) ;
67- const branchBlock = CFG . createBasicBlock ( cfg , blockType ) ;
68- CFG . addEdge ( cfg , scopeStartBlock , branchBlock ) ;
69- branchBlocks . push ( branchBlock ) ;
70- CFG . pushBlock ( cfg , branchBlock ) ;
68+ const branchContentBlock = CFG . createBasicBlock ( cfg , blockType ) ;
69+ CFG . addEdge ( cfg , scopeStartBlock , branchContentBlock ) ;
70+ branchBlocks . push ( branchContentBlock ) ;
71+ CFG . pushBlock ( cfg , branchContentBlock ) ;
7172 const branchResults = branchCallback ( ) ;
7273 for ( const key in branchResults ) {
7374 if ( ! phiBlockDependencies [ key ] ) {
74- phiBlockDependencies [ key ] = [ { value : branchResults [ key ] , blockId : branchBlock } ] ;
75+ phiBlockDependencies [ key ] = [ { value : branchResults [ key ] , blockId : branchContentBlock } ] ;
7576 } else {
76- phiBlockDependencies [ key ] . push ( { value : branchResults [ key ] , blockId : branchBlock } ) ;
77+ phiBlockDependencies [ key ] . push ( { value : branchResults [ key ] , blockId : branchContentBlock } ) ;
7778 }
7879 }
7980 results . push ( branchResults ) ;
81+
82+ // Create BRANCH_END block for phi assignments
83+ const branchEndBlock = CFG . createBasicBlock ( cfg , BlockType . DEFAULT ) ;
84+ CFG . addEdge ( cfg , cfg . currentBlock , branchEndBlock ) ;
85+ branchEndBlocks . push ( branchEndBlock ) ;
86+ CFG . popBlock ( cfg ) ;
87+
8088 const scopeEndBlock = CFG . createBasicBlock ( cfg , BlockType . SCOPE_END ) ;
81- if ( cfg . currentBlock !== branchBlock ) {
82- CFG . addEdge ( cfg , cfg . currentBlock , scopeEndBlock ) ;
83- CFG . popBlock ( cfg ) ;
84- } else {
85- CFG . addEdge ( cfg , branchBlock , scopeEndBlock ) ;
86- CFG . popBlock ( cfg ) ;
87- }
89+ CFG . addEdge ( cfg , branchEndBlock , scopeEndBlock ) ;
8890 CFG . addEdge ( cfg , scopeEndBlock , mergeBlock ) ;
8991 previousBlock = scopeStartBlock ;
9092 }
@@ -96,8 +98,8 @@ function buildConditional(strandsContext, conditional) {
9698 CFG . popBlock ( cfg ) ;
9799 for ( let i = 0 ; i < results . length ; i ++ ) {
98100 const branchResult = results [ i ] ;
99- const branchBlockID = branchBlocks [ i ] ;
100- CFG . pushBlockForModification ( cfg , branchBlockID ) ;
101+ const branchEndBlockID = branchEndBlocks [ i ] ;
102+ CFG . pushBlockForModification ( cfg , branchEndBlockID ) ;
101103 for ( const key in branchResult ) {
102104 if ( mergedAssignments [ key ] ) {
103105 // Create an assignment statement: phiNode = branchResult[key]
@@ -112,7 +114,7 @@ function buildConditional(strandsContext, conditional) {
112114 phiBlocks : [ ]
113115 } ;
114116 const assignmentID = DAG . getOrCreateNode ( strandsContext . dag , assignmentNode ) ;
115- CFG . recordInBasicBlock ( cfg , branchBlockID , assignmentID ) ;
117+ CFG . recordInBasicBlock ( cfg , branchEndBlockID , assignmentID ) ;
116118 }
117119 }
118120 CFG . popBlock ( cfg ) ;
0 commit comments