Changeset 2a301ff for src/Concurrency/Waituntil.cpp
- Timestamp:
- Aug 31, 2023, 11:31:15 PM (2 years ago)
- Branches:
- master
- Children:
- 950c58e
- Parents:
- 92355883 (diff), 686912c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Concurrency/Waituntil.cpp
r92355883 r2a301ff 142 142 UniqueName namer_target = "__clause_target_"s; 143 143 UniqueName namer_when = "__when_cond_"s; 144 UniqueName namer_label = "__waituntil_label_"s; 144 145 145 146 string idxName = "__CFA_clause_idx_"; … … 173 174 void addPredicates( const WaitUntilStmt * stmt, string & satName, string & runName ); 174 175 void setUpClause( const WhenClause * clause, ClauseData * data, string & pCountName, CompoundStmt * body ); 175 ForStmt * genStatusCheckFor( const WaitUntilStmt * stmt, vector<ClauseData *> & clauseData, string & predName );176 CompoundStmt * genStatusCheckFor( const WaitUntilStmt * stmt, vector<ClauseData *> & clauseData, string & predName ); 176 177 Expr * genSelectTraitCall( const WhenClause * clause, const ClauseData * data, string fnName ); 177 178 CompoundStmt * genStmtBlock( const WhenClause * clause, const ClauseData * data ); 178 179 Stmt * genElseClauseBranch( const WaitUntilStmt * stmt, string & runName, string & arrName, vector<ClauseData *> & clauseData ); 179 Stmt * genNoElseClauseBranch( const WaitUntilStmt * stmt, string & satName, string &runName, string & arrName, string & pCountName, vector<ClauseData *> & clauseData );180 Stmt * genNoElseClauseBranch( const WaitUntilStmt * stmt, string & runName, string & arrName, string & pCountName, vector<ClauseData *> & clauseData ); 180 181 void genClauseInits( const WaitUntilStmt * stmt, vector<ClauseData *> & clauseData, CompoundStmt * body, string & statusName, string & elseWhenName ); 181 182 Stmt * recursiveOrIfGen( const WaitUntilStmt * stmt, vector<ClauseData *> & data, vector<ClauseData*>::size_type idx, string & elseWhenName ); … … 626 627 return new CompoundStmt( cLoc, 627 628 { 628 new ExprStmt( cLoc,629 genSelectTraitCall( clause, data, "on_selected" ) 630 ),631 ast::deepCopy( clause->stmt)629 new IfStmt( cLoc, 630 genSelectTraitCall( clause, data, "on_selected" ), 631 ast::deepCopy( clause->stmt ) 632 ) 632 633 } 633 634 ); … … 653 654 } 654 655 }*/ 655 ForStmt * GenerateWaitUntilCore::genStatusCheckFor( const WaitUntilStmt * stmt, vector<ClauseData *> & clauseData, string & predName ) {656 CompoundStmt * GenerateWaitUntilCore::genStatusCheckFor( const WaitUntilStmt * stmt, vector<ClauseData *> & clauseData, string & predName ) { 656 657 CompoundStmt * ifBody = new CompoundStmt( stmt->location ); 657 658 const CodeLocation & loc = stmt->location; 659 660 string switchLabel = namer_label.newName(); 658 661 659 662 /* generates: … … 707 710 ) 708 711 ), 709 new BranchStmt( cLoc, BranchStmt::Kind::Break, Label( cLoc ) )712 new BranchStmt( cLoc, BranchStmt::Kind::Break, Label( cLoc, switchLabel ) ) 710 713 } 711 714 ) … … 719 722 new SwitchStmt( loc, 720 723 new NameExpr( loc, idxName ), 721 std::move( switchCases ) 724 std::move( switchCases ), 725 { Label( loc, switchLabel ) } 722 726 ) 723 727 ); … … 744 748 ); 745 749 746 return new ForStmt( loc, 750 string forLabel = namer_label.newName(); 751 752 // we hoist init here so that this pass can happen after hoistdecls pass 753 return new CompoundStmt( loc, 747 754 { 748 755 new DeclStmt( loc, … … 752 759 new SingleInit( loc, ConstantExpr::from_int( loc, 0 ) ) 753 760 ) 754 ) 755 }, // inits 756 new UntypedExpr ( loc, 757 new NameExpr( loc, "?<?" ), 758 { 759 new NameExpr( loc, idxName ), 760 ConstantExpr::from_int( loc, stmt->clauses.size() ) 761 } 762 ), // cond 763 new UntypedExpr ( loc, 764 new NameExpr( loc, "?++" ), 765 { new NameExpr( loc, idxName ) } 766 ), // inc 767 new CompoundStmt( loc, 768 { 769 new IfStmt( loc, 770 new UntypedExpr ( loc, 771 new NameExpr( loc, predName ), 772 { new NameExpr( loc, clauseData.at(0)->statusName ) } 773 ), 774 new BranchStmt( loc, BranchStmt::Kind::Break, Label( loc ) ) 775 ), 776 ifSwitch 777 } 778 ) // body 761 ), 762 new ForStmt( loc, 763 {}, // inits 764 new UntypedExpr ( loc, 765 new NameExpr( loc, "?<?" ), 766 { 767 new NameExpr( loc, idxName ), 768 ConstantExpr::from_int( loc, stmt->clauses.size() ) 769 } 770 ), // cond 771 new UntypedExpr ( loc, 772 new NameExpr( loc, "?++" ), 773 { new NameExpr( loc, idxName ) } 774 ), // inc 775 new CompoundStmt( loc, 776 { 777 new IfStmt( loc, 778 new UntypedExpr ( loc, 779 new NameExpr( loc, predName ), 780 { new NameExpr( loc, clauseData.at(0)->statusName ) } 781 ), 782 new BranchStmt( loc, BranchStmt::Kind::Break, Label( loc, forLabel ) ) 783 ), 784 ifSwitch 785 } 786 ), // body 787 { Label( loc, forLabel ) } 788 ) 789 } 779 790 ); 780 791 } … … 809 820 } 810 821 811 Stmt * GenerateWaitUntilCore::genNoElseClauseBranch( const WaitUntilStmt * stmt, string & satName, string &runName, string & arrName, string & pCountName, vector<ClauseData *> & clauseData ) {822 Stmt * GenerateWaitUntilCore::genNoElseClauseBranch( const WaitUntilStmt * stmt, string & runName, string & arrName, string & pCountName, vector<ClauseData *> & clauseData ) { 812 823 CompoundStmt * whileBody = new CompoundStmt( stmt->location ); 813 824 const CodeLocation & loc = stmt->location; … … 823 834 ); 824 835 825 whileBody->push_back( genStatusCheckFor( stmt, clauseData, satName ) );836 whileBody->push_back( genStatusCheckFor( stmt, clauseData, runName ) ); 826 837 827 838 return new CompoundStmt( loc, 828 839 { 829 840 new WhileDoStmt( loc, 830 genNotSatExpr( stmt, satName, arrName ),841 genNotSatExpr( stmt, runName, arrName ), 831 842 whileBody, // body 832 843 {} // no inits 833 ), 834 genStatusCheckFor( stmt, clauseData, runName ) 844 ) 835 845 } 836 846 ); … … 856 866 new ObjectDecl( cLoc, 857 867 currClause->targetName, 858 new ReferenceType( new TypeofType( ast::deepCopy( stmt->clauses.at(i)->target ) ) ), 868 new ReferenceType( 869 new TypeofType( new UntypedExpr( cLoc, 870 new NameExpr( cLoc, "__CFA_select_get_type" ), 871 { ast::deepCopy( stmt->clauses.at(i)->target ) } 872 )) 873 ), 859 874 new SingleInit( cLoc, ast::deepCopy( stmt->clauses.at(i)->target ) ) 860 875 ) … … 1268 1283 new NameExpr( stmt->else_cond->location, elseWhenName ), 1269 1284 genElseClauseBranch( stmt, runName, statusArrName, clauseData ), 1270 genNoElseClauseBranch( stmt, satName,runName, statusArrName, pCountName, clauseData )1285 genNoElseClauseBranch( stmt, runName, statusArrName, pCountName, clauseData ) 1271 1286 ) 1272 1287 ); 1273 1288 } else if ( !stmt->else_stmt ) { // normal gen 1274 tryBody->push_back( genNoElseClauseBranch( stmt, satName,runName, statusArrName, pCountName, clauseData ) );1289 tryBody->push_back( genNoElseClauseBranch( stmt, runName, statusArrName, pCountName, clauseData ) ); 1275 1290 } else { // generate just else 1276 1291 tryBody->push_back( genElseClauseBranch( stmt, runName, statusArrName, clauseData ) ); 1277 1292 } 1278 1293 1294 // Collection of unregister calls on resources to be put in finally clause 1295 // for each clause: 1296 // if ( !__CFA_has_clause_run( clause_statuses[i] )) && unregister_select( ... , clausei ) ) { ... clausei stmt ... } 1297 // OR if when( ... ) defined on resource 1298 // if ( when_cond_i && (!__CFA_has_clause_run( clause_statuses[i] )) && unregister_select( ... , clausei ) ) { ... clausei stmt ... } 1279 1299 CompoundStmt * unregisters = new CompoundStmt( loc ); 1280 // generates for each clause: 1281 // if ( !has_run( clause_statuses[i] ) ) 1282 // OR if when_cond defined 1283 // if ( when_cond_i && !has_run( clause_statuses[i] ) ) 1284 // body of if is: 1285 // { if (unregister_select(A, clause1) && on_selected(A, clause1)) clause1->stmt; } // this conditionally runs the block unregister_select returns true (needed by some primitives) 1286 Expr * ifCond; 1287 UntypedExpr * statusExpr; // !clause_statuses[i] 1300 1301 Expr * statusExpr; // !__CFA_has_clause_run( clause_statuses[i] ) 1288 1302 for ( int i = 0; i < numClauses; i++ ) { 1289 1303 const CodeLocation & cLoc = stmt->clauses.at(i)->location; 1290 1304 1305 // Generates: !__CFA_has_clause_run( clause_statuses[i] ) 1291 1306 statusExpr = new UntypedExpr ( cLoc, 1292 1307 new NameExpr( cLoc, "!?" ), … … 1300 1315 } 1301 1316 ); 1302 1303 if ( stmt->clauses.at(i)->when_cond ) { 1304 // generates: if( when_cond_i && !has_run(clause_statuses[i]) ) 1305 ifCond = new LogicalExpr( cLoc, 1317 1318 // Generates: 1319 // (!__CFA_has_clause_run( clause_statuses[i] )) && unregister_select( ... , clausei ); 1320 statusExpr = new LogicalExpr( cLoc, 1321 new CastExpr( cLoc, 1322 statusExpr, 1323 new BasicType( BasicType::Kind::Bool ), GeneratedFlag::ExplicitCast 1324 ), 1325 new CastExpr( cLoc, 1326 genSelectTraitCall( stmt->clauses.at(i), clauseData.at(i), "unregister_select" ), 1327 new BasicType( BasicType::Kind::Bool ), GeneratedFlag::ExplicitCast 1328 ), 1329 LogicalFlag::AndExpr 1330 ); 1331 1332 // if when cond defined generates: 1333 // when_cond_i && (!__CFA_has_clause_run( clause_statuses[i] )) && unregister_select( ... , clausei ); 1334 if ( stmt->clauses.at(i)->when_cond ) 1335 statusExpr = new LogicalExpr( cLoc, 1306 1336 new CastExpr( cLoc, 1307 1337 new NameExpr( cLoc, clauseData.at(i)->whenName ), … … 1314 1344 LogicalFlag::AndExpr 1315 1345 ); 1316 } else // generates: if( !clause_statuses[i] ) 1317 ifCond = statusExpr;1318 1346 1347 // generates: 1348 // if ( statusExpr ) { ... clausei stmt ... } 1319 1349 unregisters->push_back( 1320 1350 new IfStmt( cLoc, 1321 ifCond,1351 statusExpr, 1322 1352 new CompoundStmt( cLoc, 1323 1353 { 1324 1354 new IfStmt( cLoc, 1325 genSelectTraitCall( stmt->clauses.at(i), clauseData.at(i), "unregister_select" ), 1326 // ast::deepCopy( stmt->clauses.at(i)->stmt ) 1327 genStmtBlock( stmt->clauses.at(i), clauseData.at(i) ) 1355 genSelectTraitCall( stmt->clauses.at(i), clauseData.at(i), "on_selected" ), 1356 ast::deepCopy( stmt->clauses.at(i)->stmt ) 1328 1357 ) 1329 1358 } 1330 1359 ) 1331 1332 ) 1333 ); 1360 ) 1361 ); 1362 1363 // // generates: 1364 // // if ( statusExpr ) { ... clausei stmt ... } 1365 // unregisters->push_back( 1366 // new IfStmt( cLoc, 1367 // statusExpr, 1368 // genStmtBlock( stmt->clauses.at(i), clauseData.at(i) ) 1369 // ) 1370 // ); 1334 1371 } 1335 1372
Note:
See TracChangeset
for help on using the changeset viewer.