Skip to content

Commit e5f1639

Browse files
[Flang]Fix for changed code at the end of AllocaIP. (#92430)
Some of the OpenMP code can change the instruction pointed at by the insertion point. This leads to an assert in the compiler about BB->getParent() and IP->getParent() not matching. The fix is to rebuild the insertionpoint from the block, rather than use builder.restoreIP. Also, move some of the alloca generation, rather than skipping back and forth between insert points (and ensure all the allocas are done before their users are created). A simple test, mainly to ensure the minimal reproducer doesn't fail to compile in the future is also added.
1 parent 5e20785 commit e5f1639

File tree

7 files changed

+174
-109
lines changed

7 files changed

+174
-109
lines changed

clang/test/OpenMP/irbuilder_nested_parallel_for.c

Lines changed: 72 additions & 72 deletions
Large diffs are not rendered by default.

clang/test/OpenMP/nested_loop_codegen.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -545,17 +545,17 @@ int inline_decl() {
545545
// CHECK3-NEXT: [[LOADGEP_I:%.*]] = load ptr, ptr [[GEP_I]], align 8
546546
// CHECK3-NEXT: [[GEP_K:%.*]] = getelementptr { ptr, ptr }, ptr [[TMP0]], i32 0, i32 1
547547
// CHECK3-NEXT: [[LOADGEP_K:%.*]] = load ptr, ptr [[GEP_K]], align 8
548+
// CHECK3-NEXT: [[P_LASTITER:%.*]] = alloca i32, align 4
549+
// CHECK3-NEXT: [[P_LOWERBOUND:%.*]] = alloca i32, align 4
550+
// CHECK3-NEXT: [[P_UPPERBOUND:%.*]] = alloca i32, align 4
551+
// CHECK3-NEXT: [[P_STRIDE:%.*]] = alloca i32, align 4
548552
// CHECK3-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
549553
// CHECK3-NEXT: [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4
550554
// CHECK3-NEXT: store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4
551555
// CHECK3-NEXT: [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
552556
// CHECK3-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 8
553557
// CHECK3-NEXT: [[AGG_CAPTURED1:%.*]] = alloca [[STRUCT_ANON_0:%.*]], align 4
554558
// CHECK3-NEXT: [[DOTCOUNT_ADDR:%.*]] = alloca i32, align 4
555-
// CHECK3-NEXT: [[P_LASTITER:%.*]] = alloca i32, align 4
556-
// CHECK3-NEXT: [[P_LOWERBOUND:%.*]] = alloca i32, align 4
557-
// CHECK3-NEXT: [[P_UPPERBOUND:%.*]] = alloca i32, align 4
558-
// CHECK3-NEXT: [[P_STRIDE:%.*]] = alloca i32, align 4
559559
// CHECK3-NEXT: br label [[OMP_PAR_REGION:%.*]]
560560
// CHECK3: omp.par.region:
561561
// CHECK3-NEXT: store i32 0, ptr [[LOADGEP_I]], align 4
@@ -713,6 +713,10 @@ int inline_decl() {
713713
// CHECK3-NEXT: [[LOADGEP_I:%.*]] = load ptr, ptr [[GEP_I]], align 8
714714
// CHECK3-NEXT: [[GEP_RES:%.*]] = getelementptr { ptr, ptr }, ptr [[TMP0]], i32 0, i32 1
715715
// CHECK3-NEXT: [[LOADGEP_RES:%.*]] = load ptr, ptr [[GEP_RES]], align 8
716+
// CHECK3-NEXT: [[P_LASTITER:%.*]] = alloca i32, align 4
717+
// CHECK3-NEXT: [[P_LOWERBOUND:%.*]] = alloca i32, align 4
718+
// CHECK3-NEXT: [[P_UPPERBOUND:%.*]] = alloca i32, align 4
719+
// CHECK3-NEXT: [[P_STRIDE:%.*]] = alloca i32, align 4
716720
// CHECK3-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
717721
// CHECK3-NEXT: [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4
718722
// CHECK3-NEXT: store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4
@@ -721,10 +725,6 @@ int inline_decl() {
721725
// CHECK3-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON_1:%.*]], align 8
722726
// CHECK3-NEXT: [[AGG_CAPTURED1:%.*]] = alloca [[STRUCT_ANON_2:%.*]], align 4
723727
// CHECK3-NEXT: [[DOTCOUNT_ADDR:%.*]] = alloca i32, align 4
724-
// CHECK3-NEXT: [[P_LASTITER:%.*]] = alloca i32, align 4
725-
// CHECK3-NEXT: [[P_LOWERBOUND:%.*]] = alloca i32, align 4
726-
// CHECK3-NEXT: [[P_UPPERBOUND:%.*]] = alloca i32, align 4
727-
// CHECK3-NEXT: [[P_STRIDE:%.*]] = alloca i32, align 4
728728
// CHECK3-NEXT: br label [[OMP_PAR_REGION:%.*]]
729729
// CHECK3: omp.par.region:
730730
// CHECK3-NEXT: store i32 0, ptr [[LOADGEP_I]], align 4
@@ -884,17 +884,17 @@ int inline_decl() {
884884
// CHECK4-NEXT: [[LOADGEP_I:%.*]] = load ptr, ptr [[GEP_I]], align 8
885885
// CHECK4-NEXT: [[GEP_K:%.*]] = getelementptr { ptr, ptr }, ptr [[TMP0]], i32 0, i32 1
886886
// CHECK4-NEXT: [[LOADGEP_K:%.*]] = load ptr, ptr [[GEP_K]], align 8
887+
// CHECK4-NEXT: [[P_LASTITER:%.*]] = alloca i32, align 4
888+
// CHECK4-NEXT: [[P_LOWERBOUND:%.*]] = alloca i32, align 4
889+
// CHECK4-NEXT: [[P_UPPERBOUND:%.*]] = alloca i32, align 4
890+
// CHECK4-NEXT: [[P_STRIDE:%.*]] = alloca i32, align 4
887891
// CHECK4-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
888892
// CHECK4-NEXT: [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4
889893
// CHECK4-NEXT: store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4
890894
// CHECK4-NEXT: [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4
891895
// CHECK4-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 8
892896
// CHECK4-NEXT: [[AGG_CAPTURED1:%.*]] = alloca [[STRUCT_ANON_0:%.*]], align 4
893897
// CHECK4-NEXT: [[DOTCOUNT_ADDR:%.*]] = alloca i32, align 4
894-
// CHECK4-NEXT: [[P_LASTITER:%.*]] = alloca i32, align 4
895-
// CHECK4-NEXT: [[P_LOWERBOUND:%.*]] = alloca i32, align 4
896-
// CHECK4-NEXT: [[P_UPPERBOUND:%.*]] = alloca i32, align 4
897-
// CHECK4-NEXT: [[P_STRIDE:%.*]] = alloca i32, align 4
898898
// CHECK4-NEXT: br label [[OMP_PAR_REGION:%.*]]
899899
// CHECK4: omp.par.region:
900900
// CHECK4-NEXT: store i32 0, ptr [[LOADGEP_I]], align 4, !dbg [[DBG23:![0-9]+]]
@@ -1062,6 +1062,10 @@ int inline_decl() {
10621062
// CHECK4-NEXT: [[LOADGEP_I:%.*]] = load ptr, ptr [[GEP_I]], align 8
10631063
// CHECK4-NEXT: [[GEP_RES:%.*]] = getelementptr { ptr, ptr }, ptr [[TMP0]], i32 0, i32 1
10641064
// CHECK4-NEXT: [[LOADGEP_RES:%.*]] = load ptr, ptr [[GEP_RES]], align 8
1065+
// CHECK4-NEXT: [[P_LASTITER:%.*]] = alloca i32, align 4
1066+
// CHECK4-NEXT: [[P_LOWERBOUND:%.*]] = alloca i32, align 4
1067+
// CHECK4-NEXT: [[P_UPPERBOUND:%.*]] = alloca i32, align 4
1068+
// CHECK4-NEXT: [[P_STRIDE:%.*]] = alloca i32, align 4
10651069
// CHECK4-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
10661070
// CHECK4-NEXT: [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4
10671071
// CHECK4-NEXT: store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4
@@ -1070,10 +1074,6 @@ int inline_decl() {
10701074
// CHECK4-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON_1:%.*]], align 8
10711075
// CHECK4-NEXT: [[AGG_CAPTURED1:%.*]] = alloca [[STRUCT_ANON_2:%.*]], align 4
10721076
// CHECK4-NEXT: [[DOTCOUNT_ADDR:%.*]] = alloca i32, align 4
1073-
// CHECK4-NEXT: [[P_LASTITER:%.*]] = alloca i32, align 4
1074-
// CHECK4-NEXT: [[P_LOWERBOUND:%.*]] = alloca i32, align 4
1075-
// CHECK4-NEXT: [[P_UPPERBOUND:%.*]] = alloca i32, align 4
1076-
// CHECK4-NEXT: [[P_STRIDE:%.*]] = alloca i32, align 4
10771077
// CHECK4-NEXT: br label [[OMP_PAR_REGION:%.*]]
10781078
// CHECK4: omp.par.region:
10791079
// CHECK4-NEXT: store i32 0, ptr [[LOADGEP_I]], align 4, !dbg [[DBG86:![0-9]+]]
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
!! Make sure that mixture of by-ref and by-val reductions work all the way
2+
!! to LLVM-IR code.
3+
! RUN: %flang_fc1 -emit-llvm -fopenmp -o - %s 2>&1 | FileCheck %s
4+
subroutine proc
5+
implicit none
6+
real(8),allocatable :: F(:)
7+
real(8),allocatable :: A(:)
8+
9+
integer :: I
10+
11+
!$omp parallel private(A) reduction(+:F,I)
12+
allocate(A(10))
13+
!$omp end parallel
14+
end subroutine proc
15+
16+
!CHECK-LABEL: define void @proc_()
17+
!CHECK: call void
18+
!CHECK-SAME: @__kmpc_fork_call(ptr {{.*}}, i32 1, ptr @[[OMP_PAR:.*]], {{.*}})
19+
20+
!CHECK: define internal void @[[OMP_PAR]](ptr {{.*}} %[[TID_ADDR:.*]], ptr noalias
21+
!CHECK: %[[TID_LOCAL:.*]] = alloca i32
22+
!CHECK: %[[TID:.*]] = load i32, ptr %[[TID_ADDR]]
23+
!CHECK: store i32 %[[TID]], ptr %[[TID_LOCAL]]
24+
!CHECK: %[[I_priv:.*]] = alloca i32
25+
!CHECK: %[[F_priv:.*]] = alloca ptr
26+
27+
!CHECK: omp.reduction.init:
28+
!CHECK: store ptr %{{.*}}, ptr %[[F_priv]]
29+
!CHECK: store i32 0, ptr %[[I_priv]]
30+
31+
!CHECK: omp.par.region8:
32+
!CHECK-NEXT: call ptr @malloc
33+
!CHECK-SAME: i64 10
34+
35+
!CHECK: %[[RED_ARR_0:.*]] = getelementptr inbounds [2 x ptr], ptr %red.array, i64 0, i64 0
36+
!CHECK: store ptr %[[F_priv]], ptr %[[RED_ARR_0:.*]]
37+
!CHECK: %[[RED_ARR_1:.*]] = getelementptr inbounds [2 x ptr], ptr %red.array, i64 0, i64 1
38+
!CHECK: store ptr %[[I_priv]], ptr %[[RED_ARR_1]]
39+
40+
!CHECK: omp.par.pre_finalize: ; preds = %reduce.finalize
41+
!CHECK: %{{.*}} = load ptr, ptr %[[F_priv]]
42+
!CHECK: br label %omp.reduction.cleanup
43+
44+
!CHECK: omp.reduction.cleanup:
45+
!CHECK: br i1 %{{.*}}, label %[[OMP_FREE:.*]], label %{{.*}}
46+
47+
!CHECK: [[OMP_FREE]]:
48+
!CHECK: call void @free

llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1392,7 +1392,8 @@ IRBuilder<>::InsertPoint OpenMPIRBuilder::createParallel(
13921392

13931393
// Change the location to the outer alloca insertion point to create and
13941394
// initialize the allocas we pass into the parallel region.
1395-
Builder.restoreIP(OuterAllocaIP);
1395+
InsertPointTy NewOuter(OuterAllocaBlock, OuterAllocaBlock->begin());
1396+
Builder.restoreIP(NewOuter);
13961397
AllocaInst *TIDAddrAlloca = Builder.CreateAlloca(Int32, nullptr, "tid.addr");
13971398
AllocaInst *ZeroAddrAlloca =
13981399
Builder.CreateAlloca(Int32, nullptr, "zero.addr");
@@ -2156,7 +2157,7 @@ OpenMPIRBuilder::createReductions(const LocationDescription &Loc,
21562157
// values.
21572158
unsigned NumReductions = ReductionInfos.size();
21582159
Type *RedArrayTy = ArrayType::get(Builder.getPtrTy(), NumReductions);
2159-
Builder.restoreIP(AllocaIP);
2160+
Builder.SetInsertPoint(AllocaIP.getBlock()->getTerminator());
21602161
Value *RedArray = Builder.CreateAlloca(RedArrayTy, nullptr, "red.array");
21612162

21622163
Builder.SetInsertPoint(InsertBlock, InsertBlock->end());
@@ -2557,7 +2558,8 @@ OpenMPIRBuilder::applyStaticWorkshareLoop(DebugLoc DL, CanonicalLoopInfo *CLI,
25572558
getOrCreateRuntimeFunction(M, omp::OMPRTL___kmpc_for_static_fini);
25582559

25592560
// Allocate space for computed loop bounds as expected by the "init" function.
2560-
Builder.restoreIP(AllocaIP);
2561+
Builder.SetInsertPoint(AllocaIP.getBlock()->getFirstNonPHIOrDbgOrAlloca());
2562+
25612563
Type *I32Type = Type::getInt32Ty(M.getContext());
25622564
Value *PLastIter = Builder.CreateAlloca(I32Type, nullptr, "p.lastiter");
25632565
Value *PLowerBound = Builder.CreateAlloca(IVTy, nullptr, "p.lowerbound");
@@ -3119,7 +3121,7 @@ OpenMPIRBuilder::InsertPointTy OpenMPIRBuilder::applyDynamicWorkshareLoop(
31193121
FunctionCallee DynamicNext = getKmpcForDynamicNextForType(IVTy, M, *this);
31203122

31213123
// Allocate space for computed loop bounds as expected by the "init" function.
3122-
Builder.restoreIP(AllocaIP);
3124+
Builder.SetInsertPoint(AllocaIP.getBlock()->getFirstNonPHIOrDbgOrAlloca());
31233125
Type *I32Type = Type::getInt32Ty(M.getContext());
31243126
Value *PLastIter = Builder.CreateAlloca(I32Type, nullptr, "p.lastiter");
31253127
Value *PLowerBound = Builder.CreateAlloca(IVTy, nullptr, "p.lowerbound");

mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -770,7 +770,7 @@ static void allocByValReductionVars(
770770
DenseMap<Value, llvm::Value *> &reductionVariableMap,
771771
llvm::ArrayRef<bool> isByRefs) {
772772
llvm::IRBuilderBase::InsertPointGuard guard(builder);
773-
builder.restoreIP(allocaIP);
773+
builder.SetInsertPoint(allocaIP.getBlock()->getTerminator());
774774
auto args =
775775
loop.getRegion().getArguments().take_back(loop.getNumReductionVars());
776776

@@ -780,7 +780,7 @@ static void allocByValReductionVars(
780780
llvm::Value *var = builder.CreateAlloca(
781781
moduleTranslation.convertType(reductionDecls[i].getType()));
782782
moduleTranslation.mapValue(args[i], var);
783-
privateReductionVariables.push_back(var);
783+
privateReductionVariables[i] = var;
784784
reductionVariableMap.try_emplace(loop.getReductionVars()[i], var);
785785
}
786786
}
@@ -911,7 +911,8 @@ convertOmpWsloop(Operation &opInst, llvm::IRBuilderBase &builder,
911911
llvm::OpenMPIRBuilder::InsertPointTy allocaIP =
912912
findAllocaInsertPoint(builder, moduleTranslation);
913913

914-
SmallVector<llvm::Value *> privateReductionVariables;
914+
SmallVector<llvm::Value *> privateReductionVariables(
915+
wsloopOp.getNumReductionVars());
915916
DenseMap<Value, llvm::Value *> reductionVariableMap;
916917
allocByValReductionVars(wsloopOp, builder, moduleTranslation, allocaIP,
917918
reductionDecls, privateReductionVariables,
@@ -942,7 +943,7 @@ convertOmpWsloop(Operation &opInst, llvm::IRBuilderBase &builder,
942943
// ptr
943944
builder.CreateStore(phis[0], var);
944945

945-
privateReductionVariables.push_back(var);
946+
privateReductionVariables[i] = var;
946947
moduleTranslation.mapValue(reductionArgs[i], phis[0]);
947948
reductionVariableMap.try_emplace(wsloopOp.getReductionVars()[i], phis[0]);
948949
} else {
@@ -1140,7 +1141,8 @@ convertOmpParallel(omp::ParallelOp opInst, llvm::IRBuilderBase &builder,
11401141
// Collect reduction declarations
11411142
SmallVector<omp::DeclareReductionOp> reductionDecls;
11421143
collectReductionDecls(opInst, reductionDecls);
1143-
SmallVector<llvm::Value *> privateReductionVariables;
1144+
SmallVector<llvm::Value *> privateReductionVariables(
1145+
opInst.getNumReductionVars());
11441146

11451147
auto bodyGenCB = [&](InsertPointTy allocaIP, InsertPointTy codeGenIP) {
11461148
// Allocate reduction vars
@@ -1154,6 +1156,21 @@ convertOmpParallel(omp::ParallelOp opInst, llvm::IRBuilderBase &builder,
11541156
MutableArrayRef<BlockArgument> reductionArgs =
11551157
opInst.getRegion().getArguments().take_back(
11561158
opInst.getNumReductionVars());
1159+
1160+
llvm::BasicBlock *initBlock = splitBB(builder, true, "omp.reduction.init");
1161+
allocaIP =
1162+
InsertPointTy(allocaIP.getBlock(),
1163+
allocaIP.getBlock()->getTerminator()->getIterator());
1164+
SmallVector<llvm::Value *> byRefVars(opInst.getNumReductionVars());
1165+
for (unsigned i = 0; i < opInst.getNumReductionVars(); ++i) {
1166+
if (isByRef[i]) {
1167+
// Allocate reduction variable (which is a pointer to the real reduciton
1168+
// variable allocated in the inlined region)
1169+
byRefVars[i] = builder.CreateAlloca(
1170+
moduleTranslation.convertType(reductionDecls[i].getType()));
1171+
}
1172+
}
1173+
11571174
for (unsigned i = 0; i < opInst.getNumReductionVars(); ++i) {
11581175
SmallVector<llvm::Value *> phis;
11591176

@@ -1166,18 +1183,14 @@ convertOmpParallel(omp::ParallelOp opInst, llvm::IRBuilderBase &builder,
11661183
assert(phis.size() == 1 &&
11671184
"expected one value to be yielded from the "
11681185
"reduction neutral element declaration region");
1169-
builder.restoreIP(allocaIP);
1186+
builder.SetInsertPoint(initBlock->getTerminator());
11701187

11711188
if (isByRef[i]) {
1172-
// Allocate reduction variable (which is a pointer to the real reduciton
1173-
// variable allocated in the inlined region)
1174-
llvm::Value *var = builder.CreateAlloca(
1175-
moduleTranslation.convertType(reductionDecls[i].getType()));
11761189
// Store the result of the inlined region to the allocated reduction var
11771190
// ptr
1178-
builder.CreateStore(phis[0], var);
1191+
builder.CreateStore(phis[0], byRefVars[i]);
11791192

1180-
privateReductionVariables.push_back(var);
1193+
privateReductionVariables[i] = byRefVars[i];
11811194
moduleTranslation.mapValue(reductionArgs[i], phis[0]);
11821195
reductionVariableMap.try_emplace(opInst.getReductionVars()[i], phis[0]);
11831196
} else {

mlir/test/Target/LLVMIR/openmp-parallel-reduction-cleanup.mlir

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@
5555

5656
// Private reduction variable and its initialization.
5757
// CHECK: %tid.addr.local = alloca i32
58-
// CHECK: %[[MALLOC_I:.+]] = call ptr @malloc(i64 4)
5958
// CHECK: %[[PRIV_PTR_I:.+]] = alloca ptr
59+
// CHECK: %[[PRIV_PTR_J:.+]] = alloca ptr
60+
// CHECK: %[[MALLOC_I:.+]] = call ptr @malloc(i64 4)
6061
// CHECK: store ptr %[[MALLOC_I]], ptr %[[PRIV_PTR_I]]
6162
// CHECK: %[[MALLOC_J:.+]] = call ptr @malloc(i64 4)
62-
// CHECK: %[[PRIV_PTR_J:.+]] = alloca ptr
6363
// CHECK: store ptr %[[MALLOC_J]], ptr %[[PRIV_PTR_J]]
6464

6565
// Call to the reduction function.

mlir/test/Target/LLVMIR/openmp-reduction-init-arg.mlir

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,15 @@ module {
5959
// CHECK: %[[VAL_17:.*]] = load i32, ptr %[[VAL_18:.*]], align 4
6060
// CHECK: store i32 %[[VAL_17]], ptr %[[VAL_16]], align 4
6161
// CHECK: %[[VAL_19:.*]] = load i32, ptr %[[VAL_16]], align 4
62-
// CHECK: %[[VAL_20:.*]] = load { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %[[VAL_13]], align 8
6362
// CHECK: %[[VAL_21:.*]] = alloca ptr, align 8
63+
// CHECK: %[[VAL_23:.*]] = alloca ptr, align 8
64+
// CHECK: %[[VAL_20:.*]] = load { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %[[VAL_13]], align 8
65+
// CHECK: %[[VAL_24:.*]] = alloca [2 x ptr], align 8
66+
// CHECK: br label %[[INIT_LABEL:.*]]
67+
// CHECK: [[INIT_LABEL]]:
6468
// CHECK: store ptr %[[VAL_13]], ptr %[[VAL_21]], align 8
6569
// CHECK: %[[VAL_22:.*]] = load { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %[[VAL_15]], align 8
66-
// CHECK: %[[VAL_23:.*]] = alloca ptr, align 8
6770
// CHECK: store ptr %[[VAL_15]], ptr %[[VAL_23]], align 8
68-
// CHECK: %[[VAL_24:.*]] = alloca [2 x ptr], align 8
6971
// CHECK: br label %[[VAL_25:.*]]
7072
// CHECK: omp.par.region: ; preds = %[[VAL_26:.*]]
7173
// CHECK: br label %[[VAL_27:.*]]

0 commit comments

Comments
 (0)