[clang] [llvm] Implement a subset of builtin_cpu_supports() features (PR #82809)
zhijian lin via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 29 07:25:20 PST 2024
https://github.com/diggerlin updated https://github.com/llvm/llvm-project/pull/82809
>From cef79b36bcb3f4b7452d01aafdf111ff0e50605d Mon Sep 17 00:00:00 2001
From: zhijian <zhijian at ca.ibm.com>
Date: Fri, 23 Feb 2024 13:23:18 -0500
Subject: [PATCH 1/8] Implement a subset of builtin_cpu_supports() features
---
clang/lib/Basic/Targets/PPC.cpp | 12 ++
clang/lib/Basic/Targets/PPC.h | 9 +-
clang/lib/CodeGen/CGBuiltin.cpp | 99 ++++++++---
clang/lib/Sema/SemaChecking.cpp | 6 +-
clang/test/CodeGen/aix-builtin-cpu-is.c | 4 +-
clang/test/CodeGen/aix-builtin-cpu-supports.c | 154 ++++++++++++++++++
clang/test/Sema/aix-builtin-cpu-unsupports.c | 40 ++++-
.../test/Sema/builtin-cpu-unsupports-AIX-Os.c | 9 +
.../llvm/TargetParser/PPCTargetParser.def | 73 ++++++++-
9 files changed, 369 insertions(+), 37 deletions(-)
create mode 100644 clang/test/CodeGen/aix-builtin-cpu-supports.c
create mode 100644 clang/test/Sema/builtin-cpu-unsupports-AIX-Os.c
diff --git a/clang/lib/Basic/Targets/PPC.cpp b/clang/lib/Basic/Targets/PPC.cpp
index aebe51bfa4daad..17b462c73bfc6a 100644
--- a/clang/lib/Basic/Targets/PPC.cpp
+++ b/clang/lib/Basic/Targets/PPC.cpp
@@ -897,6 +897,18 @@ ArrayRef<Builtin::Info> PPCTargetInfo::getTargetBuiltins() const {
}
bool PPCTargetInfo::validateCpuSupports(StringRef FeatureStr) const {
+ llvm::Triple Triple = getTriple();
+ if (Triple.isOSAIX()) {
+#define PPC_AIX_FEATURE(NAME, DESC, SUPPORT_METHOD, INDEX, MASK, OP, VALUE) \
+ .Case(NAME, true)
+ return llvm::StringSwitch<bool>(FeatureStr)
+#include "llvm/TargetParser/PPCTargetParser.def"
+ .Default(false);
+ }
+
+ assert(Triple.isOSLinux() &&
+ "__builtin_cpu_supports() is only supported for AIX and Linux.");
+
#define PPC_LNX_FEATURE(NAME, DESC, ENUMNAME, ENUMVAL, HWCAPN) .Case(NAME, true)
return llvm::StringSwitch<bool>(FeatureStr)
#include "llvm/TargetParser/PPCTargetParser.def"
diff --git a/clang/lib/Basic/Targets/PPC.h b/clang/lib/Basic/Targets/PPC.h
index 70683916a8b04f..39b52d362f36b8 100644
--- a/clang/lib/Basic/Targets/PPC.h
+++ b/clang/lib/Basic/Targets/PPC.h
@@ -364,7 +364,14 @@ class LLVM_LIBRARY_VISIBILITY PPCTargetInfo : public TargetInfo {
// have Glibc since it is Glibc that provides the HWCAP[2] in the auxv.
static constexpr int MINIMUM_AIX_OS_MAJOR = 7;
static constexpr int MINIMUM_AIX_OS_MINOR = 2;
- bool supportsCpuSupports() const override { return getTriple().isOSGlibc(); }
+ bool supportsCpuSupports() const override {
+ llvm::Triple Triple = getTriple();
+ // AIX 7.2 is the minimum requirement to support __builtin_cpu_supports().
+ return Triple.isOSGlibc() ||
+ (Triple.isOSAIX() &&
+ !Triple.isOSVersionLT(MINIMUM_AIX_OS_MAJOR, MINIMUM_AIX_OS_MINOR));
+ }
+
bool supportsCpuIs() const override {
llvm::Triple Triple = getTriple();
// AIX 7.2 is the minimum requirement to support __builtin_cpu_is().
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 734eb5a035ca49..cf4ddc52ff362a 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -16560,7 +16560,7 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
#include "llvm/TargetParser/PPCTargetParser.def"
auto GenAIXPPCBuiltinCpuExpr = [&](unsigned SupportMethod, unsigned FieldIdx,
- unsigned CompOp,
+ unsigned Mask, unsigned CompOp,
unsigned OpValue) -> Value * {
if (SupportMethod == AIX_BUILTIN_PPC_FALSE)
return llvm::ConstantInt::getFalse(ConvertType(E->getType()));
@@ -16568,24 +16568,61 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
if (SupportMethod == AIX_BUILTIN_PPC_TRUE)
return llvm::ConstantInt::getTrue(ConvertType(E->getType()));
- assert(SupportMethod <= USE_SYS_CONF && "Invalid value for SupportMethod.");
- assert((CompOp == COMP_EQ) && "Only equal comparisons are supported.");
+ assert(SupportMethod <= SYS_CALL && "Invalid value for SupportMethod.");
+
+ llvm::Value *FieldValue = nullptr;
+ if (SupportMethod == USE_SYS_CONF) {
+ llvm::Type *STy = llvm::StructType::get(PPC_SYSTEMCONFIG_TYPE);
+ llvm::Constant *SysConf =
+ CGM.CreateRuntimeVariable(STy, "_system_configuration");
+
+ // Grab the appropriate field from _system_configuration.
+ llvm::Value *Idxs[] = {ConstantInt::get(Int32Ty, 0),
+ ConstantInt::get(Int32Ty, FieldIdx)};
+
+ FieldValue = Builder.CreateGEP(STy, SysConf, Idxs);
+ FieldValue = Builder.CreateAlignedLoad(Int32Ty, FieldValue,
+ CharUnits::fromQuantity(4));
+ } else if (SupportMethod == SYS_CALL) {
+ llvm::FunctionType *FTy =
+ llvm::FunctionType::get(Int64Ty, Int32Ty, false);
+ llvm::FunctionCallee Func =
+ CGM.CreateRuntimeFunction(FTy, "getsystemcfg");
+
+ FieldValue =
+ Builder.CreateCall(Func, {ConstantInt::get(Int32Ty, FieldIdx)});
+ }
+
+ if (Mask)
+ FieldValue = Builder.CreateAnd(FieldValue, Mask);
- llvm::Type *STy = llvm::StructType::get(PPC_SYSTEMCONFIG_TYPE);
- llvm::Constant *SysConf =
- CGM.CreateRuntimeVariable(STy, "_system_configuration");
+ CmpInst::Predicate PreOp;
+ switch (CompOp) {
+ case COMP_EQ:
+ PreOp = ICmpInst::ICMP_EQ;
+ break;
+ case COMP_GT:
+ PreOp = ICmpInst::ICMP_UGT;
+ break;
+ case COMP_GE:
+ PreOp = ICmpInst::ICMP_UGE;
+ break;
+ case COMP_NE:
+ PreOp = ICmpInst::ICMP_NE;
+ break;
+ default:
+ llvm_unreachable("Compare type is not correct in PPCTargetParser.def.");
+ }
- // Grab the appropriate field from _system_configuration.
- llvm::Value *Idxs[] = {ConstantInt::get(Int32Ty, 0),
- ConstantInt::get(Int32Ty, FieldIdx)};
+ llvm::Type *ValueType = FieldValue->getType();
+ assert(
+ (ValueType->isIntegerTy(64) || ValueType->isIntegerTy(32)) &&
+ "Only 32/64-bit integers are supported in GenAIXPPCBuiltinCpuExpr().");
- llvm::Value *FieldValue = Builder.CreateGEP(STy, SysConf, Idxs);
- FieldValue = Builder.CreateAlignedLoad(Int32Ty, FieldValue,
- CharUnits::fromQuantity(4));
- assert(FieldValue->getType()->isIntegerTy(32) &&
- "Only 32-bit integers are supported in GenAIXPPCBuiltinCpuExpr().");
- return Builder.CreateICmp(ICmpInst::ICMP_EQ, FieldValue,
- ConstantInt::get(Int32Ty, OpValue));
+ return Builder.CreateICmp(
+ PreOp, FieldValue,
+ ConstantInt::get(ValueType->isIntegerTy(64) ? Int64Ty : Int32Ty,
+ OpValue));
};
switch (BuiltinID) {
@@ -16597,15 +16634,15 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
llvm::Triple Triple = getTarget().getTriple();
if (Triple.isOSAIX()) {
- unsigned IsCpuSupport, FieldIdx, CompareOp, CpuIdValue;
+ unsigned SupportMethod, FieldIdx, CompareOp, CpuIdValue;
typedef std::tuple<unsigned, unsigned, unsigned, unsigned> CPUType;
std::tie(IsCpuSupport, FieldIdx, CompareOp, CpuIdValue) =
static_cast<CPUType>(StringSwitch<CPUType>(CPUStr)
-#define PPC_AIX_CPU(NAME, SUPPORT_MAGIC, INDEX, COMPARE_OP, VALUE) \
- .Case(NAME, {SUPPORT_MAGIC, INDEX, COMPARE_OP, VALUE})
+#define PPC_AIX_CPU(NAME, SUPPORT_METHOD, INDEX, COMPARE_OP, VALUE) \
+ .Case(NAME, {SUPPORT_METHOD, INDEX, COMPARE_OP, VALUE})
#include "llvm/TargetParser/PPCTargetParser.def"
);
- return GenAIXPPCBuiltinCpuExpr(IsCpuSupport, FieldIdx, CompareOp,
+ return GenAIXPPCBuiltinCpuExpr(SupportMethod, FieldIdx, 0, CompareOp,
CpuIdValue);
}
@@ -16623,10 +16660,28 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
llvm::ConstantInt::get(Int32Ty, NumCPUID));
}
case Builtin::BI__builtin_cpu_supports: {
- unsigned FeatureWord;
- unsigned BitMask;
+ llvm::Triple Triple = getTarget().getTriple();
const Expr *CPUExpr = E->getArg(0)->IgnoreParenCasts();
StringRef CPUStr = cast<clang::StringLiteral>(CPUExpr)->getString();
+ if (Triple.isOSAIX()) {
+ unsigned SupportMethod, FieldIdx, Mask, CompOp, Value;
+ typedef std::tuple<unsigned, unsigned, unsigned, unsigned, unsigned>
+ CPUSupportType;
+ std::tie(SupportMethod, FieldIdx, Mask, CompOp, Value) =
+ static_cast<CPUSupportType>(StringSwitch<CPUSupportType>(CPUStr)
+#define PPC_AIX_FEATURE(NAME, DESC, SUPPORT_METHOD, INDEX, MASK, COMP_OP, \
+ VALUE) \
+ .Case(NAME, {SUPPORT_METHOD, INDEX, MASK, COMP_OP, VALUE})
+#include "llvm/TargetParser/PPCTargetParser.def"
+ );
+ return GenAIXPPCBuiltinCpuExpr(SupportMethod, FieldIdx, Mask, CompOp,
+ Value);
+ }
+
+ assert(Triple.isOSLinux() &&
+ "__builtin_cpu_support() is only supported for AIX and Linux.");
+ unsigned FeatureWord;
+ unsigned BitMask;
std::tie(FeatureWord, BitMask) =
StringSwitch<std::pair<unsigned, unsigned>>(CPUStr)
#define PPC_LNX_FEATURE(Name, Description, EnumName, Bitmask, FA_WORD) \
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 7fa295ebd94044..86175f1428b409 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -2161,10 +2161,8 @@ static bool SemaBuiltinCpu(Sema &S, const TargetInfo &TI, CallExpr *TheCall,
if (!SupportsBI(&TI) && SupportsBI(AuxTI))
TheTI = AuxTI;
- if (IsCPUSupports && !TheTI->supportsCpuSupports())
- return S.Diag(TheCall->getBeginLoc(), diag::err_builtin_target_unsupported)
- << SourceRange(TheCall->getBeginLoc(), TheCall->getEndLoc());
- if (!IsCPUSupports && !TheTI->supportsCpuIs())
+ if ((!IsCPUSupports && !TheTI->supportsCpuIs()) ||
+ (IsCPUSupports && !TheTI->supportsCpuSupports()))
return S.Diag(TheCall->getBeginLoc(),
TI.getTriple().isOSAIX()
? diag::err_builtin_aix_os_unsupported
diff --git a/clang/test/CodeGen/aix-builtin-cpu-is.c b/clang/test/CodeGen/aix-builtin-cpu-is.c
index b0a0dec41b56c0..e17cf7353511a2 100644
--- a/clang/test/CodeGen/aix-builtin-cpu-is.c
+++ b/clang/test/CodeGen/aix-builtin-cpu-is.c
@@ -57,12 +57,12 @@
// CHECK-NEXT: ret i32 0
// CHECK-NEXT: }
-// CHECKOP: @_system_configuration = external global { i32, i32, i32 }
+// CHECKOP: @_system_configuration = external global { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i64, i32, i32, i32, i32, i64, i64, i64, i64, i32, i32, i32, i32, i32, i32, i64, i32, i8, i8, i8, i8, i32, i32, i16, i16, [3 x i32], i32 }
// CHECKOP: define i32 @main() #0 {
// CHECKOP-NEXT: entry:
// CHECKOP-NEXT: %retval = alloca i32, align 4
// CHECKOP-NEXT: store i32 0, ptr %retval, align 4
-// CHECKOP-NEXT: %0 = load i32, ptr getelementptr inbounds ({ i32, i32, i32 }, ptr @_system_configuration, i32 0, i32 1), align 4
+// CHECKOP-NEXT: %0 = load i32, ptr getelementptr inbounds ({ i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i64, i32, i32, i32, i32, i64, i64, i64, i64, i32, i32, i32, i32, i32, i32, i64, i32, i8, i8, i8, i8, i32, i32, i16, i16, [3 x i32], i32 }, ptr @_system_configuration, i32 0, i32 1), align 4
// CHECKOP-NEXT: %1 = icmp eq i32 %0, [[VALUE]]
// CHECKOP-NEXT: %conv = zext i1 %1 to i32
// CHECKOP-NEXT: ret i32 %conv
diff --git a/clang/test/CodeGen/aix-builtin-cpu-supports.c b/clang/test/CodeGen/aix-builtin-cpu-supports.c
new file mode 100644
index 00000000000000..638f3657e978c8
--- /dev/null
+++ b/clang/test/CodeGen/aix-builtin-cpu-supports.c
@@ -0,0 +1,154 @@
+// RUN: echo "int main() { return __builtin_cpu_supports(\"4xxmac\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s \
+// RUN: --check-prefix=CHECKBOOL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"altivec\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=46 -DOP=ugt -DBIT=i32 -DVALUE=0 \
+// RUN: --check-prefixes=CHECKOP,OPRT,MEMVAR
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"booke\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s \
+// RUN: --check-prefix=CHECKBOOL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"cellbe\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s \
+// RUN: --check-prefix=CHECKBOOL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"darn\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=1 -DOP=uge -DBIT=i32 -DVALUE=262144 \
+// RUN: --check-prefixes=CHECKOP,OPRT,MEMVAR
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"efpdouble\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s \
+// RUN: --check-prefix=CHECKBOOL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"efpsingle\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s \
+// RUN: --check-prefix=CHECKBOOL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"pa6t\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s \
+// RUN: --check-prefix=CHECKBOOL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"fpu\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s \
+// RUN: --check-prefix=CHECKBOOL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"htm\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=1 -DOP=ugt -DLABLE=59 -DBIT=i64 -DVALUE=0 \
+// RUN: --check-prefixes=CHECKOP,OPRT,APICALL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"mma\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=1 -DOP=ugt -DLABLE=62 -DBIT=i64 -DVALUE=0 \
+// RUN: --check-prefixes=CHECKOP,OPRT,APICALL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"mmu\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s \
+// RUN: --check-prefix=CHECKBOOL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"arch_2_05\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s \
+// RUN: --check-prefix=CHECKBOOL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"arch_2_06\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=1 -DOP=uge -DBIT=i32 -DVALUE=32768 \
+// RUN: --check-prefixes=CHECKOP,OPRT,MEMVAR
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"arch_2_07\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=1 -DOP=uge -DBIT=i32 -DVALUE=65536 \
+// RUN: --check-prefixes=CHECKOP,OPRT,MEMVAR
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"arch_3_00\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=1 -DOP=uge -DBIT=i32 -DVALUE=131072 \
+// RUN: --check-prefixes=CHECKOP,OPRT,MEMVAR
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"arch_3_1\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=1 -DOP=uge -DBIT=i32 -DVALUE=262144 \
+// RUN: --check-prefixes=CHECKOP,OPRT,MEMVAR
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"dfp\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=53 -DOP=ne -DBIT=i32 -DVALUE=0 \
+// RUN: --check-prefixes=CHECKOP,OPRT,MEMVAR
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"power4\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s \
+// RUN: --check-prefix=CHECKBOOL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"power5\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s \
+// RUN: --check-prefix=CHECKBOOL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"power5+\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s \
+// RUN: --check-prefix=CHECKBOOL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"power6x\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s \
+// RUN: --check-prefix=CHECKBOOL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"ppc32\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s \
+// RUN: --check-prefix=CHECKBOOL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"ppc601\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s \
+// RUN: --check-prefix=CHECKBOOL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"ppc64\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s \
+// RUN: --check-prefix=CHECKBOOL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"ppcle\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s \
+// RUN: --check-prefix=CHECKBOOL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"smt\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=44 -DMASK=3 -DOP=eq -DBIT=i32 -DVALUE=3 \
+// RUN: --check-prefixes=CHECKOP,OPMASK,MEMVAR
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"spe\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s \
+// RUN: --check-prefix=CHECKBOOL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"true_le\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s \
+// RUN: --check-prefix=CHECKBOOL
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"ucache\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=5 -DMASK=2 -DOP=eq -DBIT=i32 -DVALUE=2 \
+// RUN: --check-prefixes=CHECKOP,OPMASK,MEMVAR
+
+// RUN: echo "int main() { return __builtin_cpu_supports(\"vsx\");}" > %t.c
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=46 -DOP=ugt -DBIT=i32 -DVALUE=1 \
+// RUN: --check-prefixes=CHECKOP,OPRT,MEMVAR
+
+// CHECKBOOL: define i32 @main() #0 {
+// CHECKBOOL-NEXT: entry:
+// CHECKBOOL-NEXT: %retval = alloca i32, align 4
+// CHECKBOOL-NEXT: store i32 0, ptr %retval, align 4
+// CHECKBOOL-NEXT: ret i32 [[BOOL]]
+// CHECKBOOL-NEXT: }
+
+// MEMVAR: @_system_configuration = external global { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i64, i32, i32, i32, i32, i64, i64, i64, i64, i32, i32, i32, i32, i32, i32, i64, i32, i8, i8, i8, i8, i32, i32, i16, i16, [3 x i32], i32 }
+
+// CHECKOP: define i32 @main() #0 {
+// CHECKOP-NEXT: entry:
+// CHECKOP-NEXT: %retval = alloca i32, align 4
+// CHECKOP-NEXT: store i32 0, ptr %retval, align 4
+
+// MEMVAR-NEXT: %0 = load i32, ptr getelementptr inbounds ({ i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i64, i32, i32, i32, i32, i64, i64, i64, i64, i32, i32, i32, i32, i32, i32, i64, i32, i8, i8, i8, i8, i32, i32, i16, i16, [3 x i32], i32 }, ptr @_system_configuration, i32 0, i32 [[POS]]), align 4
+// APICALL-NEXT: %0 = call i64 @getsystemcfg(i32 [[LABLE]])
+
+// OPRT-NEXT: %1 = icmp [[OP]] [[BIT]] %0, [[VALUE]]
+// OPRT-NEXT: %conv = zext i1 %1 to i32
+
+// OPMASK-NEXT: %1 = and i32 %0, [[MASK]]
+// OPMASK-NEXT: %2 = icmp [[OP]] i32 %1, [[VALUE]]
+// OPMASK-NEXT: %conv = zext i1 %2 to i32
+
+// CHECKOP-NEXT: ret i32 %conv
+// CHECKOP-NEXT: }
+
+// APICALL: declare i64 @getsystemcfg(i32)
+
+
diff --git a/clang/test/Sema/aix-builtin-cpu-unsupports.c b/clang/test/Sema/aix-builtin-cpu-unsupports.c
index 10e21867c39373..39cf3aea747f6e 100644
--- a/clang/test/Sema/aix-builtin-cpu-unsupports.c
+++ b/clang/test/Sema/aix-builtin-cpu-unsupports.c
@@ -1,6 +1,42 @@
-// RUN: %clang_cc1 -fsyntax-only -triple powerpc-ibm-aix7.1.0.0 -verify %s
+// RUN: %clang_cc1 -fsyntax-only -triple powerpc-ibm-aix7.2.0.0 -verify %s
int main(void) {
- if (__builtin_cpu_is("power8")) // expected-error {{this builtin is available only on AIX 7.2 and later operating systems}}
+ if (__builtin_cpu_supports("aes")) // expected-error {{invalid cpu feature string for builtin}}
+ return 1;
+
+ if (__builtin_cpu_supports("archpmu")) // expected-error {{invalid cpu feature string for builtin}}
+ return 1;
+
+ if (__builtin_cpu_supports("dscr")) // expected-error {{invalid cpu feature string for builtin}}
+ return 1;
+
+ if (__builtin_cpu_supports("ebb")) // expected-error {{invalid cpu feature string for builtin}}
+ return 1;
+
+ if (__builtin_cpu_supports("htm-nosc")) // expected-error {{invalid cpu feature string for builtin}}
+ return 1;
+
+ if (__builtin_cpu_supports("htm-no-suspend")) // expected-error {{invalid cpu feature string for builtin}}
+ return 1;
+
+ if (__builtin_cpu_supports("ic_snoop")) // expected-error {{invalid cpu feature string for builtin}}
+ return 1;
+
+ if (__builtin_cpu_supports("ieee128")) // expected-error {{invalid cpu feature string for builtin}}
+ return 1;
+
+ if (__builtin_cpu_supports("isel")) // expected-error {{invalid cpu feature string for builtin}}
+ return 1;
+
+ if (__builtin_cpu_supports("notb")) // expected-error {{invalid cpu feature string for builtin}}
+ return 1;
+
+ if (__builtin_cpu_supports("scv")) // expected-error {{invalid cpu feature string for builtin}}
+ return 1;
+
+ if (__builtin_cpu_supports("tar")) // expected-error {{invalid cpu feature string for builtin}}
+ return 1;
+
+ if (__builtin_cpu_supports("vcrypto")) // expected-error {{invalid cpu feature string for builtin}}
return 1;
}
diff --git a/clang/test/Sema/builtin-cpu-unsupports-AIX-Os.c b/clang/test/Sema/builtin-cpu-unsupports-AIX-Os.c
new file mode 100644
index 00000000000000..25d25b2ac4c924
--- /dev/null
+++ b/clang/test/Sema/builtin-cpu-unsupports-AIX-Os.c
@@ -0,0 +1,9 @@
+// RUN: %clang_cc1 -fsyntax-only -triple powerpc-ibm-aix7.1.0.0 -verify %s
+
+int main(void) {
+ if (__builtin_cpu_is("power8")) // expected-error {{this builtin is available only on AIX 7.2 and later operating systems}}
+ return 1;
+
+ if (__builtin_cpu_supports("power8")) // expected-error {{this builtin is available only on AIX 7.2 and later operating systems}}
+ return 1;
+}
diff --git a/llvm/include/llvm/TargetParser/PPCTargetParser.def b/llvm/include/llvm/TargetParser/PPCTargetParser.def
index 88c7304659c4d9..621bd2c73fb9c9 100644
--- a/llvm/include/llvm/TargetParser/PPCTargetParser.def
+++ b/llvm/include/llvm/TargetParser/PPCTargetParser.def
@@ -132,6 +132,14 @@ PPC_LNX_CPU("power10",47)
#ifndef AIX_POWERPC_USE_SYS_CONF
#define AIX_POWERPC_USE_SYS_CONF
#define AIX_SYSCON_IMPL_IDX 1
+ #define AIX_SYSCON_CACHE_IDX 5
+ #define AIX_SYSCON_SMT_IDX 44
+ #define AIX_SYSCON_VMX_IDX 46
+ #define AIX_SYSCON_DFP_IDX 53
+
+ #define SC_TM_VER 59
+ #define SC_MMA_VER 62
+
#define AIX_PPC7_VALUE 0x00008000
#define AIX_PPC8_VALUE 0x00010000
#define AIX_PPC9_VALUE 0x00020000
@@ -141,23 +149,30 @@ PPC_LNX_CPU("power10",47)
#define AIX_BUILTIN_PPC_TRUE 1
#define AIX_BUILTIN_PPC_FALSE 0
#define USE_SYS_CONF 2
+ #define SYS_CALL 3
// Supported COMPARE_OP values.
#define COMP_EQ 0
+ #define COMP_GT 1
+ #define COMP_GE 2
+ #define COMP_NE 3
#endif
// The value of SUPPORT_METHOD can be AIX_BUILTIN_PPC_TRUE,
-// AIX_BUILTIN_PPC_FALSE, or USE_SYS_CONF.
-// When the value of SUPPORT_METHOD is USE_SYS_CONF, the return value
-// depends on the result of comparing the data member of
-// _system_configuration specified by INDEX with a certain value.
+// AIX_BUILTIN_PPC_FALSE, USE_SYS_CONF, API_CALL.
+// When the value of SUPPORT_METHOD is set to USE_SYS_CONF, the return value
+// depends on comparing VALUE with the specified data member of
+// _system_configuration at INDEX, where the data member is masked by Mask.
+// When the SUPPORT_METHOD value is set to SYS_CALL, the return value depends
+// on comparing a VALUE with the return value of calling `getsystemcfg`
+// with the parameter INDEX, which is then masked by Mask.
#ifndef PPC_AIX_CPU
#define PPC_AIX_CPU(NAME, SUPPORT_METHOD, INDEX, COMPARE_OP, VALUE)
#endif
-// __builtin_cpu_is() is supported only on Power7 and up.
+// __builtin_cpu_is() and __builtin_cpu_support() are supported only on Power7 and up.
PPC_AIX_CPU("power4",AIX_BUILTIN_PPC_FALSE,0,0,0)
PPC_AIX_CPU("ppc970",AIX_BUILTIN_PPC_FALSE,0,0,0)
PPC_AIX_CPU("power5",AIX_BUILTIN_PPC_FALSE,0,0,0)
@@ -176,11 +191,57 @@ PPC_AIX_CPU("power9",USE_SYS_CONF,AIX_SYSCON_IMPL_IDX,COMP_EQ,AIX_PPC9_VALUE)
PPC_AIX_CPU("power10",USE_SYS_CONF,AIX_SYSCON_IMPL_IDX,COMP_EQ,AIX_PPC10_VALUE)
#undef PPC_AIX_CPU
+#ifndef PPC_AIX_FEATURE
+#define PPC_AIX_FEATURE(NAME,DESC,SUPPORT_METHOD,INDEX,MASK,COMPARE_OP,VALUE)
+#endif
+
+PPC_AIX_FEATURE("4xxmac","4xx CPU has a Multiply Accumulator",AIX_BUILTIN_PPC_FALSE,0,0,0,0)
+PPC_AIX_FEATURE("altivec","CPU has a SIMD/Vector Unit",USE_SYS_CONF,AIX_SYSCON_VMX_IDX,0,COMP_GT,0)
+PPC_AIX_FEATURE("arch_2_05","CPU supports ISA 205 (eg, POWER6)",AIX_BUILTIN_PPC_TRUE,0,0,0,0)
+PPC_AIX_FEATURE("arch_2_06","CPU supports ISA 206 (eg, POWER7)",USE_SYS_CONF,AIX_SYSCON_IMPL_IDX,0,COMP_GE,AIX_PPC7_VALUE)
+PPC_AIX_FEATURE("arch_2_07","CPU supports ISA 207 (eg, POWER8)",USE_SYS_CONF,AIX_SYSCON_IMPL_IDX,0,COMP_GE,AIX_PPC8_VALUE)
+PPC_AIX_FEATURE("arch_3_00","CPU supports ISA 30 (eg, POWER9)", USE_SYS_CONF,AIX_SYSCON_IMPL_IDX,0,COMP_GE,AIX_PPC9_VALUE)
+PPC_AIX_FEATURE("arch_3_1","CPU supports ISA 31 (eg, POWER10)", USE_SYS_CONF,AIX_SYSCON_IMPL_IDX,0,COMP_GE,AIX_PPC10_VALUE)
+PPC_AIX_FEATURE("booke","CPU supports the Embedded ISA category",AIX_BUILTIN_PPC_FALSE,0,0,0,0)
+PPC_AIX_FEATURE("cellbe","CPU has a CELL broadband engine",AIX_BUILTIN_PPC_FALSE,0,0,0,0)
+PPC_AIX_FEATURE("darn","CPU supports the darn (deliver a random number) instruction",USE_SYS_CONF,AIX_SYSCON_IMPL_IDX,0,COMP_GE,AIX_PPC10_VALUE)
+PPC_AIX_FEATURE("dfp","CPU has a decimal floating point unit",USE_SYS_CONF,AIX_SYSCON_DFP_IDX,0,COMP_NE,0)
+PPC_AIX_FEATURE("efpsingle","CPU has a SPE single precision floating point unit",AIX_BUILTIN_PPC_FALSE,0,0,0,0)
+PPC_AIX_FEATURE("efpdouble","CPU has a SPE double precision floating point unit",AIX_BUILTIN_PPC_FALSE,0,0,0,0)
+PPC_AIX_FEATURE("fpu","CPU has a floating point unit",AIX_BUILTIN_PPC_TRUE,0,0,0,0)
+PPC_AIX_FEATURE("htm","CPU has hardware transaction memory instructions",SYS_CALL,SC_TM_VER,0,COMP_GT,0)
+PPC_AIX_FEATURE("mma","CPU has hardware transaction memory instructions",SYS_CALL,SC_MMA_VER,0,COMP_GT,0)
+PPC_AIX_FEATURE("mmu","CPU has a memory management unit",AIX_BUILTIN_PPC_TRUE,0,0,0,0)
+PPC_AIX_FEATURE("pa6t","CPU supports the PA Semi 6T CORE ISA",AIX_BUILTIN_PPC_FALSE,0,0,0,0)
+PPC_AIX_FEATURE("power4","CPU supports ISA 200 (eg, POWER4)",AIX_BUILTIN_PPC_TRUE,0,0,0,0)
+PPC_AIX_FEATURE("power5","CPU supports ISA 202 (eg, POWER5)",AIX_BUILTIN_PPC_TRUE,0,0,0,0)
+PPC_AIX_FEATURE("power5+","CPU supports ISA 203 (eg, POWER5+)",AIX_BUILTIN_PPC_TRUE,0,0,0,0)
+PPC_AIX_FEATURE("power6x","CPU supports ISA 205 (eg, POWER6)",AIX_BUILTIN_PPC_FALSE,0,0,0,0)
+PPC_AIX_FEATURE("ppc32","CPU supports 32-bit mode execution",AIX_BUILTIN_PPC_TRUE,0,0,0,0)
+PPC_AIX_FEATURE("ppc601","CPU supports the old POWER ISA (eg, 601)",AIX_BUILTIN_PPC_FALSE,0,0,0,0)
+PPC_AIX_FEATURE("ppc64","CPU supports 64-bit mode execution",AIX_BUILTIN_PPC_TRUE,0,0,0,0)
+PPC_AIX_FEATURE("ppcle","CPU supports a little-endian mode that uses address swizzling",AIX_BUILTIN_PPC_FALSE,0,0,0,0)
+PPC_AIX_FEATURE("smt","CPU support simultaneous multi-threading",USE_SYS_CONF,AIX_SYSCON_SMT_IDX,0x3,COMP_EQ,0x3)
+PPC_AIX_FEATURE("spe","CPU has a signal processing extension unit",AIX_BUILTIN_PPC_FALSE,0,0,0,0)
+PPC_AIX_FEATURE("true_le","CPU supports true little-endian mode",AIX_BUILTIN_PPC_TRUE,0,0,0,0)
+PPC_AIX_FEATURE("ucache","CPU has unified I/D cache",USE_SYS_CONF,AIX_SYSCON_CACHE_IDX,0x00000002,COMP_EQ,0x00000002)
+PPC_AIX_FEATURE("vsx","CPU supports the vector-scalar extension",USE_SYS_CONF,AIX_SYSCON_VMX_IDX,0,COMP_GT,1)
+#undef PPC_AIX_FEATURE
+
// PPC_SYSTEMCONFIG_TYPE defines the IR data structure of kernel variable
// `_system_configuration`, that is found in the AIX OS header file: </usr/include/sys/systemcfg.h>.
#ifndef PPC_SYSTEMCONFIG_TYPE
#define PPC_SYSTEMCONFIG_TYPE \
-Int32Ty, Int32Ty, Int32Ty
+Int32Ty, Int32Ty, Int32Ty, Int32Ty, Int32Ty, Int32Ty, \
+Int32Ty, Int32Ty, Int32Ty, Int32Ty, Int32Ty, Int32Ty, \
+Int32Ty, Int32Ty, Int32Ty, Int32Ty, Int32Ty, Int32Ty, \
+Int32Ty, Int32Ty, Int32Ty, Int32Ty, Int32Ty, Int32Ty, \
+Int32Ty, Int32Ty, Int32Ty, Int32Ty, Int32Ty, Int32Ty, \
+Int32Ty, Int32Ty, Int64Ty, Int32Ty, Int32Ty, Int32Ty, \
+Int32Ty, Int64Ty, Int64Ty, Int64Ty, Int64Ty, Int32Ty, \
+Int32Ty, Int32Ty, Int32Ty, Int32Ty, Int32Ty, Int64Ty, \
+Int32Ty, Int8Ty, Int8Ty, Int8Ty, Int8Ty, Int32Ty, \
+Int32Ty, Int16Ty, Int16Ty, llvm::ArrayType::get(Int32Ty,3), Int32Ty
#endif
#endif // !PPC_TGT_PARSER_UNDEF_MACROS
>From f1ab681a41b026831896263f698eec2e1123140f Mon Sep 17 00:00:00 2001
From: zhijian <zhijian at ca.ibm.com>
Date: Fri, 23 Feb 2024 13:48:44 -0500
Subject: [PATCH 2/8] minor change
---
clang/lib/Basic/Targets/PPC.cpp | 3 +-
clang/lib/CodeGen/CGBuiltin.cpp | 2 +-
clang/test/CodeGen/aix-builtin-cpu-supports.c | 69 +++++++------------
.../llvm/TargetParser/PPCTargetParser.def | 2 +-
4 files changed, 29 insertions(+), 47 deletions(-)
diff --git a/clang/lib/Basic/Targets/PPC.cpp b/clang/lib/Basic/Targets/PPC.cpp
index 17b462c73bfc6a..c2469f8166cd74 100644
--- a/clang/lib/Basic/Targets/PPC.cpp
+++ b/clang/lib/Basic/Targets/PPC.cpp
@@ -899,7 +899,8 @@ ArrayRef<Builtin::Info> PPCTargetInfo::getTargetBuiltins() const {
bool PPCTargetInfo::validateCpuSupports(StringRef FeatureStr) const {
llvm::Triple Triple = getTriple();
if (Triple.isOSAIX()) {
-#define PPC_AIX_FEATURE(NAME, DESC, SUPPORT_METHOD, INDEX, MASK, OP, VALUE) \
+#define PPC_AIX_FEATURE(NAME, DESC, SUPPORT_METHOD, INDEX, MASK, COMP_OP, \
+ VALUE) \
.Case(NAME, true)
return llvm::StringSwitch<bool>(FeatureStr)
#include "llvm/TargetParser/PPCTargetParser.def"
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index cf4ddc52ff362a..079a8c6dc07bf5 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -16679,7 +16679,7 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
}
assert(Triple.isOSLinux() &&
- "__builtin_cpu_support() is only supported for AIX and Linux.");
+ "__builtin_cpu_supports() is only supported for AIX and Linux.");
unsigned FeatureWord;
unsigned BitMask;
std::tie(FeatureWord, BitMask) =
diff --git a/clang/test/CodeGen/aix-builtin-cpu-supports.c b/clang/test/CodeGen/aix-builtin-cpu-supports.c
index 638f3657e978c8..b83fe5c149b786 100644
--- a/clang/test/CodeGen/aix-builtin-cpu-supports.c
+++ b/clang/test/CodeGen/aix-builtin-cpu-supports.c
@@ -1,38 +1,31 @@
// RUN: echo "int main() { return __builtin_cpu_supports(\"4xxmac\");}" > %t.c
-// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s \
-// RUN: --check-prefix=CHECKBOOL
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s
// RUN: echo "int main() { return __builtin_cpu_supports(\"altivec\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=46 -DOP=ugt -DBIT=i32 -DVALUE=0 \
// RUN: --check-prefixes=CHECKOP,OPRT,MEMVAR
// RUN: echo "int main() { return __builtin_cpu_supports(\"booke\");}" > %t.c
-// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s \
-// RUN: --check-prefix=CHECKBOOL
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s
// RUN: echo "int main() { return __builtin_cpu_supports(\"cellbe\");}" > %t.c
-// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s \
-// RUN: --check-prefix=CHECKBOOL
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s
// RUN: echo "int main() { return __builtin_cpu_supports(\"darn\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=1 -DOP=uge -DBIT=i32 -DVALUE=262144 \
// RUN: --check-prefixes=CHECKOP,OPRT,MEMVAR
// RUN: echo "int main() { return __builtin_cpu_supports(\"efpdouble\");}" > %t.c
-// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s \
-// RUN: --check-prefix=CHECKBOOL
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s
// RUN: echo "int main() { return __builtin_cpu_supports(\"efpsingle\");}" > %t.c
-// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s \
-// RUN: --check-prefix=CHECKBOOL
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s
// RUN: echo "int main() { return __builtin_cpu_supports(\"pa6t\");}" > %t.c
-// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s \
-// RUN: --check-prefix=CHECKBOOL
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s
// RUN: echo "int main() { return __builtin_cpu_supports(\"fpu\");}" > %t.c
-// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s \
-// RUN: --check-prefix=CHECKBOOL
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s
// RUN: echo "int main() { return __builtin_cpu_supports(\"htm\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=1 -DOP=ugt -DLABLE=59 -DBIT=i64 -DVALUE=0 \
@@ -43,12 +36,10 @@
// RUN: --check-prefixes=CHECKOP,OPRT,APICALL
// RUN: echo "int main() { return __builtin_cpu_supports(\"mmu\");}" > %t.c
-// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s \
-// RUN: --check-prefix=CHECKBOOL
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s
// RUN: echo "int main() { return __builtin_cpu_supports(\"arch_2_05\");}" > %t.c
-// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s \
-// RUN: --check-prefix=CHECKBOOL
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s
// RUN: echo "int main() { return __builtin_cpu_supports(\"arch_2_06\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=1 -DOP=uge -DBIT=i32 -DVALUE=32768 \
@@ -71,48 +62,38 @@
// RUN: --check-prefixes=CHECKOP,OPRT,MEMVAR
// RUN: echo "int main() { return __builtin_cpu_supports(\"power4\");}" > %t.c
-// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s \
-// RUN: --check-prefix=CHECKBOOL
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s
// RUN: echo "int main() { return __builtin_cpu_supports(\"power5\");}" > %t.c
-// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s \
-// RUN: --check-prefix=CHECKBOOL
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s
// RUN: echo "int main() { return __builtin_cpu_supports(\"power5+\");}" > %t.c
-// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s \
-// RUN: --check-prefix=CHECKBOOL
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s
// RUN: echo "int main() { return __builtin_cpu_supports(\"power6x\");}" > %t.c
-// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s \
-// RUN: --check-prefix=CHECKBOOL
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s
// RUN: echo "int main() { return __builtin_cpu_supports(\"ppc32\");}" > %t.c
-// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s \
-// RUN: --check-prefix=CHECKBOOL
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s
// RUN: echo "int main() { return __builtin_cpu_supports(\"ppc601\");}" > %t.c
-// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s \
-// RUN: --check-prefix=CHECKBOOL
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s
// RUN: echo "int main() { return __builtin_cpu_supports(\"ppc64\");}" > %t.c
-// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s \
-// RUN: --check-prefix=CHECKBOOL
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s
// RUN: echo "int main() { return __builtin_cpu_supports(\"ppcle\");}" > %t.c
-// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s \
-// RUN: --check-prefix=CHECKBOOL
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s
// RUN: echo "int main() { return __builtin_cpu_supports(\"smt\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=44 -DMASK=3 -DOP=eq -DBIT=i32 -DVALUE=3 \
// RUN: --check-prefixes=CHECKOP,OPMASK,MEMVAR
// RUN: echo "int main() { return __builtin_cpu_supports(\"spe\");}" > %t.c
-// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s \
-// RUN: --check-prefix=CHECKBOOL
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s
// RUN: echo "int main() { return __builtin_cpu_supports(\"true_le\");}" > %t.c
-// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s \
-// RUN: --check-prefix=CHECKBOOL
+// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s
// RUN: echo "int main() { return __builtin_cpu_supports(\"ucache\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=5 -DMASK=2 -DOP=eq -DBIT=i32 -DVALUE=2 \
@@ -122,12 +103,12 @@
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=46 -DOP=ugt -DBIT=i32 -DVALUE=1 \
// RUN: --check-prefixes=CHECKOP,OPRT,MEMVAR
-// CHECKBOOL: define i32 @main() #0 {
-// CHECKBOOL-NEXT: entry:
-// CHECKBOOL-NEXT: %retval = alloca i32, align 4
-// CHECKBOOL-NEXT: store i32 0, ptr %retval, align 4
-// CHECKBOOL-NEXT: ret i32 [[BOOL]]
-// CHECKBOOL-NEXT: }
+// CHECK: define i32 @main() #0 {
+// CHECK-NEXT: entry:
+// CHECK-NEXT: %retval = alloca i32, align 4
+// CHECK-NEXT: store i32 0, ptr %retval, align 4
+// CHECK-NEXT: ret i32 [[BOOL]]
+// CHECK-NEXT: }
// MEMVAR: @_system_configuration = external global { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i64, i32, i32, i32, i32, i64, i64, i64, i64, i32, i32, i32, i32, i32, i32, i64, i32, i8, i8, i8, i8, i32, i32, i16, i16, [3 x i32], i32 }
diff --git a/llvm/include/llvm/TargetParser/PPCTargetParser.def b/llvm/include/llvm/TargetParser/PPCTargetParser.def
index 621bd2c73fb9c9..9293a929ab2423 100644
--- a/llvm/include/llvm/TargetParser/PPCTargetParser.def
+++ b/llvm/include/llvm/TargetParser/PPCTargetParser.def
@@ -172,7 +172,7 @@ PPC_LNX_CPU("power10",47)
#define PPC_AIX_CPU(NAME, SUPPORT_METHOD, INDEX, COMPARE_OP, VALUE)
#endif
-// __builtin_cpu_is() and __builtin_cpu_support() are supported only on Power7 and up.
+// __builtin_cpu_is() and __builtin_cpu_supports() are supported only on Power7 and up.
PPC_AIX_CPU("power4",AIX_BUILTIN_PPC_FALSE,0,0,0)
PPC_AIX_CPU("ppc970",AIX_BUILTIN_PPC_FALSE,0,0,0)
PPC_AIX_CPU("power5",AIX_BUILTIN_PPC_FALSE,0,0,0)
>From c5408cac230e23f2774a30d666573ead88b1af01 Mon Sep 17 00:00:00 2001
From: zhijian <zhijian at ca.ibm.com>
Date: Fri, 23 Feb 2024 14:01:04 -0500
Subject: [PATCH 3/8] minor change
---
clang/test/CodeGen/aix-builtin-cpu-supports.c | 32 +++++++++----------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/clang/test/CodeGen/aix-builtin-cpu-supports.c b/clang/test/CodeGen/aix-builtin-cpu-supports.c
index b83fe5c149b786..db144fd318f7b2 100644
--- a/clang/test/CodeGen/aix-builtin-cpu-supports.c
+++ b/clang/test/CodeGen/aix-builtin-cpu-supports.c
@@ -3,7 +3,7 @@
// RUN: echo "int main() { return __builtin_cpu_supports(\"altivec\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=46 -DOP=ugt -DBIT=i32 -DVALUE=0 \
-// RUN: --check-prefixes=CHECKOP,OPRT,MEMVAR
+// RUN: --check-prefixes=CHECKOP,OPRT,SYSCONF
// RUN: echo "int main() { return __builtin_cpu_supports(\"booke\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s
@@ -13,7 +13,7 @@
// RUN: echo "int main() { return __builtin_cpu_supports(\"darn\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=1 -DOP=uge -DBIT=i32 -DVALUE=262144 \
-// RUN: --check-prefixes=CHECKOP,OPRT,MEMVAR
+// RUN: --check-prefixes=CHECKOP,OPRT,SYSCONF
// RUN: echo "int main() { return __builtin_cpu_supports(\"efpdouble\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s
@@ -29,11 +29,11 @@
// RUN: echo "int main() { return __builtin_cpu_supports(\"htm\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=1 -DOP=ugt -DLABLE=59 -DBIT=i64 -DVALUE=0 \
-// RUN: --check-prefixes=CHECKOP,OPRT,APICALL
+// RUN: --check-prefixes=CHECKOP,OPRT,SYSCALL
// RUN: echo "int main() { return __builtin_cpu_supports(\"mma\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=1 -DOP=ugt -DLABLE=62 -DBIT=i64 -DVALUE=0 \
-// RUN: --check-prefixes=CHECKOP,OPRT,APICALL
+// RUN: --check-prefixes=CHECKOP,OPRT,SYSCALL
// RUN: echo "int main() { return __builtin_cpu_supports(\"mmu\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s
@@ -43,23 +43,23 @@
// RUN: echo "int main() { return __builtin_cpu_supports(\"arch_2_06\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=1 -DOP=uge -DBIT=i32 -DVALUE=32768 \
-// RUN: --check-prefixes=CHECKOP,OPRT,MEMVAR
+// RUN: --check-prefixes=CHECKOP,OPRT,SYSCONF
// RUN: echo "int main() { return __builtin_cpu_supports(\"arch_2_07\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=1 -DOP=uge -DBIT=i32 -DVALUE=65536 \
-// RUN: --check-prefixes=CHECKOP,OPRT,MEMVAR
+// RUN: --check-prefixes=CHECKOP,OPRT,SYSCONF
// RUN: echo "int main() { return __builtin_cpu_supports(\"arch_3_00\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=1 -DOP=uge -DBIT=i32 -DVALUE=131072 \
-// RUN: --check-prefixes=CHECKOP,OPRT,MEMVAR
+// RUN: --check-prefixes=CHECKOP,OPRT,SYSCONF
// RUN: echo "int main() { return __builtin_cpu_supports(\"arch_3_1\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=1 -DOP=uge -DBIT=i32 -DVALUE=262144 \
-// RUN: --check-prefixes=CHECKOP,OPRT,MEMVAR
+// RUN: --check-prefixes=CHECKOP,OPRT,SYSCONF
// RUN: echo "int main() { return __builtin_cpu_supports(\"dfp\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=53 -DOP=ne -DBIT=i32 -DVALUE=0 \
-// RUN: --check-prefixes=CHECKOP,OPRT,MEMVAR
+// RUN: --check-prefixes=CHECKOP,OPRT,SYSCONF
// RUN: echo "int main() { return __builtin_cpu_supports(\"power4\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=1 %s
@@ -87,7 +87,7 @@
// RUN: echo "int main() { return __builtin_cpu_supports(\"smt\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=44 -DMASK=3 -DOP=eq -DBIT=i32 -DVALUE=3 \
-// RUN: --check-prefixes=CHECKOP,OPMASK,MEMVAR
+// RUN: --check-prefixes=CHECKOP,OPMASK,SYSCONF
// RUN: echo "int main() { return __builtin_cpu_supports(\"spe\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck -DBOOL=0 %s
@@ -97,11 +97,11 @@
// RUN: echo "int main() { return __builtin_cpu_supports(\"ucache\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=5 -DMASK=2 -DOP=eq -DBIT=i32 -DVALUE=2 \
-// RUN: --check-prefixes=CHECKOP,OPMASK,MEMVAR
+// RUN: --check-prefixes=CHECKOP,OPMASK,SYSCONF
// RUN: echo "int main() { return __builtin_cpu_supports(\"vsx\");}" > %t.c
// RUN: %clang_cc1 -triple powerpc-ibm-aix7.2.0.0 -emit-llvm -o - %t.c | FileCheck %s -DPOS=46 -DOP=ugt -DBIT=i32 -DVALUE=1 \
-// RUN: --check-prefixes=CHECKOP,OPRT,MEMVAR
+// RUN: --check-prefixes=CHECKOP,OPRT,SYSCONF
// CHECK: define i32 @main() #0 {
// CHECK-NEXT: entry:
@@ -110,15 +110,15 @@
// CHECK-NEXT: ret i32 [[BOOL]]
// CHECK-NEXT: }
-// MEMVAR: @_system_configuration = external global { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i64, i32, i32, i32, i32, i64, i64, i64, i64, i32, i32, i32, i32, i32, i32, i64, i32, i8, i8, i8, i8, i32, i32, i16, i16, [3 x i32], i32 }
+// SYSCONF: @_system_configuration = external global { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i64, i32, i32, i32, i32, i64, i64, i64, i64, i32, i32, i32, i32, i32, i32, i64, i32, i8, i8, i8, i8, i32, i32, i16, i16, [3 x i32], i32 }
// CHECKOP: define i32 @main() #0 {
// CHECKOP-NEXT: entry:
// CHECKOP-NEXT: %retval = alloca i32, align 4
// CHECKOP-NEXT: store i32 0, ptr %retval, align 4
-// MEMVAR-NEXT: %0 = load i32, ptr getelementptr inbounds ({ i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i64, i32, i32, i32, i32, i64, i64, i64, i64, i32, i32, i32, i32, i32, i32, i64, i32, i8, i8, i8, i8, i32, i32, i16, i16, [3 x i32], i32 }, ptr @_system_configuration, i32 0, i32 [[POS]]), align 4
-// APICALL-NEXT: %0 = call i64 @getsystemcfg(i32 [[LABLE]])
+// SYSCONF-NEXT: %0 = load i32, ptr getelementptr inbounds ({ i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i64, i32, i32, i32, i32, i64, i64, i64, i64, i32, i32, i32, i32, i32, i32, i64, i32, i8, i8, i8, i8, i32, i32, i16, i16, [3 x i32], i32 }, ptr @_system_configuration, i32 0, i32 [[POS]]), align 4
+// SYSCALL-NEXT: %0 = call i64 @getsystemcfg(i32 [[LABLE]])
// OPRT-NEXT: %1 = icmp [[OP]] [[BIT]] %0, [[VALUE]]
// OPRT-NEXT: %conv = zext i1 %1 to i32
@@ -130,6 +130,6 @@
// CHECKOP-NEXT: ret i32 %conv
// CHECKOP-NEXT: }
-// APICALL: declare i64 @getsystemcfg(i32)
+// SYSCALL: declare i64 @getsystemcfg(i32)
>From 4465b963e2cef85c81317921efcdcfaa2e189cf4 Mon Sep 17 00:00:00 2001
From: zhijian <zhijian at ca.ibm.com>
Date: Fri, 23 Feb 2024 14:12:04 -0500
Subject: [PATCH 4/8] change mma description
---
llvm/include/llvm/TargetParser/PPCTargetParser.def | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/include/llvm/TargetParser/PPCTargetParser.def b/llvm/include/llvm/TargetParser/PPCTargetParser.def
index 9293a929ab2423..249d29498b4c0f 100644
--- a/llvm/include/llvm/TargetParser/PPCTargetParser.def
+++ b/llvm/include/llvm/TargetParser/PPCTargetParser.def
@@ -210,7 +210,7 @@ PPC_AIX_FEATURE("efpsingle","CPU has a SPE single precision floating point unit"
PPC_AIX_FEATURE("efpdouble","CPU has a SPE double precision floating point unit",AIX_BUILTIN_PPC_FALSE,0,0,0,0)
PPC_AIX_FEATURE("fpu","CPU has a floating point unit",AIX_BUILTIN_PPC_TRUE,0,0,0,0)
PPC_AIX_FEATURE("htm","CPU has hardware transaction memory instructions",SYS_CALL,SC_TM_VER,0,COMP_GT,0)
-PPC_AIX_FEATURE("mma","CPU has hardware transaction memory instructions",SYS_CALL,SC_MMA_VER,0,COMP_GT,0)
+PPC_AIX_FEATURE("mma","CPU supports the matrix-multiply assist instructions",SYS_CALL,SC_MMA_VER,0,COMP_GT,0)
PPC_AIX_FEATURE("mmu","CPU has a memory management unit",AIX_BUILTIN_PPC_TRUE,0,0,0,0)
PPC_AIX_FEATURE("pa6t","CPU supports the PA Semi 6T CORE ISA",AIX_BUILTIN_PPC_FALSE,0,0,0,0)
PPC_AIX_FEATURE("power4","CPU supports ISA 200 (eg, POWER4)",AIX_BUILTIN_PPC_TRUE,0,0,0,0)
>From b701a9d8d69f640aa0000f291702a9361ccafc3d Mon Sep 17 00:00:00 2001
From: zhijian <zhijian at ca.ibm.com>
Date: Tue, 27 Feb 2024 11:53:59 -0500
Subject: [PATCH 5/8] address comment
---
clang/lib/CodeGen/CGBuiltin.cpp | 4 +++-
llvm/include/llvm/TargetParser/PPCTargetParser.def | 2 +-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 079a8c6dc07bf5..71625f917869e1 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -16592,6 +16592,8 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
FieldValue =
Builder.CreateCall(Func, {ConstantInt::get(Int32Ty, FieldIdx)});
}
+ assert((FieldValue != nullptr) &&
+ "unsupported SupportMethod defined in the PPCTargetParser.def.");
if (Mask)
FieldValue = Builder.CreateAnd(FieldValue, Mask);
@@ -16636,7 +16638,7 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
if (Triple.isOSAIX()) {
unsigned SupportMethod, FieldIdx, CompareOp, CpuIdValue;
typedef std::tuple<unsigned, unsigned, unsigned, unsigned> CPUType;
- std::tie(IsCpuSupport, FieldIdx, CompareOp, CpuIdValue) =
+ std::tie(SupportMethod, FieldIdx, CompareOp, CpuIdValue) =
static_cast<CPUType>(StringSwitch<CPUType>(CPUStr)
#define PPC_AIX_CPU(NAME, SUPPORT_METHOD, INDEX, COMPARE_OP, VALUE) \
.Case(NAME, {SUPPORT_METHOD, INDEX, COMPARE_OP, VALUE})
diff --git a/llvm/include/llvm/TargetParser/PPCTargetParser.def b/llvm/include/llvm/TargetParser/PPCTargetParser.def
index 249d29498b4c0f..9f02c33d13ffb8 100644
--- a/llvm/include/llvm/TargetParser/PPCTargetParser.def
+++ b/llvm/include/llvm/TargetParser/PPCTargetParser.def
@@ -160,7 +160,7 @@ PPC_LNX_CPU("power10",47)
#endif
// The value of SUPPORT_METHOD can be AIX_BUILTIN_PPC_TRUE,
-// AIX_BUILTIN_PPC_FALSE, USE_SYS_CONF, API_CALL.
+// AIX_BUILTIN_PPC_FALSE, USE_SYS_CONF, SYS_CALL.
// When the value of SUPPORT_METHOD is set to USE_SYS_CONF, the return value
// depends on comparing VALUE with the specified data member of
// _system_configuration at INDEX, where the data member is masked by Mask.
>From 2317e872ca476dbafdf49f870a7523139d7163da Mon Sep 17 00:00:00 2001
From: zhijian <zhijian at ca.ibm.com>
Date: Wed, 28 Feb 2024 10:06:48 -0500
Subject: [PATCH 6/8] addres comment
---
clang/lib/Basic/Targets/PPC.cpp | 2 +-
clang/lib/CodeGen/CGBuiltin.cpp | 3 ++-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/clang/lib/Basic/Targets/PPC.cpp b/clang/lib/Basic/Targets/PPC.cpp
index c2469f8166cd74..1d488dff825ede 100644
--- a/clang/lib/Basic/Targets/PPC.cpp
+++ b/clang/lib/Basic/Targets/PPC.cpp
@@ -919,7 +919,7 @@ bool PPCTargetInfo::validateCpuSupports(StringRef FeatureStr) const {
bool PPCTargetInfo::validateCpuIs(StringRef CPUName) const {
llvm::Triple Triple = getTriple();
if (Triple.isOSAIX()) {
-#define PPC_AIX_CPU(NAME, SUPPORT, INDEX, OP, VALUE) .Case(NAME, true)
+#define PPC_AIX_CPU(NAME, SUPPORT_METHOD, INDEX, OP, VALUE) .Case(NAME, true)
return llvm::StringSwitch<bool>(CPUName)
#include "llvm/TargetParser/PPCTargetParser.def"
.Default(false);
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 71625f917869e1..9e060ba1450bda 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -16613,7 +16613,8 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
PreOp = ICmpInst::ICMP_NE;
break;
default:
- llvm_unreachable("Compare type is not correct in PPCTargetParser.def.");
+ llvm_unreachable(
+ "Compare type does not match types defined in PPCTargetParser.def!");
}
llvm::Type *ValueType = FieldValue->getType();
>From 69320a5b99ae0b9de5b5708334282111f620b011 Mon Sep 17 00:00:00 2001
From: zhijian <zhijian at ca.ibm.com>
Date: Wed, 28 Feb 2024 16:55:37 -0500
Subject: [PATCH 7/8] address comment
---
clang/lib/CodeGen/CGBuiltin.cpp | 6 +++---
llvm/include/llvm/TargetParser/PPCTargetParser.def | 8 ++++----
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 9e060ba1450bda..108aa45a265ddd 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -16618,14 +16618,14 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
}
llvm::Type *ValueType = FieldValue->getType();
+ bool IsValueType64Bit = ValueType->isIntegerTy(64);
assert(
- (ValueType->isIntegerTy(64) || ValueType->isIntegerTy(32)) &&
+ (IsValueType64Bit || ValueType->isIntegerTy(32)) &&
"Only 32/64-bit integers are supported in GenAIXPPCBuiltinCpuExpr().");
return Builder.CreateICmp(
PreOp, FieldValue,
- ConstantInt::get(ValueType->isIntegerTy(64) ? Int64Ty : Int32Ty,
- OpValue));
+ ConstantInt::get(IsValueType64Bit ? Int64Ty : Int32Ty, OpValue));
};
switch (BuiltinID) {
diff --git a/llvm/include/llvm/TargetParser/PPCTargetParser.def b/llvm/include/llvm/TargetParser/PPCTargetParser.def
index 9f02c33d13ffb8..bae4baf8422609 100644
--- a/llvm/include/llvm/TargetParser/PPCTargetParser.def
+++ b/llvm/include/llvm/TargetParser/PPCTargetParser.def
@@ -137,8 +137,8 @@ PPC_LNX_CPU("power10",47)
#define AIX_SYSCON_VMX_IDX 46
#define AIX_SYSCON_DFP_IDX 53
- #define SC_TM_VER 59
- #define SC_MMA_VER 62
+ #define SYS_CALL_TM_VER 59
+ #define SYS_CALL_MMA_VER 62
#define AIX_PPC7_VALUE 0x00008000
#define AIX_PPC8_VALUE 0x00010000
@@ -209,8 +209,8 @@ PPC_AIX_FEATURE("dfp","CPU has a decimal floating point unit",USE_SYS_CONF,AIX_S
PPC_AIX_FEATURE("efpsingle","CPU has a SPE single precision floating point unit",AIX_BUILTIN_PPC_FALSE,0,0,0,0)
PPC_AIX_FEATURE("efpdouble","CPU has a SPE double precision floating point unit",AIX_BUILTIN_PPC_FALSE,0,0,0,0)
PPC_AIX_FEATURE("fpu","CPU has a floating point unit",AIX_BUILTIN_PPC_TRUE,0,0,0,0)
-PPC_AIX_FEATURE("htm","CPU has hardware transaction memory instructions",SYS_CALL,SC_TM_VER,0,COMP_GT,0)
-PPC_AIX_FEATURE("mma","CPU supports the matrix-multiply assist instructions",SYS_CALL,SC_MMA_VER,0,COMP_GT,0)
+PPC_AIX_FEATURE("htm","CPU has hardware transaction memory instructions",SYS_CALL,SYS_CALL_TM_VER,0,COMP_GT,0)
+PPC_AIX_FEATURE("mma","CPU supports the matrix-multiply assist instructions",SYS_CALL,SYS_CALL_MMA_VER,0,COMP_GT,0)
PPC_AIX_FEATURE("mmu","CPU has a memory management unit",AIX_BUILTIN_PPC_TRUE,0,0,0,0)
PPC_AIX_FEATURE("pa6t","CPU supports the PA Semi 6T CORE ISA",AIX_BUILTIN_PPC_FALSE,0,0,0,0)
PPC_AIX_FEATURE("power4","CPU supports ISA 200 (eg, POWER4)",AIX_BUILTIN_PPC_TRUE,0,0,0,0)
>From ea3702ec30b17776a2af19bee30f9850ed6ee007 Mon Sep 17 00:00:00 2001
From: zhijian lin <zhijian at ca.ibm.com>
Date: Thu, 29 Feb 2024 10:25:10 -0500
Subject: [PATCH 8/8] Update clang/lib/CodeGen/CGBuiltin.cpp
Co-authored-by: Amy Kwan <akwan0907 at gmail.com>
---
clang/lib/CodeGen/CGBuiltin.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 108aa45a265ddd..9c9646ac70f055 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -16593,7 +16593,7 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
Builder.CreateCall(Func, {ConstantInt::get(Int32Ty, FieldIdx)});
}
assert((FieldValue != nullptr) &&
- "unsupported SupportMethod defined in the PPCTargetParser.def.");
+ "SupportMethod value is not defined in PPCTargetParser.def.");
if (Mask)
FieldValue = Builder.CreateAnd(FieldValue, Mask);
More information about the cfe-commits
mailing list