Skip to content

Commit 9c0a065

Browse files
committed
[SLP]Fix a crash for non-profitable non-schedulable single buildvector node tree, if the threshold allows its vectorization.
1 parent 71db971 commit 9c0a065

File tree

2 files changed

+265
-0
lines changed

2 files changed

+265
-0
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9278,6 +9278,8 @@ bool BoUpSLP::isTreeTinyAndNotFullyVectorizable(bool ForReduction) const {
92789278
bool IsAllowedSingleBVNode =
92799279
VectorizableTree.size() > 1 ||
92809280
(VectorizableTree.size() == 1 && VectorizableTree.front()->getOpcode() &&
9281+
VectorizableTree.front()->getOpcode() != Instruction::PHI &&
9282+
VectorizableTree.front()->getOpcode() != Instruction::GetElementPtr &&
92819283
allSameBlock(VectorizableTree.front()->Scalars));
92829284
if (any_of(VectorizableTree, [&](const std::unique_ptr<TreeEntry> &TE) {
92839285
return TE->State == TreeEntry::NeedToGather &&
Lines changed: 263 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,263 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -S -mtriple=riscv64-unknown-linux-gnu -slp-threshold=-100 -mattr=+v < %s | FileCheck %s
3+
4+
define void @test1() personality ptr null {
5+
; CHECK-LABEL: define void @test1(
6+
; CHECK-SAME: ) #[[ATTR0:[0-9]+]] personality ptr null {
7+
; CHECK-NEXT: entry:
8+
; CHECK-NEXT: [[CALL33:%.*]] = invoke ptr null(i64 0, ptr null)
9+
; CHECK-NEXT: to label [[INVOKE_CONT32:%.*]] unwind label [[LPAD31_LOOPEXIT:%.*]]
10+
; CHECK: invoke.cont32:
11+
; CHECK-NEXT: invoke void null(ptr null, ptr null)
12+
; CHECK-NEXT: to label [[INVOKE_CONT37:%.*]] unwind label [[LPAD34_LOOPEXIT:%.*]]
13+
; CHECK: invoke.cont37:
14+
; CHECK-NEXT: unreachable
15+
; CHECK: lpad31.loopexit:
16+
; CHECK-NEXT: [[LPAD_LOOPEXIT:%.*]] = landingpad { ptr, i32 }
17+
; CHECK-NEXT: cleanup
18+
; CHECK-NEXT: br label [[EHCLEANUP47:%.*]]
19+
; CHECK: lpad34.loopexit:
20+
; CHECK-NEXT: [[DOTLCSSA101:%.*]] = phi ptr [ null, [[INVOKE_CONT32]] ]
21+
; CHECK-NEXT: [[CALL33_LCSSA96:%.*]] = phi ptr [ [[CALL33]], [[INVOKE_CONT32]] ]
22+
; CHECK-NEXT: [[LPAD_LOOPEXIT56:%.*]] = landingpad { ptr, i32 }
23+
; CHECK-NEXT: cleanup
24+
; CHECK-NEXT: br label [[LPAD34_BODY:%.*]]
25+
; CHECK: lpad34.loopexit.split-lp:
26+
; CHECK-NEXT: [[LPAD_LOOPEXIT_SPLIT_LP57:%.*]] = landingpad { ptr, i32 }
27+
; CHECK-NEXT: cleanup
28+
; CHECK-NEXT: br label [[LPAD34_BODY]]
29+
; CHECK: lpad34.body:
30+
; CHECK-NEXT: [[TMP0:%.*]] = phi ptr [ [[DOTLCSSA101]], [[LPAD34_LOOPEXIT]] ], [ null, [[LPAD34_LOOPEXIT_SPLIT_LP:%.*]] ]
31+
; CHECK-NEXT: [[CALL3399:%.*]] = phi ptr [ [[CALL33_LCSSA96]], [[LPAD34_LOOPEXIT]] ], [ null, [[LPAD34_LOOPEXIT_SPLIT_LP]] ]
32+
; CHECK-NEXT: br label [[EHCLEANUP47]]
33+
; CHECK: ehcleanup47:
34+
; CHECK-NEXT: resume { ptr, i32 } zeroinitializer
35+
;
36+
entry:
37+
%call33 = invoke ptr null(i64 0, ptr null)
38+
to label %invoke.cont32 unwind label %lpad31.loopexit
39+
40+
invoke.cont32:
41+
invoke void null(ptr null, ptr null)
42+
to label %invoke.cont37 unwind label %lpad34.loopexit
43+
44+
invoke.cont37:
45+
unreachable
46+
47+
lpad31.loopexit:
48+
%lpad.loopexit = landingpad { ptr, i32 }
49+
cleanup
50+
br label %ehcleanup47
51+
52+
lpad34.loopexit:
53+
%.lcssa101 = phi ptr [ null, %invoke.cont32 ]
54+
%call33.lcssa96 = phi ptr [ %call33, %invoke.cont32 ]
55+
%lpad.loopexit56 = landingpad { ptr, i32 }
56+
cleanup
57+
br label %lpad34.body
58+
59+
lpad34.loopexit.split-lp:
60+
%lpad.loopexit.split-lp57 = landingpad { ptr, i32 }
61+
cleanup
62+
br label %lpad34.body
63+
64+
lpad34.body:
65+
%0 = phi ptr [ %.lcssa101, %lpad34.loopexit ], [ null, %lpad34.loopexit.split-lp ]
66+
%call3399 = phi ptr [ %call33.lcssa96, %lpad34.loopexit ], [ null, %lpad34.loopexit.split-lp ]
67+
br label %ehcleanup47
68+
69+
ehcleanup47:
70+
resume { ptr, i32 } zeroinitializer
71+
}
72+
73+
define i32 @test2(i64 %idx.ext.i48.pre-phi) {
74+
; CHECK-LABEL: define i32 @test2(
75+
; CHECK-SAME: i64 [[IDX_EXT_I48_PRE_PHI:%.*]]) #[[ATTR0]] {
76+
; CHECK-NEXT: entry:
77+
; CHECK-NEXT: br label [[DO_ACTION:%.*]]
78+
; CHECK: do_action:
79+
; CHECK-NEXT: switch i32 0, label [[SW_DEFAULT:%.*]] [
80+
; CHECK-NEXT: i32 1, label [[CLEANUP185:%.*]]
81+
; CHECK-NEXT: i32 2, label [[CLEANUP185]]
82+
; CHECK-NEXT: i32 0, label [[CLEANUP185]]
83+
; CHECK-NEXT: i32 4, label [[CLEANUP185]]
84+
; CHECK-NEXT: i32 5, label [[CLEANUP185]]
85+
; CHECK-NEXT: i32 6, label [[CLEANUP185]]
86+
; CHECK-NEXT: i32 7, label [[CLEANUP185]]
87+
; CHECK-NEXT: i32 8, label [[CLEANUP185]]
88+
; CHECK-NEXT: i32 9, label [[CLEANUP185]]
89+
; CHECK-NEXT: i32 10, label [[CLEANUP185]]
90+
; CHECK-NEXT: i32 11, label [[CLEANUP185]]
91+
; CHECK-NEXT: i32 12, label [[CLEANUP185]]
92+
; CHECK-NEXT: i32 13, label [[CLEANUP185]]
93+
; CHECK-NEXT: i32 14, label [[CLEANUP185]]
94+
; CHECK-NEXT: i32 15, label [[CLEANUP185]]
95+
; CHECK-NEXT: i32 16, label [[CLEANUP185]]
96+
; CHECK-NEXT: i32 17, label [[CLEANUP185]]
97+
; CHECK-NEXT: i32 18, label [[CLEANUP185]]
98+
; CHECK-NEXT: i32 19, label [[CLEANUP185]]
99+
; CHECK-NEXT: i32 20, label [[CLEANUP185]]
100+
; CHECK-NEXT: i32 21, label [[CLEANUP185]]
101+
; CHECK-NEXT: i32 22, label [[CLEANUP185]]
102+
; CHECK-NEXT: i32 23, label [[CLEANUP185]]
103+
; CHECK-NEXT: i32 24, label [[CLEANUP185]]
104+
; CHECK-NEXT: i32 25, label [[CLEANUP185]]
105+
; CHECK-NEXT: i32 26, label [[CLEANUP185]]
106+
; CHECK-NEXT: i32 27, label [[CLEANUP185]]
107+
; CHECK-NEXT: i32 28, label [[CLEANUP185]]
108+
; CHECK-NEXT: i32 29, label [[CLEANUP185]]
109+
; CHECK-NEXT: i32 30, label [[CLEANUP185]]
110+
; CHECK-NEXT: i32 31, label [[CLEANUP185]]
111+
; CHECK-NEXT: i32 32, label [[CLEANUP185]]
112+
; CHECK-NEXT: i32 33, label [[CLEANUP185]]
113+
; CHECK-NEXT: i32 34, label [[CLEANUP185]]
114+
; CHECK-NEXT: i32 35, label [[CLEANUP185]]
115+
; CHECK-NEXT: i32 36, label [[CLEANUP185]]
116+
; CHECK-NEXT: i32 37, label [[CLEANUP185]]
117+
; CHECK-NEXT: i32 38, label [[CLEANUP185]]
118+
; CHECK-NEXT: i32 39, label [[CLEANUP185]]
119+
; CHECK-NEXT: i32 40, label [[CLEANUP185]]
120+
; CHECK-NEXT: i32 41, label [[CLEANUP185]]
121+
; CHECK-NEXT: i32 42, label [[CLEANUP185]]
122+
; CHECK-NEXT: i32 43, label [[CLEANUP185]]
123+
; CHECK-NEXT: i32 44, label [[CLEANUP185]]
124+
; CHECK-NEXT: i32 45, label [[CLEANUP185]]
125+
; CHECK-NEXT: i32 46, label [[CLEANUP185]]
126+
; CHECK-NEXT: i32 47, label [[CLEANUP185]]
127+
; CHECK-NEXT: i32 48, label [[CLEANUP185]]
128+
; CHECK-NEXT: i32 49, label [[CLEANUP185]]
129+
; CHECK-NEXT: i32 50, label [[CLEANUP185]]
130+
; CHECK-NEXT: i32 51, label [[CLEANUP185]]
131+
; CHECK-NEXT: i32 52, label [[CLEANUP185]]
132+
; CHECK-NEXT: i32 53, label [[CLEANUP185]]
133+
; CHECK-NEXT: i32 54, label [[CLEANUP185]]
134+
; CHECK-NEXT: i32 55, label [[CLEANUP185]]
135+
; CHECK-NEXT: i32 56, label [[CLEANUP185]]
136+
; CHECK-NEXT: i32 57, label [[DO_ACTION]]
137+
; CHECK-NEXT: i32 58, label [[CLEANUP185]]
138+
; CHECK-NEXT: i32 59, label [[CLEANUP185]]
139+
; CHECK-NEXT: i32 60, label [[DO_ACTION]]
140+
; CHECK-NEXT: i32 61, label [[DO_ACTION]]
141+
; CHECK-NEXT: i32 62, label [[CLEANUP185]]
142+
; CHECK-NEXT: i32 70, label [[SW_BB175:%.*]]
143+
; CHECK-NEXT: i32 64, label [[CLEANUP185]]
144+
; CHECK-NEXT: i32 65, label [[DO_ACTION]]
145+
; CHECK-NEXT: i32 66, label [[DO_ACTION]]
146+
; CHECK-NEXT: i32 67, label [[CLEANUP185]]
147+
; CHECK-NEXT: i32 72, label [[CLEANUP185]]
148+
; CHECK-NEXT: i32 69, label [[DO_ACTION]]
149+
; CHECK-NEXT: i32 71, label [[CLEANUP185]]
150+
; CHECK-NEXT: ]
151+
; CHECK: yy_get_previous_state.exit.loopexit:
152+
; CHECK-NEXT: br label [[YY_FIND_ACTION_BACKEDGE:%.*]]
153+
; CHECK: yy_find_action.backedge:
154+
; CHECK-NEXT: [[YY_BP_1_BE:%.*]] = phi ptr [ [[ADD_PTR_I49:%.*]], [[SW_BB175]] ], [ null, [[YY_GET_PREVIOUS_STATE_EXIT_LOOPEXIT:%.*]] ]
155+
; CHECK-NEXT: [[YY_CP_2_BE:%.*]] = phi ptr [ [[ARRAYIDX178:%.*]], [[SW_BB175]] ], [ null, [[YY_GET_PREVIOUS_STATE_EXIT_LOOPEXIT]] ]
156+
; CHECK-NEXT: br label [[DO_ACTION]]
157+
; CHECK: sw.bb175:
158+
; CHECK-NEXT: [[ARRAYIDX178]] = getelementptr i8, ptr null, i64 0
159+
; CHECK-NEXT: [[ADD_PTR_I49]] = getelementptr i8, ptr null, i64 [[IDX_EXT_I48_PRE_PHI]]
160+
; CHECK-NEXT: [[CMP5_I50:%.*]] = icmp ult ptr [[ADD_PTR_I49]], [[ARRAYIDX178]]
161+
; CHECK-NEXT: br label [[YY_FIND_ACTION_BACKEDGE]]
162+
; CHECK: sw.default:
163+
; CHECK-NEXT: unreachable
164+
; CHECK: cleanup185:
165+
; CHECK-NEXT: ret i32 0
166+
;
167+
entry:
168+
br label %do_action
169+
170+
do_action:
171+
switch i32 0, label %sw.default [
172+
i32 1, label %cleanup185
173+
i32 2, label %cleanup185
174+
i32 0, label %cleanup185
175+
i32 4, label %cleanup185
176+
i32 5, label %cleanup185
177+
i32 6, label %cleanup185
178+
i32 7, label %cleanup185
179+
i32 8, label %cleanup185
180+
i32 9, label %cleanup185
181+
i32 10, label %cleanup185
182+
i32 11, label %cleanup185
183+
i32 12, label %cleanup185
184+
i32 13, label %cleanup185
185+
i32 14, label %cleanup185
186+
i32 15, label %cleanup185
187+
i32 16, label %cleanup185
188+
i32 17, label %cleanup185
189+
i32 18, label %cleanup185
190+
i32 19, label %cleanup185
191+
i32 20, label %cleanup185
192+
i32 21, label %cleanup185
193+
i32 22, label %cleanup185
194+
i32 23, label %cleanup185
195+
i32 24, label %cleanup185
196+
i32 25, label %cleanup185
197+
i32 26, label %cleanup185
198+
i32 27, label %cleanup185
199+
i32 28, label %cleanup185
200+
i32 29, label %cleanup185
201+
i32 30, label %cleanup185
202+
i32 31, label %cleanup185
203+
i32 32, label %cleanup185
204+
i32 33, label %cleanup185
205+
i32 34, label %cleanup185
206+
i32 35, label %cleanup185
207+
i32 36, label %cleanup185
208+
i32 37, label %cleanup185
209+
i32 38, label %cleanup185
210+
i32 39, label %cleanup185
211+
i32 40, label %cleanup185
212+
i32 41, label %cleanup185
213+
i32 42, label %cleanup185
214+
i32 43, label %cleanup185
215+
i32 44, label %cleanup185
216+
i32 45, label %cleanup185
217+
i32 46, label %cleanup185
218+
i32 47, label %cleanup185
219+
i32 48, label %cleanup185
220+
i32 49, label %cleanup185
221+
i32 50, label %cleanup185
222+
i32 51, label %cleanup185
223+
i32 52, label %cleanup185
224+
i32 53, label %cleanup185
225+
i32 54, label %cleanup185
226+
i32 55, label %cleanup185
227+
i32 56, label %cleanup185
228+
i32 57, label %do_action
229+
i32 58, label %cleanup185
230+
i32 59, label %cleanup185
231+
i32 60, label %do_action
232+
i32 61, label %do_action
233+
i32 62, label %cleanup185
234+
i32 70, label %sw.bb175
235+
i32 64, label %cleanup185
236+
i32 65, label %do_action
237+
i32 66, label %do_action
238+
i32 67, label %cleanup185
239+
i32 72, label %cleanup185
240+
i32 69, label %do_action
241+
i32 71, label %cleanup185
242+
]
243+
244+
yy_get_previous_state.exit.loopexit:
245+
br label %yy_find_action.backedge
246+
247+
yy_find_action.backedge:
248+
%yy_bp.1.be = phi ptr [ %add.ptr.i49, %sw.bb175 ], [ null, %yy_get_previous_state.exit.loopexit ]
249+
%yy_cp.2.be = phi ptr [ %arrayidx178, %sw.bb175 ], [ null, %yy_get_previous_state.exit.loopexit ]
250+
br label %do_action
251+
252+
sw.bb175:
253+
%arrayidx178 = getelementptr i8, ptr null, i64 0
254+
%add.ptr.i49 = getelementptr i8, ptr null, i64 %idx.ext.i48.pre-phi
255+
%cmp5.i50 = icmp ult ptr %add.ptr.i49, %arrayidx178
256+
br label %yy_find_action.backedge
257+
258+
sw.default:
259+
unreachable
260+
261+
cleanup185:
262+
ret i32 0
263+
}

0 commit comments

Comments
 (0)