From 24e78e0125dbdc0667fc261175d1148f74612783 Mon Sep 17 00:00:00 2001 From: Tim Northover Date: Wed, 2 Apr 2014 14:39:02 +0000 Subject: [PATCH] SLPVectorizer: compare entire intrinsic for SLP compatibility. Some Intrinsics are overloaded to the extent that return type equality (all that's been checked up to now) does not guarantee that the arguments are the same. In these cases SLP vectorizer should not recurse into the operands, which can be achieved by comparing them as "Function *" rather than simply the ID. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205424 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Vectorize/SLPVectorizer.cpp | 4 ++-- .../SLPVectorizer/ARM64/lit.local.cfg | 3 +++ .../ARM64/mismatched-intrinsics.ll | 18 ++++++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 test/Transforms/SLPVectorizer/ARM64/lit.local.cfg create mode 100644 test/Transforms/SLPVectorizer/ARM64/mismatched-intrinsics.ll diff --git a/lib/Transforms/Vectorize/SLPVectorizer.cpp b/lib/Transforms/Vectorize/SLPVectorizer.cpp index f6b5b122742..ee322279df3 100644 --- a/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -955,11 +955,11 @@ void BoUpSLP::buildTree_rec(ArrayRef VL, unsigned Depth) { return; } - Intrinsic::ID ID = II->getIntrinsicID(); + Function *Int = II->getCalledFunction(); for (unsigned i = 1, e = VL.size(); i != e; ++i) { IntrinsicInst *II2 = dyn_cast(VL[i]); - if (!II2 || II2->getIntrinsicID() != ID) { + if (!II2 || II2->getCalledFunction() != Int) { newTreeEntry(VL, false); DEBUG(dbgs() << "SLP: mismatched calls:" << *II << "!=" << *VL[i] << "\n"); diff --git a/test/Transforms/SLPVectorizer/ARM64/lit.local.cfg b/test/Transforms/SLPVectorizer/ARM64/lit.local.cfg new file mode 100644 index 00000000000..84ac9811f01 --- /dev/null +++ b/test/Transforms/SLPVectorizer/ARM64/lit.local.cfg @@ -0,0 +1,3 @@ +targets = set(config.root.targets_to_build.split()) +if not 'ARM64' in targets: + config.unsupported = True diff --git a/test/Transforms/SLPVectorizer/ARM64/mismatched-intrinsics.ll b/test/Transforms/SLPVectorizer/ARM64/mismatched-intrinsics.ll new file mode 100644 index 00000000000..3d6da124fc4 --- /dev/null +++ b/test/Transforms/SLPVectorizer/ARM64/mismatched-intrinsics.ll @@ -0,0 +1,18 @@ +; RUN: opt -S -slp-vectorizer %s | FileCheck %s +target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" +target triple = "arm64-apple-ios5.0.0" + +define i64 @mismatched_intrinsics(<4 x i32> %in1, <2 x i32> %in2) nounwind { +; CHECK-LABEL: @mismatched_intrinsics +; CHECK: call i64 @llvm.arm64.neon.saddlv.i64.v4i32 +; CHECK: call i64 @llvm.arm64.neon.saddlv.i64.v2i32 + + %vaddlvq_s32.i = tail call i64 @llvm.arm64.neon.saddlv.i64.v4i32(<4 x i32> %in1) #2 + %vaddlv_s32.i = tail call i64 @llvm.arm64.neon.saddlv.i64.v2i32(<2 x i32> %in2) #2 + %tst = icmp sgt i64 %vaddlvq_s32.i, %vaddlv_s32.i + %equal = sext i1 %tst to i64 + ret i64 %equal +} + +declare i64 @llvm.arm64.neon.saddlv.i64.v4i32(<4 x i32> %in1) +declare i64 @llvm.arm64.neon.saddlv.i64.v2i32(<2 x i32> %in1)