@@ -19037,15 +19037,32 @@ Value *CodeGenFunction::EmitAMDGPUBuiltinExpr(unsigned BuiltinID,
1903719037 ASTContext::GetBuiltinTypeError Error;
1903819038 getContext().GetBuiltinType(BuiltinID, Error, &ICEArguments);
1903919039 assert(Error == ASTContext::GE_None && "Should not codegen an error");
19040+ llvm::Type *DataTy = ConvertType(E->getArg(0)->getType());
19041+ unsigned Size = DataTy->getPrimitiveSizeInBits();
19042+ llvm::Type *IntTy =
19043+ llvm::IntegerType::get(Builder.getContext(), std::max(Size, 32u));
19044+ Function *F = CGM.getIntrinsic(Intrinsic::amdgcn_update_dpp, IntTy);
19045+ assert(E->getNumArgs() == 5 || E->getNumArgs() == 6);
19046+ bool InsertOld = E->getNumArgs() == 5;
19047+ if (InsertOld)
19048+ Args.push_back(llvm::PoisonValue::get(IntTy));
1904019049 for (unsigned I = 0; I != E->getNumArgs(); ++I) {
19041- Args.push_back(EmitScalarOrConstFoldImmArg(ICEArguments, I, E));
19050+ llvm::Value *V = EmitScalarOrConstFoldImmArg(ICEArguments, I, E);
19051+ if (I <= !InsertOld && Size < 32) {
19052+ if (!DataTy->isIntegerTy())
19053+ V = Builder.CreateBitCast(
19054+ V, llvm::IntegerType::get(Builder.getContext(), Size));
19055+ V = Builder.CreateZExtOrBitCast(V, IntTy);
19056+ }
19057+ llvm::Type *ExpTy =
19058+ F->getFunctionType()->getFunctionParamType(I + InsertOld);
19059+ Args.push_back(Builder.CreateTruncOrBitCast(V, ExpTy));
1904219060 }
19043- assert(Args.size() == 5 || Args.size() == 6);
19044- if (Args.size() == 5)
19045- Args.insert(Args.begin(), llvm::PoisonValue::get(Args[0]->getType()));
19046- Function *F =
19047- CGM.getIntrinsic(Intrinsic::amdgcn_update_dpp, Args[0]->getType());
19048- return Builder.CreateCall(F, Args);
19061+ Value *V = Builder.CreateCall(F, Args);
19062+ if (Size < 32 && !DataTy->isIntegerTy())
19063+ V = Builder.CreateTrunc(
19064+ V, llvm::IntegerType::get(Builder.getContext(), Size));
19065+ return Builder.CreateTruncOrBitCast(V, DataTy);
1904919066 }
1905019067 case AMDGPU::BI__builtin_amdgcn_permlane16:
1905119068 case AMDGPU::BI__builtin_amdgcn_permlanex16:
0 commit comments