@@ -2212,6 +2212,32 @@ mlir::LogicalResult CIRToLLVMFuncOpLowering::matchAndRewrite(
22122212 Loc, op.getName (), llvmFnTy, linkage, isDsoLocal, cconv,
22132213 mlir::SymbolRefAttr (), attributes);
22142214
2215+ // Lower CIR attributes for arguments.
2216+ for (unsigned index = 0 ; index < fnType.getNumInputs (); index++) {
2217+ mlir::DictionaryAttr cirAttrs = op.getArgAttrDict (index);
2218+ if (cirAttrs) {
2219+ if (cirAttrs.get (cir::CIRDialect::getZExtAttrName ()))
2220+ fn.setArgAttr (index, mlir::LLVM::LLVMDialect::getZExtAttrName (),
2221+ rewriter.getUnitAttr ());
2222+ if (cirAttrs.get (cir::CIRDialect::getSExtAttrName ()))
2223+ fn.setArgAttr (index, mlir::LLVM::LLVMDialect::getSExtAttrName (),
2224+ rewriter.getUnitAttr ());
2225+ }
2226+ }
2227+
2228+ // Lower CIR attributes for return value.
2229+ // Each function has only a single result in CIR.
2230+ assert (op.getNumResults () == 1 );
2231+ mlir::DictionaryAttr resultAttrs = op.getResultAttrDict (0 );
2232+ if (resultAttrs) {
2233+ if (resultAttrs.get (cir::CIRDialect::getZExtAttrName ()))
2234+ fn.setResultAttr (0 , mlir::LLVM::LLVMDialect::getZExtAttrName (),
2235+ rewriter.getUnitAttr ());
2236+ if (resultAttrs.get (cir::CIRDialect::getSExtAttrName ()))
2237+ fn.setResultAttr (0 , mlir::LLVM::LLVMDialect::getSExtAttrName (),
2238+ rewriter.getUnitAttr ());
2239+ }
2240+
22152241 fn.setVisibility_Attr (mlir::LLVM::VisibilityAttr::get (
22162242 getContext (), lowerCIRVisibilityToLLVMVisibility (
22172243 op.getGlobalVisibilityAttr ().getValue ())));
0 commit comments