Changeset 3617 in CLRX


Ignore:
Timestamp:
Jan 14, 2018, 2:00:41 PM (2 years ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Stupid bug in resolveSSAConflict (put only conflict when last SSAId is greater than readBefore SSAId).
Update createSSAData code.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r3616 r3617  
    445445typedef std::unordered_map<AsmSingleVReg, std::vector<size_t> > LastSSAIdMap;
    446446
     447// map of ReadBeforeWrite - value - SSAId, count of occurrences
     448typedef std::unordered_map<AsmSingleVReg, std::pair<size_t, size_t> > RBWSSAIdMap;
     449
    447450struct RoutineData
    448451{
    449452    bool processed;
     453    size_t cfReturns;   // number of returns in routine
    450454    // rbwSSAIdMap - read before write SSAId's map
    451     std::unordered_map<AsmSingleVReg, size_t> rbwSSAIdMap;
     455    RBWSSAIdMap rbwSSAIdMap;
    452456    LastSSAIdMap lastSSAIdMap;
    453457};
     
    457461    size_t blockIndex;
    458462    size_t nextIndex;
     463    bool fromCall;
    459464    std::unordered_map<AsmSingleVReg, size_t> prevSSAIds;
    460465};
     
    553558                            {
    554559                                if (ssaId > sinfo.ssaIdBefore)
     560                                {
    555561                                    /*std::cout << "  insertreplace: " <<
    556562                                        ssaId << ", " << sinfo.ssaIdBefore << std::endl;*/
    557563                                    insertReplace(replacesMap, sentry.first, ssaId,
    558564                                                sinfo.ssaIdBefore);
     565                                }
     566                                else if (ssaId < sinfo.ssaIdBefore)
     567                                {
     568                                    /*std::cout << "  insertreplace: " <<
     569                                        ssaId << ", " << sinfo.ssaIdBefore << std::endl;*/
     570                                    insertReplace(replacesMap, sentry.first,
     571                                                  sinfo.ssaIdBefore, ssaId);
     572                                }
    559573                                /*else
    560574                                    std::cout << "  noinsertreplace: " <<
     
    611625}
    612626
    613 static void joinRoutineData(RoutineData& dest, const RoutineData& src)
    614 {
    615     // insert readBeforeWrite only if doesnt exists in destination
    616     dest.rbwSSAIdMap.insert(src.rbwSSAIdMap.begin(), src.rbwSSAIdMap.end());
    617    
    618     for (const auto& sentry: src.lastSSAIdMap)
    619     {
    620         auto res = dest.lastSSAIdMap.insert(sentry);
    621         if (res.second)
    622             continue; // inserted, go to next
    623         std::vector<size_t>& destSSAIds = res.first->second;
    624         destSSAIds.insert(destSSAIds.end(), sentry.second.begin(),
    625                 sentry.second.end());
    626     }
    627 }
    628 
    629627static void joinLastSSAIdMap(LastSSAIdMap& dest, const LastSSAIdMap& src)
    630628{
     
    643641        }
    644642    }
     643}
     644
     645static void joinRoutineData(RoutineData& dest, const RoutineData& src)
     646{
     647    // insert readBeforeWrite only if doesnt exists in destination
     648    dest.rbwSSAIdMap.insert(src.rbwSSAIdMap.begin(), src.rbwSSAIdMap.end());
     649   
     650    joinLastSSAIdMap(dest.lastSSAIdMap, src.lastSSAIdMap);
    645651}
    646652
     
    736742    // routine map - routine datas map, value - last SSA ids map
    737743    std::unordered_map<size_t, RoutineData> routineMap;
     744    // indicator for code block - number of ways that have return
     745    std::vector<size_t> waysHaveReturn(codeBlocks.size(), 0);
    738746   
    739747    std::vector<bool> visited(codeBlocks.size(), false);
     
    752760                //std::cout << "proc: " << entry.blockIndex << std::endl;
    753761                visited[entry.blockIndex] = true;
     762               
     763                if (cblock.haveReturn)
     764                    waysHaveReturn[entry.blockIndex] = 1;
    754765               
    755766                for (auto& ssaEntry: cblock.ssaInfoMap)
     
    769780                        // remove ssaIds from constructed routine datas (before reduction)
    770781                        // SSAId can reduced in nested call, thus this loop
    771                         for (auto cit = callStack.rbegin(); cit != callStack.rend(); ++cit)
     782                        /*auto cit = callStack.rbegin();
     783                        for (; cit != callStack.rend(); ++cit)
    772784                        {
    773785                            RoutineData& rdata =
     
    788800                                rdata.lastSSAIdMap.erase(rsit->first);
    789801                            break;
    790                         }
     802                        }*/
    791803                       
    792804                        if (ssaIds.size() >= 2)
     
    810822                            retSSAIdMap.erase(ssaIdsIt);
    811823                        }
     824                       
     825                        /*if (cit != callStack.rend())
     826                        {
     827                            // put again reduced ssaId to routine data
     828                            RoutineData& rdata =
     829                                    routineMap.find(cit->routineBlock)->second;
     830                            rdata.lastSSAIdMap[ssaEntry.first].push_back(ssaId);
     831                        }*/
    812832                    }
    813833                   
     
    839859                        // put first SSAId before write
    840860                        if (sinfo.readBeforeWrite)
    841                             rdata.rbwSSAIdMap.insert({ ssaEntry.first,
    842                                     sinfo.ssaIdBefore });
     861                        {
     862                            auto res = rdata.rbwSSAIdMap.insert({ ssaEntry.first,
     863                                { sinfo.ssaIdBefore, 1 } });
     864                            if (!res.second && res.first->second.first == sinfo.ssaIdBefore)
     865                                res.first->second.second++; // increase count
     866                        }
    843867                       
    844868                        if (sinfo.ssaIdChange != 0)
     
    853877                                auto ssaIdIt = ssaIds.end();
    854878                                if (sinfo.readBeforeWrite)
     879                                {
    855880                                    ssaIdIt = std::find(ssaIds.begin(), ssaIds.end(),
    856881                                            sinfo.ssaIdBefore);
     882                                    // found in readBeforeWrite decrease when replaced
     883                                    // by new SSAId
     884                                    auto rbwit = rdata.rbwSSAIdMap.find(ssaEntry.first);
     885                                    if (rbwit != rdata.rbwSSAIdMap.end() &&
     886                                        rbwit->second.first == sinfo.ssaIdBefore)
     887                                        rbwit->second.second--; // decrease used
     888                                }
    857889                                if (ssaIdIt == ssaIds.end())
    858890                                    ssaIds.push_back(sinfo.ssaIdLast);
     
    888920                                    ssaReplacesMap);
    889921                // back, already visited
     922                const size_t prevReturns = waysHaveReturn[entry.blockIndex];
     923                const bool fromCall = entry.fromCall;
    890924                flowStack.pop_back();
     925                if (!flowStack.empty() && !fromCall)
     926                    waysHaveReturn[flowStack.back().blockIndex] += prevReturns;
    891927                continue;
    892928            }
     
    902938            callStack.pop_back(); // just return from call
    903939            if (callStack.empty())
    904             {   // put to main
    905             }
     940                // put to main (ret SSAId map)
     941                joinLastSSAIdMap(retSSAIdMap, prevRdata.lastSSAIdMap);
    906942            else
    907943                // put to parent routine
     
    917953                callStack.push_back({ entry.blockIndex, entry.nextIndex,
    918954                            cblock.nexts[entry.nextIndex].block });
    919                 routineMap.insert({ cblock.nexts[entry.nextIndex].block, { false } });
     955                routineMap.insert({ cblock.nexts[entry.nextIndex].block, { false, 0 } });
    920956            }
    921957           
    922             flowStack.push_back({ cblock.nexts[entry.nextIndex].block, 0 });
     958            flowStack.push_back({ cblock.nexts[entry.nextIndex].block, 0,
     959                        cblock.nexts[entry.nextIndex].isCall });
    923960            entry.nextIndex++;
    924961        }
     
    938975                    }
    939976            }
    940             flowStack.push_back({ entry.blockIndex+1, 0 });
     977            flowStack.push_back({ entry.blockIndex+1, 0, false });
    941978            entry.nextIndex++;
    942979        }
     
    9661003                    curSSAIdMap[ssaEntry.first] = it->second;
    9671004            }
     1005           
     1006            if (!callStack.empty() && codeBlocks[entry.blockIndex].haveReturn)
     1007                // add return to routine cfReturns (number of return ways)
     1008                routineMap[callStack.back().routineBlock].cfReturns++;
     1009           
     1010            const size_t prevReturns = waysHaveReturn[entry.blockIndex];
     1011            const bool fromCall = entry.fromCall;
    9681012            //std::cout << "pop" << std::endl;
    9691013            flowStack.pop_back();
     1014            if (!flowStack.empty() && !fromCall)
     1015                waysHaveReturn[flowStack.back().blockIndex] += prevReturns;
    9701016        }
    9711017    }
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc.cpp

    r3614 r3617  
    19621962        },
    19631963        {
    1964             { { "sa", 3 }, { { 3, 1 }, { 5, 3 }, { 5, 1 } } }
     1964            { { "sa", 3 }, { { 3, 1 }, { 3, 1 }, { 5, 3 }, { 5, 1 } } }
    19651965        },
    19661966        true, ""
     
    20562056        },
    20572057        true, ""
     2058    },
     2059    {
     2060        R"ffDXD(.regvar sa:s:8, va:v:8
     2061        s_mov_b32 sa[2], s4
     2062        s_mov_b32 sa[3], s5
     2063        .cf_jump b1, b2
     2064        s_setpc_b64 s[0:1]
     2065       
     2066b11:    s_xor_b32 sa[2], sa[2], sa[3]
     2067        s_endpgm
     2068       
     2069b1:     s_xor_b32 sa[2], sa[2], sa[3]
     2070        s_branch b11
     2071       
     2072b2:     s_branch b11
     2073)ffDXD",
     2074        {
     2075            // block 0 - start
     2076            { 0, 12,
     2077                { { 2, false }, { 3, false } },
     2078                {
     2079                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2080                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2081                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2082                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2083                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
     2084                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
     2085                }, false, false, true },
     2086            // block 1 - b11
     2087            { 12, 20,
     2088                { },
     2089                {
     2090                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
     2091                    { { "sa", 3 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) }
     2092                }, false, false, true },
     2093            // block 2 - b1
     2094            { 20, 28,
     2095                { { 1, false } },
     2096                {
     2097                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
     2098                    { { "sa", 3 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) }
     2099                }, false, false, true },
     2100            // block 3 - b2
     2101            { 28, 32,
     2102                { { 1, false } },
     2103                { }, false, false, true }
     2104        },
     2105        {
     2106            { { "sa", 2 }, { { 2, 1 } } }
     2107        },
     2108        true, ""
    20582109    }
    20592110#if 0
    20602111    ,
    2061     {   // 14 - simple call
     2112    {   // 15 - simple call
    20622113        R"ffDXD(.regvar sa:s:8, va:v:8
    20632114        s_mov_b32 sa[2], s4
     
    21152166        true, ""
    21162167    },
    2117     {   // 15 - simple call, more complex routine
     2168    {   // 16 - simple call, more complex routine
    21182169        R"ffDXD(.regvar sa:s:8, va:v:8
    21192170        s_mov_b32 sa[2], s4
Note: See TracChangeset for help on using the changeset viewer.