================
@@ -1225,6 +1226,69 @@ getSafeRepackAttrs(Fortran::lower::AbstractConverter 
&converter) {
   return attrs.empty() ? mlir::ArrayAttr{} : builder.getArrayAttr(attrs);
 }
 
+// Helper function to related to emission of implicit
+// assignments. `Implicit` here implies the assignment does not
+// exist in the Fortran source, but is implicit through definition
+// of one or more flagsets (like -finit-* family of flags).
+// General purpose usage of this function outside the
+// scope detailed here is discouraged, and is probably wrong.
+static void emitImplicitAssignment(Fortran::lower::AbstractConverter 
&converter,
+                                   mlir::Location loc,
+                                   const Fortran::semantics::Symbol &sym,
+                                   Fortran::lower::SymMap &symMap) {
+  if (converter.getLoweringOptions().getInitLocalZeroDef()) {
+    mlir::Type eleTy = hlfir::getFortranElementType(converter.genType(sym));
+    auto *builder = &converter.getFirOpBuilder();
+
+    if (mlir::isa<fir::CharacterType>(eleTy)) {
+      fir::ExtendedValue ext = converter.getSymbolExtendedValue(sym);
+      const auto *charBox = ext.getCharBox();
+      mlir::Value buffer = charBox->getBuffer();
+      assert(buffer && "CharBox buffer is null");
+      auto eleTy = fir::unwrapRefType(buffer.getType());
+      auto charTy =
+          mlir::cast<fir::CharacterType>(fir::unwrapSequenceType(eleTy));
+      unsigned kindBytes =
+          builder->getKindMap().getCharacterBitsize(charTy.getFKind()) / 8;
+      auto lenVal = charBox->getLen();
+      mlir::Value byteLen;
+      if (lenVal) {
+
+        mlir::Value lenI64 =
+            builder->createConvert(loc, builder->getI64Type(), lenVal);
+        mlir::Value kind = builder->createIntegerConstant(
+            loc, builder->getI64Type(), kindBytes);
+        byteLen = mlir::arith::MulIOp::create(*builder, loc, lenI64, kind);
+        byteLen = builder->createConvert(loc, builder->getI64Type(), byteLen);
+      } else {
+
+        assert(charTy.hasConstantLen() && "expected constant character 
length");
+        byteLen = builder->createIntegerConstant(loc, builder->getI64Type(),
+                                                 charTy.getLen() * kindBytes);
+      }
+
+      auto ptrTy = mlir::LLVM::LLVMPointerType::get(builder->getContext());
+      mlir::Value ptr = builder->createConvert(loc, ptrTy, buffer);
+      mlir::Value zero =
+          builder->createIntegerConstant(loc, builder->getI8Type(), 0);
+      mlir::ModuleOp mod = builder->getModule();
+      mlir::OpBuilder modBuilder(mod.getBodyRegion());
+      modBuilder.setInsertionPointToEnd(zero.getParentBlock());
----------------
NimishMishra wrote:

Without this, the memset is being inserted before its arguments, thereby 
failing FIR verification. 

https://github.com/llvm/llvm-project/pull/159788
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to