https://github.com/steffenlarsen updated 
https://github.com/llvm/llvm-project/pull/231497

>From def7165fce9bd50b4db3fecc434cc9f726173795 Mon Sep 17 00:00:00 2001
From: Steffen Holst Larsen <[email protected]>
Date: Wed, 23 Sep 2026 01:40:25 -0500
Subject: [PATCH 1/3] [CIR] Put __array_idx alloca in the correct address space
 and align

LoweringPrepare lowers cir.array.ctor and cir.array.dtor into a loop
whose current element pointer lives in a stack slot `__array_idx`. The
slot was created in the default address space with align 1. On targets
whose allocas live in another address space this produced an alloca the
LLVM verifier rejects.

Create the slot in the alloca address space from the module's data
layout, as CIRGenFunction::emitAlloca does for other locals. Align it
for the element pointer it holds rather than its own address, since the
two differ where the alloca address space has narrower pointers.

Assisted-by: Claude Opus 5.5

Signed-off-by: Steffen Holst Larsen <[email protected]>
---
 .../Dialect/Transforms/LoweringPrepare.cpp    | 13 +++-
 .../delete-array-overaligned-cookie.cpp       |  4 +-
 clang/test/CIR/CodeGen/delete-array.cpp       |  2 +-
 clang/test/CIR/CodeGen/new.cpp                |  8 +-
 .../CIR/CodeGenCUDA/array-ctor-dtor-loop.cu   | 77 +++++++++++++++++++
 .../combined-reduction-clause-inline-ops.cpp  | 18 ++---
 .../combined-reduction-clause-outline-ops.cpp | 18 ++---
 .../compute-reduction-clause-inline-ops.cpp   | 18 ++---
 .../compute-reduction-clause-outline-ops.cpp  | 18 ++---
 .../loop-reduction-clause-inline-ops.cpp      | 18 ++---
 .../loop-reduction-clause-outline-ops.cpp     | 18 ++---
 .../private-clause-array-recipes-CtorDtor.cpp | 16 ++--
 .../private-clause-array-recipes-NoOps.cpp    |  8 +-
 ...-clause-pointer-array-recipes-CtorDtor.cpp |  4 +-
 ...ate-clause-pointer-array-recipes-NoOps.cpp |  2 +-
 15 files changed, 163 insertions(+), 79 deletions(-)
 create mode 100644 clang/test/CIR/CodeGenCUDA/array-ctor-dtor-loop.cu

diff --git a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp 
b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
index 9334bf65210c4..752fcc42f9860 100644
--- a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
@@ -2324,9 +2324,16 @@ static void 
lowerArrayDtorCtorIntoLoop(cir::CIRBaseBuilderTy &builder,
     builder.setInsertionPointToStart(&ifOp.getThenRegion().front());
   }
 
-  mlir::Value tmpAddr =
-      builder.createAlloca(loc, /*addr type*/ builder.getPointerTo(eltTy),
-                           "__array_idx", builder.getAlignmentAttr(1));
+  // The induction variable is a plain stack local, so it lives in the
+  // target's alloca address space. It is aligned for the element pointer it
+  // holds, not for its own address, as the two differ where the alloca address
+  // space has narrower pointers.
+  cir::CIRDataLayout dataLayout(op->getParentOfType<mlir::ModuleOp>());
+  cir::PointerType tmpAddrTy = builder.getPointerTo(
+      eltTy, dataLayout.getAllocaAddrSpace(builder.getContext()));
+  mlir::Value tmpAddr = builder.createAlloca(
+      loc, /*addr type*/ tmpAddrTy, "__array_idx",
+      builder.getAlignmentAttr(dataLayout.getABITypeAlign(eltTy).value()));
   builder.createStore(loc, start, tmpAddr);
 
   mlir::Block *bodyBlock = &op->getRegion(0).front();
diff --git a/clang/test/CIR/CodeGen/delete-array-overaligned-cookie.cpp 
b/clang/test/CIR/CodeGen/delete-array-overaligned-cookie.cpp
index 5e676045fbda3..3f2422634ca2b 100644
--- a/clang/test/CIR/CodeGen/delete-array-overaligned-cookie.cpp
+++ b/clang/test/CIR/CodeGen/delete-array-overaligned-cookie.cpp
@@ -39,7 +39,7 @@ void test_delete_array(OverAligned *a) {
 // CIR-AFTER:  cir.call @_ZdaPvmSt11align_val_t(%{{.*}}, %[[TOTAL_SIZE]], 
%[[ALIGN]]) nothrow : (!cir.ptr<!void>, !u64i, !u64i) -> ()
 
 // LLVM-LABEL: define {{.*}}@_Z17test_delete_arrayP11OverAligned(
-// LLVM: %[[A:.*]] = alloca ptr, align 8
+// LLVM: store ptr %{{.*}}, ptr %[[A:.*]], align 8
 // LLVM: %[[LOAD_A:.*]] = load ptr, ptr %[[A]], align 8
 // LLVM: %[[BEFORE_COOKIE:.*]] = getelementptr {{.*}}i8, ptr %[[LOAD_A]], i64 
-64
 // LLVM: %[[AFTER_COUNT:.*]] = getelementptr {{.*}}i8, ptr %[[BEFORE_COOKIE]], 
