Skip to content

Commit 0c70a26

Browse files
committed
[SLP]Clear root node reordering only if the root node is not re-used in graph
The reordering of the root node can be safely cleared only if the root node is not reused, otherwise the graph might be broken Fixes llvm#125357
1 parent cdeeb39 commit 0c70a26

File tree

2 files changed

+107
-1
lines changed

2 files changed

+107
-1
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20147,7 +20147,7 @@ class HorizontalReduction {
2014720147
}
2014820148
V.reorderTopToBottom();
2014920149
// No need to reorder the root node at all.
20150-
V.reorderBottomToTop(/*IgnoreReorder=*/true);
20150+
V.reorderBottomToTop(!V.doesRootHaveInTreeUses());
2015120151
// Keep extracted other reduction values, if they are used in the
2015220152
// vectorization trees.
2015320153
BoUpSLP::ExtraValueToDebugLocsMap LocalExternallyUsedValues(
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -S --passes=slp-vectorizer -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
3+
4+
@d = global i32 0, align 4
5+
@c = global i32 0, align 4
6+
@f = global i32 0, align 4
7+
@b = global i32 0, align 4
8+
@a = global i32 0, align 4
9+
@e = global i32 0, align 4
10+
11+
define i32 @test() {
12+
; CHECK-LABEL: define i32 @test() {
13+
; CHECK-NEXT: [[ENTRY:.*]]:
14+
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @d, align 4
15+
; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
16+
; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label %[[IF_END6:.*]], label %[[IF_THEN:.*]]
17+
; CHECK: [[IF_THEN]]:
18+
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @c, align 4
19+
; CHECK-NEXT: [[TMP2:%.*]] = load volatile i32, ptr @f, align 4
20+
; CHECK-NEXT: [[TOBOOL1_NOT:%.*]] = icmp eq i32 [[TMP2]], 0
21+
; CHECK-NEXT: br i1 [[TOBOOL1_NOT]], label %[[IF_END:.*]], label %[[I:.*]]
22+
; CHECK: [[IF_END]]:
23+
; CHECK-NEXT: [[TMP3:%.*]] = load volatile i32, ptr @f, align 4
24+
; CHECK-NEXT: [[TOBOOL3_NOT:%.*]] = icmp eq i32 [[TMP3]], 0
25+
; CHECK-NEXT: br i1 [[TOBOOL3_NOT]], label %[[IF_END6]], label %[[I]]
26+
; CHECK: [[IF_END6]]:
27+
; CHECK-NEXT: [[H_0:%.*]] = phi i32 [ [[TMP1]], %[[IF_END]] ], [ 0, %[[ENTRY]] ]
28+
; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr @b, align 4
29+
; CHECK-NEXT: [[TOBOOL7_NOT:%.*]] = icmp eq i32 [[TMP4]], 0
30+
; CHECK-NEXT: br i1 [[TOBOOL7_NOT]], label %[[IF_END13:.*]], label %[[I]]
31+
; CHECK: [[LAND_RHS:.*]]:
32+
; CHECK-NEXT: [[TMP5:%.*]] = load volatile i32, ptr @f, align 4
33+
; CHECK-NEXT: br label %[[IF_END13]]
34+
; CHECK: [[IF_END13]]:
35+
; CHECK-NEXT: [[H_2:%.*]] = phi i32 [ [[H_0]], %[[IF_END6]] ], [ [[H_1:%.*]], %[[LAND_RHS]] ], [ [[H_1]], %[[I]] ]
36+
; CHECK-NEXT: [[J_1:%.*]] = phi i32 [ [[TMP0]], %[[IF_END6]] ], [ [[J_0:%.*]], %[[LAND_RHS]] ], [ [[J_0]], %[[I]] ]
37+
; CHECK-NEXT: [[K_1:%.*]] = phi i32 [ [[TMP0]], %[[IF_END6]] ], [ [[K_0:%.*]], %[[LAND_RHS]] ], [ [[K_0]], %[[I]] ]
38+
; CHECK-NEXT: [[L_1:%.*]] = phi i32 [ [[TMP0]], %[[IF_END6]] ], [ [[L_0:%.*]], %[[LAND_RHS]] ], [ [[L_0]], %[[I]] ]
39+
; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr @a, align 4
40+
; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr @e, align 4
41+
; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[TMP6]], [[TMP7]]
42+
; CHECK-NEXT: br i1 [[CMP_NOT]], label %[[IF_END15:.*]], label %[[I]]
43+
; CHECK: [[I]]:
44+
; CHECK-NEXT: [[J_0]] = phi i32 [ 0, %[[IF_THEN]] ], [ [[J_1]], %[[IF_END13]] ], [ 0, %[[IF_END]] ], [ [[TMP0]], %[[IF_END6]] ]
45+
; CHECK-NEXT: [[K_0]] = phi i32 [ 0, %[[IF_THEN]] ], [ [[K_1]], %[[IF_END13]] ], [ 0, %[[IF_END]] ], [ [[TMP0]], %[[IF_END6]] ]
46+
; CHECK-NEXT: [[L_0]] = phi i32 [ 0, %[[IF_THEN]] ], [ [[L_1]], %[[IF_END13]] ], [ 0, %[[IF_END]] ], [ [[TMP0]], %[[IF_END6]] ]
47+
; CHECK-NEXT: [[H_1]] = phi i32 [ [[TMP1]], %[[IF_THEN]] ], [ [[H_2]], %[[IF_END13]] ], [ [[TMP1]], %[[IF_END]] ], [ [[H_0]], %[[IF_END6]] ]
48+
; CHECK-NEXT: [[OR:%.*]] = or i32 [[J_0]], [[H_1]]
49+
; CHECK-NEXT: [[OR9:%.*]] = or i32 [[OR]], [[K_0]]
50+
; CHECK-NEXT: [[OR10:%.*]] = or i32 [[OR9]], [[L_0]]
51+
; CHECK-NEXT: [[TOBOOL11_NOT:%.*]] = icmp eq i32 [[OR10]], 0
52+
; CHECK-NEXT: br i1 [[TOBOOL11_NOT]], label %[[IF_END13]], label %[[LAND_RHS]]
53+
; CHECK: [[IF_END15]]:
54+
; CHECK-NEXT: ret i32 0
55+
;
56+
entry:
57+
%0 = load i32, ptr @d, align 4
58+
%tobool.not = icmp eq i32 %0, 0
59+
br i1 %tobool.not, label %if.end6, label %if.then
60+
61+
if.then:
62+
%1 = load i32, ptr @c, align 4
63+
%2 = load volatile i32, ptr @f, align 4
64+
%tobool1.not = icmp eq i32 %2, 0
65+
br i1 %tobool1.not, label %if.end, label %i
66+
67+
if.end:
68+
%3 = load volatile i32, ptr @f, align 4
69+
%tobool3.not = icmp eq i32 %3, 0
70+
br i1 %tobool3.not, label %if.end6, label %i
71+
72+
if.end6:
73+
%h.0 = phi i32 [ %1, %if.end ], [ 0, %entry ]
74+
%4 = load i32, ptr @b, align 4
75+
%tobool7.not = icmp eq i32 %4, 0
76+
br i1 %tobool7.not, label %if.end13, label %i
77+
78+
land.rhs:
79+
%5 = load volatile i32, ptr @f, align 4
80+
br label %if.end13
81+
82+
if.end13:
83+
%h.2 = phi i32 [ %h.0, %if.end6 ], [ %h.1, %land.rhs ], [ %h.1, %i ]
84+
%j.1 = phi i32 [ %0, %if.end6 ], [ %j.0, %land.rhs ], [ %j.0, %i ]
85+
%k.1 = phi i32 [ %0, %if.end6 ], [ %k.0, %land.rhs ], [ %k.0, %i ]
86+
%l.1 = phi i32 [ %0, %if.end6 ], [ %l.0, %land.rhs ], [ %l.0, %i ]
87+
%6 = load i32, ptr @a, align 4
88+
%7 = load i32, ptr @e, align 4
89+
%cmp.not = icmp eq i32 %6, %7
90+
br i1 %cmp.not, label %if.end15, label %i
91+
92+
i:
93+
%j.0 = phi i32 [ 0, %if.then ], [ %j.1, %if.end13 ], [ 0, %if.end ], [ %0, %if.end6 ]
94+
%k.0 = phi i32 [ 0, %if.then ], [ %k.1, %if.end13 ], [ 0, %if.end ], [ %0, %if.end6 ]
95+
%l.0 = phi i32 [ 0, %if.then ], [ %l.1, %if.end13 ], [ 0, %if.end ], [ %0, %if.end6 ]
96+
%h.1 = phi i32 [ %1, %if.then ], [ %h.2, %if.end13 ], [ %1, %if.end ], [ %h.0, %if.end6 ]
97+
%or = or i32 %j.0, %h.1
98+
%or9 = or i32 %or, %k.0
99+
%or10 = or i32 %or9, %l.0
100+
%tobool11.not = icmp eq i32 %or10, 0
101+
br i1 %tobool11.not, label %if.end13, label %land.rhs
102+
103+
if.end15:
104+
ret i32 0
105+
}
106+

0 commit comments

Comments
 (0)