Skip to content

Commit 7b899f1

Browse files
alexey-bataevgithub-actions[bot]
authored andcommitted
Automerge: [SLP]Fix a crash when comparing phis from unreachable blocks
Need to check if the block is reachable before comparing phis from it to avoid compiler crash when requesting node. Fixes report in llvm/llvm-project#110529 (comment)
2 parents 480bb67 + 0e1ffa3 commit 7b899f1

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5724,6 +5724,10 @@ BoUpSLP::getReorderingData(const TreeEntry &TE, bool TopToBottom) {
57245724

57255725
auto CompareByBasicBlocks = [&](BasicBlock *BB1, BasicBlock *BB2) {
57265726
assert(BB1 != BB2 && "Expected different basic blocks.");
5727+
if (!DT->isReachableFromEntry(BB1))
5728+
return false;
5729+
if (!DT->isReachableFromEntry(BB2))
5730+
return true;
57275731
auto *NodeA = DT->getNode(BB1);
57285732
auto *NodeB = DT->getNode(BB2);
57295733
assert(NodeA && "Should only process reachable instructions");
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -S --passes=slp-vectorizer -mtriple=aarch64 < %s | FileCheck %s
3+
4+
define void @test() {
5+
; CHECK-LABEL: define void @test() {
6+
; CHECK-NEXT: [[ENTRY:.*]]:
7+
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i32>, ptr null, align 1
8+
; CHECK-NEXT: br label %[[IF_END:.*]]
9+
; CHECK: [[IF_THEN:.*]]:
10+
; CHECK-NEXT: br label %[[IF_END]]
11+
; CHECK: [[IF_END]]:
12+
; CHECK-NEXT: [[TMP1:%.*]] = phi <2 x i32> [ [[TMP0]], %[[ENTRY]] ], [ poison, %[[IF_THEN]] ]
13+
; CHECK-NEXT: [[TMP2:%.*]] = extractelement <2 x i32> [[TMP1]], i32 0
14+
; CHECK-NEXT: store i32 [[TMP2]], ptr null, align 1
15+
; CHECK-NEXT: br label %[[TRAP:.*]]
16+
; CHECK: [[BB3:.*:]]
17+
; CHECK-NEXT: [[TMP4:%.*]] = extractelement <2 x i32> [[TMP1]], i32 1
18+
; CHECK-NEXT: store i32 [[TMP4]], ptr null, align 1
19+
; CHECK-NEXT: ret void
20+
; CHECK: [[TRAP]]:
21+
; CHECK-NEXT: unreachable
22+
;
23+
entry:
24+
%g_2197.real32.pre = load i32, ptr null, align 1
25+
%g_2197.imag33.pre = load i32, ptr getelementptr inbounds nuw ({ i32, i32 }, ptr null, i32 0, i32 1), align 1
26+
br label %if.end
27+
28+
if.then:
29+
br label %if.end
30+
31+
if.end:
32+
%g_2197.imag33 = phi i32 [ %g_2197.imag33.pre, %entry ], [ 0, %if.then ]
33+
%g_2197.real32 = phi i32 [ %g_2197.real32.pre, %entry ], [ 0, %if.then ]
34+
store i32 %g_2197.real32, ptr null, align 1
35+
br label %trap
36+
37+
0:
38+
store i32 %g_2197.imag33, ptr null, align 1
39+
ret void
40+
41+
trap:
42+
unreachable
43+
}

0 commit comments

Comments
 (0)