Changeset 3615 in CLRX


Ignore:
Timestamp:
Jan 12, 2018, 10:09:44 PM (11 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Remove code to handle calls from createSSAData. Add retSSAIdMap (hold current SSAIds from calls).

File:
1 edited

Legend:

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

    r3614 r3615  
    448448{
    449449    bool processed;
    450     LastSSAIdMap regVarMap;
     450    // rbwSSAIdMap - read before write SSAId's map
     451    std::unordered_map<AsmSingleVReg, size_t> rbwSSAIdMap;
     452    LastSSAIdMap lastSSAIdMap;
    451453};
    452454
     
    455457    size_t blockIndex;
    456458    size_t nextIndex;
    457     LastSSAIdMap replacedMultiSSAIds;
    458         // ssaIds from called routine already visited before call
    459459    std::unordered_map<AsmSingleVReg, size_t> prevSSAIds;
    460460};
     
    501501            {
    502502                const LastSSAIdMap& regVarMap =
    503                         routineMap.find(next.block)->second.regVarMap;
     503                        routineMap.find(next.block)->second.lastSSAIdMap;
    504504                for (const auto& sentry: regVarMap)
    505505                    stackVarMap[sentry.first] = sentry.second;
     
    737737    // total SSA count
    738738    std::unordered_map<AsmSingleVReg, size_t> totalSSACountMap;
     739    // last SSA ids map from returns
     740    LastSSAIdMap retSSAIdMap;
    739741    // last SSA ids in current way in code flow
    740     std::unordered_map<AsmSingleVReg, std::vector<size_t> > curSSAIdMap;
     742    std::unordered_map<AsmSingleVReg, size_t> curSSAIdMap;
    741743    // routine map - routine datas map, value - last SSA ids map
    742744    std::unordered_map<size_t, RoutineData> routineMap;
     
    773775                    }
    774776                   
    775                     auto& ssaIds = curSSAIdMap[ssaEntry.first];
    776                     if (ssaIds.empty())
    777                         ssaIds.resize(1);
    778                     size_t& ssaId = ssaIds.front();
     777                    size_t& ssaId = curSSAIdMap[ssaEntry.first];
     778                    {
     779                        auto& ssaIds = retSSAIdMap[ssaEntry.first];
     780                        if (ssaIds.size() >= 2 && ssaEntry.second.readBeforeWrite)
     781                        {
     782                            // reduce to minimal ssaId from all calls
     783                            std::sort(ssaIds.begin(), ssaIds.end());
     784                            ssaIds.resize(std::unique(ssaIds.begin(), ssaIds.end()) -
     785                                    ssaIds.begin());
     786                            // insert SSA replaces
     787                            size_t minSSAId = ssaIds.front();
     788                            for (auto sit = ssaIds.begin()+1; sit != ssaIds.end(); ++sit)
     789                                insertReplace(ssaReplacesMap, ssaEntry.first,
     790                                        *sit, minSSAId);
     791                            ssaId = minSSAId+1; // plus one
     792                            // finally remove from container (because obsolete)
     793                            retSSAIdMap.erase(ssaEntry.first);
     794                        }
     795                    }
     796                   
    779797                    size_t& totalSSACount = totalSSACountMap[ssaEntry.first];
    780798                    if (totalSSACount == 0)
     
    787805                    else if (ssaId != totalSSACount) // save old ssaId
    788806                        entry.prevSSAIds.insert({ ssaEntry.first, ssaId });
     807                   
    789808                    ssaEntry.second.ssaId = totalSSACount;
    790809                    ssaEntry.second.ssaIdFirst = ssaEntry.second.ssaIdChange!=0 ?
     
    802821                if (rit != routineMap.end() && !rit->second.processed)
    803822                    selectedRoutines.insert(entry.blockIndex);
    804                
    805                 // add routine regvar map
    806                 for (const auto& ssaEntry: cblock.ssaInfoMap)
    807                 {
    808                     const SSAInfo& sinfo = ssaEntry.second;
    809                     // add to routine regvarmap if new SSA genered
    810                     // just add only new SSAs inside routines
    811                     if (sinfo.ssaIdChange!=0 && ssaEntry.first.regVar!=nullptr)
    812                     {
    813                         auto lmsit = lastMultiSSAIdMap.find(ssaEntry.first);
    814                         if (lmsit != lastMultiSSAIdMap.end())
    815                         {
    816                             /*std::cout << "lmsit:";
    817                             for (size_t r: lmsit->second)
    818                                 std::cout << " " << r;
    819                             std::cout << std::endl;*/
    820                             // update last SSAId inside previously called routines
    821                             for (size_t routine: selectedRoutines)
    822                             {
    823                                 LastSSAIdMap& regVarMap =
    824                                     routineMap.find(routine)->second.regVarMap;
    825                                    
    826                                 std::vector<size_t>& ssas = regVarMap[ssaEntry.first];
    827                                 // if many parallel ssaId from routine returns
    828                                 const std::vector<size_t>& ssaIdsToRemove = lmsit->second;
    829                                 for (size_t s: ssaIdsToRemove)
    830                                 {
    831                                     auto ssaIt = std::find(ssas.begin(), ssas.end(), s);
    832                                     if (ssaIt != ssas.end())
    833                                         ssas.erase(ssaIt);
    834                                     // add new
    835                                     /*std::cout <<
    836                                         "addsass: " << sinfo.ssaIdLast << std::endl;*/
    837                                     ssas.push_back(sinfo.ssaIdLast);
    838                                 }
    839                             }
    840                             // add to replaced ssaid to revert changes at pop
    841                             entry.replacedMultiSSAIds.insert(*lmsit);
    842                             lastMultiSSAIdMap.erase(lmsit);
    843                         }
    844                         else
    845                             for (size_t routine: selectedRoutines)
    846                             {
    847                                 LastSSAIdMap& regVarMap =
    848                                     routineMap.find(routine)->second.regVarMap;
    849                                 std::vector<size_t>& ssas = regVarMap[ssaEntry.first];
    850                                 auto ssaIt = std::find(ssas.begin(), ssas.end(),
    851                                             sinfo.ssaId-1);
    852                                 entry.replacedMultiSSAIds.insert({ssaEntry.first, ssas});
    853                                 if (ssaIt != ssas.end()) // update this point
    854                                 {
    855                                     /*std::cout <<
    856                                         "chsass2: " << sinfo.ssaIdLast << std::endl;*/
    857                                     *ssaIt = sinfo.ssaIdLast;
    858                                 }
    859                                 else if (std::find(ssas.begin(), ssas.end(),
    860                                         sinfo.ssaIdLast) == ssas.end())
    861                                 {
    862                                     /*std::cout <<
    863                                         "addsass2: " << sinfo.ssaIdLast << std::endl;*/
    864                                     // otherwise add new way
    865                                     ssas.push_back(sinfo.ssaIdLast);
    866                                 }
    867                             }
    868                     }
    869                 }
    870823            }
    871824            else
     
    883836                            codeBlocks[fcit->blockIndex].ssaInfoMap;
    884837                    for (size_t routine: selectedRoutines)
    885                         joinRoutineData(routineMap.find(routine)->second.regVarMap,
    886                                 rit->second.regVarMap, prevSSAInfoMap);
     838                        joinRoutineData(routineMap.find(routine)->second.lastSSAIdMap,
     839                                rit->second.lastSSAIdMap, prevSSAInfoMap);
    887840                }
    888841                else if (rit != routineMap.end())
     
    926879            {
    927880                // expand lastMultiSSAIdMap from all calls
    928                 for (const NextBlock& next: cblock.nexts)
     881                /*for (const NextBlock& next: cblock.nexts)
    929882                    if (next.isCall)
    930883                    {
    931884                        auto it = routineMap.find(next.block); // must find
    932                         joinLastSSAIdMap(lastMultiSSAIdMap, it->second.regVarMap);
    933                     }
     885                        joinLastSSAIdMap(lastMultiSSAIdMap, it->second.lastSSAIdMap);
     886                    }*/
    934887            }
    935888            flowStack.push_back({ entry.blockIndex+1, 0 });
     
    939892        {
    940893            // revert lastMultiSSAIdMap changes (add removed entries)
    941             if (cblock.haveCalls)
     894            /*if (cblock.haveCalls)
    942895            {
    943896                //remove all return parallel ssaids
     
    946899                    {
    947900                        auto it = routineMap.find(next.block); // must find
    948                         removeLastSSAIdMap(lastMultiSSAIdMap, it->second.regVarMap);
     901                        removeLastSSAIdMap(lastMultiSSAIdMap, it->second.lastSSAIdMap);
    949902                    }
    950903            }
    951904            else // normal block (revert changes in lastMultiSSAIdMap)
    952905                lastMultiSSAIdMap.insert(entry.replacedMultiSSAIds.begin(),
    953                                 entry.replacedMultiSSAIds.end());
     906                                entry.replacedMultiSSAIds.end());*/
    954907            // erase at pop from selectedRoutines
    955             selectedRoutines.erase(entry.blockIndex);
     908            selectedRoutines.erase(entry.blockIndex);
     909           
    956910            for (const auto& ssaEntry: cblock.ssaInfoMap)
    957911            {
    958912                auto it = entry.prevSSAIds.find(ssaEntry.first);
    959                 auto& ssaIds = curSSAIdMap[ssaEntry.first];
    960                 if (ssaIds.empty())
    961                     ssaIds.resize(1);
    962913                if (it == entry.prevSSAIds.end())
    963                     ssaIds.front() -= ssaEntry.second.ssaIdChange;
     914                    curSSAIdMap[ssaEntry.first] -= ssaEntry.second.ssaIdChange;
    964915                else // if found
    965                     ssaIds.front() = it->second;
     916                    curSSAIdMap[ssaEntry.first] = it->second;
    966917            }
    967918            //std::cout << "pop" << std::endl;
Note: See TracChangeset for help on using the changeset viewer.