Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[flang][NFC] use hlfir.declare first result when both results are raw pointers #132261

Merged
merged 1 commit into from
Mar 21, 2025

Conversation

jeanPerier
Copy link
Contributor

@jeanPerier jeanPerier commented Mar 20, 2025

Currently, the helpers to get fir::ExtendedValue out of hlfir::Entity use hlfir.declare second result (#1) in most cases. This is because this result is the same as the input and matches what FIR was getting before lowering to HLFIR.

But this creates odd situations when both hlfir.declare are raw pointers and either result ends-up being used in the IR depending on whether the code was generated by a helper using fir::ExtendedValue, or via "pure HLFIR" helpers using the first result.

This will typically prevent simple CSE and easy identification that two operation (e.g load/store) are touching the exact same memory location without using alias analysis or "manual detection" (looking for common hlfir.declare defining op).

Hence, when hlfir.declare results are both raw pointers, use #0 when producing fir::ExtendedValue.
When #0 is a fir.box, keep using #1 because these are not the same.
The only code change is in HLFIRTools.cpp and is pretty small, but there is a big test fallout of #1 to #0.

I am considering going towards a simplification where there is a single result for hlfir.declare, but this will be a bit more intrusive since extra box_addr will have to be generated (that will be optimized at the FIR level when the fir.embox generated for hlfir.declare is visible).

@llvmbot llvmbot added flang Flang issues not falling into any other category flang:fir-hlfir flang:openmp openacc labels Mar 20, 2025
@llvmbot
Copy link
Member

llvmbot commented Mar 20, 2025

@llvm/pr-subscribers-openacc

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

Author: None (jeanPerier)

Changes

Currently, the helpers to get fir::ExtendedValue out of hlfir::Entity use hlfir.declare second result (#<!-- -->1) in most cases. This is because this result is the same as the input and matches what FIR was getting before lowering to HLFIR.

But this creates odd situations when both hlfir.declare are raw pointers and either result ends-up being used in the IR depending on whether the code was generated by a helper using fir::ExtendedValue, or via "pure HLFIR" helpers using the first result.

This will typically prevent simple CSE and easy identification that two operation (e.g load/store) are touching the exact same memory location without using alias analysis or "manual detection" (looking for common hlfir.declare defining op).

Hence, when both hlfir.declare are both raw pointers, use #<!-- -->0 when producing fir::ExtendedValue.
When #<!-- -->0 is a fir.box, keep using #<!-- -->1 because these are not the same.
The only code change is in HLFIRTools.cpp and is pretty small, but there is a big test fallout of #<!-- -->1 to #<!-- -->0.

I am considering going towards a simplification where there is a single result for hlfir.declare, but this will be a bit more intrusive since extra box_addr will have to be generated (that will be optimized at the FIR level when the fir.embox generated for hlfir.declare is visible).


Patch is 757.94 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/132261.diff

214 Files Affected:

  • (modified) flang/lib/Optimizer/Builder/HLFIRTools.cpp (+12-2)
  • (modified) flang/test/HLFIR/all-lowering.fir (+1-1)
  • (modified) flang/test/HLFIR/any-lowering.fir (+1-1)
  • (modified) flang/test/HLFIR/associate-codegen.fir (+6-6)
  • (modified) flang/test/HLFIR/assumed-type-actual-args.f90 (+1-1)
  • (modified) flang/test/HLFIR/boxchar_emboxing.f90 (+2-2)
  • (modified) flang/test/HLFIR/count-lowering.fir (+1-1)
  • (modified) flang/test/HLFIR/cshift-lowering.fir (+1-1)
  • (modified) flang/test/HLFIR/dot_product-lowering.fir (+2-2)
  • (modified) flang/test/HLFIR/elemental-codegen-nested.fir (+1-1)
  • (modified) flang/test/HLFIR/maxloc-lowering.fir (+2-2)
  • (modified) flang/test/HLFIR/maxval-lowering.fir (+2-2)
  • (modified) flang/test/HLFIR/minloc-lowering.fir (+2-2)
  • (modified) flang/test/HLFIR/minval-lowering.fir (+2-2)
  • (modified) flang/test/HLFIR/mul_transpose.f90 (+8-7)
  • (modified) flang/test/HLFIR/opt-bufferization-eval_in_mem.fir (+1-1)
  • (modified) flang/test/HLFIR/order_assignments/user-defined-assignment.fir (+1-1)
  • (modified) flang/test/HLFIR/product-lowering.fir (+2-2)
  • (modified) flang/test/HLFIR/reshape-lowering.fir (+8-8)
  • (modified) flang/test/HLFIR/sum-lowering.fir (+2-2)
  • (modified) flang/test/HLFIR/transpose-lowering.fir (+1-1)
  • (modified) flang/test/Lower/CUDA/cuda-allocatable.cuf (+37-37)
  • (modified) flang/test/Lower/CUDA/cuda-data-attribute.cuf (+2-2)
  • (modified) flang/test/Lower/CUDA/cuda-data-transfer.cuf (+5-5)
  • (modified) flang/test/Lower/CUDA/cuda-device-proc.cuf (+4-4)
  • (modified) flang/test/Lower/CUDA/cuda-kernel-calls.cuf (+6-6)
  • (modified) flang/test/Lower/CUDA/cuda-kernel-loop-directive.cuf (+3-3)
  • (modified) flang/test/Lower/CUDA/cuda-return01.cuf (+1-1)
  • (modified) flang/test/Lower/CUDA/cuda-return02.cuf (+1-1)
  • (modified) flang/test/Lower/HLFIR/actual_target_for_dummy_pointer.f90 (+16-16)
  • (modified) flang/test/Lower/HLFIR/allocatable-and-pointer-status-change.f90 (+7-7)
  • (modified) flang/test/Lower/HLFIR/allocatable-end-of-scope-dealloc.f90 (+5-5)
  • (modified) flang/test/Lower/HLFIR/allocatable-return.f90 (+6-6)
  • (modified) flang/test/Lower/HLFIR/allocatables-and-pointers.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/array-ctor-as-elemental.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/array-ctor-derived.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/array-ctor-index.f90 (+4-4)
  • (modified) flang/test/Lower/HLFIR/associate-construct.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/assumed-rank-iface.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/assumed-rank-inquiries-2.f90 (+6-6)
  • (modified) flang/test/Lower/HLFIR/assumed-rank-inquiries.f90 (+18-18)
  • (modified) flang/test/Lower/HLFIR/bindc-entry-stmt.f90 (+6-6)
  • (modified) flang/test/Lower/HLFIR/bindc-value-derived.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/call-issue-124043.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/call-sequence-associated-descriptors.f90 (+12-12)
  • (modified) flang/test/Lower/HLFIR/calls-array-results.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/calls-assumed-shape.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/calls-constant-expr-arg.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/calls-f77.f90 (+9-9)
  • (modified) flang/test/Lower/HLFIR/calls-optional.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/calls-percent-val-ref.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/cray-pointers.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/custom-intrinsic.f90 (+29-29)
  • (modified) flang/test/Lower/HLFIR/elemental-array-ops.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/elemental-call-vector-subscripts.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/elemental-user-procedure-ref.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/entry_return.f90 (+10-10)
  • (modified) flang/test/Lower/HLFIR/expr-addr.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/expr-as-inquired.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/function-return-as-expr.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/function-return.f90 (+4-4)
  • (modified) flang/test/Lower/HLFIR/goto-do-body.f90 (+6-6)
  • (modified) flang/test/Lower/HLFIR/ignore-rank-unlimited-polymorphic.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/implicit-call-mismatch.f90 (+7-7)
  • (modified) flang/test/Lower/HLFIR/intentout-allocatable-components.f90 (+3-3)
  • (modified) flang/test/Lower/HLFIR/internal-procedures.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/intrinsic-dynamically-optional.f90 (+10-10)
  • (modified) flang/test/Lower/HLFIR/intrinsic-module-procedures.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/intrinsic-subroutines.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/issue80884.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/maxloc.f90 (+4-4)
  • (modified) flang/test/Lower/HLFIR/maxval.f90 (+4-4)
  • (modified) flang/test/Lower/HLFIR/minloc.f90 (+4-4)
  • (modified) flang/test/Lower/HLFIR/minval.f90 (+5-5)
  • (modified) flang/test/Lower/HLFIR/proc-pointer-comp-nopass.f90 (+8-8)
  • (modified) flang/test/Lower/HLFIR/proc-pointer-comp-pass.f90 (+7-7)
  • (modified) flang/test/Lower/HLFIR/procedure-designators.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/procedure-pointer.f90 (+6-6)
  • (modified) flang/test/Lower/HLFIR/product.f90 (+4-4)
  • (modified) flang/test/Lower/HLFIR/reshape.f90 (+6-6)
  • (modified) flang/test/Lower/HLFIR/select-rank.f90 (+7-7)
  • (modified) flang/test/Lower/HLFIR/select-type-selector.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/structure-constructor.f90 (+12-12)
  • (modified) flang/test/Lower/HLFIR/sum.f90 (+4-4)
  • (modified) flang/test/Lower/HLFIR/transformational.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/user-defined-assignment.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/vector-subscript-as-value.f90 (+1-1)
  • (modified) flang/test/Lower/Intrinsics/associated-proc-pointers.f90 (+6-6)
  • (modified) flang/test/Lower/Intrinsics/c_f_procpointer.f90 (+4-4)
  • (modified) flang/test/Lower/Intrinsics/c_ptr_eq_ne.f90 (+6-6)
  • (modified) flang/test/Lower/Intrinsics/chdir.f90 (+7-7)
  • (modified) flang/test/Lower/Intrinsics/ieee_rint_int.f90 (+7-7)
  • (modified) flang/test/Lower/Intrinsics/ieee_rounding.f90 (+3-3)
  • (modified) flang/test/Lower/Intrinsics/loc.f90 (+11-11)
  • (modified) flang/test/Lower/Intrinsics/min.f90 (+1-1)
  • (modified) flang/test/Lower/Intrinsics/reduce.f90 (+3-3)
  • (modified) flang/test/Lower/Intrinsics/rename.f90 (+1-1)
  • (modified) flang/test/Lower/Intrinsics/second.f90 (+1-1)
  • (modified) flang/test/Lower/Intrinsics/selected_logical_kind.f90 (+5-5)
  • (modified) flang/test/Lower/Intrinsics/shape.f90 (+2-2)
  • (modified) flang/test/Lower/Intrinsics/signal.f90 (+6-6)
  • (modified) flang/test/Lower/Intrinsics/system-optional.f90 (+1-1)
  • (modified) flang/test/Lower/Intrinsics/system.f90 (+1-1)
  • (modified) flang/test/Lower/OpenACC/acc-atomic-capture.f90 (+18-18)
  • (modified) flang/test/Lower/OpenACC/acc-atomic-read.f90 (+2-2)
  • (modified) flang/test/Lower/OpenACC/acc-atomic-update-array.f90 (+3-3)
  • (modified) flang/test/Lower/OpenACC/acc-atomic-update-hlfir.f90 (+3-3)
  • (modified) flang/test/Lower/OpenACC/acc-atomic-update.f90 (+3-3)
  • (modified) flang/test/Lower/OpenACC/acc-atomic-write.f90 (+2-2)
  • (modified) flang/test/Lower/OpenACC/acc-data-operands-unwrap-defaultbounds.f90 (+6-6)
  • (modified) flang/test/Lower/OpenACC/acc-data-operands.f90 (+6-6)
  • (modified) flang/test/Lower/OpenACC/acc-declare-unwrap-defaultbounds.f90 (+2-2)
  • (modified) flang/test/Lower/OpenACC/acc-declare.f90 (+2-2)
  • (modified) flang/test/Lower/OpenACC/acc-enter-data-unwrap-defaultbounds.f90 (+9-9)
  • (modified) flang/test/Lower/OpenACC/acc-enter-data.f90 (+8-8)
  • (modified) flang/test/Lower/OpenACC/acc-kernels-loop.f90 (+1-1)
  • (modified) flang/test/Lower/OpenACC/acc-kernels.f90 (+1-1)
  • (modified) flang/test/Lower/OpenACC/acc-parallel-loop.f90 (+1-1)
  • (modified) flang/test/Lower/OpenACC/acc-parallel.f90 (+1-1)
  • (modified) flang/test/Lower/OpenACC/acc-private-unwrap-defaultbounds.f90 (+1-1)
  • (modified) flang/test/Lower/OpenACC/acc-private.f90 (+1-1)
  • (modified) flang/test/Lower/OpenACC/acc-serial-loop.f90 (+1-1)
  • (modified) flang/test/Lower/OpenACC/acc-serial.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/DelayedPrivatization/distribute-standalone-private.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/DelayedPrivatization/wsloop.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/allocatable-array-bounds.f90 (+7-7)
  • (modified) flang/test/Lower/OpenMP/common-atomic-lowering.f90 (+2-2)
  • (modified) flang/test/Lower/OpenMP/copyin-order.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/copyin.f90 (+41-41)
  • (modified) flang/test/Lower/OpenMP/default-clause.f90 (+2-2)
  • (modified) flang/test/Lower/OpenMP/flush.f90 (+2-2)
  • (modified) flang/test/Lower/OpenMP/generic-loop-rewriting.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/hlfir-seqloop-parallel.f90 (+8-8)
  • (modified) flang/test/Lower/OpenMP/lastprivate-allocatable.f90 (+2-1)
  • (modified) flang/test/Lower/OpenMP/lastprivate-iv.f90 (+6-6)
  • (modified) flang/test/Lower/OpenMP/lastprivate-simd.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/loop-pointer-variable.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/parallel-lastprivate-clause-scalar.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/parallel-private-clause-fixes.f90 (+4-4)
  • (modified) flang/test/Lower/OpenMP/parallel-private-clause.f90 (+8-8)
  • (modified) flang/test/Lower/OpenMP/parallel-reduction-allocatable-array.f90 (+2-2)
  • (modified) flang/test/Lower/OpenMP/parallel-reduction-pointer-array.f90 (+4-4)
  • (modified) flang/test/Lower/OpenMP/parallel-reduction3.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/parallel-wsloop-firstpriv.f90 (+6-6)
  • (modified) flang/test/Lower/OpenMP/parallel-wsloop-lastpriv.f90 (+22-22)
  • (modified) flang/test/Lower/OpenMP/parallel-wsloop.f90 (+12-12)
  • (modified) flang/test/Lower/OpenMP/private-commonblock.f90 (+11-11)
  • (modified) flang/test/Lower/OpenMP/private-derived-type.f90 (+2-2)
  • (modified) flang/test/Lower/OpenMP/scan.f90 (+2-2)
  • (modified) flang/test/Lower/OpenMP/shared-loop.f90 (+9-9)
  • (modified) flang/test/Lower/OpenMP/simd.f90 (+12-12)
  • (modified) flang/test/Lower/OpenMP/simd_x86_64.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/stop-stmt-in-region.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/target.f90 (+9-9)
  • (modified) flang/test/Lower/OpenMP/threadprivate-char-array-chararray.f90 (+15-15)
  • (modified) flang/test/Lower/OpenMP/threadprivate-commonblock.f90 (+12-12)
  • (modified) flang/test/Lower/OpenMP/threadprivate-hlfir.f90 (+5-5)
  • (modified) flang/test/Lower/OpenMP/threadprivate-host-association.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/threadprivate-integer-different-kinds.f90 (+12-12)
  • (modified) flang/test/Lower/OpenMP/threadprivate-pointer-allocatable.f90 (+14-14)
  • (modified) flang/test/Lower/OpenMP/threadprivate-real-logical-complex-derivedtype.f90 (+8-8)
  • (modified) flang/test/Lower/OpenMP/threadprivate-use-association-2-hlfir.f90 (+4-4)
  • (modified) flang/test/Lower/OpenMP/threadprivate-use-association.f90 (+6-6)
  • (modified) flang/test/Lower/OpenMP/unstructured.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-chunks.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-collapse.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-monotonic.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-nonmonotonic.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-add-byref.f90 (+7-7)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-add.f90 (+7-7)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-allocatable-array-minmax.f90 (+8-8)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-allocatable.f90 (+2-2)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-array-assumed-shape.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-array.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-array2.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-iand-byref.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-iand.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-ieor-byref.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-ieor.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-ior-byref.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-ior.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-logical-and-byref.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-logical-and.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-logical-eqv-byref.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-logical-eqv.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-logical-neqv-byref.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-logical-neqv.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-logical-or-byref.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-logical-or.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-max-byref.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-max.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-min-byref.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-min.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-min2.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-mul-byref.f90 (+7-7)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-mul.f90 (+7-7)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-multiple-clauses.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-pointer.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-schedule.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-variable.f90 (+9-9)
  • (modified) flang/test/Lower/OpenMP/wsloop.f90 (+3-3)
  • (modified) flang/test/Lower/allocatable-polymorphic.f90 (+60-60)
  • (modified) flang/test/Lower/allocate-source-allocatables-2.f90 (+5-5)
  • (modified) flang/test/Lower/array-character.f90 (+7-7)
  • (modified) flang/test/Lower/array-elemental-calls-char-byval.f90 (+3-3)
  • (modified) flang/test/Lower/array-elemental-calls-char.f90 (+3-3)
  • (modified) flang/test/Lower/call-by-value-attr.f90 (+5-5)
  • (modified) flang/test/Lower/components.f90 (+1-1)
  • (modified) flang/test/Lower/derived-type-temp.f90 (+1-1)
  • (modified) flang/test/Lower/entry-statement.f90 (+9-9)
  • (modified) flang/test/Lower/intentout-deallocate.f90 (+29-29)
  • (modified) flang/test/Lower/io-asynchronous.f90 (+4-4)
  • (modified) flang/test/Lower/nullify-polymorphic.f90 (+1-1)
  • (modified) flang/test/Lower/structure-constructors-alloc-comp.f90 (+4-4)
diff --git a/flang/lib/Optimizer/Builder/HLFIRTools.cpp b/flang/lib/Optimizer/Builder/HLFIRTools.cpp
index 1a31ca33e9465..85fd742db6beb 100644
--- a/flang/lib/Optimizer/Builder/HLFIRTools.cpp
+++ b/flang/lib/Optimizer/Builder/HLFIRTools.cpp
@@ -186,14 +186,24 @@ static fir::CharBoxValue genUnboxChar(mlir::Location loc,
   return {addr, len};
 }
 
+// To maximize chances of identifying usage of a same variables in the IR,
+// always return the hlfirBase result of declare/associate if it is a raw
+// pointer.
+static mlir::Value getFirBaseHelper(mlir::Value hlfirBase,
+                                    mlir::Value firBase) {
+  if (fir::isa_ref_type(hlfirBase.getType()))
+    return hlfirBase;
+  return firBase;
+}
+
 mlir::Value hlfir::Entity::getFirBase() const {
   if (fir::FortranVariableOpInterface variable = getIfVariableInterface()) {
     if (auto declareOp =
             mlir::dyn_cast<hlfir::DeclareOp>(variable.getOperation()))
-      return declareOp.getOriginalBase();
+      return getFirBaseHelper(declareOp.getBase(), declareOp.getOriginalBase());
     if (auto associateOp =
             mlir::dyn_cast<hlfir::AssociateOp>(variable.getOperation()))
-      return associateOp.getFirBase();
+      return getFirBaseHelper(associateOp.getBase(), associateOp.getFirBase());
   }
   return getBase();
 }
diff --git a/flang/test/HLFIR/all-lowering.fir b/flang/test/HLFIR/all-lowering.fir
index df6771e565efc..b20d5e759177f 100644
--- a/flang/test/HLFIR/all-lowering.fir
+++ b/flang/test/HLFIR/all-lowering.fir
@@ -90,7 +90,7 @@ func.func @_QPall3(%arg0: !fir.ref<!fir.array<2x!fir.logical<4>>> {fir.bindc_nam
 
 // CHECK-DAG:     %[[MASK_ADDR:.*]] = fir.address_of
 // CHECK-DAG:     %[[MASK_VAR:.*]]:2 = hlfir.declare %[[MASK_ADDR]](%[[MASK_SHAPE:.*]])
-// CHECK-DAG:     %[[MASK_BOX:.*]] = fir.embox %[[MASK_VAR]]#1(%[[MASK_SHAPE:.*]])
+// CHECK-DAG:     %[[MASK_BOX:.*]] = fir.embox %[[MASK_VAR]]#0(%[[MASK_SHAPE:.*]])
 
 // CHECK-DAG:     %[[DIM:.*]] = arith.constant 1 : i32
 
diff --git a/flang/test/HLFIR/any-lowering.fir b/flang/test/HLFIR/any-lowering.fir
index 72fcdd37b6193..71889b01aaf29 100644
--- a/flang/test/HLFIR/any-lowering.fir
+++ b/flang/test/HLFIR/any-lowering.fir
@@ -93,7 +93,7 @@ func.func @_QPany3(%arg0: !fir.ref<!fir.array<2x!fir.logical<4>>> {fir.bindc_nam
 
 // CHECK-DAG:     %[[MASK_ADDR:.*]] = fir.address_of
 // CHECK-DAG:     %[[MASK_VAR:.*]]:2 = hlfir.declare %[[MASK_ADDR]](%[[MASK_SHAPE:.*]])
-// CHECK-DAG:     %[[MASK_BOX:.*]] = fir.embox %[[MASK_VAR]]#1(%[[MASK_SHAPE:.*]])
+// CHECK-DAG:     %[[MASK_BOX:.*]] = fir.embox %[[MASK_VAR]]#0(%[[MASK_SHAPE:.*]])
 
 // CHECK-DAG:     %[[DIM:.*]] = arith.constant 1 : i32
 
diff --git a/flang/test/HLFIR/associate-codegen.fir b/flang/test/HLFIR/associate-codegen.fir
index ad64959984a14..d2ab142744072 100644
--- a/flang/test/HLFIR/associate-codegen.fir
+++ b/flang/test/HLFIR/associate-codegen.fir
@@ -88,7 +88,7 @@ func.func @associate_char(%arg0: !fir.boxchar<1> ) {
 // CHECK:           %[[VAL_16:.*]] = arith.subi %[[VAL_7]], %[[VAL_15]] : index
 // CHECK:           fir.do_loop %[[VAL_17:.*]] = %[[VAL_2]]#1 to %[[VAL_16]] step %[[VAL_15]] {
 // CHECK:             %[[VAL_18:.*]] = arith.subi %[[VAL_17]], %[[VAL_2]]#1 : index
-// CHECK:             %[[VAL_19:.*]] = fir.convert %[[VAL_6]]#1 : (!fir.ref<!fir.char<1>>) -> !fir.ref<!fir.array<1x!fir.char<1>>>
+// CHECK:             %[[VAL_19:.*]] = fir.convert %[[VAL_6]]#0 : (!fir.ref<!fir.char<1>>) -> !fir.ref<!fir.array<1x!fir.char<1>>>
 // CHECK:             %[[VAL_20:.*]] = fir.coordinate_of %[[VAL_19]], %[[VAL_18]] : (!fir.ref<!fir.array<1x!fir.char<1>>>, index) -> !fir.ref<!fir.char<1>>
 // CHECK:             %[[VAL_21:.*]] = fir.load %[[VAL_20]] : !fir.ref<!fir.char<1>>
 // CHECK:             %[[VAL_22:.*]] = fir.convert %[[VAL_8]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>>
@@ -233,7 +233,7 @@ func.func @test_shape_of(%arg0: !fir.ref<!fir.array<4x3xi32>>) {
 // CHECK:           %[[VAL_14:.*]] = fir.insert_value %[[VAL_13]], %[[VAL_6]], [1 : index] : (tuple<!fir.heap<!fir.array<3x4xi32>>, i1>, i1) -> tuple<!fir.heap<!fir.array<3x4xi32>>, i1>
 // CHECK:           %[[VAL_15:.*]] = fir.insert_value %[[VAL_14]], %[[VAL_5]]#0, [0 : index] : (tuple<!fir.heap<!fir.array<3x4xi32>>, i1>, !fir.heap<!fir.array<3x4xi32>>) -> tuple<!fir.heap<!fir.array<3x4xi32>>, i1>
 // CHECK:           %[[VAL_16:.*]] = fir.convert %[[VAL_5]]#0 : (!fir.heap<!fir.array<3x4xi32>>) -> !fir.ref<!fir.array<3x4xi32>>
-// CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_5]]#1 : (!fir.heap<!fir.array<3x4xi32>>) -> !fir.ref<!fir.array<3x4xi32>>
+// CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_5]]#0 : (!fir.heap<!fir.array<3x4xi32>>) -> !fir.ref<!fir.array<3x4xi32>>
 // CHECK:           %[[VAL_18:.*]] = fir.convert %[[VAL_17]] : (!fir.ref<!fir.array<3x4xi32>>) -> !fir.heap<!fir.array<3x4xi32>>
 // CHECK:           fir.freemem %[[VAL_18]] : !fir.heap<!fir.array<3x4xi32>>
 // CHECK:           return
@@ -266,7 +266,7 @@ func.func @test_multiple_associations(%arg0: !hlfir.expr<1x2xi32>) {
 // CHECK:           %[[VAL_11:.*]] = fir.insert_value %[[VAL_10]], %[[VAL_8]], [1 : index] : (tuple<!fir.heap<!fir.array<1x2xi32>>, i1>, i1) -> tuple<!fir.heap<!fir.array<1x2xi32>>, i1>
 // CHECK:           %[[VAL_12:.*]] = fir.insert_value %[[VAL_11]], %[[VAL_9]]#0, [0 : index] : (tuple<!fir.heap<!fir.array<1x2xi32>>, i1>, !fir.heap<!fir.array<1x2xi32>>) -> tuple<!fir.heap<!fir.array<1x2xi32>>, i1>
 // CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_9]]#0 : (!fir.heap<!fir.array<1x2xi32>>) -> !fir.ref<!fir.array<1x2xi32>>
-// CHECK:           %[[VAL_14:.*]] = fir.convert %[[VAL_9]]#1 : (!fir.heap<!fir.array<1x2xi32>>) -> !fir.ref<!fir.array<1x2xi32>>
+// CHECK:           %[[VAL_14:.*]] = fir.convert %[[VAL_9]]#0 : (!fir.heap<!fir.array<1x2xi32>>) -> !fir.ref<!fir.array<1x2xi32>>
 // associate 1:
 // CHECK:           %[[VAL_15:.*]] = hlfir.shape_of %[[VAL_0]] : (!hlfir.expr<1x2xi32>) -> !fir.shape<2>
 // CHECK:           %[[VAL_16:.*]] = arith.constant 1 : index
@@ -279,7 +279,7 @@ func.func @test_multiple_associations(%arg0: !hlfir.expr<1x2xi32>) {
 // CHECK:           %[[VAL_22:.*]] = fir.insert_value %[[VAL_21]], %[[VAL_19]], [1 : index] : (tuple<!fir.heap<!fir.array<1x2xi32>>, i1>, i1) -> tuple<!fir.heap<!fir.array<1x2xi32>>, i1>
 // CHECK:           %[[VAL_23:.*]] = fir.insert_value %[[VAL_22]], %[[VAL_20]]#0, [0 : index] : (tuple<!fir.heap<!fir.array<1x2xi32>>, i1>, !fir.heap<!fir.array<1x2xi32>>) -> tuple<!fir.heap<!fir.array<1x2xi32>>, i1>
 // CHECK:           %[[VAL_24:.*]] = fir.convert %[[VAL_20]]#0 : (!fir.heap<!fir.array<1x2xi32>>) -> !fir.ref<!fir.array<1x2xi32>>
-// CHECK:           %[[VAL_25:.*]] = fir.convert %[[VAL_20]]#1 : (!fir.heap<!fir.array<1x2xi32>>) -> !fir.ref<!fir.array<1x2xi32>>
+// CHECK:           %[[VAL_25:.*]] = fir.convert %[[VAL_20]]#0 : (!fir.heap<!fir.array<1x2xi32>>) -> !fir.ref<!fir.array<1x2xi32>>
 // end associate 0:
 // CHECK:           %[[VAL_26:.*]] = fir.convert %[[VAL_14]] : (!fir.ref<!fir.array<1x2xi32>>) -> !fir.heap<!fir.array<1x2xi32>>
 // CHECK:           fir.freemem %[[VAL_26]] : !fir.heap<!fir.array<1x2xi32>>
@@ -414,7 +414,7 @@ func.func @_QPtest_multitple_associates_for_same_expr() {
 // CHECK:           %[[VAL_17:.*]] = fir.insert_value %[[VAL_16]], %[[VAL_14]], [1 : index] : (tuple<!fir.heap<!fir.array<10x!fir.char<1>>>, i1>, i1) -> tuple<!fir.heap<!fir.array<10x!fir.char<1>>>, i1>
 // CHECK:           %[[VAL_18:.*]] = fir.insert_value %[[VAL_17]], %[[VAL_15]]#0, [0 : index] : (tuple<!fir.heap<!fir.array<10x!fir.char<1>>>, i1>, !fir.heap<!fir.array<10x!fir.char<1>>>) -> tuple<!fir.heap<!fir.array<10x!fir.char<1>>>, i1>
 // CHECK:           %[[VAL_19:.*]] = fir.convert %[[VAL_15]]#0 : (!fir.heap<!fir.array<10x!fir.char<1>>>) -> !fir.ref<!fir.array<10x!fir.char<1>>>
-// CHECK:           %[[VAL_20:.*]] = fir.convert %[[VAL_15]]#1 : (!fir.heap<!fir.array<10x!fir.char<1>>>) -> !fir.ref<!fir.array<10x!fir.char<1>>>
+// CHECK:           %[[VAL_20:.*]] = fir.convert %[[VAL_15]]#0 : (!fir.heap<!fir.array<10x!fir.char<1>>>) -> !fir.ref<!fir.array<10x!fir.char<1>>>
 // CHECK:           %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (!fir.ref<!fir.array<10x!fir.char<1>>>) -> !fir.heap<!fir.array<10x!fir.char<1>>>
 // CHECK:           fir.freemem %[[VAL_21]] : !fir.heap<!fir.array<10x!fir.char<1>>>
 // CHECK:           %[[VAL_22:.*]] = fir.allocmem !fir.array<10x!fir.char<1>> {bindc_name = ".tmp", uniq_name = ""}
@@ -425,7 +425,7 @@ func.func @_QPtest_multitple_associates_for_same_expr() {
 // CHECK:           %[[VAL_26:.*]] = fir.insert_value %[[VAL_25]], %[[VAL_23]], [1 : index] : (tuple<!fir.heap<!fir.array<10x!fir.char<1>>>, i1>, i1) -> tuple<!fir.heap<!fir.array<10x!fir.char<1>>>, i1>
 // CHECK:           %[[VAL_27:.*]] = fir.insert_value %[[VAL_26]], %[[VAL_24]]#0, [0 : index] : (tuple<!fir.heap<!fir.array<10x!fir.char<1>>>, i1>, !fir.heap<!fir.array<10x!fir.char<1>>>) -> tuple<!fir.heap<!fir.array<10x!fir.char<1>>>, i1>
 // CHECK:           %[[VAL_28:.*]] = fir.convert %[[VAL_24]]#0 : (!fir.heap<!fir.array<10x!fir.char<1>>>) -> !fir.ref<!fir.array<10x!fir.char<1>>>
-// CHECK:           %[[VAL_29:.*]] = fir.convert %[[VAL_24]]#1 : (!fir.heap<!fir.array<10x!fir.char<1>>>) -> !fir.ref<!fir.array<10x!fir.char<1>>>
+// CHECK:           %[[VAL_29:.*]] = fir.convert %[[VAL_24]]#0 : (!fir.heap<!fir.array<10x!fir.char<1>>>) -> !fir.ref<!fir.array<10x!fir.char<1>>>
 // CHECK:           %[[VAL_30:.*]] = fir.convert %[[VAL_29]] : (!fir.ref<!fir.array<10x!fir.char<1>>>) -> !fir.heap<!fir.array<10x!fir.char<1>>>
 // CHECK:           fir.freemem %[[VAL_30]] : !fir.heap<!fir.array<10x!fir.char<1>>>
 // CHECK:           fir.freemem %[[VAL_4]]#0 : !fir.heap<!fir.array<10x!fir.char<1>>>
diff --git a/flang/test/HLFIR/assumed-type-actual-args.f90 b/flang/test/HLFIR/assumed-type-actual-args.f90
index 855542709f622..42e9ed27340e7 100644
--- a/flang/test/HLFIR/assumed-type-actual-args.f90
+++ b/flang/test/HLFIR/assumed-type-actual-args.f90
@@ -106,7 +106,7 @@ subroutine s5b(x)
 ! CHECK-SAME:                        %[[VAL_0:.*]]: !fir.ref<none> {fir.bindc_name = "x"}) {
 ! CHECK:           %[[DSCOPE:.*]] = fir.dummy_scope : !fir.dscope
 ! CHECK:           %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %[[DSCOPE]] {uniq_name = "_QFtest1Ex"} : (!fir.ref<none>, !fir.dscope) -> (!fir.ref<none>, !fir.ref<none>)
-! CHECK:           fir.call @_QPs1(%[[VAL_1]]#1) fastmath<contract> : (!fir.ref<none>) -> ()
+! CHECK:           fir.call @_QPs1(%[[VAL_1]]#0) fastmath<contract> : (!fir.ref<none>) -> ()
 ! CHECK:           return
 ! CHECK:         }
 
diff --git a/flang/test/HLFIR/boxchar_emboxing.f90 b/flang/test/HLFIR/boxchar_emboxing.f90
index 787aa8325a8c8..b80ff9858da34 100644
--- a/flang/test/HLFIR/boxchar_emboxing.f90
+++ b/flang/test/HLFIR/boxchar_emboxing.f90
@@ -18,7 +18,7 @@
 ! CHECK:           %[[VAL_9:.*]] = fir.address_of(@_QQclX4641494C) : !fir.ref<!fir.char<1,4>>
 ! CHECK:           %[[VAL_10:.*]] = arith.constant 4 : index
 ! CHECK:           %[[VAL_11:.*]]:2 = hlfir.declare %[[VAL_9]] typeparams %[[VAL_10]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQclX4641494C"} : (!fir.ref<!fir.char<1,4>>, index) -> (!fir.ref<!fir.char<1,4>>, !fir.ref<!fir.char<1,4>>)
-! CHECK:           %[[VAL_12:.*]] = fir.convert %[[VAL_11]]#1 : (!fir.ref<!fir.char<1,4>>) -> !fir.ref<i8>
+! CHECK:           %[[VAL_12:.*]] = fir.convert %[[VAL_11]]#0 : (!fir.ref<!fir.char<1,4>>) -> !fir.ref<i8>
 ! CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_10]] : (index) -> i64
 ! CHECK:           %[[VAL_14:.*]] = arith.constant false
 ! CHECK:           %[[VAL_15:.*]] = arith.constant false
@@ -62,7 +62,7 @@ end subroutine test1
 ! CHECK:           %[[VAL_11:.*]] = fir.address_of(@_QQclX4641494C) : !fir.ref<!fir.char<1,4>>
 ! CHECK:           %[[VAL_12:.*]] = arith.constant 4 : index
 ! CHECK:           %[[VAL_13:.*]]:2 = hlfir.declare %[[VAL_11]] typeparams %[[VAL_12]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQclX4641494C"} : (!fir.ref<!fir.char<1,4>>, index) -> (!fir.ref<!fir.char<1,4>>, !fir.ref<!fir.char<1,4>>)
-! CHECK:           %[[VAL_14:.*]] = fir.convert %[[VAL_13]]#1 : (!fir.ref<!fir.char<1,4>>) -> !fir.ref<i8>
+! CHECK:           %[[VAL_14:.*]] = fir.convert %[[VAL_13]]#0 : (!fir.ref<!fir.char<1,4>>) -> !fir.ref<i8>
 ! CHECK:           %[[VAL_15:.*]] = fir.convert %[[VAL_12]] : (index) -> i64
 ! CHECK:           %[[VAL_16:.*]] = arith.constant false
 ! CHECK:           %[[VAL_17:.*]] = arith.constant false
diff --git a/flang/test/HLFIR/count-lowering.fir b/flang/test/HLFIR/count-lowering.fir
index a314b507d048c..394a34b526795 100644
--- a/flang/test/HLFIR/count-lowering.fir
+++ b/flang/test/HLFIR/count-lowering.fir
@@ -92,7 +92,7 @@ func.func @_QPcount3(%arg0: !fir.ref<!fir.array<2xi32>> {fir.bindc_name = "s"})
 
 // CHECK-DAG:     %[[MASK_ADDR:.*]] = fir.address_of
 // CHECK-DAG:     %[[MASK_VAR:.*]]:2 = hlfir.declare %[[MASK_ADDR]](%[[MASK_SHAPE:.*]])
-// CHECK-DAG:     %[[MASK_BOX:.*]] = fir.embox %[[MASK_VAR]]#1(%[[MASK_SHAPE:.*]])
+// CHECK-DAG:     %[[MASK_BOX:.*]] = fir.embox %[[MASK_VAR]]#0(%[[MASK_SHAPE:.*]])
 
 // CHECK-DAG:     %[[DIM:.*]] = arith.constant 1 : i32
 
diff --git a/flang/test/HLFIR/cshift-lowering.fir b/flang/test/HLFIR/cshift-lowering.fir
index 44408d785f682..316fc439f531c 100644
--- a/flang/test/HLFIR/cshift-lowering.fir
+++ b/flang/test/HLFIR/cshift-lowering.fir
@@ -21,7 +21,7 @@ func.func @cshift1(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"}, %a
 // CHECK:           %[[VAL_9:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1>
 // CHECK:           %[[VAL_10:.*]] = fir.embox %[[VAL_8]](%[[VAL_9]]) : (!fir.heap<!fir.array<?xi32>>, !fir.shape<1>) -> !fir.box<!fir.heap<!fir.array<?xi32>>>
 // CHECK:           fir.store %[[VAL_10]] to %[[VAL_5]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
-// CHECK:           %[[VAL_11:.*]] = fir.load %[[VAL_7]]#1 : !fir.ref<i32>
+// CHECK:           %[[VAL_11:.*]] = fir.load %[[VAL_7]]#0 : !fir.ref<i32>
 // CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_5]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<none>>
 // CHECK:           %[[VAL_14:.*]] = fir.convert %[[VAL_6]]#1 : (!fir.box<!fir.array<?xi32>>) -> !fir.box<none>
 // CHECK:           %[[VAL_15:.*]] = fir.convert %[[VAL_11]] : (i32) -> i64
diff --git a/flang/test/HLFIR/dot_product-lowering.fir b/flang/test/HLFIR/dot_product-lowering.fir
index 64d65665433f1..3960b1d644fa5 100644
--- a/flang/test/HLFIR/dot_product-lowering.fir
+++ b/flang/test/HLFIR/dot_product-lowering.fir
@@ -70,8 +70,8 @@ func.func @_QPdot_product2(%arg0: !fir.box<!fir.array<?x!fir.logical<4>>> {fir.b
 // CHECK-DAG:     %[[RHS_VAR:.*]]:2 = hlfir.declare %[[ARG1]]
 // CHECK-DAG:     %[[RES_VAR:.*]]:2 = hlfir.declare %[[ARG2]]
 
-// CHECK-DAG:     %[[LHS_BOX:.*]] = fir.embox %[[LHS_VAR]]#1
-// CHECK-DAG:     %[[RHS_BOX:.*]] = fir.embox %[[RHS_VAR]]#1
+// CHECK-DAG:     %[[LHS_BOX:.*]] = fir.embox %[[LHS_VAR]]#0
+// CHECK-DAG:     %[[RHS_BOX:.*]] = fir.embox %[[RHS_VAR]]#0
 // CHECK-DAG:     %[[LHS_ARG:.*]] = fir.convert %[[LHS_BOX]] : (!fir.box<!fir.array<5xi32>>) -> !fir.box<none>
 // CHECK-DAG:     %[[RHS_ARG:.*]] = fir.convert %[[RHS_BOX]] : (!fir.box<!fir.array<5xi32>>) -> !fir.box<none>
 
diff --git a/flang/test/HLFIR/elemental-codegen-nested.fir b/flang/test/HLFIR/elemental-codegen-nested.fir
index 3ef296249c7d6..74fee6e5e2192 100644
--- a/flang/test/HLFIR/elemental-codegen-nested.fir
+++ b/flang/test/HLFIR/elemental-codegen-nested.fir
@@ -34,7 +34,7 @@
 // CHECK:             %[[VAL_27:.*]] = fir.insert_value %[[VAL_26]], %[[VAL_21]], [1 : index] : (tuple<!fir.heap<!fir.array<2xf32>>, i1>, i1) -> tuple<!fir.heap<!fir.array<2xf32>>, i1>
 // CHECK:             %[[VAL_28:.*]] = fir.insert_value %[[VAL_27]], %[[VAL_20]]#0, [0 : index] : (tuple<!fir.heap<!fir.array<2xf32>>, i1>, !fir.heap<!fir.array<2xf32>>) -> tuple<!fir.heap<!fir.array<2xf32>>, i1>
 // CHECK:             %[[VAL_29:.*]] = fir.convert %[[VAL_20]]#0 : (!fir.heap<!fir.array<2xf32>>) -> !fir.ref<!fir.array<2xf32>>
-// CHECK:             %[[VAL_30:.*]] = fir.convert %[[VAL_20]]#1 : (!fir.heap<!fir.array<2xf32>>) -> !fir.ref<!fir.array<2xf32>>
+// CHECK:             %[[VAL_30:.*]] = fir.convert %[[VAL_20]]#0 : (!fir.heap<!fir.array<2xf32>>) -> !fir.ref<!fir.array<2xf32>>
 // CHECK:             %[[VAL_31:.*]] = fir.embox %[[VAL_29]](%[[VAL_18]]) : (!fir.ref<!fir.array<2xf32>>, !fir.shape<1>) -> !fir.box<!fir.array<2xf32>>
 // CHECK:             %[[VAL_32:.*]] = fir.convert %[[VAL_31]] : (!fir.box<!fir.array<2xf32>>) -> !fir.box<!fir.array<?xf32>>
 // CHECK:             %[[VAL_33:.*]] = fir.call @_QPfoo(%[[VAL_32]]) fastmath<contract> : (!fir.box<!fir.array<?xf32>>) -> f32
diff --git a/flang/test/HLFIR/maxloc-lowering.fir b/flang/test/HLFIR/maxloc-lowering.fir
index be52627564c49..0872088a25a44 100644
--- a/flang/test/HLFIR/maxloc-lowering.fir
+++ b/flang/test/HLFIR/maxloc-lowering.fir
@@ -106,7 +106,7 @@ func.func @_QPmaxloc3(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"},
 // CHECK-NEXT:    %[[V1:.*]]:2 = hlfir.declare %[[ARG0]] {uniq_name = "_QFmaxloc3Ea"} : (!fir.box<!fir.array<?xi32>>) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)
 // CHECK-NEXT:    %[[V2:.*]]:2 = hlfir.declare %[[ARG2]] {uniq_name = "_QFmaxloc3Em"} : (!fir.ref<!fir.logical<4>>) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)
 // CHECK-NEXT:    %[[V3:.*]]:2 = hlfir.declare %[[ARG1]] {uniq_name = "_QFmaxloc3Es"} : (!fir.box<!fir.array<?xi32>>) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)
-// CHECK-NEXT:    %[[V4:.*]] = fir.embox %[[V2]]#1 : (!fir.ref<!fir.logical<4>>) -> !fir.box<!fir.logical<4>>
+// CHECK-NEXT:    %[[V4:.*]] = fir.embox %[[V2]]#0 : (!fir.ref<!fir.logical<4>>) -> !fir.box<!fir.logical<4>>
 // CHECK-NEXT:    %[[V5:.*]] = fir.zero_bits !fir.heap<!fir.array<?xi32>>
 // CHECK-NEXT:    %[[V6:.*]] = fir.shape %[[C0]] : (index) -> !fir.shape<1>
 // CHECK-NEXT:    %[[V7:.*]] = fir.embox %[[V5]](%[[V6]]) : (!fir.heap<!fir.array<?xi32>>, !fir.shape<1>) -> !fir.box<!fir.heap<!fir.array<?xi32>>>
@@ -215,7 +215,7 @@ func.func @_QPmaxloc5(%arg0: !fir.ref<!fir.array<2xi32>> {fir.bindc_name = "s"})
 // CHECK-NEXT:    %[[V5:.*]] = fir.shape %[[C2]] : (index) -> !fir.shape<1>
 // CHECK-NEXT:    %[[V6:.*]]:2 = hlfir.declare %[[ARG0]](%[[V5]]) {uniq_name = "_QFmaxloc5Es"} : (!fir.ref<!fir.array<2xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<2xi32>>, !fir.ref<!fir.array<2xi32>>)
 // CHECK-NEXT:    %[[V7:.*]] = fir.shape %[[C2]], %[[C2]] : (index, index) -> !fir.shape<2>
-// CHECK-NEXT:    %[[V8:.*]] = fir.embox %[[V4]]#1(%[[V7]]) : (!fir.ref<!fir.array<2x2xi32>>, !fir.shape<2>) -> !fir.box<!fir.array<2x2xi32>>
+// CHECK-NEXT:    %[[V8:.*]] = fir.embox %[[V4]]#0(%[[V7]]) : (!fir.ref<!fir.array<2x2xi32>>, !fir.shape<2>) -> !fir.box<!fir.array<2x2xi32>>
 // CHECK-NEXT:    %[[V9:.*]] = fir.convert %[[TRUE]] : (i1) -> !fir.logical<4>
 // CHECK-NEXT:    fir.store %[[V9]] to %[[V1]] : !fir.ref<!fir.logical<4>>
 // CHECK-NEXT:    %[[V10:.*]] = fir.embox %[[V1]] : (!fir.ref<!fir.logical<4>>) -> !fir.box<!fir.logical<4>>
diff --git a/flang/test/HLFIR/maxval-lowering.fir b/flang/test/HLFIR/maxval-lowering.fir
index fbf75d9050544..208877c31be70 100644
--- a/flang/test/HLFIR/maxval-lowering.fir
+++ b/flang/test/HLFIR/maxval-lowering.fir
@@ -86,7 +86,7 @@ func.func @_QPmaxval3(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"},
 // CHECK-DAG:     %[[ARRAY:.*]]:2 = hlfir.declare %[[ARG0]]
 // CHECK-DAG:     %[[RES:.*]]:2 = hlfir.declare %[[ARG1]]
 // CHECK-DAG:     %[[MASK:.*]]:2 = hlfir.declare %[[ARG2]]
-// CHECK-DAG:     %[[MASK_BOX:.*]] = fir.embox %[[MASK]]#1 : (!fir.ref<!fir.logical<4>>) -> !fir.box<!fir.logical<4>>
+// CHECK-DAG:     %[[MASK_BOX:.*]] = fir.embox %[[MASK]]#0 : (!fir.ref<!fir.logical<4>>) -> !fir.box<!fir.logical<4>>
 // CHECK-DAG:     %[[ARRAY_ARG:.*]] = fir.convert %[[ARRAY]]#1 : (!fir.box<!fir.array<?xi32>>) -> !fir.box<none>
 // CHECK-DAG:     %[[MASK_ARG:.*]] = fir.convert %[[MASK_BOX]] : (!fir.box<!fir.logical<4>>) -> !fir.box<none>
 // CHECK:         %[[RET:.*]] = fir.call @_FortranAMaxvalInteger4(%[[ARRAY_ARG]], %[[LOC_STR:.*]], %[[LOC_N:.*]], %[[INT:.*]], %[[MASK_ARG]]) fastmath<contract> : (!fir.box<none>, !fir.ref<i8>, i32, i32, !fir.box<none>) -> i32
@@ -168,7 +168,7 @@ func.func @_QPmaxval5(%arg0: !fir.r...
[truncated]

@llvmbot
Copy link
Member

llvmbot commented Mar 20, 2025

@llvm/pr-subscribers-flang-openmp

Author: None (jeanPerier)

Changes

Currently, the helpers to get fir::ExtendedValue out of hlfir::Entity use hlfir.declare second result (#<!-- -->1) in most cases. This is because this result is the same as the input and matches what FIR was getting before lowering to HLFIR.

But this creates odd situations when both hlfir.declare are raw pointers and either result ends-up being used in the IR depending on whether the code was generated by a helper using fir::ExtendedValue, or via "pure HLFIR" helpers using the first result.

This will typically prevent simple CSE and easy identification that two operation (e.g load/store) are touching the exact same memory location without using alias analysis or "manual detection" (looking for common hlfir.declare defining op).

Hence, when both hlfir.declare are both raw pointers, use #<!-- -->0 when producing fir::ExtendedValue.
When #<!-- -->0 is a fir.box, keep using #<!-- -->1 because these are not the same.
The only code change is in HLFIRTools.cpp and is pretty small, but there is a big test fallout of #<!-- -->1 to #<!-- -->0.

I am considering going towards a simplification where there is a single result for hlfir.declare, but this will be a bit more intrusive since extra box_addr will have to be generated (that will be optimized at the FIR level when the fir.embox generated for hlfir.declare is visible).


Patch is 757.94 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/132261.diff

214 Files Affected:

  • (modified) flang/lib/Optimizer/Builder/HLFIRTools.cpp (+12-2)
  • (modified) flang/test/HLFIR/all-lowering.fir (+1-1)
  • (modified) flang/test/HLFIR/any-lowering.fir (+1-1)
  • (modified) flang/test/HLFIR/associate-codegen.fir (+6-6)
  • (modified) flang/test/HLFIR/assumed-type-actual-args.f90 (+1-1)
  • (modified) flang/test/HLFIR/boxchar_emboxing.f90 (+2-2)
  • (modified) flang/test/HLFIR/count-lowering.fir (+1-1)
  • (modified) flang/test/HLFIR/cshift-lowering.fir (+1-1)
  • (modified) flang/test/HLFIR/dot_product-lowering.fir (+2-2)
  • (modified) flang/test/HLFIR/elemental-codegen-nested.fir (+1-1)
  • (modified) flang/test/HLFIR/maxloc-lowering.fir (+2-2)
  • (modified) flang/test/HLFIR/maxval-lowering.fir (+2-2)
  • (modified) flang/test/HLFIR/minloc-lowering.fir (+2-2)
  • (modified) flang/test/HLFIR/minval-lowering.fir (+2-2)
  • (modified) flang/test/HLFIR/mul_transpose.f90 (+8-7)
  • (modified) flang/test/HLFIR/opt-bufferization-eval_in_mem.fir (+1-1)
  • (modified) flang/test/HLFIR/order_assignments/user-defined-assignment.fir (+1-1)
  • (modified) flang/test/HLFIR/product-lowering.fir (+2-2)
  • (modified) flang/test/HLFIR/reshape-lowering.fir (+8-8)
  • (modified) flang/test/HLFIR/sum-lowering.fir (+2-2)
  • (modified) flang/test/HLFIR/transpose-lowering.fir (+1-1)
  • (modified) flang/test/Lower/CUDA/cuda-allocatable.cuf (+37-37)
  • (modified) flang/test/Lower/CUDA/cuda-data-attribute.cuf (+2-2)
  • (modified) flang/test/Lower/CUDA/cuda-data-transfer.cuf (+5-5)
  • (modified) flang/test/Lower/CUDA/cuda-device-proc.cuf (+4-4)
  • (modified) flang/test/Lower/CUDA/cuda-kernel-calls.cuf (+6-6)
  • (modified) flang/test/Lower/CUDA/cuda-kernel-loop-directive.cuf (+3-3)
  • (modified) flang/test/Lower/CUDA/cuda-return01.cuf (+1-1)
  • (modified) flang/test/Lower/CUDA/cuda-return02.cuf (+1-1)
  • (modified) flang/test/Lower/HLFIR/actual_target_for_dummy_pointer.f90 (+16-16)
  • (modified) flang/test/Lower/HLFIR/allocatable-and-pointer-status-change.f90 (+7-7)
  • (modified) flang/test/Lower/HLFIR/allocatable-end-of-scope-dealloc.f90 (+5-5)
  • (modified) flang/test/Lower/HLFIR/allocatable-return.f90 (+6-6)
  • (modified) flang/test/Lower/HLFIR/allocatables-and-pointers.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/array-ctor-as-elemental.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/array-ctor-derived.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/array-ctor-index.f90 (+4-4)
  • (modified) flang/test/Lower/HLFIR/associate-construct.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/assumed-rank-iface.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/assumed-rank-inquiries-2.f90 (+6-6)
  • (modified) flang/test/Lower/HLFIR/assumed-rank-inquiries.f90 (+18-18)
  • (modified) flang/test/Lower/HLFIR/bindc-entry-stmt.f90 (+6-6)
  • (modified) flang/test/Lower/HLFIR/bindc-value-derived.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/call-issue-124043.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/call-sequence-associated-descriptors.f90 (+12-12)
  • (modified) flang/test/Lower/HLFIR/calls-array-results.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/calls-assumed-shape.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/calls-constant-expr-arg.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/calls-f77.f90 (+9-9)
  • (modified) flang/test/Lower/HLFIR/calls-optional.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/calls-percent-val-ref.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/cray-pointers.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/custom-intrinsic.f90 (+29-29)
  • (modified) flang/test/Lower/HLFIR/elemental-array-ops.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/elemental-call-vector-subscripts.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/elemental-user-procedure-ref.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/entry_return.f90 (+10-10)
  • (modified) flang/test/Lower/HLFIR/expr-addr.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/expr-as-inquired.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/function-return-as-expr.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/function-return.f90 (+4-4)
  • (modified) flang/test/Lower/HLFIR/goto-do-body.f90 (+6-6)
  • (modified) flang/test/Lower/HLFIR/ignore-rank-unlimited-polymorphic.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/implicit-call-mismatch.f90 (+7-7)
  • (modified) flang/test/Lower/HLFIR/intentout-allocatable-components.f90 (+3-3)
  • (modified) flang/test/Lower/HLFIR/internal-procedures.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/intrinsic-dynamically-optional.f90 (+10-10)
  • (modified) flang/test/Lower/HLFIR/intrinsic-module-procedures.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/intrinsic-subroutines.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/issue80884.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/maxloc.f90 (+4-4)
  • (modified) flang/test/Lower/HLFIR/maxval.f90 (+4-4)
  • (modified) flang/test/Lower/HLFIR/minloc.f90 (+4-4)
  • (modified) flang/test/Lower/HLFIR/minval.f90 (+5-5)
  • (modified) flang/test/Lower/HLFIR/proc-pointer-comp-nopass.f90 (+8-8)
  • (modified) flang/test/Lower/HLFIR/proc-pointer-comp-pass.f90 (+7-7)
  • (modified) flang/test/Lower/HLFIR/procedure-designators.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/procedure-pointer.f90 (+6-6)
  • (modified) flang/test/Lower/HLFIR/product.f90 (+4-4)
  • (modified) flang/test/Lower/HLFIR/reshape.f90 (+6-6)
  • (modified) flang/test/Lower/HLFIR/select-rank.f90 (+7-7)
  • (modified) flang/test/Lower/HLFIR/select-type-selector.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/structure-constructor.f90 (+12-12)
  • (modified) flang/test/Lower/HLFIR/sum.f90 (+4-4)
  • (modified) flang/test/Lower/HLFIR/transformational.f90 (+1-1)
  • (modified) flang/test/Lower/HLFIR/user-defined-assignment.f90 (+2-2)
  • (modified) flang/test/Lower/HLFIR/vector-subscript-as-value.f90 (+1-1)
  • (modified) flang/test/Lower/Intrinsics/associated-proc-pointers.f90 (+6-6)
  • (modified) flang/test/Lower/Intrinsics/c_f_procpointer.f90 (+4-4)
  • (modified) flang/test/Lower/Intrinsics/c_ptr_eq_ne.f90 (+6-6)
  • (modified) flang/test/Lower/Intrinsics/chdir.f90 (+7-7)
  • (modified) flang/test/Lower/Intrinsics/ieee_rint_int.f90 (+7-7)
  • (modified) flang/test/Lower/Intrinsics/ieee_rounding.f90 (+3-3)
  • (modified) flang/test/Lower/Intrinsics/loc.f90 (+11-11)
  • (modified) flang/test/Lower/Intrinsics/min.f90 (+1-1)
  • (modified) flang/test/Lower/Intrinsics/reduce.f90 (+3-3)
  • (modified) flang/test/Lower/Intrinsics/rename.f90 (+1-1)
  • (modified) flang/test/Lower/Intrinsics/second.f90 (+1-1)
  • (modified) flang/test/Lower/Intrinsics/selected_logical_kind.f90 (+5-5)
  • (modified) flang/test/Lower/Intrinsics/shape.f90 (+2-2)
  • (modified) flang/test/Lower/Intrinsics/signal.f90 (+6-6)
  • (modified) flang/test/Lower/Intrinsics/system-optional.f90 (+1-1)
  • (modified) flang/test/Lower/Intrinsics/system.f90 (+1-1)
  • (modified) flang/test/Lower/OpenACC/acc-atomic-capture.f90 (+18-18)
  • (modified) flang/test/Lower/OpenACC/acc-atomic-read.f90 (+2-2)
  • (modified) flang/test/Lower/OpenACC/acc-atomic-update-array.f90 (+3-3)
  • (modified) flang/test/Lower/OpenACC/acc-atomic-update-hlfir.f90 (+3-3)
  • (modified) flang/test/Lower/OpenACC/acc-atomic-update.f90 (+3-3)
  • (modified) flang/test/Lower/OpenACC/acc-atomic-write.f90 (+2-2)
  • (modified) flang/test/Lower/OpenACC/acc-data-operands-unwrap-defaultbounds.f90 (+6-6)
  • (modified) flang/test/Lower/OpenACC/acc-data-operands.f90 (+6-6)
  • (modified) flang/test/Lower/OpenACC/acc-declare-unwrap-defaultbounds.f90 (+2-2)
  • (modified) flang/test/Lower/OpenACC/acc-declare.f90 (+2-2)
  • (modified) flang/test/Lower/OpenACC/acc-enter-data-unwrap-defaultbounds.f90 (+9-9)
  • (modified) flang/test/Lower/OpenACC/acc-enter-data.f90 (+8-8)
  • (modified) flang/test/Lower/OpenACC/acc-kernels-loop.f90 (+1-1)
  • (modified) flang/test/Lower/OpenACC/acc-kernels.f90 (+1-1)
  • (modified) flang/test/Lower/OpenACC/acc-parallel-loop.f90 (+1-1)
  • (modified) flang/test/Lower/OpenACC/acc-parallel.f90 (+1-1)
  • (modified) flang/test/Lower/OpenACC/acc-private-unwrap-defaultbounds.f90 (+1-1)
  • (modified) flang/test/Lower/OpenACC/acc-private.f90 (+1-1)
  • (modified) flang/test/Lower/OpenACC/acc-serial-loop.f90 (+1-1)
  • (modified) flang/test/Lower/OpenACC/acc-serial.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/DelayedPrivatization/distribute-standalone-private.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/DelayedPrivatization/wsloop.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/allocatable-array-bounds.f90 (+7-7)
  • (modified) flang/test/Lower/OpenMP/common-atomic-lowering.f90 (+2-2)
  • (modified) flang/test/Lower/OpenMP/copyin-order.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/copyin.f90 (+41-41)
  • (modified) flang/test/Lower/OpenMP/default-clause.f90 (+2-2)
  • (modified) flang/test/Lower/OpenMP/flush.f90 (+2-2)
  • (modified) flang/test/Lower/OpenMP/generic-loop-rewriting.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/hlfir-seqloop-parallel.f90 (+8-8)
  • (modified) flang/test/Lower/OpenMP/lastprivate-allocatable.f90 (+2-1)
  • (modified) flang/test/Lower/OpenMP/lastprivate-iv.f90 (+6-6)
  • (modified) flang/test/Lower/OpenMP/lastprivate-simd.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/loop-pointer-variable.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/parallel-lastprivate-clause-scalar.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/parallel-private-clause-fixes.f90 (+4-4)
  • (modified) flang/test/Lower/OpenMP/parallel-private-clause.f90 (+8-8)
  • (modified) flang/test/Lower/OpenMP/parallel-reduction-allocatable-array.f90 (+2-2)
  • (modified) flang/test/Lower/OpenMP/parallel-reduction-pointer-array.f90 (+4-4)
  • (modified) flang/test/Lower/OpenMP/parallel-reduction3.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/parallel-wsloop-firstpriv.f90 (+6-6)
  • (modified) flang/test/Lower/OpenMP/parallel-wsloop-lastpriv.f90 (+22-22)
  • (modified) flang/test/Lower/OpenMP/parallel-wsloop.f90 (+12-12)
  • (modified) flang/test/Lower/OpenMP/private-commonblock.f90 (+11-11)
  • (modified) flang/test/Lower/OpenMP/private-derived-type.f90 (+2-2)
  • (modified) flang/test/Lower/OpenMP/scan.f90 (+2-2)
  • (modified) flang/test/Lower/OpenMP/shared-loop.f90 (+9-9)
  • (modified) flang/test/Lower/OpenMP/simd.f90 (+12-12)
  • (modified) flang/test/Lower/OpenMP/simd_x86_64.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/stop-stmt-in-region.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/target.f90 (+9-9)
  • (modified) flang/test/Lower/OpenMP/threadprivate-char-array-chararray.f90 (+15-15)
  • (modified) flang/test/Lower/OpenMP/threadprivate-commonblock.f90 (+12-12)
  • (modified) flang/test/Lower/OpenMP/threadprivate-hlfir.f90 (+5-5)
  • (modified) flang/test/Lower/OpenMP/threadprivate-host-association.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/threadprivate-integer-different-kinds.f90 (+12-12)
  • (modified) flang/test/Lower/OpenMP/threadprivate-pointer-allocatable.f90 (+14-14)
  • (modified) flang/test/Lower/OpenMP/threadprivate-real-logical-complex-derivedtype.f90 (+8-8)
  • (modified) flang/test/Lower/OpenMP/threadprivate-use-association-2-hlfir.f90 (+4-4)
  • (modified) flang/test/Lower/OpenMP/threadprivate-use-association.f90 (+6-6)
  • (modified) flang/test/Lower/OpenMP/unstructured.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-chunks.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-collapse.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-monotonic.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-nonmonotonic.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-add-byref.f90 (+7-7)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-add.f90 (+7-7)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-allocatable-array-minmax.f90 (+8-8)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-allocatable.f90 (+2-2)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-array-assumed-shape.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-array.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-array2.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-iand-byref.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-iand.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-ieor-byref.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-ieor.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-ior-byref.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-ior.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-logical-and-byref.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-logical-and.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-logical-eqv-byref.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-logical-eqv.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-logical-neqv-byref.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-logical-neqv.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-logical-or-byref.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-logical-or.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-max-byref.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-max.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-min-byref.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-min.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-min2.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-mul-byref.f90 (+7-7)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-mul.f90 (+7-7)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-multiple-clauses.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-reduction-pointer.f90 (+3-3)
  • (modified) flang/test/Lower/OpenMP/wsloop-schedule.f90 (+1-1)
  • (modified) flang/test/Lower/OpenMP/wsloop-variable.f90 (+9-9)
  • (modified) flang/test/Lower/OpenMP/wsloop.f90 (+3-3)
  • (modified) flang/test/Lower/allocatable-polymorphic.f90 (+60-60)
  • (modified) flang/test/Lower/allocate-source-allocatables-2.f90 (+5-5)
  • (modified) flang/test/Lower/array-character.f90 (+7-7)
  • (modified) flang/test/Lower/array-elemental-calls-char-byval.f90 (+3-3)
  • (modified) flang/test/Lower/array-elemental-calls-char.f90 (+3-3)
  • (modified) flang/test/Lower/call-by-value-attr.f90 (+5-5)
  • (modified) flang/test/Lower/components.f90 (+1-1)
  • (modified) flang/test/Lower/derived-type-temp.f90 (+1-1)
  • (modified) flang/test/Lower/entry-statement.f90 (+9-9)
  • (modified) flang/test/Lower/intentout-deallocate.f90 (+29-29)
  • (modified) flang/test/Lower/io-asynchronous.f90 (+4-4)
  • (modified) flang/test/Lower/nullify-polymorphic.f90 (+1-1)
  • (modified) flang/test/Lower/structure-constructors-alloc-comp.f90 (+4-4)
diff --git a/flang/lib/Optimizer/Builder/HLFIRTools.cpp b/flang/lib/Optimizer/Builder/HLFIRTools.cpp
index 1a31ca33e9465..85fd742db6beb 100644
--- a/flang/lib/Optimizer/Builder/HLFIRTools.cpp
+++ b/flang/lib/Optimizer/Builder/HLFIRTools.cpp
@@ -186,14 +186,24 @@ static fir::CharBoxValue genUnboxChar(mlir::Location loc,
   return {addr, len};
 }
 
+// To maximize chances of identifying usage of a same variables in the IR,
+// always return the hlfirBase result of declare/associate if it is a raw
+// pointer.
+static mlir::Value getFirBaseHelper(mlir::Value hlfirBase,
+                                    mlir::Value firBase) {
+  if (fir::isa_ref_type(hlfirBase.getType()))
+    return hlfirBase;
+  return firBase;
+}
+
 mlir::Value hlfir::Entity::getFirBase() const {
   if (fir::FortranVariableOpInterface variable = getIfVariableInterface()) {
     if (auto declareOp =
             mlir::dyn_cast<hlfir::DeclareOp>(variable.getOperation()))
-      return declareOp.getOriginalBase();
+      return getFirBaseHelper(declareOp.getBase(), declareOp.getOriginalBase());
     if (auto associateOp =
             mlir::dyn_cast<hlfir::AssociateOp>(variable.getOperation()))
-      return associateOp.getFirBase();
+      return getFirBaseHelper(associateOp.getBase(), associateOp.getFirBase());
   }
   return getBase();
 }
diff --git a/flang/test/HLFIR/all-lowering.fir b/flang/test/HLFIR/all-lowering.fir
index df6771e565efc..b20d5e759177f 100644
--- a/flang/test/HLFIR/all-lowering.fir
+++ b/flang/test/HLFIR/all-lowering.fir
@@ -90,7 +90,7 @@ func.func @_QPall3(%arg0: !fir.ref<!fir.array<2x!fir.logical<4>>> {fir.bindc_nam
 
 // CHECK-DAG:     %[[MASK_ADDR:.*]] = fir.address_of
 // CHECK-DAG:     %[[MASK_VAR:.*]]:2 = hlfir.declare %[[MASK_ADDR]](%[[MASK_SHAPE:.*]])
-// CHECK-DAG:     %[[MASK_BOX:.*]] = fir.embox %[[MASK_VAR]]#1(%[[MASK_SHAPE:.*]])
+// CHECK-DAG:     %[[MASK_BOX:.*]] = fir.embox %[[MASK_VAR]]#0(%[[MASK_SHAPE:.*]])
 
 // CHECK-DAG:     %[[DIM:.*]] = arith.constant 1 : i32
 
diff --git a/flang/test/HLFIR/any-lowering.fir b/flang/test/HLFIR/any-lowering.fir
index 72fcdd37b6193..71889b01aaf29 100644
--- a/flang/test/HLFIR/any-lowering.fir
+++ b/flang/test/HLFIR/any-lowering.fir
@@ -93,7 +93,7 @@ func.func @_QPany3(%arg0: !fir.ref<!fir.array<2x!fir.logical<4>>> {fir.bindc_nam
 
 // CHECK-DAG:     %[[MASK_ADDR:.*]] = fir.address_of
 // CHECK-DAG:     %[[MASK_VAR:.*]]:2 = hlfir.declare %[[MASK_ADDR]](%[[MASK_SHAPE:.*]])
-// CHECK-DAG:     %[[MASK_BOX:.*]] = fir.embox %[[MASK_VAR]]#1(%[[MASK_SHAPE:.*]])
+// CHECK-DAG:     %[[MASK_BOX:.*]] = fir.embox %[[MASK_VAR]]#0(%[[MASK_SHAPE:.*]])
 
 // CHECK-DAG:     %[[DIM:.*]] = arith.constant 1 : i32
 
diff --git a/flang/test/HLFIR/associate-codegen.fir b/flang/test/HLFIR/associate-codegen.fir
index ad64959984a14..d2ab142744072 100644
--- a/flang/test/HLFIR/associate-codegen.fir
+++ b/flang/test/HLFIR/associate-codegen.fir
@@ -88,7 +88,7 @@ func.func @associate_char(%arg0: !fir.boxchar<1> ) {
 // CHECK:           %[[VAL_16:.*]] = arith.subi %[[VAL_7]], %[[VAL_15]] : index
 // CHECK:           fir.do_loop %[[VAL_17:.*]] = %[[VAL_2]]#1 to %[[VAL_16]] step %[[VAL_15]] {
 // CHECK:             %[[VAL_18:.*]] = arith.subi %[[VAL_17]], %[[VAL_2]]#1 : index
-// CHECK:             %[[VAL_19:.*]] = fir.convert %[[VAL_6]]#1 : (!fir.ref<!fir.char<1>>) -> !fir.ref<!fir.array<1x!fir.char<1>>>
+// CHECK:             %[[VAL_19:.*]] = fir.convert %[[VAL_6]]#0 : (!fir.ref<!fir.char<1>>) -> !fir.ref<!fir.array<1x!fir.char<1>>>
 // CHECK:             %[[VAL_20:.*]] = fir.coordinate_of %[[VAL_19]], %[[VAL_18]] : (!fir.ref<!fir.array<1x!fir.char<1>>>, index) -> !fir.ref<!fir.char<1>>
 // CHECK:             %[[VAL_21:.*]] = fir.load %[[VAL_20]] : !fir.ref<!fir.char<1>>
 // CHECK:             %[[VAL_22:.*]] = fir.convert %[[VAL_8]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>>
@@ -233,7 +233,7 @@ func.func @test_shape_of(%arg0: !fir.ref<!fir.array<4x3xi32>>) {
 // CHECK:           %[[VAL_14:.*]] = fir.insert_value %[[VAL_13]], %[[VAL_6]], [1 : index] : (tuple<!fir.heap<!fir.array<3x4xi32>>, i1>, i1) -> tuple<!fir.heap<!fir.array<3x4xi32>>, i1>
 // CHECK:           %[[VAL_15:.*]] = fir.insert_value %[[VAL_14]], %[[VAL_5]]#0, [0 : index] : (tuple<!fir.heap<!fir.array<3x4xi32>>, i1>, !fir.heap<!fir.array<3x4xi32>>) -> tuple<!fir.heap<!fir.array<3x4xi32>>, i1>
 // CHECK:           %[[VAL_16:.*]] = fir.convert %[[VAL_5]]#0 : (!fir.heap<!fir.array<3x4xi32>>) -> !fir.ref<!fir.array<3x4xi32>>
-// CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_5]]#1 : (!fir.heap<!fir.array<3x4xi32>>) -> !fir.ref<!fir.array<3x4xi32>>
+// CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_5]]#0 : (!fir.heap<!fir.array<3x4xi32>>) -> !fir.ref<!fir.array<3x4xi32>>
 // CHECK:           %[[VAL_18:.*]] = fir.convert %[[VAL_17]] : (!fir.ref<!fir.array<3x4xi32>>) -> !fir.heap<!fir.array<3x4xi32>>
 // CHECK:           fir.freemem %[[VAL_18]] : !fir.heap<!fir.array<3x4xi32>>
 // CHECK:           return
@@ -266,7 +266,7 @@ func.func @test_multiple_associations(%arg0: !hlfir.expr<1x2xi32>) {
 // CHECK:           %[[VAL_11:.*]] = fir.insert_value %[[VAL_10]], %[[VAL_8]], [1 : index] : (tuple<!fir.heap<!fir.array<1x2xi32>>, i1>, i1) -> tuple<!fir.heap<!fir.array<1x2xi32>>, i1>
 // CHECK:           %[[VAL_12:.*]] = fir.insert_value %[[VAL_11]], %[[VAL_9]]#0, [0 : index] : (tuple<!fir.heap<!fir.array<1x2xi32>>, i1>, !fir.heap<!fir.array<1x2xi32>>) -> tuple<!fir.heap<!fir.array<1x2xi32>>, i1>
 // CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_9]]#0 : (!fir.heap<!fir.array<1x2xi32>>) -> !fir.ref<!fir.array<1x2xi32>>
-// CHECK:           %[[VAL_14:.*]] = fir.convert %[[VAL_9]]#1 : (!fir.heap<!fir.array<1x2xi32>>) -> !fir.ref<!fir.array<1x2xi32>>
+// CHECK:           %[[VAL_14:.*]] = fir.convert %[[VAL_9]]#0 : (!fir.heap<!fir.array<1x2xi32>>) -> !fir.ref<!fir.array<1x2xi32>>
 // associate 1:
 // CHECK:           %[[VAL_15:.*]] = hlfir.shape_of %[[VAL_0]] : (!hlfir.expr<1x2xi32>) -> !fir.shape<2>
 // CHECK:           %[[VAL_16:.*]] = arith.constant 1 : index
@@ -279,7 +279,7 @@ func.func @test_multiple_associations(%arg0: !hlfir.expr<1x2xi32>) {
 // CHECK:           %[[VAL_22:.*]] = fir.insert_value %[[VAL_21]], %[[VAL_19]], [1 : index] : (tuple<!fir.heap<!fir.array<1x2xi32>>, i1>, i1) -> tuple<!fir.heap<!fir.array<1x2xi32>>, i1>
 // CHECK:           %[[VAL_23:.*]] = fir.insert_value %[[VAL_22]], %[[VAL_20]]#0, [0 : index] : (tuple<!fir.heap<!fir.array<1x2xi32>>, i1>, !fir.heap<!fir.array<1x2xi32>>) -> tuple<!fir.heap<!fir.array<1x2xi32>>, i1>
 // CHECK:           %[[VAL_24:.*]] = fir.convert %[[VAL_20]]#0 : (!fir.heap<!fir.array<1x2xi32>>) -> !fir.ref<!fir.array<1x2xi32>>
-// CHECK:           %[[VAL_25:.*]] = fir.convert %[[VAL_20]]#1 : (!fir.heap<!fir.array<1x2xi32>>) -> !fir.ref<!fir.array<1x2xi32>>
+// CHECK:           %[[VAL_25:.*]] = fir.convert %[[VAL_20]]#0 : (!fir.heap<!fir.array<1x2xi32>>) -> !fir.ref<!fir.array<1x2xi32>>
 // end associate 0:
 // CHECK:           %[[VAL_26:.*]] = fir.convert %[[VAL_14]] : (!fir.ref<!fir.array<1x2xi32>>) -> !fir.heap<!fir.array<1x2xi32>>
 // CHECK:           fir.freemem %[[VAL_26]] : !fir.heap<!fir.array<1x2xi32>>
@@ -414,7 +414,7 @@ func.func @_QPtest_multitple_associates_for_same_expr() {
 // CHECK:           %[[VAL_17:.*]] = fir.insert_value %[[VAL_16]], %[[VAL_14]], [1 : index] : (tuple<!fir.heap<!fir.array<10x!fir.char<1>>>, i1>, i1) -> tuple<!fir.heap<!fir.array<10x!fir.char<1>>>, i1>
 // CHECK:           %[[VAL_18:.*]] = fir.insert_value %[[VAL_17]], %[[VAL_15]]#0, [0 : index] : (tuple<!fir.heap<!fir.array<10x!fir.char<1>>>, i1>, !fir.heap<!fir.array<10x!fir.char<1>>>) -> tuple<!fir.heap<!fir.array<10x!fir.char<1>>>, i1>
 // CHECK:           %[[VAL_19:.*]] = fir.convert %[[VAL_15]]#0 : (!fir.heap<!fir.array<10x!fir.char<1>>>) -> !fir.ref<!fir.array<10x!fir.char<1>>>
-// CHECK:           %[[VAL_20:.*]] = fir.convert %[[VAL_15]]#1 : (!fir.heap<!fir.array<10x!fir.char<1>>>) -> !fir.ref<!fir.array<10x!fir.char<1>>>
+// CHECK:           %[[VAL_20:.*]] = fir.convert %[[VAL_15]]#0 : (!fir.heap<!fir.array<10x!fir.char<1>>>) -> !fir.ref<!fir.array<10x!fir.char<1>>>
 // CHECK:           %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (!fir.ref<!fir.array<10x!fir.char<1>>>) -> !fir.heap<!fir.array<10x!fir.char<1>>>
 // CHECK:           fir.freemem %[[VAL_21]] : !fir.heap<!fir.array<10x!fir.char<1>>>
 // CHECK:           %[[VAL_22:.*]] = fir.allocmem !fir.array<10x!fir.char<1>> {bindc_name = ".tmp", uniq_name = ""}
@@ -425,7 +425,7 @@ func.func @_QPtest_multitple_associates_for_same_expr() {
 // CHECK:           %[[VAL_26:.*]] = fir.insert_value %[[VAL_25]], %[[VAL_23]], [1 : index] : (tuple<!fir.heap<!fir.array<10x!fir.char<1>>>, i1>, i1) -> tuple<!fir.heap<!fir.array<10x!fir.char<1>>>, i1>
 // CHECK:           %[[VAL_27:.*]] = fir.insert_value %[[VAL_26]], %[[VAL_24]]#0, [0 : index] : (tuple<!fir.heap<!fir.array<10x!fir.char<1>>>, i1>, !fir.heap<!fir.array<10x!fir.char<1>>>) -> tuple<!fir.heap<!fir.array<10x!fir.char<1>>>, i1>
 // CHECK:           %[[VAL_28:.*]] = fir.convert %[[VAL_24]]#0 : (!fir.heap<!fir.array<10x!fir.char<1>>>) -> !fir.ref<!fir.array<10x!fir.char<1>>>
-// CHECK:           %[[VAL_29:.*]] = fir.convert %[[VAL_24]]#1 : (!fir.heap<!fir.array<10x!fir.char<1>>>) -> !fir.ref<!fir.array<10x!fir.char<1>>>
+// CHECK:           %[[VAL_29:.*]] = fir.convert %[[VAL_24]]#0 : (!fir.heap<!fir.array<10x!fir.char<1>>>) -> !fir.ref<!fir.array<10x!fir.char<1>>>
 // CHECK:           %[[VAL_30:.*]] = fir.convert %[[VAL_29]] : (!fir.ref<!fir.array<10x!fir.char<1>>>) -> !fir.heap<!fir.array<10x!fir.char<1>>>
 // CHECK:           fir.freemem %[[VAL_30]] : !fir.heap<!fir.array<10x!fir.char<1>>>
 // CHECK:           fir.freemem %[[VAL_4]]#0 : !fir.heap<!fir.array<10x!fir.char<1>>>
diff --git a/flang/test/HLFIR/assumed-type-actual-args.f90 b/flang/test/HLFIR/assumed-type-actual-args.f90
index 855542709f622..42e9ed27340e7 100644
--- a/flang/test/HLFIR/assumed-type-actual-args.f90
+++ b/flang/test/HLFIR/assumed-type-actual-args.f90
@@ -106,7 +106,7 @@ subroutine s5b(x)
 ! CHECK-SAME:                        %[[VAL_0:.*]]: !fir.ref<none> {fir.bindc_name = "x"}) {
 ! CHECK:           %[[DSCOPE:.*]] = fir.dummy_scope : !fir.dscope
 ! CHECK:           %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %[[DSCOPE]] {uniq_name = "_QFtest1Ex"} : (!fir.ref<none>, !fir.dscope) -> (!fir.ref<none>, !fir.ref<none>)
-! CHECK:           fir.call @_QPs1(%[[VAL_1]]#1) fastmath<contract> : (!fir.ref<none>) -> ()
+! CHECK:           fir.call @_QPs1(%[[VAL_1]]#0) fastmath<contract> : (!fir.ref<none>) -> ()
 ! CHECK:           return
 ! CHECK:         }
 
diff --git a/flang/test/HLFIR/boxchar_emboxing.f90 b/flang/test/HLFIR/boxchar_emboxing.f90
index 787aa8325a8c8..b80ff9858da34 100644
--- a/flang/test/HLFIR/boxchar_emboxing.f90
+++ b/flang/test/HLFIR/boxchar_emboxing.f90
@@ -18,7 +18,7 @@
 ! CHECK:           %[[VAL_9:.*]] = fir.address_of(@_QQclX4641494C) : !fir.ref<!fir.char<1,4>>
 ! CHECK:           %[[VAL_10:.*]] = arith.constant 4 : index
 ! CHECK:           %[[VAL_11:.*]]:2 = hlfir.declare %[[VAL_9]] typeparams %[[VAL_10]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQclX4641494C"} : (!fir.ref<!fir.char<1,4>>, index) -> (!fir.ref<!fir.char<1,4>>, !fir.ref<!fir.char<1,4>>)
-! CHECK:           %[[VAL_12:.*]] = fir.convert %[[VAL_11]]#1 : (!fir.ref<!fir.char<1,4>>) -> !fir.ref<i8>
+! CHECK:           %[[VAL_12:.*]] = fir.convert %[[VAL_11]]#0 : (!fir.ref<!fir.char<1,4>>) -> !fir.ref<i8>
 ! CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_10]] : (index) -> i64
 ! CHECK:           %[[VAL_14:.*]] = arith.constant false
 ! CHECK:           %[[VAL_15:.*]] = arith.constant false
@@ -62,7 +62,7 @@ end subroutine test1
 ! CHECK:           %[[VAL_11:.*]] = fir.address_of(@_QQclX4641494C) : !fir.ref<!fir.char<1,4>>
 ! CHECK:           %[[VAL_12:.*]] = arith.constant 4 : index
 ! CHECK:           %[[VAL_13:.*]]:2 = hlfir.declare %[[VAL_11]] typeparams %[[VAL_12]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQclX4641494C"} : (!fir.ref<!fir.char<1,4>>, index) -> (!fir.ref<!fir.char<1,4>>, !fir.ref<!fir.char<1,4>>)
-! CHECK:           %[[VAL_14:.*]] = fir.convert %[[VAL_13]]#1 : (!fir.ref<!fir.char<1,4>>) -> !fir.ref<i8>
+! CHECK:           %[[VAL_14:.*]] = fir.convert %[[VAL_13]]#0 : (!fir.ref<!fir.char<1,4>>) -> !fir.ref<i8>
 ! CHECK:           %[[VAL_15:.*]] = fir.convert %[[VAL_12]] : (index) -> i64
 ! CHECK:           %[[VAL_16:.*]] = arith.constant false
 ! CHECK:           %[[VAL_17:.*]] = arith.constant false
diff --git a/flang/test/HLFIR/count-lowering.fir b/flang/test/HLFIR/count-lowering.fir
index a314b507d048c..394a34b526795 100644
--- a/flang/test/HLFIR/count-lowering.fir
+++ b/flang/test/HLFIR/count-lowering.fir
@@ -92,7 +92,7 @@ func.func @_QPcount3(%arg0: !fir.ref<!fir.array<2xi32>> {fir.bindc_name = "s"})
 
 // CHECK-DAG:     %[[MASK_ADDR:.*]] = fir.address_of
 // CHECK-DAG:     %[[MASK_VAR:.*]]:2 = hlfir.declare %[[MASK_ADDR]](%[[MASK_SHAPE:.*]])
-// CHECK-DAG:     %[[MASK_BOX:.*]] = fir.embox %[[MASK_VAR]]#1(%[[MASK_SHAPE:.*]])
+// CHECK-DAG:     %[[MASK_BOX:.*]] = fir.embox %[[MASK_VAR]]#0(%[[MASK_SHAPE:.*]])
 
 // CHECK-DAG:     %[[DIM:.*]] = arith.constant 1 : i32
 
diff --git a/flang/test/HLFIR/cshift-lowering.fir b/flang/test/HLFIR/cshift-lowering.fir
index 44408d785f682..316fc439f531c 100644
--- a/flang/test/HLFIR/cshift-lowering.fir
+++ b/flang/test/HLFIR/cshift-lowering.fir
@@ -21,7 +21,7 @@ func.func @cshift1(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"}, %a
 // CHECK:           %[[VAL_9:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1>
 // CHECK:           %[[VAL_10:.*]] = fir.embox %[[VAL_8]](%[[VAL_9]]) : (!fir.heap<!fir.array<?xi32>>, !fir.shape<1>) -> !fir.box<!fir.heap<!fir.array<?xi32>>>
 // CHECK:           fir.store %[[VAL_10]] to %[[VAL_5]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
-// CHECK:           %[[VAL_11:.*]] = fir.load %[[VAL_7]]#1 : !fir.ref<i32>
+// CHECK:           %[[VAL_11:.*]] = fir.load %[[VAL_7]]#0 : !fir.ref<i32>
 // CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_5]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<none>>
 // CHECK:           %[[VAL_14:.*]] = fir.convert %[[VAL_6]]#1 : (!fir.box<!fir.array<?xi32>>) -> !fir.box<none>
 // CHECK:           %[[VAL_15:.*]] = fir.convert %[[VAL_11]] : (i32) -> i64
diff --git a/flang/test/HLFIR/dot_product-lowering.fir b/flang/test/HLFIR/dot_product-lowering.fir
index 64d65665433f1..3960b1d644fa5 100644
--- a/flang/test/HLFIR/dot_product-lowering.fir
+++ b/flang/test/HLFIR/dot_product-lowering.fir
@@ -70,8 +70,8 @@ func.func @_QPdot_product2(%arg0: !fir.box<!fir.array<?x!fir.logical<4>>> {fir.b
 // CHECK-DAG:     %[[RHS_VAR:.*]]:2 = hlfir.declare %[[ARG1]]
 // CHECK-DAG:     %[[RES_VAR:.*]]:2 = hlfir.declare %[[ARG2]]
 
-// CHECK-DAG:     %[[LHS_BOX:.*]] = fir.embox %[[LHS_VAR]]#1
-// CHECK-DAG:     %[[RHS_BOX:.*]] = fir.embox %[[RHS_VAR]]#1
+// CHECK-DAG:     %[[LHS_BOX:.*]] = fir.embox %[[LHS_VAR]]#0
+// CHECK-DAG:     %[[RHS_BOX:.*]] = fir.embox %[[RHS_VAR]]#0
 // CHECK-DAG:     %[[LHS_ARG:.*]] = fir.convert %[[LHS_BOX]] : (!fir.box<!fir.array<5xi32>>) -> !fir.box<none>
 // CHECK-DAG:     %[[RHS_ARG:.*]] = fir.convert %[[RHS_BOX]] : (!fir.box<!fir.array<5xi32>>) -> !fir.box<none>
 
diff --git a/flang/test/HLFIR/elemental-codegen-nested.fir b/flang/test/HLFIR/elemental-codegen-nested.fir
index 3ef296249c7d6..74fee6e5e2192 100644
--- a/flang/test/HLFIR/elemental-codegen-nested.fir
+++ b/flang/test/HLFIR/elemental-codegen-nested.fir
@@ -34,7 +34,7 @@
 // CHECK:             %[[VAL_27:.*]] = fir.insert_value %[[VAL_26]], %[[VAL_21]], [1 : index] : (tuple<!fir.heap<!fir.array<2xf32>>, i1>, i1) -> tuple<!fir.heap<!fir.array<2xf32>>, i1>
 // CHECK:             %[[VAL_28:.*]] = fir.insert_value %[[VAL_27]], %[[VAL_20]]#0, [0 : index] : (tuple<!fir.heap<!fir.array<2xf32>>, i1>, !fir.heap<!fir.array<2xf32>>) -> tuple<!fir.heap<!fir.array<2xf32>>, i1>
 // CHECK:             %[[VAL_29:.*]] = fir.convert %[[VAL_20]]#0 : (!fir.heap<!fir.array<2xf32>>) -> !fir.ref<!fir.array<2xf32>>
-// CHECK:             %[[VAL_30:.*]] = fir.convert %[[VAL_20]]#1 : (!fir.heap<!fir.array<2xf32>>) -> !fir.ref<!fir.array<2xf32>>
+// CHECK:             %[[VAL_30:.*]] = fir.convert %[[VAL_20]]#0 : (!fir.heap<!fir.array<2xf32>>) -> !fir.ref<!fir.array<2xf32>>
 // CHECK:             %[[VAL_31:.*]] = fir.embox %[[VAL_29]](%[[VAL_18]]) : (!fir.ref<!fir.array<2xf32>>, !fir.shape<1>) -> !fir.box<!fir.array<2xf32>>
 // CHECK:             %[[VAL_32:.*]] = fir.convert %[[VAL_31]] : (!fir.box<!fir.array<2xf32>>) -> !fir.box<!fir.array<?xf32>>
 // CHECK:             %[[VAL_33:.*]] = fir.call @_QPfoo(%[[VAL_32]]) fastmath<contract> : (!fir.box<!fir.array<?xf32>>) -> f32
diff --git a/flang/test/HLFIR/maxloc-lowering.fir b/flang/test/HLFIR/maxloc-lowering.fir
index be52627564c49..0872088a25a44 100644
--- a/flang/test/HLFIR/maxloc-lowering.fir
+++ b/flang/test/HLFIR/maxloc-lowering.fir
@@ -106,7 +106,7 @@ func.func @_QPmaxloc3(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"},
 // CHECK-NEXT:    %[[V1:.*]]:2 = hlfir.declare %[[ARG0]] {uniq_name = "_QFmaxloc3Ea"} : (!fir.box<!fir.array<?xi32>>) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)
 // CHECK-NEXT:    %[[V2:.*]]:2 = hlfir.declare %[[ARG2]] {uniq_name = "_QFmaxloc3Em"} : (!fir.ref<!fir.logical<4>>) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)
 // CHECK-NEXT:    %[[V3:.*]]:2 = hlfir.declare %[[ARG1]] {uniq_name = "_QFmaxloc3Es"} : (!fir.box<!fir.array<?xi32>>) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)
-// CHECK-NEXT:    %[[V4:.*]] = fir.embox %[[V2]]#1 : (!fir.ref<!fir.logical<4>>) -> !fir.box<!fir.logical<4>>
+// CHECK-NEXT:    %[[V4:.*]] = fir.embox %[[V2]]#0 : (!fir.ref<!fir.logical<4>>) -> !fir.box<!fir.logical<4>>
 // CHECK-NEXT:    %[[V5:.*]] = fir.zero_bits !fir.heap<!fir.array<?xi32>>
 // CHECK-NEXT:    %[[V6:.*]] = fir.shape %[[C0]] : (index) -> !fir.shape<1>
 // CHECK-NEXT:    %[[V7:.*]] = fir.embox %[[V5]](%[[V6]]) : (!fir.heap<!fir.array<?xi32>>, !fir.shape<1>) -> !fir.box<!fir.heap<!fir.array<?xi32>>>
@@ -215,7 +215,7 @@ func.func @_QPmaxloc5(%arg0: !fir.ref<!fir.array<2xi32>> {fir.bindc_name = "s"})
 // CHECK-NEXT:    %[[V5:.*]] = fir.shape %[[C2]] : (index) -> !fir.shape<1>
 // CHECK-NEXT:    %[[V6:.*]]:2 = hlfir.declare %[[ARG0]](%[[V5]]) {uniq_name = "_QFmaxloc5Es"} : (!fir.ref<!fir.array<2xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<2xi32>>, !fir.ref<!fir.array<2xi32>>)
 // CHECK-NEXT:    %[[V7:.*]] = fir.shape %[[C2]], %[[C2]] : (index, index) -> !fir.shape<2>
-// CHECK-NEXT:    %[[V8:.*]] = fir.embox %[[V4]]#1(%[[V7]]) : (!fir.ref<!fir.array<2x2xi32>>, !fir.shape<2>) -> !fir.box<!fir.array<2x2xi32>>
+// CHECK-NEXT:    %[[V8:.*]] = fir.embox %[[V4]]#0(%[[V7]]) : (!fir.ref<!fir.array<2x2xi32>>, !fir.shape<2>) -> !fir.box<!fir.array<2x2xi32>>
 // CHECK-NEXT:    %[[V9:.*]] = fir.convert %[[TRUE]] : (i1) -> !fir.logical<4>
 // CHECK-NEXT:    fir.store %[[V9]] to %[[V1]] : !fir.ref<!fir.logical<4>>
 // CHECK-NEXT:    %[[V10:.*]] = fir.embox %[[V1]] : (!fir.ref<!fir.logical<4>>) -> !fir.box<!fir.logical<4>>
diff --git a/flang/test/HLFIR/maxval-lowering.fir b/flang/test/HLFIR/maxval-lowering.fir
index fbf75d9050544..208877c31be70 100644
--- a/flang/test/HLFIR/maxval-lowering.fir
+++ b/flang/test/HLFIR/maxval-lowering.fir
@@ -86,7 +86,7 @@ func.func @_QPmaxval3(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"},
 // CHECK-DAG:     %[[ARRAY:.*]]:2 = hlfir.declare %[[ARG0]]
 // CHECK-DAG:     %[[RES:.*]]:2 = hlfir.declare %[[ARG1]]
 // CHECK-DAG:     %[[MASK:.*]]:2 = hlfir.declare %[[ARG2]]
-// CHECK-DAG:     %[[MASK_BOX:.*]] = fir.embox %[[MASK]]#1 : (!fir.ref<!fir.logical<4>>) -> !fir.box<!fir.logical<4>>
+// CHECK-DAG:     %[[MASK_BOX:.*]] = fir.embox %[[MASK]]#0 : (!fir.ref<!fir.logical<4>>) -> !fir.box<!fir.logical<4>>
 // CHECK-DAG:     %[[ARRAY_ARG:.*]] = fir.convert %[[ARRAY]]#1 : (!fir.box<!fir.array<?xi32>>) -> !fir.box<none>
 // CHECK-DAG:     %[[MASK_ARG:.*]] = fir.convert %[[MASK_BOX]] : (!fir.box<!fir.logical<4>>) -> !fir.box<none>
 // CHECK:         %[[RET:.*]] = fir.call @_FortranAMaxvalInteger4(%[[ARRAY_ARG]], %[[LOC_STR:.*]], %[[LOC_N:.*]], %[[INT:.*]], %[[MASK_ARG]]) fastmath<contract> : (!fir.box<none>, !fir.ref<i8>, i32, i32, !fir.box<none>) -> i32
@@ -168,7 +168,7 @@ func.func @_QPmaxval5(%arg0: !fir.r...
[truncated]

Copy link
Contributor

@vzakhari vzakhari left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks great!

Copy link
Contributor

@razvanlupusoru razvanlupusoru left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you!

@jeanPerier jeanPerier merged commit 44261da into llvm:main Mar 21, 2025
16 checks passed
@jeanPerier jeanPerier deleted the jpr_simplify_declare branch March 21, 2025 10:41
@llvm-ci
Copy link
Collaborator

llvm-ci commented Mar 21, 2025

LLVM Buildbot has detected a new failure on builder ppc64le-flang-rhel-clang running on ppc64le-flang-rhel-test while building flang at step 6 "test-build-unified-tree-check-flang".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/157/builds/23172

Here is the relevant piece of the build log for the reference
Step 6 (test-build-unified-tree-check-flang) failure: test (failure)
******************** TEST 'Flang :: Lower/OpenMP/critical.f90' FAILED ********************
Exit Code: 1

Command Output (stderr):
--
RUN: at line 3: /home/buildbots/llvm-external-buildbots/workers/ppc64le-flang-rhel-test/ppc64le-flang-rhel-clang-build/build/bin/flang -fc1 -emit-hlfir -fopenmp -J /home/buildbots/llvm-external-buildbots/workers/ppc64le-flang-rhel-test/ppc64le-flang-rhel-clang-build/build/runtimes/runtimes-bins/openmp/runtime/src /home/buildbots/llvm-external-buildbots/workers/ppc64le-flang-rhel-test/ppc64le-flang-rhel-clang-build/llvm-project/flang/test/Lower/OpenMP/critical.f90 -o - | /home/buildbots/llvm-external-buildbots/workers/ppc64le-flang-rhel-test/ppc64le-flang-rhel-clang-build/build/bin/FileCheck /home/buildbots/llvm-external-buildbots/workers/ppc64le-flang-rhel-test/ppc64le-flang-rhel-clang-build/llvm-project/flang/test/Lower/OpenMP/critical.f90
+ /home/buildbots/llvm-external-buildbots/workers/ppc64le-flang-rhel-test/ppc64le-flang-rhel-clang-build/build/bin/flang -fc1 -emit-hlfir -fopenmp -J /home/buildbots/llvm-external-buildbots/workers/ppc64le-flang-rhel-test/ppc64le-flang-rhel-clang-build/build/runtimes/runtimes-bins/openmp/runtime/src /home/buildbots/llvm-external-buildbots/workers/ppc64le-flang-rhel-test/ppc64le-flang-rhel-clang-build/llvm-project/flang/test/Lower/OpenMP/critical.f90 -o -
+ /home/buildbots/llvm-external-buildbots/workers/ppc64le-flang-rhel-test/ppc64le-flang-rhel-clang-build/build/bin/FileCheck /home/buildbots/llvm-external-buildbots/workers/ppc64le-flang-rhel-test/ppc64le-flang-rhel-clang-build/llvm-project/flang/test/Lower/OpenMP/critical.f90
/home/buildbots/llvm-external-buildbots/workers/ppc64le-flang-rhel-test/ppc64le-flang-rhel-clang-build/llvm-project/flang/test/Lower/OpenMP/critical.f90:45:10: error: CHECK: expected string not found in input
 !CHECK: hlfir.assign %[[IV]] to %[[PRIV_I_DECL]]#1
         ^
<stdin>:300:28: note: scanning from here
 %5:2 = hlfir.declare %arg0 {uniq_name = "_QFpredetermined_privatizationEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
                           ^
<stdin>:300:28: note: with "IV" equal to "arg1"
 %5:2 = hlfir.declare %arg0 {uniq_name = "_QFpredetermined_privatizationEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
                           ^
<stdin>:300:28: note: with "PRIV_I_DECL" equal to "5"
 %5:2 = hlfir.declare %arg0 {uniq_name = "_QFpredetermined_privatizationEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
                           ^
<stdin>:314:2: note: possible intended match here
 hlfir.assign %11 to %14 : i32, !fir.ref<i32>
 ^

Input file: <stdin>
Check file: /home/buildbots/llvm-external-buildbots/workers/ppc64le-flang-rhel-test/ppc64le-flang-rhel-clang-build/llvm-project/flang/test/Lower/OpenMP/critical.f90

-dump-input=help explains the following input dump.

Input was:
<<<<<<
            .
            .
            .
          295:  %c2_i32 = arith.constant 2 : i32 
          296:  %c10_i32 = arith.constant 10 : i32 
          297:  %c1_i32 = arith.constant 1 : i32 
          298:  omp.wsloop private(@_QFpredetermined_privatizationEi_private_i32 %4#0 -> %arg0 : !fir.ref<i32>) { 
          299:  omp.loop_nest (%arg1) : i32 = (%c2_i32) to (%c10_i32) inclusive step (%c1_i32) { 
          300:  %5:2 = hlfir.declare %arg0 {uniq_name = "_QFpredetermined_privatizationEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) 
check:45'0                                X~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ error: no match found
check:45'1                                                                                                                                       with "IV" equal to "arg1"
check:45'2                                                                                                                                       with "PRIV_I_DECL" equal to "5"
          301:  hlfir.assign %arg1 to %5#0 : i32, !fir.ref<i32> 
check:45'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          302:  omp.critical { 
check:45'0     ~~~~~~~~~~~~~~~~
          303:  %6 = fir.load %5#0 : !fir.ref<i32> 
check:45'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          304:  %c1_i32_0 = arith.constant 1 : i32 
...

@llvm-ci
Copy link
Collaborator

llvm-ci commented Mar 21, 2025

LLVM Buildbot has detected a new failure on builder openmp-offload-sles-build-only running on rocm-worker-hw-04-sles while building flang at step 7 "Add check check-flang".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/140/builds/19497

Here is the relevant piece of the build log for the reference
Step 7 (Add check check-flang) failure: test (failure)
******************** TEST 'Flang :: Lower/OpenMP/atomic-update.f90' FAILED ********************
Exit Code: 1

Command Output (stderr):
--
RUN: at line 4: bbc -fopenmp -J /home/botworker/bbot/builds/openmp-offload-sles-build/llvm.build/runtimes/runtimes-bins/openmp/runtime/src -fopenmp-version=50 -emit-hlfir /home/botworker/bbot/builds/openmp-offload-sles-build/llvm.src/flang/test/Lower/OpenMP/atomic-update.f90 -o - | /home/botworker/bbot/builds/openmp-offload-sles-build/llvm.build/bin/FileCheck /home/botworker/bbot/builds/openmp-offload-sles-build/llvm.src/flang/test/Lower/OpenMP/atomic-update.f90
+ bbc -fopenmp -J /home/botworker/bbot/builds/openmp-offload-sles-build/llvm.build/runtimes/runtimes-bins/openmp/runtime/src -fopenmp-version=50 -emit-hlfir /home/botworker/bbot/builds/openmp-offload-sles-build/llvm.src/flang/test/Lower/OpenMP/atomic-update.f90 -o -
+ /home/botworker/bbot/builds/openmp-offload-sles-build/llvm.build/bin/FileCheck /home/botworker/bbot/builds/openmp-offload-sles-build/llvm.src/flang/test/Lower/OpenMP/atomic-update.f90
/home/botworker/bbot/builds/openmp-offload-sles-build/llvm.src/flang/test/Lower/OpenMP/atomic-update.f90:44:9: error: CHECK: expected string not found in input
!CHECK: %[[EMBOX:.*]] = fir.embox %[[VAL_C_DECLARE]]#1 : (!fir.ref<i32>) -> !fir.box<!fir.ptr<i32>>
        ^
<stdin>:278:103: note: scanning from here
 %272:2 = hlfir.declare %271 {uniq_name = "_QFEz"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
                                                                                                      ^
<stdin>:278:103: note: with "VAL_C_DECLARE" equal to "9"
 %272:2 = hlfir.declare %271 {uniq_name = "_QFEz"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
                                                                                                      ^
<stdin>:279:2: note: possible intended match here
 %273 = fir.embox %9#0 : (!fir.ref<i32>) -> !fir.box<!fir.ptr<i32>>
 ^

Input file: <stdin>
Check file: /home/botworker/bbot/builds/openmp-offload-sles-build/llvm.src/flang/test/Lower/OpenMP/atomic-update.f90

-dump-input=help explains the following input dump.

Input was:
<<<<<<
            .
            .
            .
          273:  %267 = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFEx"} 
          274:  %268:2 = hlfir.declare %267 {uniq_name = "_QFEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) 
          275:  %269 = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFEy"} 
          276:  %270:2 = hlfir.declare %269 {uniq_name = "_QFEy"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) 
          277:  %271 = fir.alloca i32 {bindc_name = "z", uniq_name = "_QFEz"} 
          278:  %272:2 = hlfir.declare %271 {uniq_name = "_QFEz"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) 
check:44'0                                                                                                           X error: no match found
check:44'1                                                                                                             with "VAL_C_DECLARE" equal to "9"
          279:  %273 = fir.embox %9#0 : (!fir.ref<i32>) -> !fir.box<!fir.ptr<i32>> 
check:44'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:44'2      ?                                                                   possible intended match
          280:  fir.store %273 to %3#0 : !fir.ref<!fir.box<!fir.ptr<i32>>> 
check:44'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          281:  %274 = fir.embox %11#0 : (!fir.ref<i32>) -> !fir.box<!fir.ptr<i32>> 
check:44'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          282:  fir.store %274 to %7#0 : !fir.ref<!fir.box<!fir.ptr<i32>>> 
check:44'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          283:  %c3 = arith.constant 3 : index 
check:44'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
...

@llvm-ci
Copy link
Collaborator

llvm-ci commented Mar 21, 2025

LLVM Buildbot has detected a new failure on builder flang-aarch64-dylib running on linaro-flang-aarch64-dylib while building flang at step 6 "test-build-unified-tree-check-flang".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/50/builds/11789

Here is the relevant piece of the build log for the reference
Step 6 (test-build-unified-tree-check-flang) failure: test (failure)
******************** TEST 'Flang :: Lower/OpenMP/atomic-update.f90' FAILED ********************
Exit Code: 1

Command Output (stderr):
--
RUN: at line 4: bbc -fopenmp -J /home/tcwg-buildbot/worker/flang-aarch64-dylib/build/runtimes/runtimes-bins/openmp/runtime/src -fopenmp-version=50 -emit-hlfir /home/tcwg-buildbot/worker/flang-aarch64-dylib/llvm-project/flang/test/Lower/OpenMP/atomic-update.f90 -o - | /home/tcwg-buildbot/worker/flang-aarch64-dylib/build/bin/FileCheck /home/tcwg-buildbot/worker/flang-aarch64-dylib/llvm-project/flang/test/Lower/OpenMP/atomic-update.f90
+ bbc -fopenmp -J /home/tcwg-buildbot/worker/flang-aarch64-dylib/build/runtimes/runtimes-bins/openmp/runtime/src -fopenmp-version=50 -emit-hlfir /home/tcwg-buildbot/worker/flang-aarch64-dylib/llvm-project/flang/test/Lower/OpenMP/atomic-update.f90 -o -
+ /home/tcwg-buildbot/worker/flang-aarch64-dylib/build/bin/FileCheck /home/tcwg-buildbot/worker/flang-aarch64-dylib/llvm-project/flang/test/Lower/OpenMP/atomic-update.f90
/home/tcwg-buildbot/worker/flang-aarch64-dylib/llvm-project/flang/test/Lower/OpenMP/atomic-update.f90:44:9: error: CHECK: expected string not found in input
!CHECK: %[[EMBOX:.*]] = fir.embox %[[VAL_C_DECLARE]]#1 : (!fir.ref<i32>) -> !fir.box<!fir.ptr<i32>>
        ^
<stdin>:278:103: note: scanning from here
 %272:2 = hlfir.declare %271 {uniq_name = "_QFEz"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
                                                                                                      ^
<stdin>:278:103: note: with "VAL_C_DECLARE" equal to "9"
 %272:2 = hlfir.declare %271 {uniq_name = "_QFEz"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
                                                                                                      ^
<stdin>:279:2: note: possible intended match here
 %273 = fir.embox %9#0 : (!fir.ref<i32>) -> !fir.box<!fir.ptr<i32>>
 ^

Input file: <stdin>
Check file: /home/tcwg-buildbot/worker/flang-aarch64-dylib/llvm-project/flang/test/Lower/OpenMP/atomic-update.f90

-dump-input=help explains the following input dump.

Input was:
<<<<<<
            .
            .
            .
          273:  %267 = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFEx"} 
          274:  %268:2 = hlfir.declare %267 {uniq_name = "_QFEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) 
          275:  %269 = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFEy"} 
          276:  %270:2 = hlfir.declare %269 {uniq_name = "_QFEy"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) 
          277:  %271 = fir.alloca i32 {bindc_name = "z", uniq_name = "_QFEz"} 
          278:  %272:2 = hlfir.declare %271 {uniq_name = "_QFEz"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) 
check:44'0                                                                                                           X error: no match found
check:44'1                                                                                                             with "VAL_C_DECLARE" equal to "9"
          279:  %273 = fir.embox %9#0 : (!fir.ref<i32>) -> !fir.box<!fir.ptr<i32>> 
check:44'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
check:44'2      ?                                                                   possible intended match
          280:  fir.store %273 to %3#0 : !fir.ref<!fir.box<!fir.ptr<i32>>> 
check:44'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          281:  %274 = fir.embox %11#0 : (!fir.ref<i32>) -> !fir.box<!fir.ptr<i32>> 
check:44'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          282:  fir.store %274 to %7#0 : !fir.ref<!fir.box<!fir.ptr<i32>>> 
check:44'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          283:  %c3 = arith.constant 3 : index 
check:44'0     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
...

@jeanPerier
Copy link
Contributor Author

Just saw the failures. Fixing the tests ASAP. I was not running them because they are under REQUIRES: openmp_runtime.

jeanPerier added a commit to jeanPerier/llvm-project that referenced this pull request Mar 21, 2025
jeanPerier added a commit to jeanPerier/llvm-project that referenced this pull request Mar 21, 2025
jeanPerier added a commit that referenced this pull request Mar 21, 2025
I missed these tests in my test update after #132261 because they are
under `! REQUIRES: openmp_runtime`.
Broke build bots:
https://lab.llvm.org/buildbot/#/builders/50/builds/11789
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
flang:fir-hlfir flang:openmp flang Flang issues not falling into any other category openacc
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants