Changeset ed1a7ab8
- Timestamp:
- Jul 3, 2023, 1:09:53 PM (17 months ago)
- Branches:
- master
- Children:
- a2f1ea8d
- Parents:
- bdf4cd9e
- Location:
- src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Concurrency/Waituntil.cpp
rbdf4cd9e red1a7ab8 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 ); … … 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 } … … 870 881 new BasicType( BasicType::Kind::Bool ), 871 882 new SingleInit( cLoc, ast::deepCopy( stmt->clauses.at(i)->when_cond ) ) 883 ) 884 ) 885 ); 886 else // we reuse the when_cond bools later during unregister so init to false if initially unused 887 body->push_back( 888 new DeclStmt( cLoc, 889 new ObjectDecl( cLoc, 890 currClause->whenName, 891 new BasicType( BasicType::Kind::Bool ), 892 new SingleInit( cLoc, ConstantExpr::from_bool( cLoc, false ) ) 872 893 ) 873 894 ) … … 1277 1298 } 1278 1299 1300 // Collection of unregister calls on resources to be put in finally clause 1301 // for each clause: 1302 // when_cond_i = (!__CFA_has_clause_run( clause_statuses[i] )) && unregister_select( ... , clausei ); 1303 // OR if when( ... ) defined on resource 1304 // if ( when_cond_i ) 1305 // when_cond_i = (!__CFA_has_clause_run( clause_statuses[i] )) && unregister_select( ... , clausei ); 1279 1306 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] 1307 1308 // Collection of optional statement executions following finally clause 1309 // for each clause: 1310 // if ( when_cond_i ) clausei->stmt; 1311 // when_cond_i is repurposed in the finally to store if any statements need to be run after unregisters 1312 // the statements need to be run outside a finally clause since they may contain non-local transfers 1313 CompoundStmt * unregisterStmts = new CompoundStmt( loc ); 1314 1315 UntypedExpr * statusExpr; // !__CFA_has_clause_run( clause_statuses[i] ) 1316 ExprStmt * assignStmt; // when_cond_i = (!__CFA_has_clause_run( clause_statuses[i] )) && unregister_select( ... , clausei ); 1288 1317 for ( int i = 0; i < numClauses; i++ ) { 1289 1318 const CodeLocation & cLoc = stmt->clauses.at(i)->location; 1290 1319 1320 // Generates: !__CFA_has_clause_run( clause_statuses[i] ) 1291 1321 statusExpr = new UntypedExpr ( cLoc, 1292 1322 new NameExpr( cLoc, "!?" ), … … 1300 1330 } 1301 1331 ); 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, 1306 new CastExpr( cLoc, 1307 new NameExpr( cLoc, clauseData.at(i)->whenName ), 1308 new BasicType( BasicType::Kind::Bool ), GeneratedFlag::ExplicitCast 1309 ), 1310 new CastExpr( cLoc, 1311 statusExpr, 1312 new BasicType( BasicType::Kind::Bool ), GeneratedFlag::ExplicitCast 1313 ), 1314 LogicalFlag::AndExpr 1332 1333 // Generates: 1334 // when_cond_i = (!__CFA_has_clause_run( clause_statuses[i] )) && unregister_select( ... , clausei ); 1335 assignStmt = new ExprStmt( cLoc, 1336 UntypedExpr::createAssign( cLoc, 1337 new NameExpr( cLoc, clauseData.at(i)->whenName ), 1338 new LogicalExpr( cLoc, 1339 new CastExpr( cLoc, 1340 statusExpr, 1341 new BasicType( BasicType::Kind::Bool ), GeneratedFlag::ExplicitCast 1342 ), 1343 new CastExpr( cLoc, 1344 genSelectTraitCall( stmt->clauses.at(i), clauseData.at(i), "unregister_select" ), 1345 new BasicType( BasicType::Kind::Bool ), GeneratedFlag::ExplicitCast 1346 ), 1347 LogicalFlag::AndExpr 1348 ) 1349 ) 1350 ); 1351 1352 if ( stmt->clauses.at(i)->when_cond ) // if ( when_cond_i ) assignStmt 1353 unregisters->push_back( 1354 new IfStmt( cLoc, 1355 new NameExpr( cLoc, clauseData.at(i)->whenName ), 1356 new CompoundStmt( cLoc, { assignStmt } ) 1357 ) 1315 1358 ); 1316 } else // generates: if( !clause_statuses[i] )1317 ifCond = statusExpr;1318 1319 unregister s->push_back(1359 else 1360 unregisters->push_back( assignStmt ); 1361 1362 unregisterStmts->push_back( 1320 1363 new IfStmt( cLoc, 1321 ifCond, 1322 new CompoundStmt( cLoc, 1323 { 1324 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) ) 1328 ) 1329 } 1330 ) 1331 1364 new NameExpr( cLoc, clauseData.at(i)->whenName ), 1365 genStmtBlock( stmt->clauses.at(i), clauseData.at(i) ) 1332 1366 ) 1333 1367 ); … … 1342 1376 ) 1343 1377 ); 1378 1379 body->push_back( unregisterStmts ); 1380 1344 1381 1345 1382 for ( ClauseData * datum : clauseData ) -
src/main.cc
rbdf4cd9e red1a7ab8 343 343 PASS( "Implement Concurrent Keywords", Concurrency::implementKeywords, transUnit ); 344 344 PASS( "Forall Pointer Decay", Validate::decayForallPointers, transUnit ); 345 PASS( "Implement Waituntil", Concurrency::generateWaitUntil, transUnit );346 345 PASS( "Hoist Control Declarations", ControlStruct::hoistControlDecls, transUnit ); 347 346 … … 370 369 PASS( "Translate Throws", ControlStruct::translateThrows, transUnit ); 371 370 PASS( "Fix Labels", ControlStruct::fixLabels, transUnit ); 371 PASS( "Implement Waituntil", Concurrency::generateWaitUntil, transUnit ); 372 372 PASS( "Fix Names", CodeGen::fixNames, transUnit ); 373 373 PASS( "Gen Init", InitTweak::genInit, transUnit );
Note: See TracChangeset
for help on using the changeset viewer.