[flang-commits] [flang] [flang] Lower Cray pointee references without a runtime call. (PR #230699)

Greg Williamson via flang-commits flang-commits at lists.llvm.org
Fri Oct 9 16:02:53 PDT 2026


https://github.com/fundies created https://github.com/llvm/llvm-project/pull/230699

Each Cray pointee reference called a runtime function to update the pointee's descriptor, which blocked LLVM optimizations and slowed down loops that use pointees. This replaces the call with a new `fir.box_set_addr` op that lowers to a single store, so LLVM can optimize it.

Assisted-by: Claude Code

>From b112c8d2b471c68bb7fbaa876f17db1161f47a0a Mon Sep 17 00:00:00 2001
From: Greg Williamson <gregwi+snps at synopsys.com>
Date: Fri, 9 Oct 2026 18:53:53 -0400
Subject: [PATCH] [flang] Lower Cray pointee references without a runtime call.
 Assisted-by: Claude Code

---
 .../include/flang/Optimizer/Dialect/FIROps.td | 30 +++++++++
 flang/lib/Lower/ConvertExprToHLFIR.cpp        | 12 ++--
 flang/lib/Optimizer/CodeGen/CodeGen.cpp       | 26 +++++++-
 flang/lib/Optimizer/Dialect/FIROps.cpp        | 10 +++
 flang/test/Fir/box-set-addr.fir               | 41 ++++++++++++
 flang/test/Fir/invalid.fir                    |  8 +++
 flang/test/Integration/cray-pointee-loop.f90  | 37 +++++++++++
 flang/test/Lower/HLFIR/cray-pointers.f90      | 56 ++++------------
 flang/test/Lower/OpenMP/cray-pointers01.f90   | 10 ++-
 flang/test/Lower/OpenMP/cray-pointers02.f90   | 42 ++++++------
 flang/test/Lower/cray-pointer.f90             | 64 +++++--------------
 11 files changed, 210 insertions(+), 126 deletions(-)
 create mode 100644 flang/test/Fir/box-set-addr.fir
 create mode 100644 flang/test/Integration/cray-pointee-loop.f90

diff --git a/flang/include/flang/Optimizer/Dialect/FIROps.td b/flang/include/flang/Optimizer/Dialect/FIROps.td
index 7fc12430d0663f..cde6f03e251297 100644
--- a/flang/include/flang/Optimizer/Dialect/FIROps.td
+++ b/flang/include/flang/Optimizer/Dialect/FIROps.td
@@ -1275,6 +1275,36 @@ def fir_BoxAddrOp
   }];
 }
 
+def fir_BoxSetAddrOp : fir_Op<"box_set_addr", []> {
+  let summary = "update the base address of a descriptor in memory";
+
+  let description = [{
+    Store the address `addr` into the base address field of the descriptor
+    held in memory at `box_ref`.  All other fields of the descriptor (type,
+    rank, attributes, bounds, strides, element size) are left unchanged.
+
+    It is used to re-associate the descriptor of a Cray pointee with the
+    current value of its Cray pointer before each reference of the pointee.
+    Code generation lowers it to a single store into the descriptor, so the
+    update is visible to (and can be optimized by) LLVM, unlike a call to the
+    PointerAssociateScalar runtime function.
+
+    ```
+      fir.box_set_addr %p to %desc : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
+    ```
+  }];
+
+  let arguments = (ins AnyReferenceLike:$addr,
+                       Arg<AnyReferenceLike, "descriptor in memory",
+                           [MemRead, MemWrite]>:$box_ref);
+
+  let assemblyFormat = [{
+    $addr `to` $box_ref attr-dict `:` type($addr) `,` type($box_ref)
+  }];
+
+  let hasVerifier = 1;
+}
+
 def fir_BoxCharLenOp : fir_SimpleOp<"boxchar_len", [NoMemoryEffect]> {
   let summary = "return the LEN type parameter from a boxchar value";
 
diff --git a/flang/lib/Lower/ConvertExprToHLFIR.cpp b/flang/lib/Lower/ConvertExprToHLFIR.cpp
index 24c990141be552..fd88d04e1def87 100644
--- a/flang/lib/Lower/ConvertExprToHLFIR.cpp
+++ b/flang/lib/Lower/ConvertExprToHLFIR.cpp
@@ -28,7 +28,6 @@
 #include "flang/Optimizer/Builder/IntrinsicCall.h"
 #include "flang/Optimizer/Builder/MutableBox.h"
 #include "flang/Optimizer/Builder/Runtime/Derived.h"
-#include "flang/Optimizer/Builder/Runtime/Pointer.h"
 #include "flang/Optimizer/Builder/Todo.h"
 #include "flang/Optimizer/Dialect/FIRAttr.h"
 #include "flang/Optimizer/HLFIR/HLFIROps.h"
@@ -362,13 +361,10 @@ class HlfirDesignatorBuilder {
         mlir::Value ptrVal = fir::LoadOp::create(builder, loc, cast);
 
         // Update the base_addr to the value of the Cray pointer.
-        // This is a hacky way to do the update, and it may harm
-        // performance around Cray pointer references.
-        // TODO: we should introduce an operation that updates
-        // just the base_addr of the given box. The CodeGen
-        // will just convert it into a single store.
-        fir::runtime::genPointerAssociateScalar(builder, loc, varDef->getBase(),
-                                                ptrVal);
+        // fir.box_set_addr is lowered to a single store into the
+        // descriptor, which LLVM can see through (and hoist out of loops
+        // when the Cray pointer does not change), unlike a runtime call.
+        fir::BoxSetAddrOp::create(builder, loc, ptrVal, varDef->getBase());
       }
       return *varDef;
     }
diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
index 4923cfe2e18787..fc9bf75033ac0d 100644
--- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp
+++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
@@ -512,6 +512,30 @@ struct BoxAddrOpConversion : public fir::FIROpConversion<fir::BoxAddrOp> {
   }
 };
 
