https://github.com/aobolensk created https://github.com/llvm/llvm-project/pull/238455
Drop the bitcast to a generic-AS `ptr`, which is invalid for `ptr addrspace(4)` on SPIR-V >From 9546bd3a5e92661dfbaadbc6b17933237bf32a15 Mon Sep 17 00:00:00 2001 From: Arseniy Obolenskiy <[email protected]> Date: Tue, 3 Nov 2026 18:51:36 +0100 Subject: [PATCH] [CIR] Fix va_list lowering for non-zero default address space Drop the bitcast to a generic-AS `ptr`, which is invalid for `ptr addrspace(4)` on SPIR-V --- .../CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 25 ++++----------- ...rargs-with-nonzero-default-address-space.c | 32 +++++++++++++++++++ 2 files changed, 38 insertions(+), 19 deletions(-) create mode 100644 clang/test/CIR/CodeGen/varargs-with-nonzero-default-address-space.c diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index d28e65ef8fa79..1b349c46a01bc 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -6296,32 +6296,22 @@ mlir::LogicalResult CIRToLLVMInlineAsmOpLowering::matchAndRewrite( mlir::LogicalResult CIRToLLVMVAStartOpLowering::matchAndRewrite( cir::VAStartOp op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) const { - auto opaquePtr = mlir::LLVM::LLVMPointerType::get(getContext()); - auto vaList = mlir::LLVM::BitcastOp::create(rewriter, op.getLoc(), opaquePtr, - adaptor.getArgList()); - rewriter.replaceOpWithNewOp<mlir::LLVM::VaStartOp>(op, vaList); + rewriter.replaceOpWithNewOp<mlir::LLVM::VaStartOp>(op, adaptor.getArgList()); return mlir::success(); } mlir::LogicalResult CIRToLLVMVAEndOpLowering::matchAndRewrite( cir::VAEndOp op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) const { - auto opaquePtr = mlir::LLVM::LLVMPointerType::get(getContext()); - auto vaList = mlir::LLVM::BitcastOp::create(rewriter, op.getLoc(), opaquePtr, - adaptor.getArgList()); - rewriter.replaceOpWithNewOp<mlir::LLVM::VaEndOp>(op, vaList); + rewriter.replaceOpWithNewOp<mlir::LLVM::VaEndOp>(op, adaptor.getArgList()); return mlir::success(); } mlir::LogicalResult CIRToLLVMVACopyOpLowering::matchAndRewrite( cir::VACopyOp op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) const { - auto opaquePtr = mlir::LLVM::LLVMPointerType::get(getContext()); - auto dstList = mlir::LLVM::BitcastOp::create(rewriter, op.getLoc(), opaquePtr, - adaptor.getDstList()); - auto srcList = mlir::LLVM::BitcastOp::create(rewriter, op.getLoc(), opaquePtr, - adaptor.getSrcList()); - rewriter.replaceOpWithNewOp<mlir::LLVM::VaCopyOp>(op, dstList, srcList); + rewriter.replaceOpWithNewOp<mlir::LLVM::VaCopyOp>(op, adaptor.getDstList(), + adaptor.getSrcList()); return mlir::success(); } @@ -6329,16 +6319,13 @@ mlir::LogicalResult CIRToLLVMVAArgOpLowering::matchAndRewrite( cir::VAArgOp op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) const { assert(!cir::MissingFeatures::vaArgABILowering()); - auto opaquePtr = mlir::LLVM::LLVMPointerType::get(getContext()); - auto vaList = mlir::LLVM::BitcastOp::create(rewriter, op.getLoc(), opaquePtr, - adaptor.getArgList()); - mlir::Type llvmType = getTypeConverter()->convertType(op->getResultTypes().front()); if (!llvmType) return mlir::failure(); - rewriter.replaceOpWithNewOp<mlir::LLVM::VaArgOp>(op, llvmType, vaList); + rewriter.replaceOpWithNewOp<mlir::LLVM::VaArgOp>(op, llvmType, + adaptor.getArgList()); return mlir::success(); } diff --git a/clang/test/CIR/CodeGen/varargs-with-nonzero-default-address-space.c b/clang/test/CIR/CodeGen/varargs-with-nonzero-default-address-space.c new file mode 100644 index 0000000000000..3247361347188 --- /dev/null +++ b/clang/test/CIR/CodeGen/varargs-with-nonzero-default-address-space.c @@ -0,0 +1,32 @@ +// RUN: %clang_cc1 -triple spirv64-unknown-unknown -fcuda-is-device -fclangir -emit-cir %s -o %t.cir +// RUN: FileCheck --input-file=%t.cir %s -check-prefix=CIR +// RUN: %clang_cc1 -triple spirv64-unknown-unknown -fcuda-is-device -fclangir -emit-llvm %s -o %t-cir.ll +// RUN: FileCheck --input-file=%t-cir.ll %s -check-prefixes=LLVM,LLVMCIR +// RUN: %clang_cc1 -triple spirv64-unknown-unknown -fcuda-is-device -emit-llvm %s -o %t.ll +// RUN: FileCheck --input-file=%t.ll %s -check-prefix=LLVM + +// TODO(cir): Add aggregate va_arg once va_arg ABI lowering supports SPIR-V. +int testva(int n, ...) { + __builtin_va_list ap; + __builtin_va_start(ap, n); + __builtin_va_list ap2; + __builtin_va_copy(ap2, ap); + int v = __builtin_va_arg(ap2, int); + __builtin_va_end(ap2); + __builtin_va_end(ap); + return v; +} + +// CIR-LABEL: cir.func {{.*}} @testva( +// CIR: cir.va_start %[[AP:.+]] : !cir.ptr<!cir.ptr<!void, target_address_space(4)>, target_address_space(4)> +// CIR: cir.va_copy %[[AP]] to %[[AP2:.+]] : !cir.ptr<!cir.ptr<!void, target_address_space(4)>, target_address_space(4)>, !cir.ptr<!cir.ptr<!void, target_address_space(4)>, target_address_space(4)> +// CIR: cir.va_arg %[[AP2]] : (!cir.ptr<!cir.ptr<!void, target_address_space(4)>, target_address_space(4)>) -> !s32i +// CIR: cir.va_end %[[AP2]] : !cir.ptr<!cir.ptr<!void, target_address_space(4)>, target_address_space(4)> +// CIR: cir.va_end %[[AP]] : !cir.ptr<!cir.ptr<!void, target_address_space(4)>, target_address_space(4)> + +// LLVM-LABEL: define spir_func i32 @testva( +// LLVM: call void @llvm.va_start.p4(ptr addrspace(4) %[[AP:.*]]) +// LLVM: call void @llvm.va_copy.p4(ptr addrspace(4) %[[AP2:.*]], ptr addrspace(4) %[[AP]]) +// LLVMCIR: va_arg ptr addrspace(4) %[[AP2]], i32 +// LLVM: call void @llvm.va_end.p4(ptr addrspace(4) %[[AP2]]) +// LLVM: call void @llvm.va_end.p4(ptr addrspace(4) %[[AP]]) _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
