Skip to content

Commit 9302b74

Browse files
committed
change sorting to use reverse post order.
This commit also changes many tests as the new sorting has a slightly different order: - second brcond operand goes first if possible. - switch operands are sorted last to first.
1 parent afe4a60 commit 9302b74

31 files changed

+762
-686
lines changed

llvm/lib/Target/SPIRV/SPIRVUtils.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -655,15 +655,12 @@ bool sortBlocks(Function &F) {
655655
return false;
656656

657657
bool Modified = false;
658-
659658
std::vector<BasicBlock *> Order;
660659
Order.reserve(F.size());
661660

662-
PartialOrderingVisitor Visitor(F);
663-
Visitor.partialOrderVisit(*F.begin(), [&Order](BasicBlock *Block) {
664-
Order.push_back(Block);
665-
return true;
666-
});
661+
ReversePostOrderTraversal<Function *> RPOT(&F);
662+
for (BasicBlock *BB : RPOT)
663+
Order.push_back(BB);
667664

668665
assert(&*F.begin() == Order[0]);
669666
BasicBlock *LastBlock = &*F.begin();

llvm/test/CodeGen/SPIRV/branching/OpSwitchBranches.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,16 @@ end:
3434
%result = load i32, ptr %alloc
3535
ret i32 %result
3636

37-
; CHECK-SPIRV: %[[#DEFAULT]] = OpLabel
37+
; CHECK-SPIRV: %[[#CASE3]] = OpLabel
3838
; CHECK-SPIRV: OpBranch %[[#END:]]
3939

40-
; CHECK-SPIRV: %[[#CASE1]] = OpLabel
40+
; CHECK-SPIRV: %[[#CASE2]] = OpLabel
4141
; CHECK-SPIRV: OpBranch %[[#END]]
4242

43-
; CHECK-SPIRV: %[[#CASE2]] = OpLabel
43+
; CHECK-SPIRV: %[[#CASE1]] = OpLabel
4444
; CHECK-SPIRV: OpBranch %[[#END]]
4545

46-
; CHECK-SPIRV: %[[#CASE3]] = OpLabel
46+
; CHECK-SPIRV: %[[#DEFAULT]] = OpLabel
4747
; CHECK-SPIRV: OpBranch %[[#END]]
4848

4949
; CHECK-SPIRV: %[[#END]] = OpLabel

llvm/test/CodeGen/SPIRV/branching/OpSwitchUnreachable.ll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,13 @@ define void @test_switch_with_unreachable_block(i1 %a) {
1212
i32 1, label %reachable
1313
]
1414

15-
; CHECK-SPIRV: %[[#UNREACHABLE]] = OpLabel
16-
; CHECK-SPIRV-NEXT: OpUnreachable
17-
1815
; CHECK-SPIRV-NEXT: %[[#REACHABLE]] = OpLabel
1916
reachable:
2017
; CHECK-SPIRV-NEXT: OpReturn
2118
ret void
2219

20+
; CHECK-SPIRV: %[[#UNREACHABLE]] = OpLabel
21+
; CHECK-SPIRV-NEXT: OpUnreachable
2322
unreachable:
2423
unreachable
2524
}

llvm/test/CodeGen/SPIRV/branching/Two_OpSwitch_same_register.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,19 @@ case4:
3232
default2:
3333
ret void
3434

35-
; CHECK-SPIRV: %[[#CASE1]] = OpLabel
35+
; CHECK-SPIRV: %[[#CASE2]] = OpLabel
3636
; CHECK-SPIRV-NEXT: OpBranch %[[#DEFAULT1]]
3737

38-
; CHECK-SPIRV: %[[#CASE2]] = OpLabel
38+
; CHECK-SPIRV: %[[#CASE1]] = OpLabel
3939
; CHECK-SPIRV-NEXT: OpBranch %[[#DEFAULT1]]
4040

4141
; CHECK-SPIRV: %[[#DEFAULT1]] = OpLabel
4242
; CHECK-SPIRV-NEXT: OpSwitch %[[#REGISTER]] %[[#DEFAULT2:]] 0 %[[#CASE3:]] 1 %[[#CASE4:]]
4343

44-
; CHECK-SPIRV: %[[#CASE3]] = OpLabel
44+
; CHECK-SPIRV: %[[#CASE4]] = OpLabel
4545
; CHECK-SPIRV-NEXT: OpBranch %[[#DEFAULT2]]
4646

47-
; CHECK-SPIRV: %[[#CASE4:]] = OpLabel
47+
; CHECK-SPIRV: %[[#CASE3]] = OpLabel
4848
; CHECK-SPIRV-NEXT: OpBranch %[[#DEFAULT2]]
4949

5050
; CHECK-SPIRV: %[[#DEFAULT2]] = OpLabel

llvm/test/CodeGen/SPIRV/branching/if-merging.ll

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
; CHECK-DAG: OpName [[FOO:%.+]] "foo"
66
; CHECK-DAG: OpName [[BAR:%.+]] "bar"
77

8-
; CHECK-DAG: [[I32:%.+]] = OpTypeInt 32
9-
; CHECK-DAG: [[BOOL:%.+]] = OpTypeBool
8+
; CHECK-DAG: %[[#I32:]] = OpTypeInt 32
9+
; CHECK-DAG: %[[#BOOL:]] = OpTypeBool
1010

1111
declare i32 @foo()
1212
declare i32 @bar()
@@ -30,23 +30,24 @@ merge_label:
3030
}
3131

3232
; CHECK: OpFunction
33-
; CHECK: [[A:%.+]] = OpFunctionParameter [[I32]]
34-
; CHECK: [[B:%.+]] = OpFunctionParameter [[I32]]
33+
; CHECK: %[[#A:]] = OpFunctionParameter %[[#I32]]
34+
; CHECK: %[[#B:]] = OpFunctionParameter %[[#I32]]
3535

36-
; CHECK: [[ENTRY:%.+]] = OpLabel
37-
; CHECK: [[COND:%.+]] = OpIEqual [[BOOL]] [[A]] [[B]]
38-
; CHECK: OpBranchConditional [[COND]] [[TRUE_LABEL:%.+]] [[FALSE_LABEL:%.+]]
36+
; CHECK: %[[#ENTRY:]] = OpLabel
37+
; CHECK: %[[#COND:]] = OpIEqual %[[#BOOL]] %[[#A]] %[[#B]]
38+
; CHECK: OpBranchConditional %[[#COND]] %[[#TRUE_LABEL:]] %[[#FALSE_LABEL:]]
3939

40-
; CHECK: [[TRUE_LABEL]] = OpLabel
41-
; CHECK: [[V1:%.+]] = OpFunctionCall [[I32]] [[FOO]]
42-
; CHECK: OpBranch [[MERGE_LABEL:%.+]]
40+
; CHECK: %[[#FALSE_LABEL]] = OpLabel
41+
; CHECK: %[[#V2:]] = OpFunctionCall %[[#I32]] [[BAR]]
42+
; CHECK: OpBranch %[[#MERGE_LABEL:]]
4343

44-
; CHECK: [[FALSE_LABEL]] = OpLabel
45-
; CHECK: [[V2:%.+]] = OpFunctionCall [[I32]] [[BAR]]
46-
; CHECK: OpBranch [[MERGE_LABEL]]
44+
; CHECK: %[[#TRUE_LABEL]] = OpLabel
45+
; CHECK: %[[#V1:]] = OpFunctionCall %[[#I32]] [[FOO]]
46+
; CHECK: OpBranch %[[#MERGE_LABEL]]
4747

48-
; CHECK: [[MERGE_LABEL]] = OpLabel
49-
; CHECK-NEXT: [[V:%.+]] = OpPhi [[I32]] [[V1]] [[TRUE_LABEL]] [[V2]] [[FALSE_LABEL]]
48+
49+
; CHECK: %[[#MERGE_LABEL]] = OpLabel
50+
; CHECK-NEXT: [[V:%.+]] = OpPhi %[[#I32]] %[[#V1]] %[[#TRUE_LABEL]] %[[#V2]] %[[#FALSE_LABEL]]
5051
; CHECK: OpReturnValue [[V]]
5152

5253
; CHECK-NEXT: OpFunctionEnd

llvm/test/CodeGen/SPIRV/branching/if-non-merging.ll

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ false_label:
2121
; CHECK: [[ENTRY:%.+]] = OpLabel
2222
; CHECK: [[COND:%.+]] = OpIEqual [[BOOL]] [[A]] [[B]]
2323
; CHECK: OpBranchConditional [[COND]] [[TRUE_LABEL:%.+]] [[FALSE_LABEL:%.+]]
24-
; CHECK: [[TRUE_LABEL]] = OpLabel
25-
; CHECK: OpReturnValue [[TRUE]]
24+
2625
; CHECK: [[FALSE_LABEL]] = OpLabel
2726
; CHECK: OpReturnValue [[FALSE]]
27+
28+
; CHECK: [[TRUE_LABEL]] = OpLabel
29+
; CHECK: OpReturnValue [[TRUE]]

llvm/test/CodeGen/SPIRV/structurizer/basic-if.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,18 @@ entry:
1414
%1 = alloca i32, align 4
1515
br i1 true, label %left, label %right
1616

17-
; CHECK: %[[#left]] = OpLabel
18-
; CHECK: OpBranch %[[#merge]]
19-
left:
20-
store i32 0, ptr %1
21-
br label %end
22-
2317
; CHECK: %[[#right]] = OpLabel
2418
; CHECK: OpBranch %[[#merge]]
2519
right:
2620
store i32 0, ptr %1
2721
br label %end
2822

23+
; CHECK: %[[#left]] = OpLabel
24+
; CHECK: OpBranch %[[#merge]]
25+
left:
26+
store i32 0, ptr %1
27+
br label %end
28+
2929
; CHECK: %[[#merge]] = OpLabel
3030
; CHECK: OpReturnValue %[[#]]
3131
end:

llvm/test/CodeGen/SPIRV/structurizer/basic-loop.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ header:
2121
%2 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %0) ]
2222
br i1 true, label %body, label %merge
2323

24+
; CHECK: %[[#merge]] = OpLabel
25+
; CHECK: OpReturnValue %[[#]]
26+
merge:
27+
ret i32 0
28+
2429
; CHECK: %[[#body]] = OpLabel
2530
; CHECK: OpBranch %[[#continue]]
2631
body:
@@ -31,11 +36,6 @@ continue:
3136
br label %header
3237
; CHECK: %[[#continue]] = OpLabel
3338
; CHECK: OpBranch %[[#header]]
34-
35-
; CHECK: %[[#merge]] = OpLabel
36-
; CHECK: OpReturnValue %[[#]]
37-
merge:
38-
ret i32 0
3939
}
4040

4141
; Function Attrs: convergent nocallback nofree nosync nounwind willreturn memory(none)

llvm/test/CodeGen/SPIRV/structurizer/basic-phi.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,18 @@ entry:
1818
%0 = call token @llvm.experimental.convergence.entry()
1919
br i1 true, label %left, label %right
2020

21-
; CHECK: %[[#left]] = OpLabel
22-
; CHECK-NEXT: OpStore %[[#var]] %[[#int_0]]
23-
; CHECK-NEXT: OpBranch %[[#merge]]
24-
left:
25-
br label %end
26-
2721
; CHECK: %[[#right]] = OpLabel
2822
; CHECK-NEXT: OpStore %[[#var]] %[[#int_1]]
2923
; CHECK-NEXT: OpBranch %[[#merge]]
3024
right:
3125
br label %end
3226

27+
; CHECK: %[[#left]] = OpLabel
28+
; CHECK-NEXT: OpStore %[[#var]] %[[#int_0]]
29+
; CHECK-NEXT: OpBranch %[[#merge]]
30+
left:
31+
br label %end
32+
3333
; CHECK: %[[#merge]] = OpLabel
3434
; CHECK: %[[#tmp:]] = OpLoad %[[#]] %[[#var]]
3535
; CHECK: OpReturnValue %[[#tmp]]

llvm/test/CodeGen/SPIRV/structurizer/cf.cond-op.ll

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,18 @@ entry:
5555
%var = alloca i32
5656
br i1 true, label %a_true, label %a_false
5757

58-
; CHECK: %[[#a_true]] = OpLabel
59-
; CHECK: OpStore %[[#r2m_a]] %[[#true]]
60-
; CHECK: OpBranch %[[#a_merge]]
61-
a_true:
62-
br label %a_merge
63-
6458
; CHECK: %[[#a_false]] = OpLabel
6559
; CHECK: OpStore %[[#r2m_a]] %[[#false]]
6660
; CHECK: OpBranch %[[#a_merge]]
6761
a_false:
6862
br label %a_merge
6963

64+
; CHECK: %[[#a_true]] = OpLabel
65+
; CHECK: OpStore %[[#r2m_a]] %[[#true]]
66+
; CHECK: OpBranch %[[#a_merge]]
67+
a_true:
68+
br label %a_merge
69+
7070
; CHECK: %[[#a_merge]] = OpLabel
7171
; CHECK: %[[#tmp:]] = OpLoad %[[#]] %[[#r2m_a]]
7272
; CHECK: OpSelectionMerge %[[#b_merge:]]
@@ -89,6 +89,14 @@ b_merge:
8989
%f1 = call spir_func noundef i32 @_Z2fnv() #4 [ "convergencectrl"(token %0) ]
9090
br i1 true, label %c_true, label %c_false
9191

92+
; CHECK: %[[#c_false]] = OpLabel
93+
; CHECK: %[[#]] = OpFunctionCall
94+
; CHECK: OpStore %[[#r2m_b]] %[[#]]
95+
; CHECK: OpBranch %[[#c_merge]]
96+
c_false:
97+
%f3 = call spir_func noundef i32 @_Z3fn2v() #4 [ "convergencectrl"(token %0) ]
98+
br label %c_merge
99+
92100
; CHECK: %[[#c_true]] = OpLabel
93101
; CHECK: %[[#]] = OpFunctionCall
94102
; CHECK: OpStore %[[#r2m_b]] %[[#]]
@@ -97,13 +105,6 @@ c_true:
97105
%f2 = call spir_func noundef i32 @_Z3fn1v() #4 [ "convergencectrl"(token %0) ]
98106
br label %c_merge
99107

100-
; CHECK: %[[#c_false]] = OpLabel
101-
; CHECK: %[[#]] = OpFunctionCall
102-
; CHECK: OpStore %[[#r2m_b]] %[[#]]
103-
; CHECK: OpBranch %[[#c_merge]]
104-
c_false:
105-
%f3 = call spir_func noundef i32 @_Z3fn2v() #4 [ "convergencectrl"(token %0) ]
106-
br label %c_merge
107108

108109
; CHECK: %[[#c_merge]] = OpLabel
109110
; CHECK: %[[#tmp:]] = OpLoad %[[#]] %[[#r2m_b]]

llvm/test/CodeGen/SPIRV/structurizer/cf.for.continue.ll

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -50,43 +50,49 @@
5050
; CHECK: %[[#func_12:]] = OpFunction %[[#uint:]] DontInline %[[#]]
5151
; CHECK: %[[#bb44:]] = OpLabel
5252
; CHECK: OpBranch %[[#bb45:]]
53-
; CHECK: %[[#bb45:]] = OpLabel
53+
; CHECK: %[[#bb45]] = OpLabel
5454
; CHECK: OpLoopMerge %[[#bb46:]] %[[#bb47:]] None
5555
; CHECK: OpBranchConditional %[[#]] %[[#bb48:]] %[[#bb46:]]
56-
; CHECK: %[[#bb48:]] = OpLabel
57-
; CHECK: OpSelectionMerge %[[#bb49:]] None
58-
; CHECK: OpBranchConditional %[[#]] %[[#bb49:]] %[[#bb50:]]
59-
; CHECK: %[[#bb50:]] = OpLabel
60-
; CHECK: OpBranch %[[#bb49:]]
61-
; CHECK: %[[#bb49:]] = OpLabel
62-
; CHECK: OpBranch %[[#bb47:]]
63-
; CHECK: %[[#bb47:]] = OpLabel
64-
; CHECK: OpBranch %[[#bb45:]]
65-
; CHECK: %[[#bb46:]] = OpLabel
66-
; CHECK: OpBranch %[[#bb51:]]
67-
; CHECK: %[[#bb51:]] = OpLabel
68-
; CHECK: OpLoopMerge %[[#bb52:]] %[[#bb53:]] None
69-
; CHECK: OpBranchConditional %[[#]] %[[#bb54:]] %[[#bb52:]]
70-
; CHECK: %[[#bb54:]] = OpLabel
71-
; CHECK: OpBranch %[[#bb55:]]
72-
; CHECK: %[[#bb55:]] = OpLabel
73-
; CHECK: OpLoopMerge %[[#bb56:]] %[[#bb57:]] None
74-
; CHECK: OpBranchConditional %[[#]] %[[#bb58:]] %[[#bb56:]]
75-
; CHECK: %[[#bb58:]] = OpLabel
76-
; CHECK: OpBranch %[[#bb57:]]
77-
; CHECK: %[[#bb57:]] = OpLabel
78-
; CHECK: OpBranch %[[#bb55:]]
79-
; CHECK: %[[#bb56:]] = OpLabel
80-
; CHECK: OpBranch %[[#bb53:]]
81-
; CHECK: %[[#bb53:]] = OpLabel
82-
; CHECK: OpBranch %[[#bb51:]]
83-
; CHECK: %[[#bb52:]] = OpLabel
84-
; CHECK: OpReturnValue %[[#]]
56+
; CHECK: %[[#bb46]] = OpLabel
57+
; CHECK: OpBranch %[[#bb51:]]
58+
; CHECK: %[[#bb51]] = OpLabel
59+
; CHECK: OpLoopMerge %[[#bb52:]] %[[#bb53:]] None
60+
; CHECK: OpBranchConditional %[[#]] %[[#bb54:]] %[[#bb52]]
61+
; CHECK: %[[#bb52]] = OpLabel
62+
; CHECK: OpReturnValue %[[#]]
63+
64+
; CHECK: %[[#bb54]] = OpLabel
65+
; CHECK: OpBranch %[[#bb55:]]
66+
; CHECK: %[[#bb55]] = OpLabel
67+
; CHECK: OpLoopMerge %[[#bb56:]] %[[#bb57:]] None
68+
; CHECK: OpBranchConditional %[[#]] %[[#bb58:]] %[[#bb56]]
69+
; CHECK: %[[#bb56]] = OpLabel
70+
; CHECK: OpBranch %[[#bb53]]
71+
; CHECK: %[[#bb53]] = OpLabel
72+
; CHECK: OpBranch %[[#bb51]]
73+
74+
; CHECK: %[[#bb58]] = OpLabel
75+
; CHECK: OpBranch %[[#bb57]]
76+
; CHECK: %[[#bb57]] = OpLabel
77+
; CHECK: OpBranch %[[#bb55]]
78+
; CHECK: %[[#bb48]] = OpLabel
79+
; CHECK: OpSelectionMerge %[[#bb49:]] None
80+
; CHECK: OpBranchConditional %[[#]] %[[#bb49]] %[[#bb50:]]
81+
; CHECK: %[[#bb50]] = OpLabel
82+
; CHECK: OpBranch %[[#bb49]]
83+
84+
; CHECK: %[[#bb49]] = OpLabel
85+
; CHECK: OpBranch %[[#bb47]]
86+
87+
; CHECK: %[[#bb47]] = OpLabel
88+
; CHECK: OpBranch %[[#bb45]]
8589
; CHECK: OpFunctionEnd
90+
8691
; CHECK: %[[#func_40:]] = OpFunction %[[#void:]] DontInline %[[#]]
8792
; CHECK: %[[#bb59:]] = OpLabel
8893
; CHECK: OpReturn
8994
; CHECK: OpFunctionEnd
95+
9096
; CHECK: %[[#func_42:]] = OpFunction %[[#void:]] None %[[#]]
9197
; CHECK: %[[#bb60:]] = OpLabel
9298
; CHECK: OpReturn

0 commit comments

Comments
 (0)