Changeset 3584 in CLRX


Ignore:
Timestamp:
Jan 5, 2018, 9:54:47 PM (9 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Correct updating of the routine's regvarmaps and the lastMultiSSAIdMap.

File:
1 edited

Legend:

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

    r3583 r3584  
    778778                    selectedRoutines.insert(entry.blockIndex);
    779779                // add routine regvar map
    780                 for (size_t routine: selectedRoutines)
     780                for (const auto& ssaEntry: cblock.ssaInfoMap)
    781781                {
    782                     LastSSAIdMap& regVarMap = routineMap.find(routine)->second.regVarMap;
    783                     for (const auto& ssaEntry: cblock.ssaInfoMap)
     782                    const SSAInfo& sinfo = ssaEntry.second;
     783                    // add to routine regvarmap if new SSA genered
     784                    // just add only new SSAs inside routines
     785                    if (sinfo.ssaIdChange!=0 && ssaEntry.first.regVar!=nullptr)
    784786                    {
    785                         const SSAInfo& sinfo = ssaEntry.second;
    786                         if (sinfo.ssaIdChange!=0 && ssaEntry.first.regVar!=nullptr)
     787                        auto lmsit = lastMultiSSAIdMap.find(ssaEntry.first);
     788                        if (lmsit != lastMultiSSAIdMap.end())
    787789                        {
    788                             std::vector<size_t>& ssas = regVarMap[ssaEntry.first];
    789                             auto lmsit = lastMultiSSAIdMap.find(ssaEntry.first);
    790                             if (lmsit != lastMultiSSAIdMap.end())
     790                            // update last SSAId inside previously called routines
     791                            for (size_t routine: selectedRoutines)
    791792                            {
     793                                LastSSAIdMap& regVarMap =
     794                                    routineMap.find(routine)->second.regVarMap;
     795                                   
     796                                std::vector<size_t>& ssas = regVarMap[ssaEntry.first];
    792797                                // if many parallel ssaId from routine returns
    793798                                const std::vector<size_t>& ssaIdsToRemove = lmsit->second;
     
    800805                                    ssas.push_back(sinfo.ssaIdLast);
    801806                                }
    802                                 // add to replaced ssaid to revert changes at pop
    803                                 entry.replacedMultiSSAIds.insert(*lmsit);
    804                                 lastMultiSSAIdMap.erase(lmsit);
    805807                            }
    806                             else
     808                            // add to replaced ssaid to revert changes at pop
     809                            entry.replacedMultiSSAIds.insert(*lmsit);
     810                            lastMultiSSAIdMap.erase(lmsit);
     811                        }
     812                        else
     813                            for (size_t routine: selectedRoutines)
    807814                            {
     815                                LastSSAIdMap& regVarMap =
     816                                    routineMap.find(routine)->second.regVarMap;
     817                                std::vector<size_t>& ssas = regVarMap[ssaEntry.first];
    808818                                auto ssaIt = std::find(ssas.begin(), ssas.end(),
    809819                                            sinfo.ssaId-1);
     
    815825                                    ssas.push_back(sinfo.ssaIdLast);
    816826                            }
    817                         }
    818827                    }
    819828                }
     
    862871                 !cblock.haveReturn && !cblock.haveEnd)
    863872        {
    864             if (entry.nextIndex!=0) // if back from call (just return from call)
     873            if (entry.nextIndex!=0) // if back from calls (just return from calls)
    865874            {
    866875                // expand lastMultiSSAIdMap from all calls
Note: See TracChangeset for help on using the changeset viewer.