Skip to content

Commit 3df9334

Browse files
alexey-bataevsearlmc1
authored andcommitted
[SLP]Fix a crash for the replaced vectorized value.
If two nodes share the same value, which is replaced in one of the nodes, need to automatically replace same value in all nodes. Btter to use WeakTrackingVH for this to fix compiler crash. Change-Id: I6724034c0540e0b933807a20126d60b7d9d2019c
1 parent 066b5e3 commit 3df9334

File tree

2 files changed

+76
-1
lines changed

2 files changed

+76
-1
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2611,7 +2611,7 @@ class BoUpSLP {
26112611
ValueList Scalars;
26122612

26132613
/// The Scalars are vectorized into this value. It is initialized to Null.
2614-
Value *VectorizedValue = nullptr;
2614+
WeakTrackingVH VectorizedValue = nullptr;
26152615

26162616
/// Do we need to gather this sequence or vectorize it
26172617
/// (either with vector instruction or with scatter/gather
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2+
; RUN: opt < %s -passes=slp-vectorizer -slp-threshold=-10 -mtriple=x86_64-unknown-linux-gnu -S | FileCheck %s
3+
4+
define void @foo() {
5+
; CHECK-LABEL: define void @foo() {
6+
; CHECK-NEXT: bci_0:
7+
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(1) null, align 8
8+
; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i32> <i32 poison, i32 0>, i32 [[TMP0]], i32 0
9+
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <2 x i32> [[TMP1]], <2 x i32> poison, <2 x i32> zeroinitializer
10+
; CHECK-NEXT: br label [[BCI_252:%.*]]
11+
; CHECK: bci_252:
12+
; CHECK-NEXT: [[TMP3:%.*]] = phi <2 x i32> [ zeroinitializer, [[BCI_0:%.*]] ], [ [[TMP16:%.*]], [[BCI_252_1:%.*]] ]
13+
; CHECK-NEXT: [[TMP4:%.*]] = mul <2 x i32> zeroinitializer, [[TMP1]]
14+
; CHECK-NEXT: [[TMP5:%.*]] = or <2 x i32> [[TMP3]], zeroinitializer
15+
; CHECK-NEXT: [[TMP6:%.*]] = or <2 x i32> [[TMP2]], [[TMP4]]
16+
; CHECK-NEXT: [[TMP7:%.*]] = or <2 x i32> [[TMP6]], zeroinitializer
17+
; CHECK-NEXT: [[TMP8:%.*]] = or <2 x i32> [[TMP5]], [[TMP7]]
18+
; CHECK-NEXT: [[TMP9:%.*]] = or <2 x i32> [[TMP8]], zeroinitializer
19+
; CHECK-NEXT: br i1 false, label [[NOT_ZERO70:%.*]], label [[BCI_252_1]]
20+
; CHECK: bci_252.1:
21+
; CHECK-NEXT: [[TMP10:%.*]] = or <2 x i32> [[TMP2]], zeroinitializer
22+
; CHECK-NEXT: [[TMP11:%.*]] = or <2 x i32> [[TMP9]], zeroinitializer
23+
; CHECK-NEXT: [[TMP12:%.*]] = mul <2 x i32> [[TMP10]], zeroinitializer
24+
; CHECK-NEXT: [[TMP13:%.*]] = or <2 x i32> [[TMP2]], [[TMP12]]
25+
; CHECK-NEXT: [[TMP14:%.*]] = or <2 x i32> [[TMP13]], zeroinitializer
26+
; CHECK-NEXT: [[TMP15:%.*]] = or <2 x i32> [[TMP11]], [[TMP14]]
27+
; CHECK-NEXT: [[TMP16]] = or <2 x i32> [[TMP15]], zeroinitializer
28+
; CHECK-NEXT: br label [[BCI_252]]
29+
; CHECK: not_zero70:
30+
; CHECK-NEXT: [[TMP17:%.*]] = phi <2 x i32> [ [[TMP9]], [[BCI_252]] ]
31+
; CHECK-NEXT: ret void
32+
;
33+
bci_0:
34+
%0 = load i32, ptr addrspace(1) null, align 8
35+
br label %bci_252
36+
37+
bci_252:
38+
%1 = phi i32 [ 0, %bci_0 ], [ %20, %bci_252.1 ]
39+
%2 = phi i32 [ 0, %bci_0 ], [ %15, %bci_252.1 ]
40+
%3 = mul i32 %0, 0
41+
%4 = or i32 %0, %3
42+
%5 = or i32 %4, 0
43+
%.neg91.neg = or i32 %2, 0
44+
%.neg446 = or i32 %.neg91.neg, %5
45+
%6 = or i32 %.neg446, 0
46+
%7 = mul i32 0, 0
47+
%8 = or i32 %0, %7
48+
%9 = or i32 %8, 0
49+
%.neg91.1.neg = or i32 %1, 0
50+
%.neg448 = or i32 %.neg91.1.neg, %9
51+
%10 = or i32 %.neg448, 0
52+
br i1 false, label %not_zero70, label %bci_252.1
53+
54+
bci_252.1:
55+
%11 = or i32 %0, 0
56+
%12 = mul i32 %11, 0
57+
%13 = or i32 %0, %12
58+
%14 = or i32 %13, 0
59+
%.neg91.neg.1 = or i32 %6, 0
60+
%.neg446.1 = or i32 %.neg91.neg.1, %14
61+
%15 = or i32 %.neg446.1, 0
62+
%16 = or i32 %0, 0
63+
%17 = mul i32 %16, 0
64+
%18 = or i32 %0, %17
65+
%19 = or i32 %18, 0
66+
%.neg91.1.neg.1 = or i32 %10, 0
67+
%.neg448.1 = or i32 %.neg91.1.neg.1, %19
68+
%20 = or i32 %.neg448.1, 0
69+
br label %bci_252
70+
71+
not_zero70:
72+
%.lcssa546 = phi i32 [ %6, %bci_252 ]
73+
%.lcssa545 = phi i32 [ %10, %bci_252 ]
74+
ret void
75+
}

0 commit comments

Comments
 (0)