Don't vectorize target-specific types (ppc_fp128, x86_fp80, etc.).
authorHal Finkel <hfinkel@anl.gov>
Fri, 27 Apr 2012 19:34:00 +0000 (19:34 +0000)
committerHal Finkel <hfinkel@anl.gov>
Fri, 27 Apr 2012 19:34:00 +0000 (19:34 +0000)
Target specific types should not be vectorized. As a practical matter,
these types are already register matched (at least in the x86 case),
and codegen does not always work correctly (at least in the ppc case,
and this is not worth fixing because ppc_fp128 is currently broken and
will probably go away soon).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@155729 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Vectorize/BBVectorize.cpp
test/Transforms/BBVectorize/simple-tst.ll [new file with mode: 0644]

index 9d62306dce5a0a78003c13b2e7c979ffca7affce..1d08df59b3375a99104e46359258128596c6f59d 100644 (file)
@@ -612,6 +612,12 @@ namespace {
         && (T1->isFPOrFPVectorTy() || T2->isFPOrFPVectorTy()))
       return false;
 
+    // Don't vectorize target-specific types.
+    if (T1->isX86_FP80Ty() || T1->isPPC_FP128Ty() || T1->isX86_MMXTy())
+      return false;
+    if (T2->isX86_FP80Ty() || T2->isPPC_FP128Ty() || T2->isX86_MMXTy())
+      return false;
+
     if ((!Config.VectorizePointers || TD == 0) &&
         (T1->getScalarType()->isPointerTy() ||
          T2->getScalarType()->isPointerTy()))
diff --git a/test/Transforms/BBVectorize/simple-tst.ll b/test/Transforms/BBVectorize/simple-tst.ll
new file mode 100644 (file)
index 0000000..42146c6
--- /dev/null
@@ -0,0 +1,18 @@
+target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64"
+target triple = "powerpc64-unknown-linux"
+; RUN: opt < %s -bb-vectorize -bb-vectorize-req-chain-depth=3 -bb-vectorize-vector-bits=256 -instcombine -gvn -S | FileCheck %s
+
+; Basic depth-3 chain (target-specific type should not vectorize)
+define ppc_fp128 @test7(ppc_fp128 %A1, ppc_fp128 %A2, ppc_fp128 %B1, ppc_fp128 %B2) {
+; CHECK: @test7
+; CHECK-NOT: <2 x ppc_fp128>
+       %X1 = fsub ppc_fp128 %A1, %B1
+       %X2 = fsub ppc_fp128 %A2, %B2
+       %Y1 = fmul ppc_fp128 %X1, %A1
+       %Y2 = fmul ppc_fp128 %X2, %A2
+       %Z1 = fadd ppc_fp128 %Y1, %B1
+       %Z2 = fadd ppc_fp128 %Y2, %B2
+       %R  = fmul ppc_fp128 %Z1, %Z2
+       ret ppc_fp128 %R
+}
+