Ignore:
Timestamp:
Aug 31, 2023, 11:31:15 PM (2 years ago)
Author:
JiadaL <j82liang@…>
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.
Message:

Resolve conflict

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Concurrency/Waituntil.cpp

    r92355883 r2a301ff  
    142142    UniqueName namer_target = "__clause_target_"s;
    143143    UniqueName namer_when = "__when_cond_"s;
     144    UniqueName namer_label = "__waituntil_label_"s;
    144145
    145146    string idxName = "__CFA_clause_idx_";
     
    173174    void addPredicates( const WaitUntilStmt * stmt, string & satName, string & runName );
    174175    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 );
    176177    Expr * genSelectTraitCall( const WhenClause * clause, const ClauseData * data, string fnName );
    177178    CompoundStmt * genStmtBlock( const WhenClause * clause, const ClauseData * data );
    178179    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 );
    180181    void genClauseInits( const WaitUntilStmt * stmt, vector<ClauseData *> & clauseData, CompoundStmt * body, string & statusName, string & elseWhenName );
    181182    Stmt * recursiveOrIfGen( const WaitUntilStmt * stmt, vector<ClauseData *> & data, vector<ClauseData*>::size_type idx, string & elseWhenName );
     
    626627    return new CompoundStmt( cLoc,
    627628        {
    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            )
    632633        }
    633634    );
     
    653654    }
    654655}*/
    655 ForStmt * GenerateWaitUntilCore::genStatusCheckFor( const WaitUntilStmt * stmt, vector<ClauseData *> & clauseData, string & predName ) {
     656CompoundStmt * GenerateWaitUntilCore::genStatusCheckFor( const WaitUntilStmt * stmt, vector<ClauseData *> & clauseData, string & predName ) {
    656657    CompoundStmt * ifBody = new CompoundStmt( stmt->location );
    657658    const CodeLocation & loc = stmt->location;
     659
     660    string switchLabel = namer_label.newName();
    658661
    659662    /* generates:
     
    707710                                )
    708711                            ),
    709                             new BranchStmt( cLoc, BranchStmt::Kind::Break, Label( cLoc ) )
     712                            new BranchStmt( cLoc, BranchStmt::Kind::Break, Label( cLoc, switchLabel ) )
    710713                        }
    711714                    )
     
    719722        new SwitchStmt( loc,
    720723            new NameExpr( loc, idxName ),
    721             std::move( switchCases )
     724            std::move( switchCases ),
     725            { Label( loc, switchLabel ) }
    722726        )
    723727    );
     
    744748    );
    745749
    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,
    747754        {
    748755            new DeclStmt( loc,
     
    752759                    new SingleInit( loc, ConstantExpr::from_int( loc, 0 ) )
    753760                )
    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        }
    779790    );
    780791}
     
    809820}
    810821
    811 Stmt * GenerateWaitUntilCore::genNoElseClauseBranch( const WaitUntilStmt * stmt, string & satName, string & runName, string & arrName, string & pCountName, vector<ClauseData *> & clauseData ) {
     822Stmt * GenerateWaitUntilCore::genNoElseClauseBranch( const WaitUntilStmt * stmt, string & runName, string & arrName, string & pCountName, vector<ClauseData *> & clauseData ) {
    812823    CompoundStmt * whileBody = new CompoundStmt( stmt->location );
    813824    const CodeLocation & loc = stmt->location;
     
    823834    );
    824835
    825     whileBody->push_back( genStatusCheckFor( stmt, clauseData, satName ) );
     836    whileBody->push_back( genStatusCheckFor( stmt, clauseData, runName ) );
    826837
    827838    return new CompoundStmt( loc,
    828839        {
    829840            new WhileDoStmt( loc,
    830                 genNotSatExpr( stmt, satName, arrName ),
     841                genNotSatExpr( stmt, runName, arrName ),
    831842                whileBody,  // body
    832843                {}          // no inits
    833             ),
    834             genStatusCheckFor( stmt, clauseData, runName )
     844            )
    835845        }
    836846    );
     
    856866                new ObjectDecl( cLoc,
    857867                    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                    ),
    859874                    new SingleInit( cLoc, ast::deepCopy( stmt->clauses.at(i)->target ) )
    860875                )
     
    12681283                new NameExpr( stmt->else_cond->location, elseWhenName ),
    12691284                genElseClauseBranch( stmt, runName, statusArrName, clauseData ),
    1270                 genNoElseClauseBranch( stmt, satName, runName, statusArrName, pCountName, clauseData )
     1285                genNoElseClauseBranch( stmt, runName, statusArrName, pCountName, clauseData )
    12711286            )
    12721287        );
    12731288    } 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 ) );
    12751290    } else { // generate just else
    12761291        tryBody->push_back( genElseClauseBranch( stmt, runName, statusArrName, clauseData ) );
    12771292    }
    12781293
     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 ... }
    12791299    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] )
    12881302    for ( int i = 0; i < numClauses; i++ ) {
    12891303        const CodeLocation & cLoc = stmt->clauses.at(i)->location;
    12901304
     1305        // Generates: !__CFA_has_clause_run( clause_statuses[i] )
    12911306        statusExpr = new UntypedExpr ( cLoc,
    12921307            new NameExpr( cLoc, "!?" ),
     
    13001315            }
    13011316        );
    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,
    13061336                new CastExpr( cLoc,
    13071337                    new NameExpr( cLoc, clauseData.at(i)->whenName ),
     
    13141344                LogicalFlag::AndExpr
    13151345            );
    1316         } else // generates: if( !clause_statuses[i] )
    1317             ifCond = statusExpr;
    1318        
     1346
     1347        // generates:
     1348        // if ( statusExpr ) { ... clausei stmt ... }
    13191349        unregisters->push_back(
    13201350            new IfStmt( cLoc,
    1321                 ifCond,
     1351                statusExpr,
    13221352                new CompoundStmt( cLoc,
    13231353                    {
    13241354                        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 )
    13281357                        )
    13291358                    }
    13301359                )
    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        // );
    13341371    }
    13351372
Note: See TracChangeset for help on using the changeset viewer.