Skip to content

Commit

Permalink
Revert "[PowerPC] Add target feature requirement to builtins"
Browse files Browse the repository at this point in the history
Breaks PPC bots, see D143467.

This reverts commit 651b0e2.
  • Loading branch information
vitalybuka committed May 8, 2023
1 parent 96bc786 commit af88d34
Show file tree
Hide file tree
Showing 21 changed files with 1,179 additions and 1,075 deletions.
1,445 changes: 632 additions & 813 deletions clang/include/clang/Basic/BuiltinsPPC.def

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions clang/include/clang/Basic/DiagnosticSemaKinds.td
Expand Up @@ -10050,6 +10050,12 @@ def err_mips_builtin_requires_dspr2 : Error<
"this builtin requires 'dsp r2' ASE, please use -mdspr2">;
def err_mips_builtin_requires_msa : Error<
"this builtin requires 'msa' ASE, please use -mmsa">;
def err_ppc_builtin_only_on_arch : Error<
"this builtin is only valid on POWER%0 or later CPUs">;
def err_ppc_builtin_requires_vsx : Error<
"this builtin requires VSX to be enabled">;
def err_ppc_builtin_requires_htm : Error<
"this builtin requires HTM to be enabled">;
def err_ppc_builtin_requires_abi : Error<
"this builtin requires ABI -mabi=%0">;
def err_ppc_invalid_use_mma_type : Error<
Expand Down
2 changes: 0 additions & 2 deletions clang/lib/Basic/Targets/PPC.cpp
Expand Up @@ -21,8 +21,6 @@ using namespace clang::targets;
static constexpr Builtin::Info BuiltinInfo[] = {
#define BUILTIN(ID, TYPE, ATTRS) \
{#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
{#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
{#ID, TYPE, ATTRS, nullptr, HeaderDesc::HEADER, ALL_LANGUAGES},
#include "clang/Basic/BuiltinsPPC.def"
Expand Down
4 changes: 2 additions & 2 deletions clang/lib/CodeGen/CGBuiltin.cpp
Expand Up @@ -16548,7 +16548,7 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
// use custom code generation to expand a builtin call with a pointer to a
// load (if the corresponding instruction accumulates its result) followed by
// the call to the intrinsic and a store of the result.
#define CUSTOM_BUILTIN(Name, Intr, Types, Accumulate, Feature) \
#define CUSTOM_BUILTIN(Name, Intr, Types, Accumulate) \
case PPC::BI__builtin_##Name:
#include "clang/Basic/BuiltinsPPC.def"
{
Expand Down Expand Up @@ -16598,7 +16598,7 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
}
bool Accumulate;
switch (BuiltinID) {
#define CUSTOM_BUILTIN(Name, Intr, Types, Acc, Feature) \
#define CUSTOM_BUILTIN(Name, Intr, Types, Acc) \
case PPC::BI__builtin_##Name: \
ID = Intrinsic::ppc_##Intr; \
Accumulate = Acc; \
Expand Down
150 changes: 139 additions & 11 deletions clang/lib/Sema/SemaChecking.cpp
Expand Up @@ -4172,6 +4172,21 @@ static bool isPPC_64Builtin(unsigned BuiltinID) {
return false;
}

static bool SemaFeatureCheck(Sema &S, CallExpr *TheCall,
StringRef FeatureToCheck, unsigned DiagID,
StringRef DiagArg = "") {
if (S.Context.getTargetInfo().hasFeature(FeatureToCheck))
return false;

if (DiagArg.empty())
S.Diag(TheCall->getBeginLoc(), DiagID) << TheCall->getSourceRange();
else
S.Diag(TheCall->getBeginLoc(), DiagID)
<< DiagArg << TheCall->getSourceRange();

return true;
}

/// Returns true if the argument consists of one contiguous run of 1s with any
/// number of 0s on either side. The 1s are allowed to wrap from LSB to MSB, so
/// 0x000FFF0, 0x0000FFFF, 0xFF0000FF, 0x0 are all runs. 0x0F0F0000 is not,
Expand Down Expand Up @@ -4216,16 +4231,42 @@ bool Sema::CheckPPCBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
return SemaBuiltinConstantArgRange(TheCall, 0, 0, 3);
case PPC::BI__builtin_tbegin:
case PPC::BI__builtin_tend:
return SemaBuiltinConstantArgRange(TheCall, 0, 0, 1);
return SemaBuiltinConstantArgRange(TheCall, 0, 0, 1) ||
SemaFeatureCheck(*this, TheCall, "htm",
diag::err_ppc_builtin_requires_htm);
case PPC::BI__builtin_tsr:
return SemaBuiltinConstantArgRange(TheCall, 0, 0, 7);
return SemaBuiltinConstantArgRange(TheCall, 0, 0, 7) ||
SemaFeatureCheck(*this, TheCall, "htm",
diag::err_ppc_builtin_requires_htm);
case PPC::BI__builtin_tabortwc:
case PPC::BI__builtin_tabortdc:
return SemaBuiltinConstantArgRange(TheCall, 0, 0, 31);
return SemaBuiltinConstantArgRange(TheCall, 0, 0, 31) ||
SemaFeatureCheck(*this, TheCall, "htm",
diag::err_ppc_builtin_requires_htm);
case PPC::BI__builtin_tabortwci:
case PPC::BI__builtin_tabortdci:
return SemaBuiltinConstantArgRange(TheCall, 0, 0, 31) ||
SemaBuiltinConstantArgRange(TheCall, 2, 0, 31);
return SemaFeatureCheck(*this, TheCall, "htm",
diag::err_ppc_builtin_requires_htm) ||
(SemaBuiltinConstantArgRange(TheCall, 0, 0, 31) ||
SemaBuiltinConstantArgRange(TheCall, 2, 0, 31));
case PPC::BI__builtin_tabort:
case PPC::BI__builtin_tcheck:
case PPC::BI__builtin_treclaim:
case PPC::BI__builtin_trechkpt:
case PPC::BI__builtin_tendall:
case PPC::BI__builtin_tresume:
case PPC::BI__builtin_tsuspend:
case PPC::BI__builtin_get_texasr:
case PPC::BI__builtin_get_texasru:
case PPC::BI__builtin_get_tfhar:
case PPC::BI__builtin_get_tfiar:
case PPC::BI__builtin_set_texasr:
case PPC::BI__builtin_set_texasru:
case PPC::BI__builtin_set_tfhar:
case PPC::BI__builtin_set_tfiar:
case PPC::BI__builtin_ttest:
return SemaFeatureCheck(*this, TheCall, "htm",
diag::err_ppc_builtin_requires_htm);
// According to GCC 'Basic PowerPC Built-in Functions Available on ISA 2.05',
// __builtin_(un)pack_longdouble are available only if long double uses IBM
// extended double representation.
Expand All @@ -4246,8 +4287,26 @@ bool Sema::CheckPPCBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
case PPC::BI__builtin_vsx_xxpermdi:
case PPC::BI__builtin_vsx_xxsldwi:
return SemaBuiltinVSX(TheCall);
case PPC::BI__builtin_divwe:
case PPC::BI__builtin_divweu:
case PPC::BI__builtin_divde:
case PPC::BI__builtin_divdeu:
return SemaFeatureCheck(*this, TheCall, "extdiv",
diag::err_ppc_builtin_only_on_arch, "7");
case PPC::BI__builtin_bpermd:
return SemaFeatureCheck(*this, TheCall, "bpermd",
diag::err_ppc_builtin_only_on_arch, "7");
case PPC::BI__builtin_unpack_vector_int128:
return SemaBuiltinConstantArgRange(TheCall, 1, 0, 1);
return SemaFeatureCheck(*this, TheCall, "vsx",
diag::err_ppc_builtin_only_on_arch, "7") ||
SemaBuiltinConstantArgRange(TheCall, 1, 0, 1);
case PPC::BI__builtin_pack_vector_int128:
return SemaFeatureCheck(*this, TheCall, "vsx",
diag::err_ppc_builtin_only_on_arch, "7");
case PPC::BI__builtin_pdepd:
case PPC::BI__builtin_pextd:
return SemaFeatureCheck(*this, TheCall, "isa-v31-instructions",
diag::err_ppc_builtin_only_on_arch, "10");
case PPC::BI__builtin_altivec_vgnb:
return SemaBuiltinConstantArgRange(TheCall, 1, 2, 7);
case PPC::BI__builtin_vsx_xxeval:
Expand All @@ -4261,8 +4320,17 @@ bool Sema::CheckPPCBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
case PPC::BI__builtin_ppc_tw:
case PPC::BI__builtin_ppc_tdw:
return SemaBuiltinConstantArgRange(TheCall, 2, 1, 31);
case PPC::BI__builtin_ppc_cmpeqb:
case PPC::BI__builtin_ppc_setb:
case PPC::BI__builtin_ppc_maddhd:
case PPC::BI__builtin_ppc_maddhdu:
case PPC::BI__builtin_ppc_maddld:
return SemaFeatureCheck(*this, TheCall, "isa-v30-instructions",
diag::err_ppc_builtin_only_on_arch, "9");
case PPC::BI__builtin_ppc_cmprb:
return SemaBuiltinConstantArgRange(TheCall, 0, 0, 1);
return SemaFeatureCheck(*this, TheCall, "isa-v30-instructions",
diag::err_ppc_builtin_only_on_arch, "9") ||
SemaBuiltinConstantArgRange(TheCall, 0, 0, 1);
// For __rlwnm, __rlwimi and __rldimi, the last parameter mask must
// be a constant that represents a contiguous bit field.
case PPC::BI__builtin_ppc_rlwnm:
Expand All @@ -4271,8 +4339,15 @@ bool Sema::CheckPPCBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
case PPC::BI__builtin_ppc_rldimi:
return SemaBuiltinConstantArg(TheCall, 2, Result) ||
SemaValueIsRunOfOnes(TheCall, 3);
case PPC::BI__builtin_ppc_extract_exp:
case PPC::BI__builtin_ppc_extract_sig:
case PPC::BI__builtin_ppc_insert_exp:
return SemaFeatureCheck(*this, TheCall, "power9-vector",
diag::err_ppc_builtin_only_on_arch, "9");
case PPC::BI__builtin_ppc_addex: {
if (SemaBuiltinConstantArgRange(TheCall, 2, 0, 3))
if (SemaFeatureCheck(*this, TheCall, "isa-v30-instructions",
diag::err_ppc_builtin_only_on_arch, "9") ||
SemaBuiltinConstantArgRange(TheCall, 2, 0, 3))
return true;
// Output warning for reserved values 1 to 3.
int ArgValue =
Expand All @@ -4294,19 +4369,41 @@ bool Sema::CheckPPCBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
return SemaBuiltinConstantArgPower2(TheCall, 0);
case PPC::BI__builtin_ppc_rdlam:
return SemaValueIsRunOfOnes(TheCall, 2);
case PPC::BI__builtin_ppc_icbt:
case PPC::BI__builtin_ppc_sthcx:
case PPC::BI__builtin_ppc_stbcx:
case PPC::BI__builtin_ppc_lharx:
case PPC::BI__builtin_ppc_lbarx:
return SemaFeatureCheck(*this, TheCall, "isa-v207-instructions",
diag::err_ppc_builtin_only_on_arch, "8");
case PPC::BI__builtin_vsx_ldrmb:
case PPC::BI__builtin_vsx_strmb:
return SemaBuiltinConstantArgRange(TheCall, 1, 1, 16);
return SemaFeatureCheck(*this, TheCall, "isa-v207-instructions",
diag::err_ppc_builtin_only_on_arch, "8") ||
SemaBuiltinConstantArgRange(TheCall, 1, 1, 16);
case PPC::BI__builtin_altivec_vcntmbb:
case PPC::BI__builtin_altivec_vcntmbh:
case PPC::BI__builtin_altivec_vcntmbw:
case PPC::BI__builtin_altivec_vcntmbd:
return SemaBuiltinConstantArgRange(TheCall, 1, 0, 1);
case PPC::BI__builtin_darn:
case PPC::BI__builtin_darn_raw:
case PPC::BI__builtin_darn_32:
return SemaFeatureCheck(*this, TheCall, "isa-v30-instructions",
diag::err_ppc_builtin_only_on_arch, "9");
case PPC::BI__builtin_vsx_xxgenpcvbm:
case PPC::BI__builtin_vsx_xxgenpcvhm:
case PPC::BI__builtin_vsx_xxgenpcvwm:
case PPC::BI__builtin_vsx_xxgenpcvdm:
return SemaBuiltinConstantArgRange(TheCall, 1, 0, 3);
case PPC::BI__builtin_ppc_compare_exp_uo:
case PPC::BI__builtin_ppc_compare_exp_lt:
case PPC::BI__builtin_ppc_compare_exp_gt:
case PPC::BI__builtin_ppc_compare_exp_eq:
return SemaFeatureCheck(*this, TheCall, "isa-v30-instructions",
diag::err_ppc_builtin_only_on_arch, "9") ||
SemaFeatureCheck(*this, TheCall, "vsx",
diag::err_ppc_builtin_requires_vsx);
case PPC::BI__builtin_ppc_test_data_class: {
// Check if the first argument of the __builtin_ppc_test_data_class call is
// valid. The argument must be 'float' or 'double' or '__float128'.
Expand All @@ -4316,7 +4413,11 @@ bool Sema::CheckPPCBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
ArgType != QualType(Context.Float128Ty))
return Diag(TheCall->getBeginLoc(),
diag::err_ppc_invalid_test_data_class_type);
return SemaBuiltinConstantArgRange(TheCall, 1, 0, 127);
return SemaFeatureCheck(*this, TheCall, "isa-v30-instructions",
diag::err_ppc_builtin_only_on_arch, "9") ||
SemaFeatureCheck(*this, TheCall, "vsx",
diag::err_ppc_builtin_requires_vsx) ||
SemaBuiltinConstantArgRange(TheCall, 1, 0, 127);
}
case PPC::BI__builtin_ppc_maxfe:
case PPC::BI__builtin_ppc_minfe:
Expand Down Expand Up @@ -4345,7 +4446,11 @@ bool Sema::CheckPPCBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
<< TheCall->getArg(I)->getType() << ArgType << 1 << 0 << 0;
return false;
}
#define CUSTOM_BUILTIN(Name, Intr, Types, Acc, Feature) \
case PPC::BI__builtin_ppc_load8r:
case PPC::BI__builtin_ppc_store8r:
return SemaFeatureCheck(*this, TheCall, "isa-v206-instructions",
diag::err_ppc_builtin_only_on_arch, "7");
#define CUSTOM_BUILTIN(Name, Intr, Types, Acc) \
case PPC::BI__builtin_##Name: \
return SemaBuiltinPPCMMACall(TheCall, BuiltinID, Types);
#include "clang/Basic/BuiltinsPPC.def"
Expand Down Expand Up @@ -8583,6 +8688,29 @@ bool Sema::SemaBuiltinPPCMMACall(CallExpr *TheCall, unsigned BuiltinID,
assert((TypeStr[0] != '\0') &&
"Invalid types in PPC MMA builtin declaration");

switch (BuiltinID) {
default:
// This function is called in CheckPPCBuiltinFunctionCall where the
// BuiltinID is guaranteed to be an MMA or pair vector memop builtin, here
// we are isolating the pair vector memop builtins that can be used with mma
// off so the default case is every builtin that requires mma and paired
// vector memops.
if (SemaFeatureCheck(*this, TheCall, "paired-vector-memops",
diag::err_ppc_builtin_only_on_arch, "10") ||
SemaFeatureCheck(*this, TheCall, "mma",
diag::err_ppc_builtin_only_on_arch, "10"))
return true;
break;
case PPC::BI__builtin_vsx_lxvp:
case PPC::BI__builtin_vsx_stxvp:
case PPC::BI__builtin_vsx_assemble_pair:
case PPC::BI__builtin_vsx_disassemble_pair:
if (SemaFeatureCheck(*this, TheCall, "paired-vector-memops",
diag::err_ppc_builtin_only_on_arch, "10"))
return true;
break;
}

unsigned Mask = 0;
unsigned ArgNum = 0;

Expand Down
74 changes: 74 additions & 0 deletions clang/test/CodeGen/PowerPC/builtins-ppc-altivec.c
Expand Up @@ -9526,6 +9526,80 @@ void test10() {
// CHECK-LE: store <4 x float> %{{[0-9]+}}, ptr %{{.+}}, align 1
}

/* ----------------------------- vec_xl_be ---------------------------------- */
void test11() {
// CHECK-LABEL: define{{.*}} void @test11
// CHECK-LE-LABEL: define{{.*}} void @test11
res_vsc = vec_xl_be(param_sll, param_sc_ld);
// CHECK: load <16 x i8>, ptr %{{.+}}, align 1
// CHECK-LE: call <2 x double> @llvm.ppc.vsx.lxvd2x.be(ptr %{{[0-9]+}})
// CHECK-LE: shufflevector <16 x i8> %{{[0-9]+}}, <16 x i8> %{{[0-9]+}}, <16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8>

res_vuc = vec_xl_be(param_sll, param_uc_ld);
// CHECK: load <16 x i8>, ptr %{{.+}}, align 1
// CHECK-LE: call <2 x double> @llvm.ppc.vsx.lxvd2x.be(ptr %{{[0-9]+}})
// CHECK-LE: shufflevector <16 x i8> %{{[0-9]+}}, <16 x i8> %{{[0-9]+}}, <16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8>

res_vs = vec_xl_be(param_sll, param_s_ld);
// CHECK: load <8 x i16>, ptr %{{.+}}, align 1
// CHECK-LE: call <2 x double> @llvm.ppc.vsx.lxvd2x.be(ptr %{{[0-9]+}})
// CHECK-LE: shufflevector <8 x i16> %{{[0-9]+}}, <8 x i16> %{{[0-9]+}}, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>

res_vus = vec_xl_be(param_sll, param_us_ld);
// CHECK: load <8 x i16>, ptr %{{.+}}, align 1
// CHECK-LE: call <2 x double> @llvm.ppc.vsx.lxvd2x.be(ptr %{{[0-9]+}})
// CHECK-LE: shufflevector <8 x i16> %{{[0-9]+}}, <8 x i16> %{{[0-9]+}}, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>

res_vi = vec_xl_be(param_sll, param_i_ld);
// CHECK: load <4 x i32>, ptr %{{.+}}, align 1
// CHECK-LE: call <4 x i32> @llvm.ppc.vsx.lxvw4x.be(ptr %{{[0-9]+}})

res_vui = vec_xl_be(param_sll, param_ui_ld);
// CHECK: load <4 x i32>, ptr %{{.+}}, align 1
// CHECK-LE: call <4 x i32> @llvm.ppc.vsx.lxvw4x.be(ptr %{{[0-9]+}})

res_vf = vec_xl_be(param_sll, param_f_ld);
// CHECK: load <4 x float>, ptr %{{.+}}, align 1
// CHECK-LE: call <4 x i32> @llvm.ppc.vsx.lxvw4x.be(ptr %{{[0-9]+}})
}

/* ----------------------------- vec_xst_be --------------------------------- */
void test12() {
// CHECK-LABEL: define{{.*}} void @test12
// CHECK-LE-LABEL: define{{.*}} void @test12
vec_xst_be(vsc, param_sll, &param_sc);
// CHECK: store <16 x i8> %{{[0-9]+}}, ptr %{{.+}}, align 1
// CHECK-LE: shufflevector <16 x i8> %{{[0-9]+}}, <16 x i8> %{{[0-9]+}}, <16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8>
// CHECK-LE: call void @llvm.ppc.vsx.stxvd2x.be(<2 x double> %{{[0-9]+}}, ptr %{{[0-9]+}})

vec_xst_be(vuc, param_sll, &param_uc);
// CHECK: store <16 x i8> %{{[0-9]+}}, ptr %{{.+}}, align 1
// CHECK-LE: shufflevector <16 x i8> %{{[0-9]+}}, <16 x i8> %{{[0-9]+}}, <16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8>
// CHECK-LE: call void @llvm.ppc.vsx.stxvd2x.be(<2 x double> %{{[0-9]+}}, ptr %{{[0-9]+}})

vec_xst_be(vs, param_sll, &param_s);
// CHECK: store <8 x i16> %{{[0-9]+}}, ptr %{{.+}}, align 1
// CHECK-LE: shufflevector <8 x i16> %{{[0-9]+}}, <8 x i16> %{{[0-9]+}}, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>
// CHECK-LE: call void @llvm.ppc.vsx.stxvd2x.be(<2 x double> %{{[0-9]+}}, ptr %{{[0-9]+}})

vec_xst_be(vus, param_sll, &param_us);
// CHECK: store <8 x i16> %{{[0-9]+}}, ptr %{{.+}}, align 1
// CHECK-LE: shufflevector <8 x i16> %{{[0-9]+}}, <8 x i16> %{{[0-9]+}}, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>
// CHECK-LE: call void @llvm.ppc.vsx.stxvd2x.be(<2 x double> %{{[0-9]+}}, ptr %{{[0-9]+}})

vec_xst_be(vi, param_sll, &param_i);
// CHECK: store <4 x i32> %{{[0-9]+}}, ptr %{{.+}}, align 1
// CHECK-LE: call void @llvm.ppc.vsx.stxvw4x.be(<4 x i32> %{{[0-9]+}}, ptr %{{[0-9]+}})

vec_xst_be(vui, param_sll, &param_ui);
// CHECK: store <4 x i32> %{{[0-9]+}}, ptr %{{.+}}, align 1
// CHECK-LE: call void @llvm.ppc.vsx.stxvw4x.be(<4 x i32> %{{[0-9]+}}, ptr %{{[0-9]+}})

vec_xst_be(vf, param_sll, &param_f);
// CHECK: store <4 x float> %{{[0-9]+}}, ptr %{{.+}}, align 1
// CHECK-LE: call void @llvm.ppc.vsx.stxvw4x.be(<4 x i32> %{{[0-9]+}}, ptr %{{[0-9]+}})
}

vector float test_rsqrtf(vector float a, vector float b) {
// CHECK-LABEL: test_rsqrtf
// CHECK: call fast <4 x float> @llvm.sqrt.v4f32
Expand Down
2 changes: 1 addition & 1 deletion clang/test/CodeGen/PowerPC/builtins-ppc-fma.c
@@ -1,5 +1,5 @@
// RUN: %clang_cc1 -triple powerpc64le-gnu-linux \
// RUN: -target-feature +vsx -Wall -Wno-unused -Werror -emit-llvm %s -o - | FileCheck \
// RUN: -target-feature +altivec -Wall -Wno-unused -Werror -emit-llvm %s -o - | FileCheck \
// RUN: %s

typedef __attribute__((vector_size(4 * sizeof(float)))) float vec_float;
Expand Down
2 changes: 1 addition & 1 deletion clang/test/CodeGen/PowerPC/builtins-ppc-fpconstrained.c
Expand Up @@ -12,7 +12,7 @@
// RUN: -o - %s | FileCheck --check-prefix=CHECK-ASM \
// RUN: --check-prefix=FIXME-CHECK %s
// RUN: %clang_cc1 -triple powerpcspe -S -ffp-exception-behavior=strict \
// RUN: -target-feature +vsx -fexperimental-strict-floating-point -emit-llvm \
// RUN: -target-feature +spe -fexperimental-strict-floating-point -emit-llvm \
// RUN: %s -o - | FileCheck --check-prefix=CHECK-CONSTRAINED %s

typedef __attribute__((vector_size(4 * sizeof(float)))) float vec_float;
Expand Down

0 comments on commit af88d34

Please sign in to comment.