i64 56
@@ -77,7 +77,7 @@ void 
test_not_aligned_new_but_need_cookie(NotAlignedNewButNeedCookie *a) {
 // CIR-AFTER:   cir.call @_ZdaPvm(%{{.*}}, %[[TOTAL_SIZE]]) nothrow : 
(!cir.ptr<!void>, !u64i) -> ()
 
 // LLVM-LABEL: define 
{{.*}}@_Z36test_not_aligned_new_but_need_cookieP26NotAlignedNewButNeedCookie(
-// LLVM: %[[A:.*]] = alloca ptr, align 8
+// LLVM: store ptr %{{.*}}, ptr %[[A:.*]], align 8
 // LLVM: %[[LOAD_A:.*]] = load ptr, ptr %[[A]], align 8
 // LLVM: %[[BEFORE_COOKIE:.*]] = getelementptr {{.*}}i8, ptr %[[LOAD_A]], i64 
-16
 // LLVM: %[[AFTER_COUNT:.*]] = getelementptr {{.*}}i8, ptr %[[BEFORE_COOKIE]], 
i64 8
diff --git a/clang/test/CIR/CodeGen/delete-array.cpp 
b/clang/test/CIR/CodeGen/delete-array.cpp
index d97d59977dbc2..6d42964eec26b 100644
--- a/clang/test/CIR/CodeGen/delete-array.cpp
+++ b/clang/test/CIR/CodeGen/delete-array.cpp
@@ -207,7 +207,7 @@ void test_delete_array_destructed(Destructed *ptr) {
 // CIR:       %[[END:.*]] = cir.ptr_stride %[[PTR]], %[[NUM_ELEM]] : 
(!cir.ptr<!rec_Destructed>, !u64i) -> !cir.ptr<!rec_Destructed>
 // CIR:       %[[NOT_EMPTY:.*]] = cir.cmp ne %[[END]], %[[PTR]] : 
!cir.ptr<!rec_Destructed>
 // CIR:       cir.if %[[NOT_EMPTY]] {
-// CIR:         %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_Destructed>>
+// CIR:         %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_Destructed>>
 // CIR:         cir.store %[[END]], %[[ARR_IDX]] : !cir.ptr<!rec_Destructed>, 
!cir.ptr<!cir.ptr<!rec_Destructed>>
 // CIR:         cir.do {
 // CIR:           %[[ARR_CUR:.*]] = cir.load{{.*}} %[[ARR_IDX]] : 
!cir.ptr<!cir.ptr<!rec_Destructed>>, !cir.ptr<!rec_Destructed>
diff --git a/clang/test/CIR/CodeGen/new.cpp b/clang/test/CIR/CodeGen/new.cpp
index 3034388c3f329..cb663a23c1f01 100644
--- a/clang/test/CIR/CodeGen/new.cpp
+++ b/clang/test/CIR/CodeGen/new.cpp
@@ -774,7 +774,7 @@ void test_array_new_with_ctor_init() {
 // CHECK:    %[[THREE_2:.*]] = cir.const #cir.int<3> : !u64i
 // CHECK:    %[[ARRAY_BEGIN:.*]] = cir.cast array_to_ptrdecay %[[ARRAY_PTR]] : 
!cir.ptr<!cir.array<!rec_F x 3>> -> !cir.ptr<!rec_F>
 // CHECK:    %[[ARRAY_END:.*]] = cir.ptr_stride %[[ARRAY_BEGIN]], %[[THREE_2]] 
: (!cir.ptr<!rec_F>, !u64i) -> !cir.ptr<!rec_F>
-// CHECK:    %[[IDX_ADDR:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_F>>
+// CHECK:    %[[IDX_ADDR:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_F>>
 // CHECK:    cir.store %[[ARRAY_BEGIN]], %[[IDX_ADDR]] : !cir.ptr<!rec_F>, 
!cir.ptr<!cir.ptr<!rec_F>>
 // CHECK:    cir.do {
 // CHECK:      %[[CUR:.*]] = cir.load %[[IDX_ADDR]] : 
!cir.ptr<!cir.ptr<!rec_F>>, !cir.ptr<!rec_F>
@@ -796,7 +796,7 @@ void test_array_new_with_ctor_init() {
 // LLVM:   %[[RAW_PTR:.*]] = call noundef nonnull ptr @_Znam(i64 noundef 3)
 // LLVM:   %[[BEGIN:.*]] = getelementptr %class.F, ptr %[[RAW_PTR]], i32 0
 // LLVM:   %[[ARRAY_END:.*]] = getelementptr %class.F, ptr %[[BEGIN]], i64 3
-// LLVM:   %[[IDX_ADDR:.*]] = alloca ptr, align 1
+// LLVM:   %[[IDX_ADDR:.*]] = alloca ptr, align 8
 // LLVM:   store ptr %[[BEGIN]], ptr %[[IDX_ADDR]], align 8
 // LLVM:   br label
 // LLVM:   %[[CUR2:.*]] = load ptr, ptr %[[IDX_ADDR]], align 8
@@ -1176,7 +1176,7 @@ void test_array_new_with_ctor_partial_init_list() {
 // CHECK:    %[[SIX:.*]] = cir.const #cir.int<6> : !u64i
 // CHECK:    %[[ARRAY_BEGIN:.*]] = cir.cast array_to_ptrdecay %[[TAIL_ARRAY]] 
: !cir.ptr<!cir.array<!rec_G x 6>> -> !cir.ptr<!rec_G>
 // CHECK:    %[[ARRAY_END:.*]] = cir.ptr_stride %[[ARRAY_BEGIN]], %[[SIX]] : 
(!cir.ptr<!rec_G>, !u64i) -> !cir.ptr<!rec_G>
-// CHECK:    %[[IDX_ADDR:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_G>>
+// CHECK:    %[[IDX_ADDR:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_G>>
 // CHECK:    cir.store %[[ARRAY_BEGIN]], %[[IDX_ADDR]] : !cir.ptr<!rec_G>, 
!cir.ptr<!cir.ptr<!rec_G>>
 // CHECK:    cir.do {
 // CHECK:      %[[CUR:.*]] = cir.load %[[IDX_ADDR]] : 
!cir.ptr<!cir.ptr<!rec_G>>, !cir.ptr<!rec_G>
@@ -1202,7 +1202,7 @@ void test_array_new_with_ctor_partial_init_list() {
 // LLVM:   %[[THIRD:.*]] = getelementptr %class.G, ptr %[[SECOND]], i64 1
 // LLVM:   %[[ARRAY_BEGIN:.*]] = getelementptr %class.G, ptr %[[THIRD]], i32 0
 // LLVM:   %[[ARRAY_END:.*]] = getelementptr %class.G, ptr %[[ARRAY_BEGIN]], 
i64 6
-// LLVM:   %[[IDX_ADDR:.*]] = alloca ptr, align 1
+// LLVM:   %[[IDX_ADDR:.*]] = alloca ptr, align 8
 // LLVM:   store ptr %[[ARRAY_BEGIN]], ptr %[[IDX_ADDR]], align 8
 // LLVM:   br label
 // LLVM:   %[[CUR2:.*]] = load ptr, ptr %[[IDX_ADDR]], align 8
diff --git a/clang/test/CIR/CodeGenCUDA/array-ctor-dtor-loop.cu 
b/clang/test/CIR/CodeGenCUDA/array-ctor-dtor-loop.cu
new file mode 100644
index 0000000000000..5c672bfb42747
--- /dev/null
+++ b/clang/test/CIR/CodeGenCUDA/array-ctor-dtor-loop.cu
@@ -0,0 +1,77 @@
+#include "Inputs/cuda.h"
+
+// RUN: %clang_cc1 -triple nvptx64-nvidia-cuda -fcuda-is-device -fclangir \
+// RUN:   -emit-cir %s -o - | FileCheck %s --check-prefix=CIR-CUDA
+// RUN: %clang_cc1 -triple nvptx64-nvidia-cuda -fcuda-is-device -fclangir \
+// RUN:   -emit-llvm %s -o - | FileCheck %s --check-prefix=LLVM-CUDA
+// RUN: %clang_cc1 -triple amdgcn-amd-amdhsa -x hip -fcuda-is-device -fclangir 
\
+// RUN:   -emit-cir %s -o - | FileCheck %s --check-prefix=CIR-HIP
+// RUN: %clang_cc1 -triple amdgcn-amd-amdhsa -x hip -fcuda-is-device -fclangir 
\
+// RUN:   -emit-llvm %s -o - | FileCheck %s --check-prefix=LLVM-HIP
+// RUN: %clang_cc1 -triple nvptx64-nvidia-cuda -fcuda-is-device \
+// RUN:   -emit-llvm %s -o - | FileCheck %s --check-prefixes=OGCG,OGCG-CUDA
+// RUN: %clang_cc1 -triple amdgcn-amd-amdhsa -x hip -fcuda-is-device \
+// RUN:   -emit-llvm %s -o - | FileCheck %s --check-prefixes=OGCG,OGCG-HIP
+
+// The loop variable of a lowered array constructor or destructor is a stack
+// local, so it lives in the alloca address space, aligned for the element
+// pointer it holds. Classic codegen keeps it in a phi instead.
+
+struct S {
+  __device__ S();
+  __device__ ~S();
+  int x;
+};
+
+__device__ void local_array() { S arr[4]; }
+
+// CIR-CUDA-LABEL: cir.func {{.*}} @_Z11local_arrayv()
+// CIR-CUDA:   %[[CTOR_IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_S>>
+// CIR-CUDA:   cir.do {
+// CIR-CUDA:     %[[CUR:.*]] = cir.load %[[CTOR_IDX]] : 
!cir.ptr<!cir.ptr<!rec_S>>, !cir.ptr<!rec_S>
+// CIR-CUDA:     cir.call @_ZN1SC1Ev(%[[CUR]])
+// CIR-CUDA:   %[[DTOR_IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_S>>
+// CIR-CUDA:   cir.do {
+// CIR-CUDA:     cir.load %[[DTOR_IDX]] : !cir.ptr<!cir.ptr<!rec_S>>, 
!cir.ptr<!rec_S>
+// CIR-CUDA:     cir.call @_ZN1SD1Ev(
+
+// LLVM-CUDA-LABEL: define {{.*}} void @_Z11local_arrayv()
+// LLVM-CUDA:   %[[DTOR_IDX:.*]] = alloca ptr, align 8
+// LLVM-CUDA:   %[[CTOR_IDX:.*]] = alloca ptr, align 8
+// LLVM-CUDA:   store ptr %{{.*}}, ptr %[[CTOR_IDX]], align 8
+// LLVM-CUDA:   load ptr, ptr %[[CTOR_IDX]], align 8
+// LLVM-CUDA:   call void @_ZN1SC1Ev(
+// LLVM-CUDA:   store ptr %{{.*}}, ptr %[[DTOR_IDX]], align 8
+// LLVM-CUDA:   load ptr, ptr %[[DTOR_IDX]], align 8
+// LLVM-CUDA:   call void @_ZN1SD1Ev(
+
+// CIR-HIP-LABEL: cir.func {{.*}} @_Z11local_arrayv()
+// CIR-HIP:   %[[CTOR_IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_S>, target_address_space(5)>
+// CIR-HIP:   cir.do {
+// CIR-HIP:     %[[CUR:.*]] = cir.load %[[CTOR_IDX]] : 
!cir.ptr<!cir.ptr<!rec_S>, target_address_space(5)>, !cir.ptr<!rec_S>
+// CIR-HIP:     cir.call @_ZN1SC1Ev(%[[CUR]])
+// CIR-HIP:   %[[DTOR_IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_S>, target_address_space(5)>
+// CIR-HIP:   cir.do {
+// CIR-HIP:     cir.load %[[DTOR_IDX]] : !cir.ptr<!cir.ptr<!rec_S>, 
target_address_space(5)>, !cir.ptr<!rec_S>
+// CIR-HIP:     cir.call @_ZN1SD1Ev(
+
+// LLVM-HIP-LABEL: define {{.*}} void @_Z11local_arrayv()
+// LLVM-HIP:   %[[DTOR_IDX:.*]] = alloca ptr, align 8, addrspace(5)
+// LLVM-HIP:   %[[CTOR_IDX:.*]] = alloca ptr, align 8, addrspace(5)
+// LLVM-HIP:   store ptr %{{.*}}, ptr addrspace(5) %[[CTOR_IDX]], align 8
+// LLVM-HIP:   load ptr, ptr addrspace(5) %[[CTOR_IDX]], align 8
+// LLVM-HIP:   call void @_ZN1SC1Ev(
+// LLVM-HIP:   store ptr %{{.*}}, ptr addrspace(5) %[[DTOR_IDX]], align 8
+// LLVM-HIP:   load ptr, ptr addrspace(5) %[[DTOR_IDX]], align 8
+// LLVM-HIP:   call void @_ZN1SD1Ev(
+
+// OGCG-LABEL: define {{.*}} void @_Z11local_arrayv()
+// OGCG-CUDA:    alloca [4 x %struct.S], align 4{{$}}
+// OGCG-HIP:     alloca [4 x %struct.S], align 4, addrspace(5)
+// OGCG:       arrayctor.loop:
+// OGCG:         %[[CUR:.*]] = phi ptr
+// OGCG:         call void @_ZN1SC1Ev(ptr {{.*}} %[[CUR]])
+// OGCG:       arraydestroy.body:
+// OGCG:         %[[PAST:.*]] = phi ptr
+// OGCG:         %[[ELT:.*]] = getelementptr inbounds %struct.S, ptr 
%[[PAST]], i64 -1
+// OGCG:         call void @_ZN1SD1Ev(ptr {{.*}} %[[ELT]])
diff --git 
a/clang/test/CIR/CodeGenOpenACC/combined-reduction-clause-inline-ops.cpp 
b/clang/test/CIR/CodeGenOpenACC/combined-reduction-clause-inline-ops.cpp
index 00140ad49b169..0b3716c834582 100644
--- a/clang/test/CIR/CodeGenOpenACC/combined-reduction-clause-inline-ops.cpp
+++ b/clang/test/CIR/CodeGenOpenACC/combined-reduction-clause-inline-ops.cpp
@@ -387,7 +387,7 @@ void acc_combined() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -530,7 +530,7 @@ void acc_combined() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -679,7 +679,7 @@ void acc_combined() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -828,7 +828,7 @@ void acc_combined() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -971,7 +971,7 @@ void acc_combined() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -1056,7 +1056,7 @@ void acc_combined() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -1140,7 +1140,7 @@ void acc_combined() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -1287,7 +1287,7 @@ void acc_combined() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -1375,7 +1375,7 @@ void acc_combined() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
diff --git 
a/clang/test/CIR/CodeGenOpenACC/combined-reduction-clause-outline-ops.cpp 
b/clang/test/CIR/CodeGenOpenACC/combined-reduction-clause-outline-ops.cpp
index 4e5bcdb63c9c1..199e517995e83 100644
--- a/clang/test/CIR/CodeGenOpenACC/combined-reduction-clause-outline-ops.cpp
+++ b/clang/test/CIR/CodeGenOpenACC/combined-reduction-clause-outline-ops.cpp
@@ -386,7 +386,7 @@ void acc_combined() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -529,7 +529,7 @@ void acc_combined() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -678,7 +678,7 @@ void acc_combined() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -827,7 +827,7 @@ void acc_combined() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -970,7 +970,7 @@ void acc_combined() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -1055,7 +1055,7 @@ void acc_combined() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -1139,7 +1139,7 @@ void acc_combined() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -1286,7 +1286,7 @@ void acc_combined() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -1374,7 +1374,7 @@ void acc_combined() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
diff --git 
a/clang/test/CIR/CodeGenOpenACC/compute-reduction-clause-inline-ops.cpp 
b/clang/test/CIR/CodeGenOpenACC/compute-reduction-clause-inline-ops.cpp
index c28e7f22554c3..119493332ff9f 100644
--- a/clang/test/CIR/CodeGenOpenACC/compute-reduction-clause-inline-ops.cpp
+++ b/clang/test/CIR/CodeGenOpenACC/compute-reduction-clause-inline-ops.cpp
@@ -387,7 +387,7 @@ void acc_compute() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -530,7 +530,7 @@ void acc_compute() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -679,7 +679,7 @@ void acc_compute() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -828,7 +828,7 @@ void acc_compute() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -971,7 +971,7 @@ void acc_compute() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -1056,7 +1056,7 @@ void acc_compute() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -1140,7 +1140,7 @@ void acc_compute() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -1287,7 +1287,7 @@ void acc_compute() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -1375,7 +1375,7 @@ void acc_compute() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
diff --git 
a/clang/test/CIR/CodeGenOpenACC/compute-reduction-clause-outline-ops.cpp 
b/clang/test/CIR/CodeGenOpenACC/compute-reduction-clause-outline-ops.cpp
index ac1ba765d8428..03ebfe784cbee 100644
--- a/clang/test/CIR/CodeGenOpenACC/compute-reduction-clause-outline-ops.cpp
+++ b/clang/test/CIR/CodeGenOpenACC/compute-reduction-clause-outline-ops.cpp
@@ -386,7 +386,7 @@ void acc_compute() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -529,7 +529,7 @@ void acc_compute() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -678,7 +678,7 @@ void acc_compute() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -827,7 +827,7 @@ void acc_compute() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -970,7 +970,7 @@ void acc_compute() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -1055,7 +1055,7 @@ void acc_compute() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -1139,7 +1139,7 @@ void acc_compute() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -1286,7 +1286,7 @@ void acc_compute() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -1374,7 +1374,7 @@ void acc_compute() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
diff --git a/clang/test/CIR/CodeGenOpenACC/loop-reduction-clause-inline-ops.cpp 
b/clang/test/CIR/CodeGenOpenACC/loop-reduction-clause-inline-ops.cpp
index c4d34212613ea..7ac4aa8978b87 100644
--- a/clang/test/CIR/CodeGenOpenACC/loop-reduction-clause-inline-ops.cpp
+++ b/clang/test/CIR/CodeGenOpenACC/loop-reduction-clause-inline-ops.cpp
@@ -387,7 +387,7 @@ void acc_loop() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -530,7 +530,7 @@ void acc_loop() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -679,7 +679,7 @@ void acc_loop() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -828,7 +828,7 @@ void acc_loop() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -971,7 +971,7 @@ void acc_loop() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -1056,7 +1056,7 @@ void acc_loop() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -1140,7 +1140,7 @@ void acc_loop() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -1287,7 +1287,7 @@ void acc_loop() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
@@ -1375,7 +1375,7 @@ void acc_loop() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsInline x 5>> -> 
!cir.ptr<!rec_HasOperatorsInline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsInline>, !u64i) -> !cir.ptr<!rec_HasOperatorsInline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsInline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsInline>>, !cir.ptr<!rec_HasOperatorsInline>
diff --git 
a/clang/test/CIR/CodeGenOpenACC/loop-reduction-clause-outline-ops.cpp 
b/clang/test/CIR/CodeGenOpenACC/loop-reduction-clause-outline-ops.cpp
index 367380ad18c9b..64a54dbfb6e22 100644
--- a/clang/test/CIR/CodeGenOpenACC/loop-reduction-clause-outline-ops.cpp
+++ b/clang/test/CIR/CodeGenOpenACC/loop-reduction-clause-outline-ops.cpp
@@ -386,7 +386,7 @@ void acc_loop() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -529,7 +529,7 @@ void acc_loop() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -678,7 +678,7 @@ void acc_loop() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -827,7 +827,7 @@ void acc_loop() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -970,7 +970,7 @@ void acc_loop() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -1055,7 +1055,7 @@ void acc_loop() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -1139,7 +1139,7 @@ void acc_loop() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -1286,7 +1286,7 @@ void acc_loop() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
@@ -1374,7 +1374,7 @@ void acc_loop() {
 // CHECK-NEXT: %[[SIZE:.*]] = cir.const #cir.int<5>  : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[ARG]] : 
!cir.ptr<!cir.array<!rec_HasOperatorsOutline x 5>> -> 
!cir.ptr<!rec_HasOperatorsOutline>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[SIZE]] : 
(!cir.ptr<!rec_HasOperatorsOutline>, !u64i) -> 
!cir.ptr<!rec_HasOperatorsOutline>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[IDX]] : 
!cir.ptr<!rec_HasOperatorsOutline>, !cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[CUR:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_HasOperatorsOutline>>, !cir.ptr<!rec_HasOperatorsOutline>
diff --git 
a/clang/test/CIR/CodeGenOpenACC/private-clause-array-recipes-CtorDtor.cpp 
b/clang/test/CIR/CodeGenOpenACC/private-clause-array-recipes-CtorDtor.cpp
index 7dc3f7beb63cf..d434af6457c0c 100644
--- a/clang/test/CIR/CodeGenOpenACC/private-clause-array-recipes-CtorDtor.cpp
+++ b/clang/test/CIR/CodeGenOpenACC/private-clause-array-recipes-CtorDtor.cpp
@@ -83,7 +83,7 @@ void do_things(unsigned A, unsigned B) {
 // CHECK-NEXT: %[[ARR_SIZE:.*]] = cir.const #cir.int<5> : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[TL_ALLOCA]] : 
!cir.ptr<!cir.array<!rec_CtorDtor x 5>> -> !cir.ptr<!rec_CtorDtor>
 // CHECK-NEXT: %[[ONE_PAST_LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], 
%[[ARR_SIZE]] : (!cir.ptr<!rec_CtorDtor>, !u64i) -> !cir.ptr<!rec_CtorDtor>
-// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
+// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
 // CHECK-NEXT: cir.store %[[DECAY]], %[[ARR_IDX]] : !cir.ptr<!rec_CtorDtor>, 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[IDX_LOAD:.*]] = cir.load %[[ARR_IDX]] : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>, !cir.ptr<!rec_CtorDtor>
@@ -103,7 +103,7 @@ void do_things(unsigned A, unsigned B) {
 // CHECK-NEXT: %[[LAST_IDX:.*]] = cir.const #cir.int<5> : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[PRIVATE]] : 
!cir.ptr<!cir.array<!rec_CtorDtor x 5>> -> !cir.ptr<!rec_CtorDtor>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[LAST_IDX]] : 
(!cir.ptr<!rec_CtorDtor>, !u64i) -> !cir.ptr<!rec_CtorDtor>
-// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
+// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[ARR_IDX]] : 
!cir.ptr<!rec_CtorDtor>, !cir.ptr<!cir.ptr<!rec_CtorDtor>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[IDX_LOAD:.*]] = cir.load %[[ARR_IDX]] : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>, !cir.ptr<!rec_CtorDtor>
@@ -249,7 +249,7 @@ void do_things(unsigned A, unsigned B) {
 // CHECK-NEXT: %[[ARR_SIZE:.*]] = cir.const #cir.int<25> : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[BITCAST]] : 
!cir.ptr<!cir.array<!rec_CtorDtor x 25>> -> !cir.ptr<!rec_CtorDtor>
 // CHECK-NEXT: %[[ONE_PAST_LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], 
%[[ARR_SIZE]] : (!cir.ptr<!rec_CtorDtor>, !u64i) -> !cir.ptr<!rec_CtorDtor>
-// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
+// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
 // CHECK-NEXT: cir.store %[[DECAY]], %[[ARR_IDX]] : !cir.ptr<!rec_CtorDtor>, 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[IDX_LOAD:.*]] = cir.load %[[ARR_IDX]] : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>, !cir.ptr<!rec_CtorDtor>
@@ -270,7 +270,7 @@ void do_things(unsigned A, unsigned B) {
 // CHECK-NEXT: %[[LAST_IDX:.*]] = cir.const #cir.int<25> : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[BITCAST]] : 
!cir.ptr<!cir.array<!rec_CtorDtor x 25>> -> !cir.ptr<!rec_CtorDtor>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[LAST_IDX]] : 
(!cir.ptr<!rec_CtorDtor>, !u64i) -> !cir.ptr<!rec_CtorDtor>
-// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
+// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[ARR_IDX]] : 
!cir.ptr<!rec_CtorDtor>, !cir.ptr<!cir.ptr<!rec_CtorDtor>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[IDX_LOAD:.*]] = cir.load %[[ARR_IDX]] : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>, !cir.ptr<!rec_CtorDtor>
@@ -494,7 +494,7 @@ void do_things(unsigned A, unsigned B) {
 // CHECK-NEXT: %[[ARR_SIZE:.*]] = cir.const #cir.int<5> : !u64i
 // CHECK-NEXT: %[[ARR_DECAY:.*]] = cir.cast array_to_ptrdecay %[[STRIDE]] : 
!cir.ptr<!cir.array<!rec_CtorDtor x 5>> -> !cir.ptr<!rec_CtorDtor>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[ARR_DECAY]], %[[ARR_SIZE]] 
: (!cir.ptr<!rec_CtorDtor>, !u64i) -> !cir.ptr<!rec_CtorDtor>
-// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
+// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
 // CHECK-NEXT: cir.store %[[ARR_DECAY]], %[[ARR_IDX]] : 
!cir.ptr<!rec_CtorDtor>, !cir.ptr<!cir.ptr<!rec_CtorDtor>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[IDX_LOAD:.*]] = cir.load %[[ARR_IDX]] : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>, !cir.ptr<!rec_CtorDtor>
@@ -567,7 +567,7 @@ void do_things(unsigned A, unsigned B) {
 // CHECK-NEXT: %[[LAST_IDX:.*]] = cir.const #cir.int<5> : !u64i
 // CHECK-NEXT: %[[ARR_DECAY:.*]] = cir.cast array_to_ptrdecay %[[STRIDE]] : 
!cir.ptr<!cir.array<!rec_CtorDtor x 5>> -> !cir.ptr<!rec_CtorDtor>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[ARR_DECAY]], %[[LAST_IDX]] 
: (!cir.ptr<!rec_CtorDtor>, !u64i) -> !cir.ptr<!rec_CtorDtor>
-// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
+// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[ARR_IDX]] : 
!cir.ptr<!rec_CtorDtor>, !cir.ptr<!cir.ptr<!rec_CtorDtor>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[IDX_LOAD:.*]] = cir.load %[[ARR_IDX]] : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>, !cir.ptr<!rec_CtorDtor>
@@ -612,7 +612,7 @@ void do_things(unsigned A, unsigned B) {
 // CHECK-NEXT: %[[ARR_SIZE:.*]] = cir.const #cir.int<125> : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[BITCAST]] : 
!cir.ptr<!cir.array<!rec_CtorDtor x 125>> -> !cir.ptr<!rec_CtorDtor>
 // CHECK-NEXT: %[[ONE_PAST_LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], 
%[[ARR_SIZE]] : (!cir.ptr<!rec_CtorDtor>, !u64i) -> !cir.ptr<!rec_CtorDtor>
-// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
+// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
 // CHECK-NEXT: cir.store %[[DECAY]], %[[ARR_IDX]] : !cir.ptr<!rec_CtorDtor>, 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[IDX_LOAD:.*]] = cir.load %[[ARR_IDX]] : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>, !cir.ptr<!rec_CtorDtor>
@@ -633,7 +633,7 @@ void do_things(unsigned A, unsigned B) {
 // CHECK-NEXT: %[[LAST_IDX:.*]] = cir.const #cir.int<125> : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[BITCAST]] : 
!cir.ptr<!cir.array<!rec_CtorDtor x 125>> -> !cir.ptr<!rec_CtorDtor>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[LAST_IDX]] : 
(!cir.ptr<!rec_CtorDtor>, !u64i) -> !cir.ptr<!rec_CtorDtor>
-// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
+// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
 // CHECK-NEXT: cir.store %[[LAST_ELT]], %[[ARR_IDX]] : 
!cir.ptr<!rec_CtorDtor>, !cir.ptr<!cir.ptr<!rec_CtorDtor>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[IDX_LOAD:.*]] = cir.load %[[ARR_IDX]] : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>, !cir.ptr<!rec_CtorDtor>
diff --git 
a/clang/test/CIR/CodeGenOpenACC/private-clause-array-recipes-NoOps.cpp 
b/clang/test/CIR/CodeGenOpenACC/private-clause-array-recipes-NoOps.cpp
index 92022c4ab45ae..608c57ac7eac4 100644
--- a/clang/test/CIR/CodeGenOpenACC/private-clause-array-recipes-NoOps.cpp
+++ b/clang/test/CIR/CodeGenOpenACC/private-clause-array-recipes-NoOps.cpp
@@ -48,7 +48,7 @@ void do_things(unsigned A, unsigned B) {
 // CHECK-NEXT: %[[ARR_SIZE:.*]] = cir.const #cir.int<5> : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[TL_ALLOCA]] : 
!cir.ptr<!cir.array<!rec_NoOps x 5>> -> !cir.ptr<!rec_NoOps>
 // CHECK-NEXT: %[[ONE_PAST_LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], 
%[[ARR_SIZE]] : (!cir.ptr<!rec_NoOps>, !u64i) -> !cir.ptr<!rec_NoOps>
-// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_NoOps>>
+// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_NoOps>>
 // CHECK-NEXT: cir.store %[[DECAY]], %[[ARR_IDX]] : !cir.ptr<!rec_NoOps>, 
!cir.ptr<!cir.ptr<!rec_NoOps>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[IDX_LOAD:.*]] = cir.load %[[ARR_IDX]] : 
!cir.ptr<!cir.ptr<!rec_NoOps>>, !cir.ptr<!rec_NoOps>
@@ -138,7 +138,7 @@ void do_things(unsigned A, unsigned B) {
 // CHECK-NEXT: %[[ARR_SIZE:.*]] = cir.const #cir.int<25> : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[BITCAST]] : 
!cir.ptr<!cir.array<!rec_NoOps x 25>> -> !cir.ptr<!rec_NoOps>
 // CHECK-NEXT: %[[ONE_PAST_LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], 
%[[ARR_SIZE]] : (!cir.ptr<!rec_NoOps>, !u64i) -> !cir.ptr<!rec_NoOps>
-// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_NoOps>>
+// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_NoOps>>
 // CHECK-NEXT: cir.store %[[DECAY]], %[[ARR_IDX]] : !cir.ptr<!rec_NoOps>, 
!cir.ptr<!cir.ptr<!rec_NoOps>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[IDX_LOAD:.*]] = cir.load %[[ARR_IDX]] : 
!cir.ptr<!cir.ptr<!rec_NoOps>>, !cir.ptr<!rec_NoOps>
@@ -283,7 +283,7 @@ void do_things(unsigned A, unsigned B) {
 // CHECK-NEXT: %[[ARR_SIZE:.*]] = cir.const #cir.int<5> : !u64i
 // CHECK-NEXT: %[[ARR_DECAY:.*]] = cir.cast array_to_ptrdecay %[[STRIDE]] : 
!cir.ptr<!cir.array<!rec_NoOps x 5>> -> !cir.ptr<!rec_NoOps>
 // CHECK-NEXT: %[[LAST_ELT:.*]] = cir.ptr_stride %[[ARR_DECAY]], %[[ARR_SIZE]] 
: (!cir.ptr<!rec_NoOps>, !u64i) -> !cir.ptr<!rec_NoOps>
-// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_NoOps>>
+// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_NoOps>>
 // CHECK-NEXT: cir.store %[[ARR_DECAY]], %[[ARR_IDX]] : !cir.ptr<!rec_NoOps>, 
!cir.ptr<!cir.ptr<!rec_NoOps>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[IDX_LOAD:.*]] = cir.load %[[ARR_IDX]] : 
!cir.ptr<!cir.ptr<!rec_NoOps>>, !cir.ptr<!rec_NoOps>
@@ -328,7 +328,7 @@ void do_things(unsigned A, unsigned B) {
 // CHECK-NEXT: %[[ARR_SIZE:.*]] = cir.const #cir.int<125> : !u64i
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[BITCAST]] : 
!cir.ptr<!cir.array<!rec_NoOps x 125>> -> !cir.ptr<!rec_NoOps>
 // CHECK-NEXT: %[[ONE_PAST_LAST_ELT:.*]] = cir.ptr_stride %[[DECAY]], 
%[[ARR_SIZE]] : (!cir.ptr<!rec_NoOps>, !u64i) -> !cir.ptr<!rec_NoOps>
-// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_NoOps>>
+// CHECK-NEXT: %[[ARR_IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_NoOps>>
 // CHECK-NEXT: cir.store %[[DECAY]], %[[ARR_IDX]] : !cir.ptr<!rec_NoOps>, 
!cir.ptr<!cir.ptr<!rec_NoOps>>
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[IDX_LOAD:.*]] = cir.load %[[ARR_IDX]] : 
!cir.ptr<!cir.ptr<!rec_NoOps>>, !cir.ptr<!rec_NoOps>
diff --git 
a/clang/test/CIR/CodeGenOpenACC/private-clause-pointer-array-recipes-CtorDtor.cpp
 
b/clang/test/CIR/CodeGenOpenACC/private-clause-pointer-array-recipes-CtorDtor.cpp
index 679aea8bb0abe..6659c72ae7ee7 100644
--- 
a/clang/test/CIR/CodeGenOpenACC/private-clause-pointer-array-recipes-CtorDtor.cpp
+++ 
b/clang/test/CIR/CodeGenOpenACC/private-clause-pointer-array-recipes-CtorDtor.cpp
@@ -1564,7 +1564,7 @@ void do_things(unsigned A, unsigned B) {
 // CHECK-NEXT: %[[ARR_SIZE:.*]] = cir.const #cir.int<5> : !u64i 
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[STRIDE]] : 
!cir.ptr<!cir.array<!rec_CtorDtor x 5>> -> !cir.ptr<!rec_CtorDtor>
 // CHECK-NEXT: %[[ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[ARR_SIZE]] : 
(!cir.ptr<!rec_CtorDtor>, !u64i) -> !cir.ptr<!rec_CtorDtor>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
 // CHECK-NEXT: cir.store %[[DECAY]], %[[IDX]] : !cir.ptr<!rec_CtorDtor>, 
!cir.ptr<!cir.ptr<!rec_CtorDtor>> 
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[IDX_LOAD:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>, !cir.ptr<!rec_CtorDtor>
@@ -1637,7 +1637,7 @@ void do_things(unsigned A, unsigned B) {
 // CHECK-NEXT: %[[LAST_IDX:.*]] = cir.const #cir.int<5> : !u64i 
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[STRIDE]] : 
!cir.ptr<!cir.array<!rec_CtorDtor x 5>> -> !cir.ptr<!rec_CtorDtor>
 // CHECK-NEXT: %[[ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[LAST_IDX]] : 
(!cir.ptr<!rec_CtorDtor>, !u64i) -> !cir.ptr<!rec_CtorDtor>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>
 // CHECK-NEXT: cir.store %[[ELT]], %[[IDX]] : !cir.ptr<!rec_CtorDtor>, 
!cir.ptr<!cir.ptr<!rec_CtorDtor>> 
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[IDX_LOAD:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_CtorDtor>>, !cir.ptr<!rec_CtorDtor>
diff --git 
a/clang/test/CIR/CodeGenOpenACC/private-clause-pointer-array-recipes-NoOps.cpp 
b/clang/test/CIR/CodeGenOpenACC/private-clause-pointer-array-recipes-NoOps.cpp
index ffe146787189c..a9f7b0f5949fe 100644
--- 
a/clang/test/CIR/CodeGenOpenACC/private-clause-pointer-array-recipes-NoOps.cpp
+++ 
b/clang/test/CIR/CodeGenOpenACC/private-clause-pointer-array-recipes-NoOps.cpp
@@ -1120,7 +1120,7 @@ void do_things(unsigned A, unsigned B) {
 // CHECK-NEXT: %[[ARR_SIZE:.*]] = cir.const #cir.int<5> : !u64i 
 // CHECK-NEXT: %[[DECAY:.*]] = cir.cast array_to_ptrdecay %[[STRIDE]] : 
!cir.ptr<!cir.array<!rec_NoOps x 5>> -> !cir.ptr<!rec_NoOps>
 // CHECK-NEXT: %[[ELT:.*]] = cir.ptr_stride %[[DECAY]], %[[ARR_SIZE]] : 
(!cir.ptr<!rec_NoOps>, !u64i) -> !cir.ptr<!rec_NoOps>
-// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(1) : 
!cir.ptr<!cir.ptr<!rec_NoOps>>
+// CHECK-NEXT: %[[IDX:.*]] = cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_NoOps>>
 // CHECK-NEXT: cir.store %[[DECAY]], %[[IDX]] : !cir.ptr<!rec_NoOps>, 
!cir.ptr<!cir.ptr<!rec_NoOps>> 
 // CHECK-NEXT: cir.do {
 // CHECK-NEXT: %[[IDX_LOAD:.*]] = cir.load %[[IDX]] : 
!cir.ptr<!cir.ptr<!rec_NoOps>>, !cir.ptr<!rec_NoOps>

>From 6459461e29f140123942085862ffd458ca5b9cf5 Mon Sep 17 00:00:00 2001
From: Steffen Larsen <[email protected]>
Date: Tue, 13 Oct 2026 16:31:18 +0200
Subject: [PATCH 2/3] Drop comment

---
 clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp 
b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
index 752fcc42f9860..499f6d11bb541 100644
--- a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
@@ -2324,10 +2324,6 @@ static void 
lowerArrayDtorCtorIntoLoop(cir::CIRBaseBuilderTy &builder,
     builder.setInsertionPointToStart(&ifOp.getThenRegion().front());
   }
 
-  // The induction variable is a plain stack local, so it lives in the
-  // target's alloca address space. It is aligned for the element pointer it
-  // holds, not for its own address, as the two differ where the alloca address
-  // space has narrower pointers.
   cir::CIRDataLayout dataLayout(op->getParentOfType<mlir::ModuleOp>());
   cir::PointerType tmpAddrTy = builder.getPointerTo(
       eltTy, dataLayout.getAllocaAddrSpace(builder.getContext()));

>From 588d2b8c30b02cae2e88ff3fa7328e54f16f6926 Mon Sep 17 00:00:00 2001
From: Steffen Holst Larsen <[email protected]>
Date: Wed, 14 Oct 2026 01:39:52 -0500
Subject: [PATCH 3/3] Expand test

Signed-off-by: Steffen Holst Larsen <[email protected]>
---
 .../CIR/CodeGen/delete-array-overaligned-cookie.cpp  | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/clang/test/CIR/CodeGen/delete-array-overaligned-cookie.cpp 
b/clang/test/CIR/CodeGen/delete-array-overaligned-cookie.cpp
index 3f2422634ca2b..f4a9f5e308ad7 100644
--- a/clang/test/CIR/CodeGen/delete-array-overaligned-cookie.cpp
+++ b/clang/test/CIR/CodeGen/delete-array-overaligned-cookie.cpp
@@ -2,7 +2,7 @@
 // RUN: FileCheck --input-file=%t-before.cir -check-prefix=CIR,CIR-BEFORE %s
 // RUN: FileCheck --input-file=%t.cir --check-prefix=CIR,CIR-AFTER %s
 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++17 -fclangir 
-mconstructor-aliases -emit-llvm %s -o %t-cir.ll
-// RUN: FileCheck --input-file=%t-cir.ll --check-prefix=LLVM %s
+// RUN: FileCheck --input-file=%t-cir.ll --check-prefixes=LLVM,LLVM-CIR %s
 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++17 
-mconstructor-aliases -emit-llvm %s -o %t.ll
 // RUN: FileCheck --input-file=%t.ll --check-prefix=LLVM %s
 
@@ -30,6 +30,7 @@ void test_delete_array(OverAligned *a) {
 // CIR-AFTER:   %[[AFTER_COUNT:.*]] = cir.ptr_stride %[[BEFORE_COOKIE]], 
%[[COUNT_OFFSET]] : (!cir.ptr<!u8i>, !s64i) -> !cir.ptr<!u8i>
 // CIR-AFTER:   %[[TO_SIZE:.*]] = cir.cast bitcast %[[AFTER_COUNT]] : 
!cir.ptr<!u8i> -> !cir.ptr<!u64i>
 // CIR-AFTER:   %[[LOAD_VAL:.*]] = cir.load align(8) %[[TO_SIZE]] : 
!cir.ptr<!u64i>, !u64i
+// CIR-AFTER:   cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_OverAligned>>
 // CIR-AFTER:   } cleanup normal {
 // CIR-AFTER:     %[[ELT_SIZE:.*]] = cir.const #cir.int<64> : !u64i
 // CIR-AFTER:     %[[ELT_OFFSET:.*]] = cir.mul %[[ELT_SIZE]], %[[LOAD_VAL]] : 
!u64i
@@ -39,11 +40,13 @@ void test_delete_array(OverAligned *a) {
 // CIR-AFTER:  cir.call @_ZdaPvmSt11align_val_t(%{{.*}}, %[[TOTAL_SIZE]], 
%[[ALIGN]]) nothrow : (!cir.ptr<!void>, !u64i, !u64i) -> ()
 
 // LLVM-LABEL: define {{.*}}@_Z17test_delete_arrayP11OverAligned(
-// LLVM: store ptr %{{.*}}, ptr %[[A:.*]], align 8
+// LLVM-CIR: %[[ARRAY_IDX:.*]] = alloca ptr, align 8
+// LLVM: %[[A:.*]] = alloca ptr, align 8
 // LLVM: %[[LOAD_A:.*]] = load ptr, ptr %[[A]], align 8
 // LLVM: %[[BEFORE_COOKIE:.*]] = getelementptr {{.*}}i8, ptr %[[LOAD_A]], i64 
-64
 // LLVM: %[[AFTER_COUNT:.*]] = getelementptr {{.*}}i8, ptr %[[BEFORE_COOKIE]], 
i64 56
 // LLVM: %[[LOAD_VAL:.*]] = load i64, ptr %[[AFTER_COUNT]], align 8
+// LLVM-CIR: store ptr %{{.*}}, ptr %[[ARRAY_IDX]], align 8
 // LLVM: %[[ELT_OFFSET:.*]] = mul i64 64, %[[LOAD_VAL]]
 // LLVM: %[[TOTAL_SIZE:.*]] = add i64 %[[ELT_OFFSET]], 64
 // LLVM: call void @_ZdaPvmSt11align_val_t(ptr {{.*}}%{{.*}}, i64 
{{.*}}%[[TOTAL_SIZE]], i64 {{.*}}64) 
@@ -69,6 +72,7 @@ void 
test_not_aligned_new_but_need_cookie(NotAlignedNewButNeedCookie *a) {
 // CIR-AFTER: %[[AFTER_COUNT:.*]] = cir.ptr_stride %[[BEFORE_COOKIE]], 
%[[COUNT_OFFSET]] : (!cir.ptr<!u8i>, !s64i) -> !cir.ptr<!u8i>
 // CIR-AFTER: %[[TO_SIZE:.*]] = cir.cast bitcast %[[AFTER_COUNT]] : 
!cir.ptr<!u8i> -> !cir.ptr<!u64i>
 // CIR-AFTER: %[[LOAD_VAL:.*]] = cir.load align(8) %[[TO_SIZE]] : 
!cir.ptr<!u64i>, !u64i
+// CIR-AFTER:   cir.alloca "__array_idx" align(8) : 
!cir.ptr<!cir.ptr<!rec_NotAlignedNewButNeedCookie>>
 // CIR-AFTER: } cleanup normal {
 // CIR-AFTER:   %[[ELT_SIZE:.*]] = cir.const #cir.int<16> : !u64i
 // CIR-AFTER:   %[[ELT_OFFSET:.*]] = cir.mul %[[ELT_SIZE]], %[[LOAD_VAL]] : 
!u64i
@@ -77,11 +81,13 @@ void 
test_not_aligned_new_but_need_cookie(NotAlignedNewButNeedCookie *a) {
 // CIR-AFTER:   cir.call @_ZdaPvm(%{{.*}}, %[[TOTAL_SIZE]]) nothrow : 
(!cir.ptr<!void>, !u64i) -> ()
 
 // LLVM-LABEL: define 
{{.*}}@_Z36test_not_aligned_new_but_need_cookieP26NotAlignedNewButNeedCookie(
-// LLVM: store ptr %{{.*}}, ptr %[[A:.*]], align 8
+// LLVM-CIR: %[[ARRAY_IDX:.*]] = alloca ptr, align 8
+// LLVM: %[[A:.*]] = alloca ptr, align 8
 // LLVM: %[[LOAD_A:.*]] = load ptr, ptr %[[A]], align 8
 // LLVM: %[[BEFORE_COOKIE:.*]] = getelementptr {{.*}}i8, ptr %[[LOAD_A]], i64 
-16
 // LLVM: %[[AFTER_COUNT:.*]] = getelementptr {{.*}}i8, ptr %[[BEFORE_COOKIE]], 
i64 8
 // LLVM: %[[LOAD_VAL:.*]] = load i64, ptr %[[AFTER_COUNT]], align 8
+// LLVM-CIR: store ptr %{{.*}}, ptr %[[ARRAY_IDX]], align 8
 // LLVM: %[[ELT_OFFEST:.*]] = mul i64 16, %[[LOAD_VAL]]
 // LLVM: %[[TOTAL_SIZE:.*]] = add i64 %[[ELT_OFFSET]], 16
 // LLVM: call void @_ZdaPvm(ptr {{.*}}%{{.*}}, i64 {{.*}}%[[TOTAL_SIZE]])

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

Reply via email to