[LLVM][IR] Use splat syntax when printing ConstantExpr based splats. (#116856)
[llvm-project.git] / llvm / test / Transforms / SLPVectorizer / X86 / crash_scheduling.ll
blob1e31772b8e49ed83c63ee01af0044eedfd135a96
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=slp-vectorizer -S -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7 | FileCheck %s
4 target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
5 target triple = "x86_64-apple-darwin13.3.0"
7 define void @_foo(double %p1, double %p2, double %p3) #0 {
8 ; CHECK-LABEL: @_foo(
9 ; CHECK-NEXT:  entry:
10 ; CHECK-NEXT:    [[TAB1:%.*]] = alloca [256 x i32], align 16
11 ; CHECK-NEXT:    [[TAB2:%.*]] = alloca [256 x i32], align 16
12 ; CHECK-NEXT:    br label [[BB1:%.*]]
13 ; CHECK:       bb1:
14 ; CHECK-NEXT:    [[MUL20:%.*]] = fmul double [[P3:%.*]], 1.638400e+04
15 ; CHECK-NEXT:    [[ADD:%.*]] = fadd double [[MUL20]], 8.192000e+03
16 ; CHECK-NEXT:    [[TMP0:%.*]] = insertelement <2 x double> poison, double [[P2:%.*]], i32 0
17 ; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> [[TMP0]], double [[P1:%.*]], i32 1
18 ; CHECK-NEXT:    [[TMP2:%.*]] = fmul <2 x double> [[TMP1]], splat (double 1.638400e+04)
19 ; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <2 x double> <double poison, double 0.000000e+00>, double [[ADD]], i32 0
20 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
21 ; CHECK:       for.body:
22 ; CHECK-NEXT:    [[INDVARS_IV266:%.*]] = phi i64 [ 0, [[BB1]] ], [ [[INDVARS_IV_NEXT267:%.*]], [[FOR_BODY]] ]
23 ; CHECK-NEXT:    [[TMP4:%.*]] = phi <2 x double> [ [[TMP3]], [[BB1]] ], [ [[TMP6:%.*]], [[FOR_BODY]] ]
24 ; CHECK-NEXT:    [[TMP5:%.*]] = shufflevector <2 x double> [[TMP4]], <2 x double> poison, <2 x i32> <i32 1, i32 poison>
25 ; CHECK-NEXT:    [[X13:%.*]] = tail call i32 @_xfn(<2 x double> [[TMP5]])
26 ; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [256 x i32], ptr [[TAB1]], i64 0, i64 [[INDVARS_IV266]]
27 ; CHECK-NEXT:    store i32 [[X13]], ptr [[ARRAYIDX]], align 4, !tbaa [[TBAA0:![0-9]+]]
28 ; CHECK-NEXT:    [[X14:%.*]] = tail call i32 @_xfn(<2 x double> [[TMP4]])
29 ; CHECK-NEXT:    [[ARRAYIDX26:%.*]] = getelementptr inbounds [256 x i32], ptr [[TAB2]], i64 0, i64 [[INDVARS_IV266]]
30 ; CHECK-NEXT:    store i32 [[X14]], ptr [[ARRAYIDX26]], align 4, !tbaa [[TBAA0]]
31 ; CHECK-NEXT:    [[TMP6]] = fadd <2 x double> [[TMP2]], [[TMP4]]
32 ; CHECK-NEXT:    [[INDVARS_IV_NEXT267]] = add nuw nsw i64 [[INDVARS_IV266]], 1
33 ; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT267]], 256
34 ; CHECK-NEXT:    br i1 [[EXITCOND]], label [[RETURN:%.*]], label [[FOR_BODY]]
35 ; CHECK:       return:
36 ; CHECK-NEXT:    ret void
38 entry:
39   %tab1 = alloca [256 x i32], align 16
40   %tab2 = alloca [256 x i32], align 16
41   br label %bb1
44 bb1:
45   %mul19 = fmul double %p1, 1.638400e+04
46   %mul20 = fmul double %p3, 1.638400e+04
47   %add = fadd double %mul20, 8.192000e+03
48   %mul21 = fmul double %p2, 1.638400e+04
49   ; The SLPVectorizer crashed when scheduling this block after it inserted an
50   ; insertelement instruction (during vectorizing the for.body block) at this position.
51   br label %for.body
53 for.body:
54   %indvars.iv266 = phi i64 [ 0, %bb1 ], [ %indvars.iv.next267, %for.body ]
55   %t.0259 = phi double [ 0.000000e+00, %bb1 ], [ %add27, %for.body ]
56   %p3.addr.0258 = phi double [ %add, %bb1 ], [ %add28, %for.body ]
57   %vecinit.i.i237 = insertelement <2 x double> undef, double %t.0259, i32 0
58   %x13 = tail call i32 @_xfn(<2 x double> %vecinit.i.i237) #2
59   %arrayidx = getelementptr inbounds [256 x i32], ptr %tab1, i64 0, i64 %indvars.iv266
60   store i32 %x13, ptr %arrayidx, align 4, !tbaa !4
61   %vecinit.i.i = insertelement <2 x double> undef, double %p3.addr.0258, i32 0
62   %x14 = tail call i32 @_xfn(<2 x double> %vecinit.i.i) #2
63   %arrayidx26 = getelementptr inbounds [256 x i32], ptr %tab2, i64 0, i64 %indvars.iv266
64   store i32 %x14, ptr %arrayidx26, align 4, !tbaa !4
65   %add27 = fadd double %mul19, %t.0259
66   %add28 = fadd double %mul21, %p3.addr.0258
67   %indvars.iv.next267 = add nuw nsw i64 %indvars.iv266, 1
68   %exitcond = icmp eq i64 %indvars.iv.next267, 256
69   br i1 %exitcond, label %return, label %for.body
71 return:
72   ret void
75 declare i32 @_xfn(<2 x double>) #4
77 !3 = !{!"int", !5, i64 0}
78 !4 = !{!3, !3, i64 0}
79 !5 = !{!"omnipotent char", !6, i64 0}
80 !6 = !{!"Simple C/C++ TBAA"}