Ignore:
Timestamp:
May 3, 2018, 5:16:07 PM (6 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Tentative version with joinSecPointsCaches (joinRegVarLivenesses).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/amdasm/AsmRegAlloc.cpp

    r4066 r4067  
    10241024    }
    10251025   
    1026     for (auto pfit = prevFlowStack.begin(); pfit != pfEnd; ++pfit)
     1026    for (auto pfit = prevFlowStack.begin()+pfStartIndex; pfit != pfEnd; ++pfit)
    10271027    {
    10281028        const FlowStackEntry3& entry = *pfit;
     
    10401040    }
    10411041   
     1042    SVRegMap cacheSecPoints;
     1043    const bool toCache = (!joinSecondPointsCache.hasKey(nextBlock)) &&
     1044                cblocksToCache.count(nextBlock)>=2;
     1045   
    10421046    // traverse by graph from next block
    10431047    std::deque<FlowStackEntry3> flowStack;
     
    10571061        {
    10581062            // process current block
    1059             //if (!visited[entry.blockIndex])
    1060             {
    1061                 //visited[entry.blockIndex] = true;
     1063            if (!visited[entry.blockIndex])
     1064            {
     1065                visited[entry.blockIndex] = true;
    10621066                ARDOut << "  lvjoin: " << entry.blockIndex << "\n";
    1063                 for (const auto& sentry: cblock.ssaInfoMap)
    1064                 {
    1065                     const SSAInfo& sinfo = sentry.second;
    1066                     auto res = alreadyReadMap.insert({ sentry.first, entry.blockIndex });
    1067                    
    1068                     if (res.second && sinfo.readBeforeWrite)
    1069                         joinSVregWithVisited(&stackVarMap, sentry.first,
    1070                             sentry.second.ssaIdBefore, prevFlowStack, codeBlocks,
    1071                             vregIndexMaps, livenesses, regTypesNum, regRanges);
     1067               
     1068                const SVRegMap* joinSecondPoints =
     1069                        joinSecondPointsCache.use(entry.blockIndex);
     1070               
     1071                if (joinSecondPoints == nullptr)
     1072                    for (const auto& sentry: cblock.ssaInfoMap)
     1073                    {
     1074                        const SSAInfo& sinfo = sentry.second;
     1075                        auto res = alreadyReadMap.insert({ sentry.first, entry.blockIndex });
     1076                       
     1077                        if (toCache)
     1078                        {
     1079                            auto res = cacheSecPoints.insert({ sentry.first,
     1080                                        sinfo.ssaIdBefore });
     1081                            if (!res.second)
     1082                                res.first->second = sinfo.ssaIdBefore;
     1083                        }
     1084                       
     1085                        if (res.second && sinfo.readBeforeWrite)
     1086                            joinSVregWithVisited(&stackVarMap, sentry.first,
     1087                                sentry.second.ssaIdBefore, prevFlowStack, codeBlocks,
     1088                                vregIndexMaps, livenesses, regTypesNum, regRanges);
     1089                    }
     1090                else
     1091                {
     1092                    // add to current cache sec points
     1093                    for (const auto& rsentry: *joinSecondPoints)
     1094                    {
     1095                        const bool alreadyRead =
     1096                            alreadyReadMap.find(rsentry.first) != alreadyReadMap.end();
     1097                       
     1098                        if (!alreadyRead)
     1099                            joinSVregWithVisited(&stackVarMap, rsentry.first,
     1100                                    rsentry.second, prevFlowStack, codeBlocks,
     1101                                    vregIndexMaps, livenesses, regTypesNum, regRanges);
     1102                       
     1103                        if (!alreadyRead)
     1104                        {
     1105                            auto res = cacheSecPoints.insert(rsentry);
     1106                            if (!res.second)
     1107                                res.first->second = rsentry.second;
     1108                        }
     1109                    }
     1110                    flowStack.pop_back();
     1111                    continue;
    10721112                }
    10731113            }
    1074             /*else
    1075             {
     1114            else
     1115            {
     1116                cblocksToCache.increase(entry.blockIndex);
     1117                ARDOut << "jcblockToCache: " << entry.blockIndex << "=" <<
     1118                            cblocksToCache.count(entry.blockIndex) << "\n";
     1119                // back, already visited
     1120                ARDOut << "join already: " << entry.blockIndex << "\n";
    10761121                flowStack.pop_back();
    10771122                continue;
    1078             }*/
     1123            }
    10791124        }
    10801125       
     
    13061351            curLiveTime = cblock.start;
    13071352            // process current block
    1308             if (!blockInWay.insert(entry.blockIndex).second)
    1309             {
    1310                 // if loop
    1311                 /*putCrossBlockForLoop(flowStack, codeBlocks,
    1312                         livenesses, vregIndexMaps, regTypesNum, regRanges);*/
    1313                 flowStack.pop_back();
    1314                 continue;
    1315             }
    1316            
    13171353            if (!visited[entry.blockIndex])
    13181354            {
     1355                visited[entry.blockIndex] = true;
     1356                ARDOut << "joinpush: " << entry.blockIndex << "\n";
    13191357                if (flowStack.size() > 1)
    13201358                    putCrossBlockLivenesses(flowStack, codeBlocks, lastVRegMap,
     
    13381376               
    13391377                // main routine to handle ssaInfos
    1340                 visited[entry.blockIndex] = true;
    13411378                SVRegMap ssaIdIdxMap;
    13421379                AsmRegVarUsage instrRVUs[8];
     
    14211458            {
    14221459                cblocksToCache.increase(entry.blockIndex);
    1423                 ARDOut << "cblockToCache: " << entry.blockIndex << "=" <<
     1460                ARDOut << "jcblockToCache: " << entry.blockIndex << "=" <<
    14241461                            cblocksToCache.count(entry.blockIndex) << "\n";
    14251462               
Note: See TracChangeset for help on using the changeset viewer.