From 8672808b6bbf4918a432a923f3a0946b8af6bb9a Mon Sep 17 00:00:00 2001 From: Michael Kuperstein Date: Wed, 11 Jan 2017 19:23:57 +0000 Subject: [PATCH] [SLP] Remove bogus assert. The removed assert seems bogus - it's perfectly legal for the roots of the vectorized subtrees to be equal even if the original scalar values aren't, if the original scalars happen to be equivalent. This fixes PR31599. Differential Revision: https://reviews.llvm.org/D28539 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@291692 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Vectorize/SLPVectorizer.cpp | 4 --- test/Transforms/SLPVectorizer/X86/pr31599.ll | 30 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 test/Transforms/SLPVectorizer/X86/pr31599.ll diff --git a/lib/Transforms/Vectorize/SLPVectorizer.cpp b/lib/Transforms/Vectorize/SLPVectorizer.cpp index bcaa8439cff..1c7cbc7edf9 100644 --- a/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -2493,10 +2493,6 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) { Value *LHS = vectorizeTree(LHSVL); Value *RHS = vectorizeTree(RHSVL); - if (LHS == RHS && isa(LHS)) { - assert((VL0->getOperand(0) == VL0->getOperand(1)) && "Invalid order"); - } - if (Value *V = alreadyVectorized(E->Scalars)) return V; diff --git a/test/Transforms/SLPVectorizer/X86/pr31599.ll b/test/Transforms/SLPVectorizer/X86/pr31599.ll new file mode 100644 index 00000000000..64e0f7be7e2 --- /dev/null +++ b/test/Transforms/SLPVectorizer/X86/pr31599.ll @@ -0,0 +1,30 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s + +define <2 x float> @foo() { +; CHECK-LABEL: @foo( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[SOURCE:%.*]] = insertelement <2 x float> undef, float undef, i32 0 +; CHECK-NEXT: [[TMP0:%.*]] = fsub <2 x float> [[SOURCE]], [[SOURCE]] +; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x float> [[TMP0]], i32 0 +; CHECK-NEXT: [[RES1:%.*]] = insertelement <2 x float> undef, float [[TMP1]], i32 0 +; CHECK-NEXT: [[TMP2:%.*]] = extractelement <2 x float> [[TMP0]], i32 1 +; CHECK-NEXT: [[RES2:%.*]] = insertelement <2 x float> [[RES1]], float [[TMP2]], i32 1 +; CHECK-NEXT: ret <2 x float> [[RES2]] +; +entry: + %source = insertelement <2 x float> undef, float undef, i32 0 + %e0 = extractelement <2 x float> %source, i32 0 + %e0.dup = extractelement <2 x float> %source, i32 0 + %sub1 = fsub float %e0, %e0.dup + %e1 = extractelement <2 x float> %source, i32 1 + %e1.dup = extractelement <2 x float> %source, i32 1 + %sub2 = fsub float %e1, %e1.dup + %res1 = insertelement <2 x float> undef, float %sub1, i32 0 + %res2 = insertelement <2 x float> %res1, float %sub2, i32 1 + ret <2 x float> %res2 +} + +!llvm.ident = !{!0, !0} + +!0 = !{!"clang version 4.0.0 "} -- 2.50.1