+/// Lower `fir.box_set_addr` to a single store of the new base address into the
+/// base_addr field of the descriptor in memory.
+struct BoxSetAddrOpConversion : public fir::FIROpConversion<fir::BoxSetAddrOp> {
+  using FIROpConversion::FIROpConversion;
+
+  llvm::LogicalResult
+  matchAndRewrite(fir::BoxSetAddrOp op, OpAdaptor adaptor,
+                  mlir::ConversionPatternRewriter &rewriter) const override {
+    auto boxTy = mlir::cast<fir::BaseBoxType>(
+        fir::unwrapRefType(op.getBoxRef().getType()));
+    TypePair boxTyPair = getBoxTypePair(boxTy);
+    mlir::Location loc = op.getLoc();
+    auto addrField = mlir::LLVM::GEPOp::create(
+        rewriter, loc, ::getLlvmPtrType(op.getContext()), boxTyPair.llvm,
+        adaptor.getBoxRef(),
+        llvm::ArrayRef<mlir::LLVM::GEPArg>{0, kAddrPosInBox});
+    auto store = mlir::LLVM::StoreOp::create(rewriter, loc, adaptor.getAddr(),
+                                             addrField);
+    attachTBAATag(store, boxTyPair.fir, nullptr, addrField);
+    rewriter.eraseOp(op);
+    return mlir::success();
+  }
+};
+
 /// Convert `!fir.boxchar_len` to  `!llvm.extractvalue` for the 2nd part of the
 /// boxchar.
 struct BoxCharLenOpConversion : public fir::FIROpConversion<fir::BoxCharLenOp> {
@@ -5118,7 +5142,7 @@ void fir::populateFIRToLLVMConversionPatterns(
       BoxTypeDescOpConversion, CallOpConversion, CmpcOpConversion,
       VolatileCastOpConversion, ConvertOpConversion, CoordinateOpConversion,
       CopyOpConversion, DTEntryOpConversion, DeclareOpConversion,
-      DeclareValueOpConversion,
+      DeclareValueOpConversion, BoxSetAddrOpConversion,
       DoConcurrentSpecifierOpConversion<fir::LocalitySpecifierOp>,
       DoConcurrentSpecifierOpConversion<fir::DeclareReductionOp>,
       CreateBoxOpConversion, DivcOpConversion, EmboxOpConversion,
diff --git a/flang/lib/Optimizer/Dialect/FIROps.cpp b/flang/lib/Optimizer/Dialect/FIROps.cpp
index 606d47631488bb..dda932b1f38238 100644
--- a/flang/lib/Optimizer/Dialect/FIROps.cpp
+++ b/flang/lib/Optimizer/Dialect/FIROps.cpp
@@ -1375,6 +1375,16 @@ mlir::Speculation::Speculatability fir::BoxAddrOp::getSpeculatability() {
                                   : mlir::Speculation::Speculatable;
 }
 
+//===----------------------------------------------------------------------===//
+// BoxSetAddrOp
+//===----------------------------------------------------------------------===//
+
+llvm::LogicalResult fir::BoxSetAddrOp::verify() {
+  if (!mlir::isa<fir::BaseBoxType>(fir::unwrapRefType(getBoxRef().getType())))
+    return emitOpError("box_ref must be a reference to a fir.box or fir.class");
+  return mlir::success();
+}
+
 //===----------------------------------------------------------------------===//
 // BoxCharLenOp
 //===----------------------------------------------------------------------===//
diff --git a/flang/test/Fir/box-set-addr.fir b/flang/test/Fir/box-set-addr.fir
new file mode 100644
index 00000000000000..9142108bd4e751
--- /dev/null
+++ b/flang/test/Fir/box-set-addr.fir
@@ -0,0 +1,41 @@
+// Test fir.box_set_addr parsing/printing and conversion to LLVM.
+// RUN: fir-opt %s | fir-opt | FileCheck %s --check-prefix=FIR
+// RUN: fir-opt --fir-to-llvm-ir="target=aarch64-unknown-linux-gnu" %s | FileCheck %s --check-prefix=LLVM
+
+func.func @set_addr_array(%p : !fir.ptr<i64>, %desc : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>) {
+  fir.box_set_addr %p to %desc : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
+  return
+}
+// FIR-LABEL:   func.func @set_addr_array(
+// FIR-SAME:      %[[P:.*]]: !fir.ptr<i64>, %[[D:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>)
+// FIR:           fir.box_set_addr %[[P]] to %[[D]] : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
+
+// LLVM-LABEL:   llvm.func @set_addr_array(
+// LLVM-SAME:      %[[P:.*]]: !llvm.ptr, %[[D:.*]]: !llvm.ptr)
+// LLVM:           %[[F:.*]] = llvm.getelementptr %[[D]][0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>
+// LLVM-NEXT:      llvm.store %[[P]], %[[F]] : !llvm.ptr, !llvm.ptr
+// LLVM-NEXT:      llvm.return
+
+func.func @set_addr_char(%p : !fir.ptr<i64>, %desc : !fir.ref<!fir.box<!fir.ptr<!fir.char<1,?>>>>) {
+  fir.box_set_addr %p to %desc : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.char<1,?>>>>
+  return
+}
+// FIR-LABEL:   func.func @set_addr_char(
+// FIR:           fir.box_set_addr %{{.*}} to %{{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.char<1,?>>>>
+
+// LLVM-LABEL:   llvm.func @set_addr_char(
+// LLVM-SAME:      %[[P:.*]]: !llvm.ptr, %[[D:.*]]: !llvm.ptr)
+// LLVM:           %[[F:.*]] = llvm.getelementptr %[[D]][0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>
+// LLVM-NEXT:      llvm.store %[[P]], %[[F]] : !llvm.ptr, !llvm.ptr
+
+func.func @set_addr_derived(%p : !fir.ptr<i64>, %desc : !fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.type<t{r:f32,i:i32}>>>>>) {
+  fir.box_set_addr %p to %desc : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.type<t{r:f32,i:i32}>>>>>
+  return
+}
+// FIR-LABEL:   func.func @set_addr_derived(
+// FIR:           fir.box_set_addr %{{.*}} to %{{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.type<t{r:f32,i:i32}>>>>>
+
+// LLVM-LABEL:   llvm.func @set_addr_derived(
+// LLVM-SAME:      %[[P:.*]]: !llvm.ptr, %[[D:.*]]: !llvm.ptr)
+// LLVM:           %[[F:.*]] = llvm.getelementptr %[[D]][0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>, ptr, array<1 x i64>)>
+// LLVM-NEXT:      llvm.store %[[P]], %[[F]] : !llvm.ptr, !llvm.ptr
diff --git a/flang/test/Fir/invalid.fir b/flang/test/Fir/invalid.fir
index 8964df1d2e93e6..5ca0ae154bd1bb 100644
--- a/flang/test/Fir/invalid.fir
+++ b/flang/test/Fir/invalid.fir
@@ -1400,3 +1400,11 @@ func.func @allocmem_bad_alignment() -> !fir.heap<!fir.array<10xf32>> {
   %0 = fir.allocmem !fir.array<10xf32> {alignment = 3 : i64}
   return %0 : !fir.heap<!fir.array<10xf32>>
 }
+
+// -----
+
+func.func @box_set_addr_not_a_box(%p : !fir.ptr<i64>, %r : !fir.ref<i64>) {
+  // expected-error at +1 {{'fir.box_set_addr' op box_ref must be a reference to a fir.box or fir.class}}
+  fir.box_set_addr %p to %r : !fir.ptr<i64>, !fir.ref<i64>
+  return
+}
diff --git a/flang/test/Integration/cray-pointee-loop.f90 b/flang/test/Integration/cray-pointee-loop.f90
new file mode 100644
index 00000000000000..f9ef63b954a1d0
--- /dev/null
+++ b/flang/test/Integration/cray-pointee-loop.f90
@@ -0,0 +1,37 @@
+! Check that re-associating a Cray pointee with its Cray pointer before each
+! reference does not leave a runtime call (or descriptor reloads) in the loop.
+! RUN: %flang_fc1 -emit-llvm -O2 -o - %s | FileCheck %s
+
+integer function find(p, n, cur)
+  integer(8) :: p
+  integer :: n, cur, i
+  integer :: pg(*)
+  pointer (pp, pg)
+  pp = p
+  find = 0
+  do i = 1, n
+    if (pg(i) == cur) then
+      find = i
+      return
+    end if
+  end do
+end function
+! CHECK-LABEL: define {{.*}}i32 @find_(
+! CHECK-NOT:     call
+! CHECK-NOT:     alloca
+! CHECK:         ret i32
+
+subroutine copy_out(p, n, v)
+  integer(8) :: p, n, i
+  integer(4) :: v(*)
+  integer(4) :: buf(*)
+  pointer (pb, buf)
+  pb = p
+  do i = 1, n
+    v(i) = buf(i)
+  end do
+end subroutine
+! CHECK-LABEL: define void @copy_out_(
+! CHECK-NOT:     PointerAssociateScalar
+! CHECK-NOT:     alloca
+! CHECK:         ret void
diff --git a/flang/test/Lower/HLFIR/cray-pointers.f90 b/flang/test/Lower/HLFIR/cray-pointers.f90
index 818ad8098a7e1a..30951996f67087 100644
--- a/flang/test/Lower/HLFIR/cray-pointers.f90
+++ b/flang/test/Lower/HLFIR/cray-pointers.f90
@@ -19,9 +19,7 @@ end subroutine test1
 ! CHECK:           fir.store %[[VAL_14]] to %[[VAL_12]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
 ! CHECK:           %[[VAL_15:.*]] = fir.convert %[[VAL_2]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK:           %[[VAL_16:.*]] = fir.load %[[VAL_15]] : !fir.ref<!fir.ptr<i64>>
-! CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_12]]#0 : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK:           %[[VAL_18:.*]] = fir.convert %[[VAL_16]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK:           fir.call @_FortranAPointerAssociateScalar(%[[VAL_17]], %[[VAL_18]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK:           fir.box_set_addr %[[VAL_16]] to %[[VAL_12]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
 ! CHECK:           %[[VAL_20:.*]] = fir.load %[[VAL_12]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
 ! CHECK:           %[[VAL_21:.*]] = arith.constant 7 : index
 ! CHECK:           %[[VAL_22:.*]] = hlfir.designate %[[VAL_20]] (%[[VAL_21]])  : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, index) -> !fir.ref<f32>
@@ -45,9 +43,7 @@ end subroutine test2
 ! CHECK:           fir.store %[[VAL_26]] to %[[VAL_24]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
 ! CHECK:           %[[VAL_27:.*]] = fir.convert %[[VAL_3]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK:           %[[VAL_28:.*]] = fir.load %[[VAL_27]] : !fir.ref<!fir.ptr<i64>>
-! CHECK:           %[[VAL_29:.*]] = fir.convert %[[VAL_24]]#0 : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK:           %[[VAL_30:.*]] = fir.convert %[[VAL_28]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK:           fir.call @_FortranAPointerAssociateScalar(%[[VAL_29]], %[[VAL_30]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK:           fir.box_set_addr %[[VAL_28]] to %[[VAL_24]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
 ! CHECK:           %[[VAL_32:.*]] = fir.load %[[VAL_24]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
 ! CHECK:           %[[VAL_33:.*]] = arith.constant 7 : index
 ! CHECK:           %[[VAL_34:.*]] = hlfir.designate %[[VAL_32]] (%[[VAL_33]])  : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, index) -> !fir.ref<f32>
@@ -73,9 +69,7 @@ end subroutine test3
 ! CHECK:           fir.store %[[VAL_31]] to %[[VAL_29]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.char<1,11>>>>>
 ! CHECK:           %[[VAL_32:.*]] = fir.convert %[[VAL_4]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK:           %[[VAL_33:.*]] = fir.load %[[VAL_32]] : !fir.ref<!fir.ptr<i64>>
-! CHECK:           %[[VAL_34:.*]] = fir.convert %[[VAL_29]]#0 : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.char<1,11>>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK:           %[[VAL_35:.*]] = fir.convert %[[VAL_33]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK:           fir.call @_FortranAPointerAssociateScalar(%[[VAL_34]], %[[VAL_35]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK:           fir.box_set_addr %[[VAL_33]] to %[[VAL_29]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.char<1,11>>>>>
 ! CHECK:           %[[VAL_37:.*]] = fir.load %[[VAL_29]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.char<1,11>>>>>
 ! CHECK:           %[[VAL_38:.*]] = arith.constant 7 : index
 ! CHECK:           %[[VAL_39:.*]] = hlfir.designate %[[VAL_37]] (%[[VAL_38]])  typeparams %[[VAL_8]] : (!fir.box<!fir.ptr<!fir.array<?x!fir.char<1,11>>>>, index, index) -> !fir.ref<!fir.char<1,11>>
@@ -101,9 +95,7 @@ end subroutine test4
 ! CHECK:           fir.store %[[VAL_15]] to %[[VAL_13]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.char<1,?>>>>
 ! CHECK:           %[[VAL_22:.*]] = fir.convert %[[VAL_4]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK:           %[[VAL_23:.*]] = fir.load %[[VAL_22]] : !fir.ref<!fir.ptr<i64>>
-! CHECK:           %[[VAL_24:.*]] = fir.convert %[[VAL_13]]#0 : (!fir.ref<!fir.box<!fir.ptr<!fir.char<1,?>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK:           %[[VAL_25:.*]] = fir.convert %[[VAL_23]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK:           fir.call @_FortranAPointerAssociateScalar(%[[VAL_24]], %[[VAL_25]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK:           fir.box_set_addr %[[VAL_23]] to %[[VAL_13]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.char<1,?>>>>
 ! CHECK:           %[[VAL_27:.*]] = fir.load %[[VAL_13]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.char<1,?>>>>
 ! CHECK:           %[[VAL_28:.*]] = fir.box_addr %[[VAL_27]] : (!fir.box<!fir.ptr<!fir.char<1,?>>>) -> !fir.ptr<!fir.char<1,?>>
 ! CHECK:           %[[VAL_29:.*]] = fir.emboxchar %[[VAL_28]], %[[VAL_8]] : (!fir.ptr<!fir.char<1,?>>, i32) -> !fir.boxchar<1>
@@ -132,9 +124,7 @@ end subroutine test5
 ! CHECK:           fir.store %[[VAL_15]] to %[[VAL_13]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QFtest5Tt{{(,sequence)?}}{r:f32,i:i32}>>>>>
 ! CHECK:           %[[VAL_16:.*]] = fir.convert %[[VAL_2]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK:           %[[VAL_17:.*]] = fir.load %[[VAL_16]] : !fir.ref<!fir.ptr<i64>>
-! CHECK:           %[[VAL_18:.*]] = fir.convert %[[VAL_13]]#0 : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QFtest5Tt{{(,sequence)?}}{r:f32,i:i32}>>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK:           %[[VAL_19:.*]] = fir.convert %[[VAL_17]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK:           fir.call @_FortranAPointerAssociateScalar(%[[VAL_18]], %[[VAL_19]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK:           fir.box_set_addr %[[VAL_17]] to %[[VAL_13]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QFtest5Tt{{(,sequence)?}}{r:f32,i:i32}>>>>>
 ! CHECK:           %[[VAL_21:.*]] = fir.load %[[VAL_13]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QFtest5Tt{{(,sequence)?}}{r:f32,i:i32}>>>>>
 ! CHECK:           %[[VAL_22:.*]] = arith.constant 7 : index
 ! CHECK:           %[[VAL_23:.*]] = hlfir.designate %[[VAL_21]] (%[[VAL_22]])  : (!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QFtest5Tt{{(,sequence)?}}{r:f32,i:i32}>>>>, index) -> !fir.ref<!fir.type<_QFtest5Tt{{(,sequence)?}}{r:f32,i:i32}>>
@@ -176,18 +166,14 @@ end subroutine test6
 
 ! CHECK:           %[[VAL_49:.*]] = fir.convert %[[VAL_5]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK:           %[[VAL_50:.*]] = fir.load %[[VAL_49]] : !fir.ref<!fir.ptr<i64>>
-! CHECK:           %[[VAL_51:.*]] = fir.convert %[[VAL_20]]#0 : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.char<1,?>>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK:           %[[VAL_52:.*]] = fir.convert %[[VAL_50]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK:           fir.call @_FortranAPointerAssociateScalar(%[[VAL_51]], %[[VAL_52]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK:           fir.box_set_addr %[[VAL_50]] to %[[VAL_20]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.char<1,?>>>>>
 ! CHECK:           %[[VAL_54:.*]] = fir.load %[[VAL_20]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.char<1,?>>>>>
 ! CHECK:           %[[VAL_55:.*]] = arith.constant 9 : index
 ! CHECK:           %[[VAL_56:.*]] = hlfir.designate %[[VAL_54]] (%[[VAL_55]])  typeparams %[[VAL_11]] : (!fir.box<!fir.ptr<!fir.array<?x!fir.char<1,?>>>>, index, i32) -> !fir.boxchar<1>
 
 ! CHECK:           %[[VAL_57:.*]] = fir.convert %[[VAL_5]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK:           %[[VAL_58:.*]] = fir.load %[[VAL_57]] : !fir.ref<!fir.ptr<i64>>
-! CHECK:           %[[VAL_59:.*]] = fir.convert %[[VAL_46]]#0 : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK:           %[[VAL_60:.*]] = fir.convert %[[VAL_58]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK:           fir.call @_FortranAPointerAssociateScalar(%[[VAL_59]], %[[VAL_60]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK:           fir.box_set_addr %[[VAL_58]] to %[[VAL_46]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
 ! CHECK:           %[[VAL_62:.*]] = fir.load %[[VAL_46]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
 ! CHECK:           %[[VAL_63:.*]] = arith.constant 5 : index
 ! CHECK:           %[[VAL_64:.*]] = hlfir.designate %[[VAL_62]] (%[[VAL_63]])  : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, index) -> !fir.ref<f32>
@@ -214,9 +200,7 @@ end subroutine test7
 ! CHECK:    fir.store %[[VAL_11]] to %[[VAL_9]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 ! CHECK:    %[[VAL_14:.*]] = fir.convert %[[VAL_13]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK:    %[[VAL_15:.*]] = fir.load %[[VAL_14]] : !fir.ref<!fir.ptr<i64>>
-! CHECK:    %[[VAL_16:.*]] = fir.convert %[[VAL_9]]#0 : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK:    %[[VAL_17:.*]] = fir.convert %[[VAL_15]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK:    fir.call @_FortranAPointerAssociateScalar(%[[VAL_16]], %[[VAL_17]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK:    fir.box_set_addr %[[VAL_15]] to %[[VAL_9]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 ! CHECK:    %[[VAL_19:.*]] = fir.load %[[VAL_9]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 
 subroutine test8()
@@ -236,9 +220,7 @@ end subroutine test8
 ! CHECK:    fir.store %[[VAL_7]] to %[[VAL_5]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 ! CHECK:    %[[VAL_10:.*]] = fir.convert %[[VAL_9]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK:    %[[VAL_11:.*]] = fir.load %[[VAL_10]] : !fir.ref<!fir.ptr<i64>>
-! CHECK:    %[[VAL_12:.*]] = fir.convert %[[VAL_5]]#0 : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK:    %[[VAL_13:.*]] = fir.convert %[[VAL_11]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK:    fir.call @_FortranAPointerAssociateScalar(%[[VAL_12]], %[[VAL_13]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK:    fir.box_set_addr %[[VAL_11]] to %[[VAL_5]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 ! CHECK:    %[[VAL_15:.*]] = fir.load %[[VAL_5]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 ! CHECK:    %[[VAL_16:.*]] = fir.box_addr %[[VAL_15]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>) -> !fir.ptr<!fir.array<?xi32>>
 ! CHECK:    %[[VAL_17:.*]] = fir.convert %[[VAL_16]] : (!fir.ptr<!fir.array<?xi32>>) -> !fir.ref<!fir.array<5xi32>>
@@ -266,9 +248,7 @@ end subroutine test9
 ! CHECK:    fir.store %[[VAL_7]] to %[[VAL_5]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 ! CHECK:    %[[VAL_10:.*]] = fir.convert %[[VAL_9]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK:    %[[VAL_11:.*]] = fir.load %[[VAL_10]] : !fir.ref<!fir.ptr<i64>>
-! CHECK:    %[[VAL_12:.*]] = fir.convert %[[VAL_5]]#0 : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK:    %[[VAL_13:.*]] = fir.convert %[[VAL_11]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK:    fir.call @_FortranAPointerAssociateScalar(%[[VAL_12]], %[[VAL_13]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK:    fir.box_set_addr %[[VAL_11]] to %[[VAL_5]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 ! CHECK:    %[[VAL_15:.*]] = fir.load %[[VAL_5]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 ! CHECK:    %[[VAL_16:.*]] = hlfir.as_expr %[[VAL_15]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>) -> !hlfir.expr<?xi32>
 ! CHECK:    %[[VAL_17:.*]] = arith.constant 0 : index
@@ -295,9 +275,7 @@ end subroutine test10
 ! CHECK:    fir.store %[[VAL_5]] to %[[VAL_3]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK:    %[[VAL_8:.*]] = fir.convert %[[VAL_7]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK:    %[[VAL_9:.*]] = fir.load %[[VAL_8]] : !fir.ref<!fir.ptr<i64>>
-! CHECK:    %[[VAL_10:.*]] = fir.convert %[[VAL_3]]#0 : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> !fir.ref<!fir.box<none>>
-! CHECK:    %[[VAL_11:.*]] = fir.convert %[[VAL_9]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK:    fir.call @_FortranAPointerAssociateScalar(%[[VAL_10]], %[[VAL_11]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK:    fir.box_set_addr %[[VAL_9]] to %[[VAL_3]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK:    %[[VAL_13:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK:    %[[VAL_14:.*]] = fir.box_addr %[[VAL_13]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
 ! CHECK:    %[[VAL_15:.*]] = fir.convert %[[VAL_14]] : (!fir.ptr<i32>) -> !fir.ref<i32>
@@ -323,9 +301,7 @@ end subroutine test11
 ! CHECK:    fir.store %[[VAL_5]] to %[[VAL_3]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK:    %[[VAL_8:.*]] = fir.convert %[[VAL_7]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK:    %[[VAL_9:.*]] = fir.load %[[VAL_8]] : !fir.ref<!fir.ptr<i64>>
-! CHECK:    %[[VAL_10:.*]] = fir.convert %[[VAL_3]]#0 : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> !fir.ref<!fir.box<none>>
-! CHECK:    %[[VAL_11:.*]] = fir.convert %[[VAL_9]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK:    fir.call @_FortranAPointerAssociateScalar(%[[VAL_10]], %[[VAL_11]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK:    fir.box_set_addr %[[VAL_9]] to %[[VAL_3]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK:    %[[VAL_13:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK:    %[[VAL_14:.*]] = fir.box_addr %[[VAL_13]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
 ! CHECK:    %[[VAL_15:.*]] = fir.load %[[VAL_14]] : !fir.ptr<i32>
@@ -353,9 +329,7 @@ subroutine test_hidden_pointer
 ! CHECK:           fir.store %[[VAL_5]] to %[[VAL_3]]#0 : !fir.ref<!fir.box<!fir.ptr<f32>>>
 ! CHECK:           %[[VAL_6:.*]] = fir.convert %[[VAL_2]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK:           %[[VAL_7:.*]] = fir.load %[[VAL_6]] : !fir.ref<!fir.ptr<i64>>
-! CHECK:           %[[VAL_8:.*]] = fir.convert %[[VAL_3]]#0 : (!fir.ref<!fir.box<!fir.ptr<f32>>>) -> !fir.ref<!fir.box<none>>
-! CHECK:           %[[VAL_9:.*]] = fir.convert %[[VAL_7]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK:           fir.call @_FortranAPointerAssociateScalar(%[[VAL_8]], %[[VAL_9]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK:           fir.box_set_addr %[[VAL_7]] to %[[VAL_3]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<f32>>>
 ! CHECK:           %[[VAL_11:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<!fir.box<!fir.ptr<f32>>>
 ! CHECK:           %[[VAL_12:.*]] = fir.box_addr %[[VAL_11]] : (!fir.box<!fir.ptr<f32>>) -> !fir.ptr<f32>
 ! CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_12]] : (!fir.ptr<f32>) -> !fir.ref<f32>
@@ -415,9 +389,7 @@ subroutine internal()
 ! CHECK:           %[[VAL_10:.*]]:2 = hlfir.declare %[[VAL_9]] uniq_name("_QFtest_craypointer_captureEcray_pointer") fortran_attrs<host_assoc, cray_pointer> : (!fir.ref<i64>) -> (!fir.ref<i64>, !fir.ref<i64>)
 ! CHECK:           %[[VAL_11:.*]] = fir.convert %[[VAL_10]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK:           %[[VAL_12:.*]] = fir.load %[[VAL_11]] : !fir.ref<!fir.ptr<i64>>
-! CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_6]]#0 : (!fir.ref<!fir.box<!fir.ptr<!fir.char<1,?>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK:           %[[VAL_14:.*]] = fir.convert %[[VAL_12]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK:           fir.call @_FortranAPointerAssociateScalar(%[[VAL_13]], %[[VAL_14]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK:           fir.box_set_addr %[[VAL_12]] to %[[VAL_6]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.char<1,?>>>>
 ! CHECK:           %[[VAL_16:.*]] = fir.load %[[VAL_6]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.char<1,?>>>>
 ! CHECK:           %[[VAL_17:.*]] = fir.box_addr %[[VAL_16]] : (!fir.box<!fir.ptr<!fir.char<1,?>>>) -> !fir.ptr<!fir.char<1,?>>
 ! CHECK:           %[[VAL_18:.*]] = fir.emboxchar %[[VAL_17]], %[[VAL_5]] : (!fir.ptr<!fir.char<1,?>>, index) -> !fir.boxchar<1>
diff --git a/flang/test/Lower/OpenMP/cray-pointers01.f90 b/flang/test/Lower/OpenMP/cray-pointers01.f90
index 04fda70f3c3452..12f14d171f365f 100644
--- a/flang/test/Lower/OpenMP/cray-pointers01.f90
+++ b/flang/test/Lower/OpenMP/cray-pointers01.f90
@@ -22,9 +22,7 @@ subroutine set_cray_pointer
     ! CHECK: omp.parallel
     ! CHECK: %[[I_01:.*]] = fir.convert %[[IVAR_DECL]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
     ! CHECK: %[[I_02:.*]] = fir.load %[[I_01]] : !fir.ref<!fir.ptr<i64>>
-    ! CHECK: %[[I_03:.*]] = fir.convert %[[VAR_DECL]]#0 : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xf64>>>>) -> !fir.ref<!fir.box<none>>
-    ! CHECK: %[[I_04:.*]] = fir.convert %[[I_02]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-    ! CHECK: fir.call @_FortranAPointerAssociateScalar(%[[I_03]], %[[I_04]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+    ! CHECK: fir.box_set_addr %[[I_02]] to %[[VAR_DECL]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf64>>>>
     print *, var(1)
     !$omp end parallel
   end subroutine
@@ -46,12 +44,12 @@ program test_cray_pointers_01
     ! CHECK:   %[[IVAR_DECL_02:.*]]:2 = hlfir.declare %[[ARG0]] uniq_name("_QFEivar") fortran_attrs<cray_pointer> : (!fir.ref<i64>) -> (!fir.ref<i64>, !fir.ref<i64>)
     ! CHECK:   hlfir.assign %{{.*}} to %[[IVAR_DECL_02]]#0 : i64, !fir.ref<i64>
     ivar = loc(pointee)
-    ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+    ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
     ! CHECK:   %[[CONST_2:.*]] = arith.constant 2 : i32
     ! CHECK:   {{.*}} = math.fpowi {{.*}}, %[[CONST_2]] fastmath<contract> : f64, i32
-    ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+    ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
     var(1) = var(1) ** 2
-    ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+    ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
     print *, var(1)
     ! CHECK:   omp.terminator
     ! CHECK: }
diff --git a/flang/test/Lower/OpenMP/cray-pointers02.f90 b/flang/test/Lower/OpenMP/cray-pointers02.f90
index 4dd1c9e6215b80..44725be3912d3d 100644
--- a/flang/test/Lower/OpenMP/cray-pointers02.f90
+++ b/flang/test/Lower/OpenMP/cray-pointers02.f90
@@ -35,10 +35,10 @@ subroutine none_shared()
 
     !$omp parallel num_threads(1) default(none) shared(ivar)
         ! CHECK: omp.parallel
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
         ! CHECK:   {{.*}} = arith.divsi
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
         var(1) = var(1) / 2
         print '(A24,I6)', 'none_shared', var(1)
     !$omp end parallel
@@ -58,10 +58,10 @@ subroutine none_private()
     !$omp parallel num_threads(1) default(none) private(ivar) shared(pointee)
         ! CHECK: omp.parallel
         ivar = loc(pointee)
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
         ! CHECK:   {{.*}} = arith.addi
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
         var(1) = var(1) + 2
         print '(A24,I6)', 'none_private', var(1)
     !$omp end parallel
@@ -80,10 +80,10 @@ subroutine none_firstprivate()
 
     !$omp parallel num_threads(1) default(none) firstprivate(ivar)
         ! CHECK: omp.parallel
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
         ! CHECK:   {{.*}} = arith.muli
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
         var(1) = var(1) * 2
         print '(A24,I6)', 'none_firstprivate', var(1)
     !$omp end parallel
@@ -102,10 +102,10 @@ subroutine private_shared()
 
     !$omp parallel num_threads(1) default(private) shared(ivar)
         ! CHECK: omp.parallel
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
         ! CHECK:   {{.*}} = math.ipowi
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
         var(1) = var(1) ** 2
         print '(A24,I6)', 'private_shared', var(1)
     !$omp end parallel
@@ -124,10 +124,10 @@ subroutine private_firstprivate()
 
     !$omp parallel num_threads(1) default(private) firstprivate(ivar)
         ! CHECK: omp.parallel
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
         ! CHECK:   {{.*}} = arith.subi
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
         var(1) = var(1) - 2
         print '(A24,I6)', 'private_firstprivate', var(1)
     !$omp end parallel
@@ -146,10 +146,10 @@ subroutine firstprivate_shared()
 
     !$omp parallel num_threads(1) default(firstprivate) shared(ivar)
         ! CHECK: omp.parallel
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
         ! CHECK:   {{.*}} = arith.divsi
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
         var(1) = var(1) / 2
         print '(A24,I6)', 'firstprivate_shared', var(1)
     !$omp end parallel
@@ -168,10 +168,10 @@ subroutine firstprivate_private()
 
     !$omp parallel num_threads(1) default(firstprivate) private(ivar) shared(pointee)
         ! CHECK: omp.parallel
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
         ! CHECK:   {{.*}} = math.ipowi
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
-        ! CHECK:   fir.call @_FortranAPointerAssociateScalar({{.*}}) fastmath<contract> : (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
+        ! CHECK:   fir.box_set_addr {{.*}} to {{.*}} : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<{{.*}}>>>
         ivar = loc(pointee)
         var(1) = var(1) ** 2
         print '(A24,I6)', 'firstprivate_private', var(1)
diff --git a/flang/test/Lower/cray-pointer.f90 b/flang/test/Lower/cray-pointer.f90
index aba5dee118f23d..3e2b4a639c7810 100644
--- a/flang/test/Lower/cray-pointer.f90
+++ b/flang/test/Lower/cray-pointer.f90
@@ -35,9 +35,7 @@ subroutine cray_scalar()
 
 ! CHECK: %[[ptrcvt:.*]] = fir.convert %[[ptr]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK: %[[ptrld:.*]] = fir.load %[[ptrcvt]] : !fir.ref<!fir.ptr<i64>>
-! CHECK: %[[ptebox_cvt:.*]] = fir.convert %[[pte]]#0 : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> !fir.ref<!fir.box<none>>
-! CHECK: %[[rawptr:.*]] = fir.convert %[[ptrld]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK: fir.call @_FortranAPointerAssociateScalar(%[[ptebox_cvt]], %[[rawptr]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK: fir.box_set_addr %[[ptrld]] to %[[pte]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK: %[[pteload:.*]] = fir.load %[[pte]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK: %[[pteaddr:.*]] = fir.box_addr %[[pteload]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
 ! CHECK: %[[ptevalue:.*]] = fir.load %[[pteaddr]] : !fir.ptr<i32>
@@ -49,9 +47,7 @@ subroutine cray_scalar()
 ! CHECK: %[[jld:.*]] = fir.load %[[j]]#0 : !fir.ref<i32>
 ! CHECK: %[[ptrcvt2:.*]] = fir.convert %[[ptr]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK: %[[ptrld2:.*]] = fir.load %[[ptrcvt2]] : !fir.ref<!fir.ptr<i64>>
-! CHECK: %[[ptebox_cvt2:.*]] = fir.convert %[[pte]]#0 : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> !fir.ref<!fir.box<none>>
-! CHECK: %[[rawptr2:.*]] = fir.convert %[[ptrld2]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK: fir.call @_FortranAPointerAssociateScalar(%[[ptebox_cvt2]], %[[rawptr2]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK: fir.box_set_addr %[[ptrld2]] to %[[pte]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK: %[[pteload2:.*]] = fir.load %[[pte]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK: %[[pteaddr2:.*]] = fir.box_addr %[[pteload2]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
 ! CHECK: hlfir.assign %[[jld]] to %[[pteaddr2]] : i32, !fir.ptr<i32>
@@ -89,9 +85,7 @@ subroutine cray_derivedType()
 
 ! CHECK: %[[ptrcvt:.*]] = fir.convert %[[ptr]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK: %[[ptrld:.*]] = fir.load %[[ptrcvt]] : !fir.ref<!fir.ptr<i64>>
-! CHECK: %[[ptebox_cvt:.*]] = fir.convert %[[pte]]#0 : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> !fir.ref<!fir.box<none>>
-! CHECK: %[[rawptr:.*]] = fir.convert %[[ptrld]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK: fir.call @_FortranAPointerAssociateScalar(%[[ptebox_cvt]], %[[rawptr]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK: fir.box_set_addr %[[ptrld]] to %[[pte]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK: %[[pteload:.*]] = fir.load %[[pte]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK: %[[pteaddr:.*]] = fir.box_addr %[[pteload]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
 ! CHECK: %[[ptevalue:.*]] = fir.load %[[pteaddr]] : !fir.ptr<i32>
@@ -106,9 +100,7 @@ subroutine cray_derivedType()
 ! CHECK: %[[add:.*]] = arith.addi %[[kld]], %[[const]] : i32
 ! CHECK: %[[ptrcvt2:.*]] = fir.convert %[[ptr]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK: %[[ptrld2:.*]] = fir.load %[[ptrcvt2]] : !fir.ref<!fir.ptr<i64>>
-! CHECK: %[[ptebox_cvt2:.*]] = fir.convert %[[pte]]#0 : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> !fir.ref<!fir.box<none>>
-! CHECK: %[[rawptr2:.*]] = fir.convert %[[ptrld2]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK: fir.call @_FortranAPointerAssociateScalar(%[[ptebox_cvt2]], %[[rawptr2]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK: fir.box_set_addr %[[ptrld2]] to %[[pte]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK: %[[pteload2:.*]] = fir.load %[[pte]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK: %[[pteaddr2:.*]] = fir.box_addr %[[pteload2]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
 ! CHECK: hlfir.assign %[[add]] to %[[pteaddr2]] : i32, !fir.ptr<i32>
@@ -151,9 +143,7 @@ subroutine cray_ptrArth()
 ! CHECK: hlfir.assign %[[add]] to %[[ptr]]#0 : i64, !fir.ref<i64>
 ! CHECK: %[[ptrcvt:.*]] = fir.convert %[[ptr]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK: %[[ptrld2:.*]] = fir.load %[[ptrcvt]] : !fir.ref<!fir.ptr<i64>>
-! CHECK: %[[ptebox_cvt:.*]] = fir.convert %[[pte]]#0 : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> !fir.ref<!fir.box<none>>
-! CHECK: %[[rawptr:.*]] = fir.convert %[[ptrld2]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK: fir.call @_FortranAPointerAssociateScalar(%[[ptebox_cvt]], %[[rawptr]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK: fir.box_set_addr %[[ptrld2]] to %[[pte]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK: %[[pteload:.*]] = fir.load %[[pte]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK: %[[pteaddr:.*]] = fir.box_addr %[[pteload]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
 ! CHECK: %[[ptevalue:.*]] = fir.load %[[pteaddr]] : !fir.ptr<i32>
@@ -170,9 +160,7 @@ subroutine cray_ptrArth()
 ! CHECK: %[[neg7:.*]] = arith.constant -7 : i32
 ! CHECK: %[[ptrcvt2:.*]] = fir.convert %[[ptr]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK: %[[ptrld4:.*]] = fir.load %[[ptrcvt2]] : !fir.ref<!fir.ptr<i64>>
-! CHECK: %[[ptebox_cvt2:.*]] = fir.convert %[[pte]]#0 : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> !fir.ref<!fir.box<none>>
-! CHECK: %[[rawptr2:.*]] = fir.convert %[[ptrld4]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK: fir.call @_FortranAPointerAssociateScalar(%[[ptebox_cvt2]], %[[rawptr2]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK: fir.box_set_addr %[[ptrld4]] to %[[pte]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK: %[[pteload2:.*]] = fir.load %[[pte]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK: %[[pteaddr2:.*]] = fir.box_addr %[[pteload2]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
 ! CHECK: hlfir.assign %[[neg7]] to %[[pteaddr2]] : i32, !fir.ptr<i32>
@@ -208,9 +196,7 @@ subroutine cray_arrayElement()
 
 ! CHECK: %[[ptrcvt:.*]] = fir.convert %[[ptr]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK: %[[ptrld:.*]] = fir.load %[[ptrcvt]] : !fir.ref<!fir.ptr<i64>>
-! CHECK: %[[ptebox_cvt:.*]] = fir.convert %[[pte]]#0 : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK: %[[rawptr:.*]] = fir.convert %[[ptrld]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK: fir.call @_FortranAPointerAssociateScalar(%[[ptebox_cvt]], %[[rawptr]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK: fir.box_set_addr %[[ptrld]] to %[[pte]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 ! CHECK: %[[pteload:.*]] = fir.load %[[pte]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 ! CHECK: %[[c3:.*]] = arith.constant 3 : index
 ! CHECK: %[[ptedes:.*]] = hlfir.designate %[[pteload]] (%[[c3]])  : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> !fir.ref<i32>
@@ -223,9 +209,7 @@ subroutine cray_arrayElement()
 ! CHECK: %[[neg2:.*]] = arith.constant -2 : i32
 ! CHECK: %[[ptrcvt2:.*]] = fir.convert %[[ptr]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK: %[[ptrld2:.*]] = fir.load %[[ptrcvt2]] : !fir.ref<!fir.ptr<i64>>
-! CHECK: %[[ptebox_cvt2:.*]] = fir.convert %[[pte]]#0 : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK: %[[rawptr2:.*]] = fir.convert %[[ptrld2]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK: fir.call @_FortranAPointerAssociateScalar(%[[ptebox_cvt2]], %[[rawptr2]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK: fir.box_set_addr %[[ptrld2]] to %[[pte]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 ! CHECK: %[[pteload2:.*]] = fir.load %[[pte]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 ! CHECK: %[[c2b:.*]] = arith.constant 2 : index
 ! CHECK: %[[ptedes2:.*]] = hlfir.designate %[[pteload2]] (%[[c2b]])  : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> !fir.ref<i32>
@@ -261,9 +245,7 @@ subroutine cray_2darrayElement()
 
 ! CHECK: %[[ptrcvt:.*]] = fir.convert %[[ptr]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK: %[[ptrld:.*]] = fir.load %[[ptrcvt]] : !fir.ref<!fir.ptr<i64>>
-! CHECK: %[[ptebox_cvt:.*]] = fir.convert %[[pte]]#0 : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?x?xi32>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK: %[[rawptr:.*]] = fir.convert %[[ptrld]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK: fir.call @_FortranAPointerAssociateScalar(%[[ptebox_cvt]], %[[rawptr]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK: fir.box_set_addr %[[ptrld]] to %[[pte]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?x?xi32>>>>
 ! CHECK: %[[pteload:.*]] = fir.load %[[pte]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?x?xi32>>>>
 ! CHECK: %[[c1:.*]] = arith.constant 1 : index
 ! CHECK: %[[c1b:.*]] = arith.constant 1 : index
@@ -277,9 +259,7 @@ subroutine cray_2darrayElement()
 ! CHECK: %[[neg2:.*]] = arith.constant -2 : i32
 ! CHECK: %[[ptrcvt2:.*]] = fir.convert %[[ptr]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK: %[[ptrld2:.*]] = fir.load %[[ptrcvt2]] : !fir.ref<!fir.ptr<i64>>
-! CHECK: %[[ptebox_cvt2:.*]] = fir.convert %[[pte]]#0 : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?x?xi32>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK: %[[rawptr2:.*]] = fir.convert %[[ptrld2]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK: fir.call @_FortranAPointerAssociateScalar(%[[ptebox_cvt2]], %[[rawptr2]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK: fir.box_set_addr %[[ptrld2]] to %[[pte]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?x?xi32>>>>
 ! CHECK: %[[pteload2:.*]] = fir.load %[[pte]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?x?xi32>>>>
 ! CHECK: %[[c1c:.*]] = arith.constant 1 : index
 ! CHECK: %[[c2c:.*]] = arith.constant 2 : index
@@ -311,9 +291,7 @@ subroutine cray_array()
 
 ! CHECK: %[[ptrcvt:.*]] = fir.convert %[[ptr]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK: %[[ptrld:.*]] = fir.load %[[ptrcvt]] : !fir.ref<!fir.ptr<i64>>
-! CHECK: %[[ptebox_cvt:.*]] = fir.convert %[[pte]]#0 : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK: %[[rawptr:.*]] = fir.convert %[[ptrld]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK: fir.call @_FortranAPointerAssociateScalar(%[[ptebox_cvt]], %[[rawptr]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK: fir.box_set_addr %[[ptrld]] to %[[pte]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 ! CHECK: %[[pteload:.*]] = fir.load %[[pte]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 ! CHECK: hlfir.assign %[[pteload]] to %[[k]]#0 : !fir.box<!fir.ptr<!fir.array<?xi32>>>, !fir.ref<!fir.array<3xi32>>
 
@@ -323,9 +301,7 @@ subroutine cray_array()
 ! CHECK: %[[neg2:.*]] = arith.constant -2 : i32
 ! CHECK: %[[ptrcvt2:.*]] = fir.convert %[[ptr]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK: %[[ptrld2:.*]] = fir.load %[[ptrcvt2]] : !fir.ref<!fir.ptr<i64>>
-! CHECK: %[[ptebox_cvt2:.*]] = fir.convert %[[pte]]#0 : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK: %[[rawptr2:.*]] = fir.convert %[[ptrld2]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK: fir.call @_FortranAPointerAssociateScalar(%[[ptebox_cvt2]], %[[rawptr2]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK: fir.box_set_addr %[[ptrld2]] to %[[pte]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 ! CHECK: %[[pteload2:.*]] = fir.load %[[pte]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 ! CHECK: hlfir.assign %[[neg2]] to %[[pteload2]] : i32, !fir.box<!fir.ptr<!fir.array<?xi32>>>
 end
@@ -353,9 +329,7 @@ subroutine cray_arraySection()
 
 ! CHECK: %[[ptrcvt:.*]] = fir.convert %[[ptr]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK: %[[ptrld:.*]] = fir.load %[[ptrcvt]] : !fir.ref<!fir.ptr<i64>>
-! CHECK: %[[ptebox_cvt:.*]] = fir.convert %[[pte]]#0 : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK: %[[rawptr:.*]] = fir.convert %[[ptrld]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK: fir.call @_FortranAPointerAssociateScalar(%[[ptebox_cvt]], %[[rawptr]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK: fir.box_set_addr %[[ptrld]] to %[[pte]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 ! CHECK: %[[pteload:.*]] = fir.load %[[pte]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 ! CHECK: %[[ptedes:.*]] = hlfir.designate %[[pteload]] (%{{.*}}:%{{.*}}:%{{.*}})  shape %{{.*}} : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index, index, index, !fir.shape<1>) -> !fir.ref<!fir.array<2xi32>>
 ! CHECK: hlfir.assign %[[ptedes]] to %[[k]]#0 : !fir.ref<!fir.array<2xi32>>, !fir.ref<!fir.array<2xi32>>
@@ -366,9 +340,7 @@ subroutine cray_arraySection()
 ! CHECK: %[[neg2:.*]] = arith.constant -2 : i32
 ! CHECK: %[[ptrcvt2:.*]] = fir.convert %[[ptr]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK: %[[ptrld2:.*]] = fir.load %[[ptrcvt2]] : !fir.ref<!fir.ptr<i64>>
-! CHECK: %[[ptebox_cvt2:.*]] = fir.convert %[[pte]]#0 : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK: %[[rawptr2:.*]] = fir.convert %[[ptrld2]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK: fir.call @_FortranAPointerAssociateScalar(%[[ptebox_cvt2]], %[[rawptr2]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK: fir.box_set_addr %[[ptrld2]] to %[[pte]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 ! CHECK: %[[pteload2:.*]] = fir.load %[[pte]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
 ! CHECK: %[[ptedes2:.*]] = hlfir.designate %[[pteload2]] (%{{.*}}:%{{.*}}:%{{.*}})  shape %{{.*}} : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index, index, index, !fir.shape<1>) -> !fir.ref<!fir.array<2xi32>>
 ! CHECK: hlfir.assign %[[neg2]] to %[[ptedes2]] : i32, !fir.ref<!fir.array<2xi32>>
@@ -410,9 +382,7 @@ subroutine test_pte()
 ! CHECK: %[[xval:.*]] = fir.load %[[x]]#0 : !fir.ref<i32>
 ! CHECK: %[[ptrcvt:.*]] = fir.convert %[[ptr]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK: %[[ptrld:.*]] = fir.load %[[ptrcvt]] : !fir.ref<!fir.ptr<i64>>
-! CHECK: %[[ptebox_cvt:.*]] = fir.convert %[[pte]]#0 : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> !fir.ref<!fir.box<none>>
-! CHECK: %[[rawptr:.*]] = fir.convert %[[ptrld]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK: fir.call @_FortranAPointerAssociateScalar(%[[ptebox_cvt]], %[[rawptr]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK: fir.box_set_addr %[[ptrld]] to %[[pte]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK: %[[pteload:.*]] = fir.load %[[pte]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK: %[[pteaddr:.*]] = fir.box_addr %[[pteload]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
 ! CHECK: hlfir.assign %[[xval]] to %[[pteaddr]] : i32, !fir.ptr<i32>
@@ -420,9 +390,7 @@ subroutine test_pte()
   x = pte
 ! CHECK: %[[ptrcvt2:.*]] = fir.convert %[[ptr]]#0 : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i64>>
 ! CHECK: %[[ptrld2:.*]] = fir.load %[[ptrcvt2]] : !fir.ref<!fir.ptr<i64>>
-! CHECK: %[[ptebox_cvt2:.*]] = fir.convert %[[pte]]#0 : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> !fir.ref<!fir.box<none>>
-! CHECK: %[[rawptr2:.*]] = fir.convert %[[ptrld2]] : (!fir.ptr<i64>) -> !fir.llvm_ptr<i8>
-! CHECK: fir.call @_FortranAPointerAssociateScalar(%[[ptebox_cvt2]], %[[rawptr2]]) {{.*}}: (!fir.ref<!fir.box<none>>, !fir.llvm_ptr<i8>) -> ()
+! CHECK: fir.box_set_addr %[[ptrld2]] to %[[pte]]#0 : !fir.ptr<i64>, !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK: %[[pteload2:.*]] = fir.load %[[pte]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
 ! CHECK: %[[pteaddr2:.*]] = fir.box_addr %[[pteload2]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
 ! CHECK: %[[val:.*]] = fir.load %[[pteaddr2]] : !fir.ptr<i32>



More information about the flang-commits mailing list