Skip to content

Commit 45b567b

Browse files
authored
[SPIR-V] Add partial order tests, assert reducible (#117887)
Add testing for the visitor and added a note explaining irreducible CFG are not supported. Related to #116692 --------- Signed-off-by: Nathan Gauër <[email protected]>
1 parent b96e757 commit 45b567b

File tree

5 files changed

+363
-9
lines changed

5 files changed

+363
-9
lines changed

llvm/lib/Target/SPIRV/SPIRVUtils.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -519,8 +519,11 @@ bool PartialOrderingVisitor::CanBeVisited(BasicBlock *BB) const {
519519
}
520520

521521
size_t PartialOrderingVisitor::GetNodeRank(BasicBlock *BB) const {
522-
size_t result = 0;
522+
auto It = BlockToOrder.find(BB);
523+
if (It != BlockToOrder.end())
524+
return It->second.Rank;
523525

526+
size_t result = 0;
524527
for (BasicBlock *P : predecessors(BB)) {
525528
// Ignore back-edges.
526529
if (DT.dominates(BB, P))
@@ -552,15 +555,20 @@ size_t PartialOrderingVisitor::visit(BasicBlock *BB, size_t Unused) {
552555
ToVisit.push(BB);
553556
Queued.insert(BB);
554557

558+
size_t QueueIndex = 0;
555559
while (ToVisit.size() != 0) {
556560
BasicBlock *BB = ToVisit.front();
557561
ToVisit.pop();
558562

559563
if (!CanBeVisited(BB)) {
560564
ToVisit.push(BB);
565+
assert(QueueIndex < ToVisit.size() &&
566+
"No valid candidate in the queue. Is the graph reducible?");
567+
QueueIndex++;
561568
continue;
562569
}
563570

571+
QueueIndex = 0;
564572
size_t Rank = GetNodeRank(BB);
565573
OrderInfo Info = {Rank, BlockToOrder.size()};
566574
BlockToOrder.emplace(BB, Info);

llvm/lib/Target/SPIRV/SPIRVUtils.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ class SPIRVSubtarget;
4141
// ignores back-edges. The cycle is visited from the entry in the same
4242
// topological-like ordering.
4343
//
44+
// Note: this visitor REQUIRES a reducible graph.
45+
//
4446
// This means once we visit a node, we know all the possible ancestors have been
4547
// visited.
4648
//
@@ -84,10 +86,11 @@ class PartialOrderingVisitor {
8486
// Visits |BB| with the current rank being |Rank|.
8587
size_t visit(BasicBlock *BB, size_t Rank);
8688

87-
size_t GetNodeRank(BasicBlock *BB) const;
8889
bool CanBeVisited(BasicBlock *BB) const;
8990

9091
public:
92+
size_t GetNodeRank(BasicBlock *BB) const;
93+
9194
// Build the visitor to operate on the function F.
9295
PartialOrderingVisitor(Function &F);
9396

llvm/test/CodeGen/SPIRV/structurizer/cf.switch.ifstmt.simple2.ll

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,21 @@
1919
; b += 2;
2020
; break;
2121
; case 3:
22-
; {
23-
; b += 3;
24-
; break;
25-
; }
22+
; {
23+
; b += 3;
24+
; break;
25+
; }
2626
; case t:
2727
; b += t;
2828
; case 4:
2929
; case 5:
3030
; b += 5;
3131
; break;
3232
; case 6: {
33-
; case 7:
34-
; break;}
33+
; case 7:
34+
; break;}
3535
; default:
36-
; break;
36+
; break;
3737
; }
3838
;
3939
; return a + b + c;

llvm/unittests/Target/SPIRV/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,6 @@ set(LLVM_LINK_COMPONENTS
1616
add_llvm_target_unittest(SPIRVTests
1717
SPIRVConvergenceRegionAnalysisTests.cpp
1818
SPIRVSortBlocksTests.cpp
19+
SPIRVPartialOrderingVisitorTests.cpp
1920
SPIRVAPITest.cpp
2021
)

0 commit comments

Comments
 (0)