cdai2 updated this revision to Diff 493470.
cdai2 added a comment.
Forget code format
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D142948/new/
https://reviews.llvm.org/D142948
Files:
clang/include/clang/Basic/LangOptions.def
clang/include/clang/Driver/Options.td
clang/lib/CodeGen/TargetInfo.cpp
clang/lib/Frontend/CompilerInvocation.cpp
clang/test/CodeGenOpenCL/vector-to-scalar-coercion.cl
Index: clang/test/CodeGenOpenCL/vector-to-scalar-coercion.cl
===================================================================
--- /dev/null
+++ clang/test/CodeGenOpenCL/vector-to-scalar-coercion.cl
@@ -0,0 +1,23 @@
+// RUN: %clang_cc1 -x cl -triple i686-unknown-unknown -fopencl-force-vector-abi %s -O0 -emit-llvm -o - | FileCheck %s --check-prefix NOCOER
+// RUN: %clang_cc1 -x cl -triple x86_64-unknown-unknown -fopencl-force-vector-abi %s -O0 -emit-llvm -o - | FileCheck %s --check-prefix NOCOER
+// RUN: %clang_cc1 -x cl -triple i686-unknown-unknown %s -O0 -emit-llvm -o - | FileCheck %s --check-prefix COER32CL
+// RUN: %clang_cc1 -x cl -triple x86_64-unknown-unknown %s -O0 -emit-llvm -o - | FileCheck %s --check-prefix COER64CL
+// RUN: %clang_cc1 -x c -triple i686-unknown-unknown %s -O0 -emit-llvm -o - | FileCheck %s --check-prefix COER32
+// RUN: %clang_cc1 -x c -triple x86_64-unknown-unknown %s -O0 -emit-llvm -o - | FileCheck %s --check-prefix COER64
+
+typedef unsigned short ushort;
+typedef ushort ushort4 __attribute__((ext_vector_type(4)));
+
+typedef unsigned long ulong;
+typedef ulong ulong4 __attribute__((ext_vector_type(4)));
+
+ulong4 __attribute__((const)) __attribute__((overloadable)) convert_ulong4_rte(ushort4 x)
+{
+ return 1;
+}
+
+// NOCOER: define {{.*}}<4 x i64> @_Z18convert_ulong4_rteDv4_t(<4 x i16> noundef %{{.*}})
+// COER32CL: define {{.*}}<4 x i64> @_Z18convert_ulong4_rteDv4_t(i64 noundef %{{.*}})
+// COER64CL: define {{.*}}<4 x i64> @_Z18convert_ulong4_rteDv4_t(double noundef %{{.*}})
+// COER32: define {{.*}}<4 x i32> @_Z18convert_ulong4_rteDv4_t(i64 noundef %{{.*}})
+// COER64: define {{.*}}<4 x i64> @_Z18convert_ulong4_rteDv4_t(double noundef %{{.*}})
Index: clang/lib/Frontend/CompilerInvocation.cpp
===================================================================
--- clang/lib/Frontend/CompilerInvocation.cpp
+++ clang/lib/Frontend/CompilerInvocation.cpp
@@ -3832,6 +3832,8 @@
}
}
+ Opts.OpenCLForceVectorABI = Args.hasArg(OPT_fopencl_force_vector_abi);
+
// Check if -fopenmp is specified and set default version to 5.0.
Opts.OpenMP = Args.hasArg(OPT_fopenmp) ? 50 : 0;
// Check if -fopenmp-simd is specified.
Index: clang/lib/CodeGen/TargetInfo.cpp
===================================================================
--- clang/lib/CodeGen/TargetInfo.cpp
+++ clang/lib/CodeGen/TargetInfo.cpp
@@ -100,6 +100,41 @@
return Address::invalid();
}
+static ABIArgInfo classifyOpenCL(QualType Ty, ASTContext &Context) {
+ if (Ty->isVoidType())
+ return ABIArgInfo::getIgnore();
+
+ if (const EnumType *EnumTy = Ty->getAs<EnumType>())
+ Ty = EnumTy->getDecl()->getIntegerType();
+
+ if (const RecordType *RT = Ty->getAs<RecordType>())
+ return ABIArgInfo::getIndirect(Context.getTypeAlignInChars(RT),
+ /*ByVal=*/false);
+
+ if (Context.isPromotableIntegerType(Ty))
+ return ABIArgInfo::getExtend(Ty);
+
+ return ABIArgInfo::getDirect();
+}
+
+static bool doOpenCLClassification(CGFunctionInfo &FI, ASTContext &Context) {
+ if (!Context.getLangOpts().OpenCL)
+ return false;
+ if (!Context.getLangOpts().OpenCLForceVectorABI)
+ return false;
+
+ // Use OpenCL classify to prevent coercing
+ // Vector ABI must be enforced by enabling the corresponding option
+ // Otherwise, vector types will be coerced to a matching integer
+ // type to conform with ABI, e.g.: <8 x i8> will be coerced to i64
+ FI.getReturnInfo() = classifyOpenCL(FI.getReturnType(), Context);
+
+ for (auto &Arg : FI.arguments())
+ Arg.info = classifyOpenCL(Arg.type, Context);
+
+ return true;
+}
+
static llvm::Type *getVAListElementType(CodeGenFunction &CGF) {
return CGF.ConvertTypeForMem(
CGF.getContext().getBuiltinVaListType()->getPointeeType());
@@ -1964,6 +1999,10 @@
}
void X86_32ABIInfo::computeInfo(CGFunctionInfo &FI) const {
+ ASTContext &Context = getContext();
+ if (doOpenCLClassification(FI, Context))
+ return;
+
CCState State(FI);
if (IsMCUABI)
State.FreeRegs = 3;
@@ -3950,6 +3989,9 @@
}
void X86_64ABIInfo::computeInfo(CGFunctionInfo &FI) const {
+ ASTContext &Context = getContext();
+ if (doOpenCLClassification(FI, Context))
+ return;
const unsigned CallingConv = FI.getCallingConvention();
// It is possible to force Win64 calling convention on any x86_64 target by
@@ -4407,6 +4449,10 @@
}
void WinX86_64ABIInfo::computeInfo(CGFunctionInfo &FI) const {
+ ASTContext &Context = getContext();
+ if (doOpenCLClassification(FI, Context))
+ return;
+
const unsigned CC = FI.getCallingConvention();
bool IsVectorCall = CC == llvm::CallingConv::X86_VectorCall;
bool IsRegCall = CC == llvm::CallingConv::X86_RegCall;
Index: clang/include/clang/Driver/Options.td
===================================================================
--- clang/include/clang/Driver/Options.td
+++ clang/include/clang/Driver/Options.td
@@ -6260,6 +6260,9 @@
def fno_bitfield_type_align : Flag<["-"], "fno-bitfield-type-align">,
HelpText<"Ignore bit-field types when aligning structures">,
MarshallingInfoFlag<LangOpts<"NoBitFieldTypeAlign">>;
+def fopencl_force_vector_abi : Flag<["-"], "fopencl-force-vector-abi">,
+ HelpText<"Disable vector to scalar coercion for OpenCL">,
+ MarshallingInfoFlag<LangOpts<"OpenCLForceVectorABI">>;
def ffake_address_space_map : Flag<["-"], "ffake-address-space-map">,
HelpText<"Use a fake address space map; OpenCL testing purposes only">,
MarshallingInfoFlag<LangOpts<"FakeAddressSpaceMap">>;
Index: clang/include/clang/Basic/LangOptions.def
===================================================================
--- clang/include/clang/Basic/LangOptions.def
+++ clang/include/clang/Basic/LangOptions.def
@@ -331,6 +331,7 @@
"Disable recognition of objc_direct methods")
LANGOPT(CFProtectionBranch , 1, 0, "Control-Flow Branch Protection enabled")
LANGOPT(FakeAddressSpaceMap , 1, 0, "OpenCL fake address space map")
+LANGOPT(OpenCLForceVectorABI, 1, 0, "OpenCL vector to scalar coercion disabling")
ENUM_LANGOPT(AddressSpaceMapMangling , AddrSpaceMapMangling, 2, ASMM_Target, "OpenCL address space map mangling mode")
LANGOPT(IncludeDefaultHeader, 1, 0, "Include default header file for OpenCL")
LANGOPT(DeclareOpenCLBuiltins, 1, 0, "Declare OpenCL builtin functions")
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits