@@ -184,29 +184,7 @@ static Value *EmitAMDGCNBallotForExec(CodeGenFunction &CGF, const CallExpr *E,
184184 return Call;
185185}
186186
187- static bool IsImageSampleBuiltIn (unsigned BuiltinID) {
188- switch (BuiltinID) {
189- case clang::AMDGPU::BI__builtin_amdgcn_image_sample_1d_v4f32_f32:
190- case clang::AMDGPU::BI__builtin_amdgcn_image_sample_1d_v4f16_f32:
191- case clang::AMDGPU::BI__builtin_amdgcn_image_sample_1darray_v4f32_f32:
192- case clang::AMDGPU::BI__builtin_amdgcn_image_sample_1darray_v4f16_f32:
193- case clang::AMDGPU::BI__builtin_amdgcn_image_sample_2d_f32_f32:
194- case clang::AMDGPU::BI__builtin_amdgcn_image_sample_2d_v4f32_f32:
195- case clang::AMDGPU::BI__builtin_amdgcn_image_sample_2d_v4f16_f32:
196- case clang::AMDGPU::BI__builtin_amdgcn_image_sample_2darray_f32_f32:
197- case clang::AMDGPU::BI__builtin_amdgcn_image_sample_2darray_v4f32_f32:
198- case clang::AMDGPU::BI__builtin_amdgcn_image_sample_2darray_v4f16_f32:
199- case clang::AMDGPU::BI__builtin_amdgcn_image_sample_3d_v4f32_f32:
200- case clang::AMDGPU::BI__builtin_amdgcn_image_sample_3d_v4f16_f32:
201- case clang::AMDGPU::BI__builtin_amdgcn_image_sample_cube_v4f32_f32:
202- case clang::AMDGPU::BI__builtin_amdgcn_image_sample_cube_v4f16_f32:
203- return true ;
204- default :
205- return false ;
206- }
207- }
208-
209- static llvm::Value *LoadTextureDescPtorAsVec8I32 (CodeGenFunction &CGF,
187+ static llvm::Value *loadTextureDescPtorAsVec8I32 (CodeGenFunction &CGF,
210188 llvm::Value *RsrcPtr) {
211189 auto &B = CGF.Builder ;
212190 auto *VecTy = llvm::FixedVectorType::get (B.getInt32Ty (), 8 );
@@ -215,15 +193,13 @@ static llvm::Value *LoadTextureDescPtorAsVec8I32(CodeGenFunction &CGF,
215193 return RsrcPtr;
216194
217195 if (RsrcPtr->getType ()->isIntegerTy (32 )) {
218- unsigned AS = 8 ;
219- llvm::PointerType *VecPtrTy = llvm::PointerType::get (VecTy, AS);
196+ llvm::PointerType *VecPtrTy = llvm::PointerType::get (CGF.getLLVMContext (), 8 );
220197 llvm::Value *Ptr = B.CreateIntToPtr (RsrcPtr, VecPtrTy, " tex.rsrc.from.int" );
221198 return B.CreateAlignedLoad (VecTy, Ptr, llvm::Align (32 ), " tex.rsrc.val" );
222199 }
223200
224201 if (RsrcPtr->getType ()->isPointerTy ()) {
225- unsigned AS = RsrcPtr->getType ()->getPointerAddressSpace ();
226- auto *VecPtrTy = llvm::PointerType::get (VecTy, AS);
202+ auto *VecPtrTy = llvm::PointerType::get (CGF.getLLVMContext (), RsrcPtr->getType ()->getPointerAddressSpace ());
227203 llvm::Value *Typed = B.CreateBitCast (RsrcPtr, VecPtrTy, " tex.rsrc.typed" );
228204 return B.CreateAlignedLoad (VecTy, Typed, llvm::Align (32 ), " tex.rsrc.val" );
229205 }
@@ -232,40 +208,44 @@ static llvm::Value *LoadTextureDescPtorAsVec8I32(CodeGenFunction &CGF,
232208 if (DL.getTypeSizeInBits (RsrcPtr->getType ()) == 256 )
233209 return B.CreateBitCast (RsrcPtr, VecTy, " tex.rsrc.val" );
234210
235- RsrcPtr->getType ()->print (llvm::errs ());
236- llvm::report_fatal_error (" : Unexpected texture resource argument form" );
237- }
238-
239- static unsigned GetTextureDescIndex (unsigned BuiltinID, const CallExpr *E) {
240- unsigned N = E->getNumArgs ();
241- if (IsImageSampleBuiltIn (BuiltinID)) {
242- if (N < 5 )
243- return (unsigned )-1 ;
244- return N - 5 ;
245- }
246-
247- if (N < 3 )
248- return (unsigned )-1 ;
249- return N - 3 ;
211+ llvm::report_fatal_error (" Unexpected texture resource argument form" );
250212}
251213
252214llvm::CallInst *
253- EmitAMDGCNImageOverloadedReturnType (clang::CodeGen::CodeGenFunction &CGF,
215+ emitAMDGCNImageOverloadedReturnType (clang::CodeGen::CodeGenFunction &CGF,
254216 const clang::CallExpr *E,
255217 unsigned IntrinsicID, bool IsImageStore) {
218+ auto findTextureDescIndex = [&CGF](const CallExpr *E) -> unsigned {
219+ QualType TexQT = CGF.getContext ().AMDGPUTextureTy ;
220+ for (unsigned I = 0 , N = E->getNumArgs (); I < N; ++I) {
221+ QualType ArgTy = E->getArg (I)->getType ();
222+ if (ArgTy == TexQT) {
223+ return I;
224+ }
225+
226+ if (ArgTy.getCanonicalType () == TexQT.getCanonicalType ()) {
227+ return I;
228+ }
229+ }
230+
231+ return ~0U ;
232+ };
233+
256234 clang::SmallVector<llvm::Value *, 10 > Args;
257- unsigned RsrcIndex = GetTextureDescIndex (E->getBuiltinCallee (), E);
235+ unsigned RsrcIndex = findTextureDescIndex (E);
236+
237+ if (RsrcIndex == ~0U ) {
238+ llvm::report_fatal_error (" Invalid argument count for image builtin" );
239+ }
258240
259241 for (unsigned I = 0 ; I < E->getNumArgs (); ++I) {
260242 llvm::Value *V = CGF.EmitScalarExpr (E->getArg (I));
261243 if (I == RsrcIndex)
262- V = LoadTextureDescPtorAsVec8I32 (CGF, V);
244+ V = loadTextureDescPtorAsVec8I32 (CGF, V);
263245 Args.push_back (V);
264246 }
265247
266- llvm::Type *RetTy = CGF.ConvertType (E->getType ());
267- if (IsImageStore)
268- RetTy = CGF.VoidTy ;
248+ llvm::Type *RetTy = IsImageStore ? CGF.VoidTy : CGF.ConvertType (E->getType ());
269249 llvm::CallInst *Call = CGF.Builder .CreateIntrinsic (RetTy, IntrinsicID, Args);
270250 return Call;
271251}
@@ -1028,133 +1008,133 @@ Value *CodeGenFunction::EmitAMDGPUBuiltinExpr(unsigned BuiltinID,
10281008 }
10291009 case AMDGPU::BI__builtin_amdgcn_image_load_1d_v4f32_i32:
10301010 case AMDGPU::BI__builtin_amdgcn_image_load_1d_v4f16_i32:
1031- return EmitAMDGCNImageOverloadedReturnType (
1011+ return emitAMDGCNImageOverloadedReturnType (
10321012 *this , E, Intrinsic::amdgcn_image_load_1d, false );
10331013 case AMDGPU::BI__builtin_amdgcn_image_load_1darray_v4f32_i32:
10341014 case AMDGPU::BI__builtin_amdgcn_image_load_1darray_v4f16_i32:
1035- return EmitAMDGCNImageOverloadedReturnType (
1015+ return emitAMDGCNImageOverloadedReturnType (
10361016 *this , E, Intrinsic::amdgcn_image_load_1darray, false );
10371017 case AMDGPU::BI__builtin_amdgcn_image_load_2d_f32_i32:
10381018 case AMDGPU::BI__builtin_amdgcn_image_load_2d_v4f32_i32:
10391019 case AMDGPU::BI__builtin_amdgcn_image_load_2d_v4f16_i32:
1040- return EmitAMDGCNImageOverloadedReturnType (
1020+ return emitAMDGCNImageOverloadedReturnType (
10411021 *this , E, Intrinsic::amdgcn_image_load_2d, false );
10421022 case AMDGPU::BI__builtin_amdgcn_image_load_2darray_f32_i32:
10431023 case AMDGPU::BI__builtin_amdgcn_image_load_2darray_v4f32_i32:
10441024 case AMDGPU::BI__builtin_amdgcn_image_load_2darray_v4f16_i32:
1045- return EmitAMDGCNImageOverloadedReturnType (
1025+ return emitAMDGCNImageOverloadedReturnType (
10461026 *this , E, Intrinsic::amdgcn_image_load_2darray, false );
10471027 case AMDGPU::BI__builtin_amdgcn_image_load_3d_v4f32_i32:
10481028 case AMDGPU::BI__builtin_amdgcn_image_load_3d_v4f16_i32:
1049- return EmitAMDGCNImageOverloadedReturnType (
1029+ return emitAMDGCNImageOverloadedReturnType (
10501030 *this , E, Intrinsic::amdgcn_image_load_3d, false );
10511031 case AMDGPU::BI__builtin_amdgcn_image_load_cube_v4f32_i32:
10521032 case AMDGPU::BI__builtin_amdgcn_image_load_cube_v4f16_i32:
1053- return EmitAMDGCNImageOverloadedReturnType (
1033+ return emitAMDGCNImageOverloadedReturnType (
10541034 *this , E, Intrinsic::amdgcn_image_load_cube, false );
10551035 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1d_v4f32_i32:
10561036 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1d_v4f16_i32:
1057- return EmitAMDGCNImageOverloadedReturnType (
1037+ return emitAMDGCNImageOverloadedReturnType (
10581038 *this , E, Intrinsic::amdgcn_image_load_mip_1d, false );
10591039 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1darray_v4f32_i32:
10601040 case AMDGPU::BI__builtin_amdgcn_image_load_mip_1darray_v4f16_i32:
1061- return EmitAMDGCNImageOverloadedReturnType (
1041+ return emitAMDGCNImageOverloadedReturnType (
10621042 *this , E, Intrinsic::amdgcn_image_load_mip_1darray, false );
10631043 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2d_f32_i32:
10641044 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2d_v4f32_i32:
10651045 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2d_v4f16_i32:
1066- return EmitAMDGCNImageOverloadedReturnType (
1046+ return emitAMDGCNImageOverloadedReturnType (
10671047 *this , E, Intrinsic::amdgcn_image_load_mip_2d, false );
10681048 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2darray_f32_i32:
10691049 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2darray_v4f32_i32:
10701050 case AMDGPU::BI__builtin_amdgcn_image_load_mip_2darray_v4f16_i32:
1071- return EmitAMDGCNImageOverloadedReturnType (
1051+ return emitAMDGCNImageOverloadedReturnType (
10721052 *this , E, Intrinsic::amdgcn_image_load_mip_2darray, false );
10731053 case AMDGPU::BI__builtin_amdgcn_image_load_mip_3d_v4f32_i32:
10741054 case AMDGPU::BI__builtin_amdgcn_image_load_mip_3d_v4f16_i32:
1075- return EmitAMDGCNImageOverloadedReturnType (
1055+ return emitAMDGCNImageOverloadedReturnType (
10761056 *this , E, Intrinsic::amdgcn_image_load_mip_3d, false );
10771057 case AMDGPU::BI__builtin_amdgcn_image_load_mip_cube_v4f32_i32:
10781058 case AMDGPU::BI__builtin_amdgcn_image_load_mip_cube_v4f16_i32:
1079- return EmitAMDGCNImageOverloadedReturnType (
1059+ return emitAMDGCNImageOverloadedReturnType (
10801060 *this , E, Intrinsic::amdgcn_image_load_mip_cube, false );
10811061 case AMDGPU::BI__builtin_amdgcn_image_store_1d_v4f32_i32:
10821062 case AMDGPU::BI__builtin_amdgcn_image_store_1d_v4f16_i32:
1083- return EmitAMDGCNImageOverloadedReturnType (
1063+ return emitAMDGCNImageOverloadedReturnType (
10841064 *this , E, Intrinsic::amdgcn_image_store_1d, true );
10851065 case AMDGPU::BI__builtin_amdgcn_image_store_1darray_v4f32_i32:
10861066 case AMDGPU::BI__builtin_amdgcn_image_store_1darray_v4f16_i32:
1087- return EmitAMDGCNImageOverloadedReturnType (
1067+ return emitAMDGCNImageOverloadedReturnType (
10881068 *this , E, Intrinsic::amdgcn_image_store_1darray, true );
10891069 case AMDGPU::BI__builtin_amdgcn_image_store_2d_f32_i32:
10901070 case AMDGPU::BI__builtin_amdgcn_image_store_2d_v4f32_i32:
10911071 case AMDGPU::BI__builtin_amdgcn_image_store_2d_v4f16_i32:
1092- return EmitAMDGCNImageOverloadedReturnType (
1072+ return emitAMDGCNImageOverloadedReturnType (
10931073 *this , E, Intrinsic::amdgcn_image_store_2d, true );
10941074 case AMDGPU::BI__builtin_amdgcn_image_store_2darray_f32_i32:
10951075 case AMDGPU::BI__builtin_amdgcn_image_store_2darray_v4f32_i32:
10961076 case AMDGPU::BI__builtin_amdgcn_image_store_2darray_v4f16_i32:
1097- return EmitAMDGCNImageOverloadedReturnType (
1077+ return emitAMDGCNImageOverloadedReturnType (
10981078 *this , E, Intrinsic::amdgcn_image_store_2darray, true );
10991079 case AMDGPU::BI__builtin_amdgcn_image_store_3d_v4f32_i32:
11001080 case AMDGPU::BI__builtin_amdgcn_image_store_3d_v4f16_i32:
1101- return EmitAMDGCNImageOverloadedReturnType (
1081+ return emitAMDGCNImageOverloadedReturnType (
11021082 *this , E, Intrinsic::amdgcn_image_store_3d, true );
11031083 case AMDGPU::BI__builtin_amdgcn_image_store_cube_v4f32_i32:
11041084 case AMDGPU::BI__builtin_amdgcn_image_store_cube_v4f16_i32:
1105- return EmitAMDGCNImageOverloadedReturnType (
1085+ return emitAMDGCNImageOverloadedReturnType (
11061086 *this , E, Intrinsic::amdgcn_image_store_cube, true );
11071087 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1d_v4f32_i32:
11081088 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1d_v4f16_i32:
1109- return EmitAMDGCNImageOverloadedReturnType (
1089+ return emitAMDGCNImageOverloadedReturnType (
11101090 *this , E, Intrinsic::amdgcn_image_store_mip_1d, true );
11111091 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1darray_v4f32_i32:
11121092 case AMDGPU::BI__builtin_amdgcn_image_store_mip_1darray_v4f16_i32:
1113- return EmitAMDGCNImageOverloadedReturnType (
1093+ return emitAMDGCNImageOverloadedReturnType (
11141094 *this , E, Intrinsic::amdgcn_image_store_mip_1darray, true );
11151095 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2d_f32_i32:
11161096 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2d_v4f32_i32:
11171097 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2d_v4f16_i32:
1118- return EmitAMDGCNImageOverloadedReturnType (
1098+ return emitAMDGCNImageOverloadedReturnType (
11191099 *this , E, Intrinsic::amdgcn_image_store_mip_2d, true );
11201100 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2darray_f32_i32:
11211101 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2darray_v4f32_i32:
11221102 case AMDGPU::BI__builtin_amdgcn_image_store_mip_2darray_v4f16_i32:
1123- return EmitAMDGCNImageOverloadedReturnType (
1103+ return emitAMDGCNImageOverloadedReturnType (
11241104 *this , E, Intrinsic::amdgcn_image_store_mip_2darray, true );
11251105 case AMDGPU::BI__builtin_amdgcn_image_store_mip_3d_v4f32_i32:
11261106 case AMDGPU::BI__builtin_amdgcn_image_store_mip_3d_v4f16_i32:
1127- return EmitAMDGCNImageOverloadedReturnType (
1107+ return emitAMDGCNImageOverloadedReturnType (
11281108 *this , E, Intrinsic::amdgcn_image_store_mip_3d, true );
11291109 case AMDGPU::BI__builtin_amdgcn_image_store_mip_cube_v4f32_i32:
11301110 case AMDGPU::BI__builtin_amdgcn_image_store_mip_cube_v4f16_i32:
1131- return EmitAMDGCNImageOverloadedReturnType (
1111+ return emitAMDGCNImageOverloadedReturnType (
11321112 *this , E, Intrinsic::amdgcn_image_store_mip_cube, true );
11331113 case AMDGPU::BI__builtin_amdgcn_image_sample_1d_v4f32_f32:
11341114 case AMDGPU::BI__builtin_amdgcn_image_sample_1d_v4f16_f32:
1135- return EmitAMDGCNImageOverloadedReturnType (
1115+ return emitAMDGCNImageOverloadedReturnType (
11361116 *this , E, Intrinsic::amdgcn_image_sample_1d, false );
11371117 case AMDGPU::BI__builtin_amdgcn_image_sample_1darray_v4f32_f32:
11381118 case AMDGPU::BI__builtin_amdgcn_image_sample_1darray_v4f16_f32:
1139- return EmitAMDGCNImageOverloadedReturnType (
1119+ return emitAMDGCNImageOverloadedReturnType (
11401120 *this , E, Intrinsic::amdgcn_image_sample_1darray, false );
11411121 case AMDGPU::BI__builtin_amdgcn_image_sample_2d_f32_f32:
11421122 case AMDGPU::BI__builtin_amdgcn_image_sample_2d_v4f32_f32:
11431123 case AMDGPU::BI__builtin_amdgcn_image_sample_2d_v4f16_f32:
1144- return EmitAMDGCNImageOverloadedReturnType (
1124+ return emitAMDGCNImageOverloadedReturnType (
11451125 *this , E, Intrinsic::amdgcn_image_sample_2d, false );
11461126 case AMDGPU::BI__builtin_amdgcn_image_sample_2darray_f32_f32:
11471127 case AMDGPU::BI__builtin_amdgcn_image_sample_2darray_v4f32_f32:
11481128 case AMDGPU::BI__builtin_amdgcn_image_sample_2darray_v4f16_f32:
1149- return EmitAMDGCNImageOverloadedReturnType (
1129+ return emitAMDGCNImageOverloadedReturnType (
11501130 *this , E, Intrinsic::amdgcn_image_sample_2darray, false );
11511131 case AMDGPU::BI__builtin_amdgcn_image_sample_3d_v4f32_f32:
11521132 case AMDGPU::BI__builtin_amdgcn_image_sample_3d_v4f16_f32:
1153- return EmitAMDGCNImageOverloadedReturnType (
1133+ return emitAMDGCNImageOverloadedReturnType (
11541134 *this , E, Intrinsic::amdgcn_image_sample_3d, false );
11551135 case AMDGPU::BI__builtin_amdgcn_image_sample_cube_v4f32_f32:
11561136 case AMDGPU::BI__builtin_amdgcn_image_sample_cube_v4f16_f32:
1157- return EmitAMDGCNImageOverloadedReturnType (
1137+ return emitAMDGCNImageOverloadedReturnType (
11581138 *this , E, Intrinsic::amdgcn_image_sample_cube, false );
11591139 case AMDGPU::BI__builtin_amdgcn_mfma_scale_f32_16x16x128_f8f6f4:
11601140 case AMDGPU::BI__builtin_amdgcn_mfma_scale_f32_32x32x64_f8f6f4: {
0 commit comments