Skip to content

Commit a101a9b

Browse files
committed
[SLP]Fix compiler crash when calculating extract cost for undefs.
Need to add an extra check for potential undef values in computeExtractCost function to avoid compiler crash on casting to instructon. Differential Revision: https://reviews.llvm.org/D115162
1 parent 5871969 commit a101a9b

File tree

2 files changed

+74
-3
lines changed

2 files changed

+74
-3
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4348,6 +4348,10 @@ computeExtractCost(ArrayRef<Value *> VL, FixedVectorType *VecTy,
43484348
for (auto *V : VL) {
43494349
++Idx;
43504350

4351+
// Need to exclude undefs from analysis.
4352+
if (isa<UndefValue>(V) || Mask[Idx] == UndefMaskElem)
4353+
continue;
4354+
43514355
// Reached the start of a new vector registers.
43524356
if (Idx % EltsPerVector == 0) {
43534357
AllConsecutive = true;
@@ -4357,9 +4361,11 @@ computeExtractCost(ArrayRef<Value *> VL, FixedVectorType *VecTy,
43574361
// Check all extracts for a vector register on the target directly
43584362
// extract values in order.
43594363
unsigned CurrentIdx = *getExtractIndex(cast<Instruction>(V));
4360-
unsigned PrevIdx = *getExtractIndex(cast<Instruction>(VL[Idx - 1]));
4361-
AllConsecutive &= PrevIdx + 1 == CurrentIdx &&
4362-
CurrentIdx % EltsPerVector == Idx % EltsPerVector;
4364+
if (!isa<UndefValue>(VL[Idx - 1]) && Mask[Idx - 1] != UndefMaskElem) {
4365+
unsigned PrevIdx = *getExtractIndex(cast<Instruction>(VL[Idx - 1]));
4366+
AllConsecutive &= PrevIdx + 1 == CurrentIdx &&
4367+
CurrentIdx % EltsPerVector == Idx % EltsPerVector;
4368+
}
43634369

43644370
if (AllConsecutive)
43654371
continue;
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
3+
4+
define void @test() {
5+
; CHECK-LABEL: @test(
6+
; CHECK-NEXT: entry:
7+
; CHECK-NEXT: br label [[BODY:%.*]]
8+
; CHECK: body:
9+
; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x double> [ zeroinitializer, [[ENTRY:%.*]] ], [ zeroinitializer, [[BODY]] ]
10+
; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x double> [[TMP0]], i32 1
11+
; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> <double poison, double undef>, double [[TMP1]], i32 0
12+
; CHECK-NEXT: [[TMP3:%.*]] = fmul fast <2 x double> [[TMP2]], zeroinitializer
13+
; CHECK-NEXT: [[TMP4:%.*]] = extractelement <2 x double> [[TMP3]], i32 0
14+
; CHECK-NEXT: [[TMP5:%.*]] = extractelement <2 x double> [[TMP3]], i32 1
15+
; CHECK-NEXT: [[ADD8_I_I:%.*]] = fadd fast double [[TMP4]], [[TMP5]]
16+
; CHECK-NEXT: [[CMP42_I:%.*]] = fcmp fast ole double [[ADD8_I_I]], 0.000000e+00
17+
; CHECK-NEXT: br i1 false, label [[BODY]], label [[EXIT:%.*]]
18+
; CHECK: exit:
19+
; CHECK-NEXT: br i1 false, label [[IF_THEN135_I:%.*]], label [[IF_END209_I:%.*]]
20+
; CHECK: if.then135.i:
21+
; CHECK-NEXT: [[TMP6:%.*]] = fcmp fast olt <2 x double> [[TMP0]], zeroinitializer
22+
; CHECK-NEXT: [[TMP7:%.*]] = extractelement <2 x i1> [[TMP6]], i32 0
23+
; CHECK-NEXT: [[TMP8:%.*]] = insertelement <2 x i1> <i1 poison, i1 false>, i1 [[TMP7]], i32 0
24+
; CHECK-NEXT: [[TMP9:%.*]] = select <2 x i1> [[TMP8]], <2 x double> zeroinitializer, <2 x double> zeroinitializer
25+
; CHECK-NEXT: [[TMP10:%.*]] = fmul fast <2 x double> zeroinitializer, [[TMP9]]
26+
; CHECK-NEXT: [[TMP11:%.*]] = fmul fast <2 x double> [[TMP10]], zeroinitializer
27+
; CHECK-NEXT: [[TMP12:%.*]] = fadd fast <2 x double> [[TMP11]], zeroinitializer
28+
; CHECK-NEXT: br label [[IF_END209_I]]
29+
; CHECK: if.end209.i:
30+
; CHECK-NEXT: [[TMP13:%.*]] = phi <2 x double> [ [[TMP12]], [[IF_THEN135_I]] ], [ zeroinitializer, [[EXIT]] ]
31+
; CHECK-NEXT: ret void
32+
;
33+
entry:
34+
br label %body
35+
36+
body:
37+
%phi1 = phi double [ 0.000000e+00, %entry ], [ 0.000000e+00, %body ]
38+
%phi2 = phi double [ 0.000000e+00, %entry ], [ 0.000000e+00, %body ]
39+
%mul.i478.i = fmul fast double %phi1, 0.000000e+00
40+
%mul7.i485.i = fmul fast double undef, 0.000000e+00
41+
%add8.i.i = fadd fast double %mul.i478.i, %mul7.i485.i
42+
%cmp42.i = fcmp fast ole double %add8.i.i, 0.000000e+00
43+
br i1 false, label %body, label %exit
44+
45+
exit:
46+
br i1 false, label %if.then135.i, label %if.end209.i
47+
48+
if.then135.i:
49+
%cmp145.i = fcmp fast olt double %phi1, 0.000000e+00
50+
%0 = select i1 false, double 0.000000e+00, double 0.000000e+00
51+
%cmp152.i = fcmp fast olt double %phi2, 0.000000e+00
52+
%1 = select i1 %cmp152.i, double 0.000000e+00, double 0.000000e+00
53+
%mul166.i = fmul fast double 0.000000e+00, %0
54+
%mul177.i = fmul fast double %mul166.i, 0.000000e+00
55+
%add178.i = fadd fast double %mul177.i, 0.000000e+00
56+
%mul181.i = fmul fast double 0.000000e+00, %1
57+
%mul182.i = fmul fast double %mul181.i, 0.000000e+00
58+
%add183.i = fadd fast double %mul182.i, 0.000000e+00
59+
br label %if.end209.i
60+
61+
if.end209.i:
62+
%drdys.1.i = phi double [ %add183.i, %if.then135.i ], [ 0.000000e+00, %exit ]
63+
%dbdxs.1.i = phi double [ %add178.i, %if.then135.i ], [ 0.000000e+00, %exit ]
64+
ret void
65+
}

0 commit comments

Comments
 (0)