[clang] [CIR] [Upstream local initialization for ArrayType (PR #132974)

Andy Kaylor via cfe-commits cfe-commits at lists.llvm.org
Tue Mar 25 17:59:12 PDT 2025


================
@@ -540,6 +542,68 @@ mlir::LogicalResult CIRToLLVMCastOpLowering::matchAndRewrite(
   return mlir::success();
 }
 
+mlir::LogicalResult CIRToLLVMPtrStrideOpLowering::matchAndRewrite(
+    cir::PtrStrideOp ptrStrideOp, OpAdaptor adaptor,
+    mlir::ConversionPatternRewriter &rewriter) const {
+
+  const mlir::DataLayout llvmLayout(
+      ptrStrideOp->getParentOfType<mlir::ModuleOp>());
+  const mlir::TypeConverter *tc = getTypeConverter();
+  const mlir::Type resultTy = tc->convertType(ptrStrideOp.getType());
+
+  mlir::Type elementTy =
+      convertTypeForMemory(*tc, dataLayout, ptrStrideOp.getElementTy());
+  mlir::MLIRContext *ctx = elementTy.getContext();
+
+  // void and function types doesn't really have a layout to use in GEPs,
+  // make it i8 instead.
+  if (mlir::isa<mlir::LLVM::LLVMVoidType>(elementTy) ||
+      mlir::isa<mlir::LLVM::LLVMFunctionType>(elementTy))
+    elementTy = mlir::IntegerType::get(elementTy.getContext(), 8,
+                                       mlir::IntegerType::Signless);
+  // Zero-extend, sign-extend or trunc the pointer value.
+  mlir::Value index = adaptor.getStride();
+  const unsigned width =
+      mlir::cast<mlir::IntegerType>(index.getType()).getWidth();
+  const std::optional<std::uint64_t> layoutWidth =
+      llvmLayout.getTypeIndexBitwidth(adaptor.getBase().getType());
+
+  const auto indexOp = index.getDefiningOp();
----------------
andykaylor wrote:

No auto here

https://github.com/llvm/llvm-project/pull/132974


More information about the cfe-commits mailing list