aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJinsong Ji <jji@us.ibm.com>2019-09-04 14:01:47 +0000
committerJinsong Ji <jji@us.ibm.com>2019-09-04 14:01:47 +0000
commit5309189d9b3e03f68fdd04b4372fc73ddc07f98e (patch)
tree561f8a503c9aaa0c088a6af1493fdfd249f8a7c6
parent791949afe56027404a4c0bc605f7e72cc272b41a (diff)
downloadllvm-5309189d9b3e03f68fdd04b4372fc73ddc07f98e.zip
llvm-5309189d9b3e03f68fdd04b4372fc73ddc07f98e.tar.gz
llvm-5309189d9b3e03f68fdd04b4372fc73ddc07f98e.tar.bz2
[PowerPC][Altivec] Fix constant argument for vec_dss
Summary: This is similar to vec_ct* in https://reviews.llvm.org/rL304205. The argument must be a constant, otherwise instruction selection will fail. always_inline is not enough for isel to always fold everything away at -O0. The fix is to turn the function into macros in altivec.h. Fixes https://bugs.llvm.org/show_bug.cgi?id=43072 Reviewers: nemanjai, hfinkel, #powerpc, wuzish Reviewed By: #powerpc, wuzish Subscribers: wuzish, kbarton, MaskRay, shchenz, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D66699 llvm-svn: 370902
-rw-r--r--clang/include/clang/Basic/BuiltinsPPC.def2
-rw-r--r--clang/lib/Headers/altivec.h4
-rw-r--r--clang/lib/Sema/SemaChecking.cpp2
-rw-r--r--clang/test/CodeGen/altivec-dss.c11
-rw-r--r--clang/test/CodeGen/builtins-ppc-error.c5
5 files changed, 20 insertions, 4 deletions
diff --git a/clang/include/clang/Basic/BuiltinsPPC.def b/clang/include/clang/Basic/BuiltinsPPC.def
index 3b6348a..249e38c 100644
--- a/clang/include/clang/Basic/BuiltinsPPC.def
+++ b/clang/include/clang/Basic/BuiltinsPPC.def
@@ -55,7 +55,7 @@ BUILTIN(__builtin_altivec_vcfux, "V4fV4iIi", "")
BUILTIN(__builtin_altivec_vctsxs, "V4SiV4fIi", "")
BUILTIN(__builtin_altivec_vctuxs, "V4UiV4fIi", "")
-BUILTIN(__builtin_altivec_dss, "vUi", "")
+BUILTIN(__builtin_altivec_dss, "vUIi", "")
BUILTIN(__builtin_altivec_dssall, "v", "")
BUILTIN(__builtin_altivec_dst, "vvC*iUi", "")
BUILTIN(__builtin_altivec_dstt, "vvC*iUi", "")
diff --git a/clang/lib/Headers/altivec.h b/clang/lib/Headers/altivec.h
index 4008440..a7f480e 100644
--- a/clang/lib/Headers/altivec.h
+++ b/clang/lib/Headers/altivec.h
@@ -3286,9 +3286,7 @@ static __inline__ vector double __ATTRS_o_ai vec_div(vector double __a,
/* vec_dss */
-static __inline__ void __attribute__((__always_inline__)) vec_dss(int __a) {
- __builtin_altivec_dss(__a);
-}
+#define vec_dss __builtin_altivec_dss
/* vec_dssall */
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index f6a705a..bb06517 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -3220,6 +3220,8 @@ bool Sema::CheckPPCBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
case PPC::BI__builtin_altivec_crypto_vshasigmad:
return SemaBuiltinConstantArgRange(TheCall, 1, 0, 1) ||
SemaBuiltinConstantArgRange(TheCall, 2, 0, 15);
+ case PPC::BI__builtin_altivec_dss:
+ return SemaBuiltinConstantArgRange(TheCall, 0, 0, 3);
case PPC::BI__builtin_tbegin:
case PPC::BI__builtin_tend: i = 0; l = 0; u = 1; break;
case PPC::BI__builtin_tsr: i = 0; l = 0; u = 7; break;
diff --git a/clang/test/CodeGen/altivec-dss.c b/clang/test/CodeGen/altivec-dss.c
new file mode 100644
index 0000000..e1b27779
--- /dev/null
+++ b/clang/test/CodeGen/altivec-dss.c
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 -triple powerpc-linux-gnu -S -O0 -o - %s -target-feature +altivec | FileCheck %s
+
+// REQUIRES: powerpc-registered-target
+
+#include <altivec.h>
+
+// CHECK-LABEL: test1
+// CHECK: dss
+void test1() {
+ vec_dss(1);
+}
diff --git a/clang/test/CodeGen/builtins-ppc-error.c b/clang/test/CodeGen/builtins-ppc-error.c
index a50dc2c..067f6b4 100644
--- a/clang/test/CodeGen/builtins-ppc-error.c
+++ b/clang/test/CodeGen/builtins-ppc-error.c
@@ -73,3 +73,8 @@ void testUnpack128(int index) {
__builtin_unpack_vector_int128(vsllli, index); //expected-error {{argument to '__builtin_unpack_vector_int128' must be a constant integer}}
__builtin_unpack_vector_int128(vsllli, 5); //expected-error {{argument value 5 is outside the valid range [0, 1]}}
}
+
+void testDSS(int index) {
+ vec_dss(index); //expected-error {{argument to '__builtin_altivec_dss' must be a constant integer}}
+ vec_dss(5); //expected-error {{argument value 5 is outside the valid range [0, 3]}}
+}