[flang-commits] [flang] [flang] Propagate call-site location into `SimplifyIntrinsics` `minmaxloc` body (PR #198732)

via flang-commits flang-commits at lists.llvm.org
Wed May 20 02:16:18 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-flang-fir-hlfir

Author: Kareem Ergawy (ergawy)

<details>
<summary>Changes</summary>


`genRuntimeMinMaxlocBody` used a hard-coded `UnknownLoc` for all generated ops, including the `fir.do_loop`. After `FIRToSCF` converts it to `scf.for`. Fix by threading the `maxloc` call-site location through the `bodyGenerator` lambda into `genRuntimeMinMaxlocBody`.

---
Full diff: https://github.com/llvm/llvm-project/pull/198732.diff


2 Files Affected:

- (modified) flang/lib/Optimizer/Transforms/SimplifyIntrinsics.cpp (+5-5) 
- (added) flang/test/Transforms/simplifyintrinsics-maxloc-loc.fir (+39) 


``````````diff
diff --git a/flang/lib/Optimizer/Transforms/SimplifyIntrinsics.cpp b/flang/lib/Optimizer/Transforms/SimplifyIntrinsics.cpp
index 49ae189d0b758..f337bfe7d061f 100644
--- a/flang/lib/Optimizer/Transforms/SimplifyIntrinsics.cpp
+++ b/flang/lib/Optimizer/Transforms/SimplifyIntrinsics.cpp
@@ -660,7 +660,8 @@ static void genRuntimeMinMaxlocBody(fir::FirOpBuilder &builder,
                                     unsigned rank, int maskRank,
                                     mlir::Type elementType,
                                     mlir::Type maskElemType,
-                                    mlir::Type resultElemTy, bool isDim) {
+                                    mlir::Type resultElemTy, bool isDim,
+                                    mlir::Location loc) {
   auto init = [isMax](fir::FirOpBuilder builder, mlir::Location loc,
                       mlir::Type elementType) {
     if (auto ty = mlir::dyn_cast<mlir::FloatType>(elementType)) {
@@ -675,7 +676,6 @@ static void genRuntimeMinMaxlocBody(fir::FirOpBuilder &builder,
     return builder.createIntegerConstant(loc, elementType, initValue);
   };
 
-  mlir::Location loc = mlir::UnknownLoc::get(builder.getContext());
   builder.setInsertionPointToEnd(funcOp.addEntryBlock());
 
   mlir::Value mask = funcOp.front().getArgument(2);
@@ -1224,10 +1224,10 @@ void SimplifyIntrinsicsPass::simplifyMinMaxlocReduction(
     return genRuntimeMinlocType(builder, rank);
   };
   auto bodyGenerator = [rank, maskRank, inputType, logicalElemType, outType,
-                        isMax, isDim](fir::FirOpBuilder &builder,
-                                      mlir::func::FuncOp &funcOp) {
+                        isMax, isDim, loc](fir::FirOpBuilder &builder,
+                                           mlir::func::FuncOp &funcOp) {
     genRuntimeMinMaxlocBody(builder, funcOp, isMax, rank, maskRank, inputType,
-                            logicalElemType, outType, isDim);
+                            logicalElemType, outType, isDim, loc);
   };
 
   mlir::func::FuncOp newFunc =
diff --git a/flang/test/Transforms/simplifyintrinsics-maxloc-loc.fir b/flang/test/Transforms/simplifyintrinsics-maxloc-loc.fir
new file mode 100644
index 0000000000000..a55e30c154e20
--- /dev/null
+++ b/flang/test/Transforms/simplifyintrinsics-maxloc-loc.fir
@@ -0,0 +1,39 @@
+// RUN: fir-opt --simplify-intrinsics --mlir-print-debuginfo %s | FileCheck %s
+
+// Verify that the source location of a maxloc call is propagated into the
+// fir.do_loop generated inside the simplified function body, so that
+// downstream passes that require a valid FileLineColLoc do not crash.
+
+func.func @_QPtest(%arg0: !fir.ref<!fir.array<10xi32>> {fir.bindc_name = "a"}) {
+  %c10 = arith.constant 10 : index
+  %c4_i32 = arith.constant 4 : i32
+  %c5_i32 = arith.constant 5 : i32
+  %false = arith.constant false
+  %0 = fir.alloca !fir.box<!fir.heap<!fir.array<?xi32>>>
+  %1 = fir.zero_bits !fir.heap<!fir.array<?xi32>>
+  %c0 = arith.constant 0 : index
+  %2 = fir.shape %c0 : (index) -> !fir.shape<1>
+  %3 = fir.embox %1(%2) : (!fir.heap<!fir.array<?xi32>>, !fir.shape<1>) -> !fir.box<!fir.heap<!fir.array<?xi32>>>
+  fir.store %3 to %0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
+  %4 = fir.shape %c10 : (index) -> !fir.shape<1>
+  %5 = fir.embox %arg0(%4) : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<10xi32>>
+  %6 = fir.absent !fir.box<i1>
+  %7 = fir.address_of(@_QQcl) : !fir.ref<!fir.char<1,8>>
+  %8 = fir.convert %0 : (!fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<none>>
+  %9 = fir.convert %5 : (!fir.box<!fir.array<10xi32>>) -> !fir.box<none>
+  %10 = fir.convert %7 : (!fir.ref<!fir.char<1,8>>) -> !fir.ref<i8>
+  %11 = fir.convert %6 : (!fir.box<i1>) -> !fir.box<none>
+  fir.call @_FortranAMaxlocInteger4(%8, %9, %c4_i32, %10, %c5_i32, %11, %false) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.box<none>, i32, !fir.ref<i8>, i32, !fir.box<none>, i1) -> () loc("test.f90":5:3)
+  return
+}
+
+// CHECK-LABEL: func.func private @_FortranAMaxlocInteger4x1_i32_contract_simplified(
+// CHECK:         fir.do_loop
+// CHECK:         loc([[LOC:#[^ ]*]])
+// CHECK:         [[LOC]] = loc("test.f90":5:3)
+
+func.func private @_FortranAMaxlocInteger4(!fir.ref<!fir.box<none>>, !fir.box<none>, i32, !fir.ref<i8>, i32, !fir.box<none>, i1) -> ()
+fir.global linkonce @_QQcl constant : !fir.char<1,8> {
+  %0 = fir.string_lit "test.f90\00"(8) : !fir.char<1,8>
+  fir.has_value %0 : !fir.char<1,8>
+}

``````````

</details>


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


More information about the flang-commits mailing list