Skip to content

Commit

Permalink
[PowerPC][Altivec] Fix constant argument for vec_dss
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Jinsong Ji committed Sep 4, 2019
1 parent 791949a commit 5309189
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 4 deletions.
2 changes: 1 addition & 1 deletion clang/include/clang/Basic/BuiltinsPPC.def
Original file line number Diff line number Diff line change
Expand Up @@ -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", "")
Expand Down
4 changes: 1 addition & 3 deletions clang/lib/Headers/altivec.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

Expand Down
2 changes: 2 additions & 0 deletions clang/lib/Sema/SemaChecking.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
11 changes: 11 additions & 0 deletions clang/test/CodeGen/altivec-dss.c
Original file line number Diff line number Diff line change
@@ -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);
}
5 changes: 5 additions & 0 deletions clang/test/CodeGen/builtins-ppc-error.c
Original file line number Diff line number Diff line change
Expand Up @@ -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]}}
}

0 comments on commit 5309189

Please sign in to comment.