diff options
Diffstat (limited to 'test/Transforms/SLPVectorizer/X86/value-bug.ll')
-rw-r--r-- | test/Transforms/SLPVectorizer/X86/value-bug.ll | 48 |
1 files changed, 39 insertions, 9 deletions
diff --git a/test/Transforms/SLPVectorizer/X86/value-bug.ll b/test/Transforms/SLPVectorizer/X86/value-bug.ll index 64d2ae1c7d7..7558c724a15 100644 --- a/test/Transforms/SLPVectorizer/X86/value-bug.ll +++ b/test/Transforms/SLPVectorizer/X86/value-bug.ll @@ -1,15 +1,46 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -slp-vectorizer < %s -S -mtriple="x86_64-grtev3-linux-gnu" -mcpu=corei7-avx | FileCheck %s target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-grtev3-linux-gnu" ; We used to crash on this example because we were building a constant ; expression during vectorization and the vectorizer expects instructions ; as elements of the vectorized tree. -; CHECK-LABEL: @test ; PR19621 define void @test() { +; CHECK-LABEL: @test( +; CHECK-NEXT: bb279: +; CHECK-NEXT: br label [[BB283:%.*]] +; CHECK: bb283: +; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x float> [ undef, [[BB279:%.*]] ], [ [[TMP11:%.*]], [[EXIT:%.*]] ] +; CHECK-NEXT: [[TMP1:%.*]] = phi <2 x float> [ undef, [[BB279]] ], [ [[TMP13:%.*]], [[EXIT]] ] +; CHECK-NEXT: br label [[BB284:%.*]] +; CHECK: bb284: +; CHECK-NEXT: [[TMP2:%.*]] = fpext <2 x float> [[TMP0]] to <2 x double> +; CHECK-NEXT: [[TMP3:%.*]] = fsub <2 x double> [[TMP2]], undef +; CHECK-NEXT: [[TMP4:%.*]] = fsub <2 x double> [[TMP3]], undef +; CHECK-NEXT: br label [[BB21_I:%.*]] +; CHECK: bb21.i: +; CHECK-NEXT: br i1 undef, label [[BB22_I:%.*]], label [[EXIT]] +; CHECK: bb22.i: +; CHECK-NEXT: [[TMP5:%.*]] = fadd <2 x double> undef, [[TMP4]] +; CHECK-NEXT: br label [[BB32_I:%.*]] +; CHECK: bb32.i: +; CHECK-NEXT: [[TMP6:%.*]] = phi <2 x double> [ [[TMP5]], [[BB22_I]] ], [ zeroinitializer, [[BB32_I]] ] +; CHECK-NEXT: br i1 undef, label [[BB32_I]], label [[BB21_I]] +; CHECK: exit: +; CHECK-NEXT: [[TMP7:%.*]] = fpext <2 x float> [[TMP1]] to <2 x double> +; CHECK-NEXT: [[TMP8:%.*]] = fmul <2 x double> <double undef, double 0.000000e+00>, [[TMP7]] +; CHECK-NEXT: [[TMP9:%.*]] = fadd <2 x double> undef, [[TMP8]] +; CHECK-NEXT: [[TMP10:%.*]] = fadd <2 x double> undef, [[TMP9]] +; CHECK-NEXT: [[TMP11]] = fptrunc <2 x double> [[TMP10]] to <2 x float> +; CHECK-NEXT: [[TMP317:%.*]] = fptrunc double undef to float +; CHECK-NEXT: [[TMP319:%.*]] = fptrunc double undef to float +; CHECK-NEXT: [[TMP12:%.*]] = insertelement <2 x float> undef, float [[TMP317]], i32 0 +; CHECK-NEXT: [[TMP13]] = insertelement <2 x float> [[TMP12]], float [[TMP319]], i32 1 +; CHECK-NEXT: br label [[BB283]] +; bb279: br label %bb283 @@ -62,6 +93,12 @@ exit: ; vectorizer starts at the type (%t2, %t3) and wil constant fold the tree. ; The code that handles insertelement instructions must handle this. define <4 x double> @constant_folding() { +; CHECK-LABEL: @constant_folding( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[I1:%.*]] = insertelement <4 x double> undef, double 1.000000e+00, i32 1 +; CHECK-NEXT: [[I2:%.*]] = insertelement <4 x double> [[I1]], double 2.000000e+00, i32 0 +; CHECK-NEXT: ret <4 x double> [[I2]] +; entry: %t0 = fadd double 1.000000e+00 , 0.000000e+00 %t1 = fadd double 1.000000e+00 , 1.000000e+00 @@ -71,10 +108,3 @@ entry: %i2 = insertelement <4 x double> %i1, double %t3, i32 0 ret <4 x double> %i2 } - -; CHECK-LABEL: @constant_folding -; CHECK: %[[V0:.+]] = extractelement <2 x double> <double 1.000000e+00, double 2.000000e+00>, i32 0 -; CHECK: %[[V1:.+]] = insertelement <4 x double> undef, double %[[V0]], i32 1 -; CHECK: %[[V2:.+]] = extractelement <2 x double> <double 1.000000e+00, double 2.000000e+00>, i32 1 -; CHECK: %[[V3:.+]] = insertelement <4 x double> %[[V1]], double %[[V2]], i32 0 -; CHECK: ret <4 x double> %[[V3]] |