Skip to content

Commit 98a15dd

Browse files
antoniofrighettotstellar
authored andcommitted
[clang][CodeGen] Allow memcpy replace with trivial auto var init
When emitting the storage (or memory copy operations) for constant initializers, the decision whether to split a constant structure or array store into a sequence of field stores or to use `memcpy` is based upon the optimization level and the size of the initializer. In afe8b93, we extended this by allowing constants to be split when the array (or struct) type does not match the type of data the address to the object (constant) is expected to contain. This may happen when `emitStoresForConstant` is called by `EmitAutoVarInit`, as the element type of the address gets shrunk. When this occurs, let the initializer be split into a bunch of stores only under `-ftrivial-auto-var-init=pattern`. Fixes: #84178.
1 parent 2498e3a commit 98a15dd

File tree

7 files changed

+56
-63
lines changed

7 files changed

+56
-63
lines changed

clang/lib/CodeGen/CGDecl.cpp

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1241,27 +1241,38 @@ static void emitStoresForConstant(CodeGenModule &CGM, const VarDecl &D,
12411241
return;
12421242
}
12431243

1244-
// If the initializer is small, use a handful of stores.
1244+
// If the initializer is small or trivialAutoVarInit is set, use a handful of
1245+
// stores.
1246+
bool IsTrivialAutoVarInitPattern =
1247+
CGM.getContext().getLangOpts().getTrivialAutoVarInit() ==
1248+
LangOptions::TrivialAutoVarInitKind::Pattern;
12451249
if (shouldSplitConstantStore(CGM, ConstantSize)) {
12461250
if (auto *STy = dyn_cast<llvm::StructType>(Ty)) {
1247-
const llvm::StructLayout *Layout =
1248-
CGM.getDataLayout().getStructLayout(STy);
1249-
for (unsigned i = 0; i != constant->getNumOperands(); i++) {
1250-
CharUnits CurOff = CharUnits::fromQuantity(Layout->getElementOffset(i));
1251-
Address EltPtr = Builder.CreateConstInBoundsByteGEP(
1252-
Loc.withElementType(CGM.Int8Ty), CurOff);
1253-
emitStoresForConstant(CGM, D, EltPtr, isVolatile, Builder,
1254-
constant->getAggregateElement(i), IsAutoInit);
1251+
if (STy == Loc.getElementType() ||
1252+
(STy != Loc.getElementType() && IsTrivialAutoVarInitPattern)) {
1253+
const llvm::StructLayout *Layout =
1254+
CGM.getDataLayout().getStructLayout(STy);
1255+
for (unsigned i = 0; i != constant->getNumOperands(); i++) {
1256+
CharUnits CurOff =
1257+
CharUnits::fromQuantity(Layout->getElementOffset(i));
1258+
Address EltPtr = Builder.CreateConstInBoundsByteGEP(
1259+
Loc.withElementType(CGM.Int8Ty), CurOff);
1260+
emitStoresForConstant(CGM, D, EltPtr, isVolatile, Builder,
1261+
constant->getAggregateElement(i), IsAutoInit);
1262+
}
1263+
return;
12551264
}
1256-
return;
12571265
} else if (auto *ATy = dyn_cast<llvm::ArrayType>(Ty)) {
1258-
for (unsigned i = 0; i != ATy->getNumElements(); i++) {
1259-
Address EltPtr = Builder.CreateConstGEP(
1260-
Loc.withElementType(ATy->getElementType()), i);
1261-
emitStoresForConstant(CGM, D, EltPtr, isVolatile, Builder,
1262-
constant->getAggregateElement(i), IsAutoInit);
1266+
if (ATy == Loc.getElementType() ||
1267+
(ATy != Loc.getElementType() && IsTrivialAutoVarInitPattern)) {
1268+
for (unsigned i = 0; i != ATy->getNumElements(); i++) {
1269+
Address EltPtr = Builder.CreateConstGEP(
1270+
Loc.withElementType(ATy->getElementType()), i);
1271+
emitStoresForConstant(CGM, D, EltPtr, isVolatile, Builder,
1272+
constant->getAggregateElement(i), IsAutoInit);
1273+
}
1274+
return;
12631275
}
1264-
return;
12651276
}
12661277
}
12671278

clang/test/CodeGen/aapcs-align.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,8 @@ void g6() {
134134
f6m(1, 2, 3, 4, 5, s);
135135
}
136136
// CHECK: define{{.*}} void @g6
137-
// CHECK: call void @f6(i32 noundef 1, [4 x i32] [i32 6, i32 7, i32 0, i32 0])
138-
// CHECK: call void @f6m(i32 noundef 1, i32 noundef 2, i32 noundef 3, i32 noundef 4, i32 noundef 5, [4 x i32] [i32 6, i32 7, i32 0, i32 0])
137+
// CHECK: call void @f6(i32 noundef 1, [4 x i32] [i32 6, i32 7, i32 0, i32 undef])
138+
// CHECK: call void @f6m(i32 noundef 1, i32 noundef 2, i32 noundef 3, i32 noundef 4, i32 noundef 5, [4 x i32] [i32 6, i32 7, i32 0, i32 undef])
139139
// CHECK: declare void @f6(i32 noundef, [4 x i32])
140140
// CHECK: declare void @f6m(i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, [4 x i32])
141141
}

clang/test/CodeGen/aapcs64-align.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ void g4() {
7575
f4m(1, 2, 3, 4, 5, s);
7676
}
7777
// CHECK: define{{.*}} void @g4()
78-
// CHECK: call void @f4(i32 noundef 1, [2 x i64] %{{.*}})
79-
// CHECK: void @f4m(i32 noundef 1, i32 noundef 2, i32 noundef 3, i32 noundef 4, i32 noundef 5, [2 x i64] %{{.*}})
78+
// CHECK: call void @f4(i32 noundef 1, [2 x i64] [i64 30064771078, i64 0])
79+
// CHECK: void @f4m(i32 noundef 1, i32 noundef 2, i32 noundef 3, i32 noundef 4, i32 noundef 5, [2 x i64] [i64 30064771078, i64 0])
8080
// CHECK: declare void @f4(i32 noundef, [2 x i64])
8181
// CHECK: declare void @f4m(i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, [2 x i64])
8282

@@ -95,8 +95,8 @@ void f5m(int, int, int, int, int, P16);
9595
f5m(1, 2, 3, 4, 5, s);
9696
}
9797
// CHECK: define{{.*}} void @g5()
98-
// CHECK: call void @f5(i32 noundef 1, [2 x i64] %{{.*}})
99-
// CHECK: void @f5m(i32 noundef 1, i32 noundef 2, i32 noundef 3, i32 noundef 4, i32 noundef 5, [2 x i64] %{{.*}})
98+
// CHECK: call void @f5(i32 noundef 1, [2 x i64] [i64 30064771078, i64 0])
99+
// CHECK: void @f5m(i32 noundef 1, i32 noundef 2, i32 noundef 3, i32 noundef 4, i32 noundef 5, [2 x i64] [i64 30064771078, i64 0])
100100
// CHECK: declare void @f5(i32 noundef, [2 x i64])
101101
// CHECK: declare void @f5m(i32 noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, [2 x i64])
102102

clang/test/CodeGen/attr-counted-by.c

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1288,16 +1288,10 @@ int test14(int idx) {
12881288
// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local i32 @test15(
12891289
// NO-SANITIZE-WITH-ATTR-SAME: i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR4]] {
12901290
// NO-SANITIZE-WITH-ATTR-NEXT: entry:
1291-
// NO-SANITIZE-WITH-ATTR-NEXT: [[FOO:%.*]] = alloca [[STRUCT_ANON_8:%.*]], align 4
1292-
// NO-SANITIZE-WITH-ATTR-NEXT: call void @llvm.lifetime.start.p0(i64 8, ptr nonnull [[FOO]]) #[[ATTR12]]
1293-
// NO-SANITIZE-WITH-ATTR-NEXT: store i32 1, ptr [[FOO]], align 4
1294-
// NO-SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[FOO]], i64 4
1295-
// NO-SANITIZE-WITH-ATTR-NEXT: store i32 2, ptr [[TMP0]], align 4
12961291
// NO-SANITIZE-WITH-ATTR-NEXT: [[IDXPROM:%.*]] = sext i32 [[IDX]] to i64
1297-
// NO-SANITIZE-WITH-ATTR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [[STRUCT_ANON_8]], ptr [[FOO]], i64 0, i32 2, i64 [[IDXPROM]]
1298-
// NO-SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4, !tbaa [[TBAA2]]
1299-
// NO-SANITIZE-WITH-ATTR-NEXT: call void @llvm.lifetime.end.p0(i64 8, ptr nonnull [[FOO]]) #[[ATTR12]]
1300-
// NO-SANITIZE-WITH-ATTR-NEXT: ret i32 [[TMP1]]
1292+
// NO-SANITIZE-WITH-ATTR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [0 x i32], ptr getelementptr inbounds ([[STRUCT_ANON_8:%.*]], ptr @__const.test15.foo, i64 1, i32 0), i64 0, i64 [[IDXPROM]]
1293+
// NO-SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4, !tbaa [[TBAA2]]
1294+
// NO-SANITIZE-WITH-ATTR-NEXT: ret i32 [[TMP0]]
13011295
//
13021296
// SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i32 @test15(
13031297
// SANITIZE-WITHOUT-ATTR-SAME: i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] {
@@ -1315,16 +1309,10 @@ int test14(int idx) {
13151309
// NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i32 @test15(
13161310
// NO-SANITIZE-WITHOUT-ATTR-SAME: i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR1]] {
13171311
// NO-SANITIZE-WITHOUT-ATTR-NEXT: entry:
1318-
// NO-SANITIZE-WITHOUT-ATTR-NEXT: [[FOO:%.*]] = alloca [[STRUCT_ANON_8:%.*]], align 4
1319-
// NO-SANITIZE-WITHOUT-ATTR-NEXT: call void @llvm.lifetime.start.p0(i64 8, ptr nonnull [[FOO]]) #[[ATTR9]]
1320-
// NO-SANITIZE-WITHOUT-ATTR-NEXT: store i32 1, ptr [[FOO]], align 4
1321-
// NO-SANITIZE-WITHOUT-ATTR-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[FOO]], i64 4
1322-
// NO-SANITIZE-WITHOUT-ATTR-NEXT: store i32 2, ptr [[TMP0]], align 4
13231312
// NO-SANITIZE-WITHOUT-ATTR-NEXT: [[IDXPROM:%.*]] = sext i32 [[IDX]] to i64
1324-
// NO-SANITIZE-WITHOUT-ATTR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [[STRUCT_ANON_8]], ptr [[FOO]], i64 0, i32 2, i64 [[IDXPROM]]
1325-
// NO-SANITIZE-WITHOUT-ATTR-NEXT: [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX]], align 4, !tbaa [[TBAA2]]
1326-
// NO-SANITIZE-WITHOUT-ATTR-NEXT: call void @llvm.lifetime.end.p0(i64 8, ptr nonnull [[FOO]]) #[[ATTR9]]
1327-
// NO-SANITIZE-WITHOUT-ATTR-NEXT: ret i32 [[TMP1]]
1313+
// NO-SANITIZE-WITHOUT-ATTR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [0 x i32], ptr getelementptr inbounds ([[STRUCT_ANON_8:%.*]], ptr @__const.test15.foo, i64 1, i32 0), i64 0, i64 [[IDXPROM]]
1314+
// NO-SANITIZE-WITHOUT-ATTR-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4, !tbaa [[TBAA2]]
1315+
// NO-SANITIZE-WITHOUT-ATTR-NEXT: ret i32 [[TMP0]]
13281316
//
13291317
int test15(int idx) {
13301318
struct {

clang/test/CodeGenCXX/auto-var-init.cpp

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown -fblocks %s -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK,CHECK-O0
22
// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown -fblocks -ftrivial-auto-var-init=pattern %s -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK-O0,PATTERN,PATTERN-O0
3-
// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown -fblocks -ftrivial-auto-var-init=pattern %s -O1 -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK-O1,PATTERN,PATTERN-O1
3+
// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown -fblocks -ftrivial-auto-var-init=pattern %s -O1 -emit-llvm -o - | FileCheck %s -check-prefixes=PATTERN,PATTERN-O1
44
// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown -fblocks -ftrivial-auto-var-init=zero %s -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK-O0,ZERO,ZERO-O0
5-
// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown -fblocks -ftrivial-auto-var-init=zero %s -O1 -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK-O1,ZERO,ZERO-O1
5+
// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown -fblocks -ftrivial-auto-var-init=zero %s -O1 -emit-llvm -o - | FileCheck %s -check-prefixes=ZERO,ZERO-O1
66
// RUN: %clang_cc1 -std=c++14 -triple i386-unknown-unknown -fblocks -ftrivial-auto-var-init=pattern %s -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK-O0,PATTERN,PATTERN-O0
77

88
#pragma clang diagnostic ignored "-Winaccessible-base"
@@ -1303,9 +1303,10 @@ TEST_CUSTOM(semivolatile, semivolatile, { 0x44444444, 0x44444444 });
13031303
// CHECK-O0: call void @llvm.memcpy
13041304
// CHECK-NOT: !annotation
13051305
// CHECK-O0: call void @{{.*}}used{{.*}}%custom)
1306-
// CHECK-O1: store i32 1145324612, ptr %custom, align 4
1307-
// CHECK-O1-NEXT: %[[I:[^ ]*]] = getelementptr inbounds i8, ptr %custom, i64 4
1308-
// CHECK-O1-NEXT: store i32 1145324612, ptr %[[I]], align 4
1306+
// PATTERN-O1: store i32 1145324612, ptr %custom, align 4
1307+
// PATTERN-O1-NEXT: %[[I:[^ ]*]] = getelementptr inbounds i8, ptr %custom, i64 4
1308+
// PATTERN-O1-NEXT: store i32 1145324612, ptr %[[I]], align 4
1309+
// ZERO-O1: store i64 4919131752989213764, ptr %custom, align 8
13091310
// CHECK-NOT: !annotation
13101311

13111312
TEST_UNINIT(semivolatileinit, semivolatileinit);
@@ -1418,7 +1419,8 @@ TEST_CUSTOM(matching, matching, { .f = 0xf00f });
14181419
// CHECK-O0: call void @llvm.memcpy
14191420
// CHECK-NOT: !annotation
14201421
// CHECK-O0: call void @{{.*}}used{{.*}}%custom)
1421-
// CHECK-O1: store float 6.145500e+04, ptr {{.*}}, align 4
1422+
// PATTERN-O1: store float 6.145500e+04, ptr {{.*}}, align 4
1423+
// ZERO-O1: store i32 1198526208, ptr %custom, align 4
14221424
// CHECK-NOT: !annotation
14231425

14241426
TEST_UNINIT(matchingreverse, matchingreverse);
@@ -1445,7 +1447,8 @@ TEST_CUSTOM(matchingreverse, matchingreverse, { .i = 0xf00f });
14451447
// CHECK-O0: call void @llvm.memcpy
14461448
// CHECK-NOT: !annotation
14471449
// CHECK-O0: call void @{{.*}}used{{.*}}%custom)
1448-
// CHECK-O1: store i32 61455, ptr %custom, align 4
1450+
// PATTERN-O1: store i32 61455, ptr %custom, align 4
1451+
// ZERO-O1: store i32 61455, ptr %custom, align 4
14491452
// CHECK-NOT: !annotation
14501453

14511454
TEST_UNINIT(unmatched, unmatched);
@@ -1471,7 +1474,8 @@ TEST_CUSTOM(unmatched, unmatched, { .i = 0x3badbeef });
14711474
// CHECK-O0: call void @llvm.memcpy
14721475
// CHECK-NOT: !annotation
14731476
// CHECK-O0: call void @{{.*}}used{{.*}}%custom)
1474-
// CHECK-O1: store i32 1001242351, ptr {{.*}}, align 4
1477+
// PATTERN-O1: store i32 1001242351, ptr {{.*}}, align 4
1478+
// ZERO-O1: store i32 1001242351, ptr {{.*}}, align 4
14751479
// CHECK-NOT: !annotation
14761480

14771481
TEST_UNINIT(unmatchedreverse, unmatchedreverse);
@@ -1504,9 +1508,7 @@ TEST_CUSTOM(unmatchedreverse, unmatchedreverse, { .c = 42 });
15041508
// PATTERN-O1-NEXT: store i8 -86, ptr %[[I]], align {{.*}}
15051509
// PATTERN-O1-NEXT: %[[I:[^ ]*]] = getelementptr inbounds i8, ptr %custom, i64 3
15061510
// PATTERN-O1-NEXT: store i8 -86, ptr %[[I]], align {{.*}}
1507-
// ZERO-O1: store i8 42, ptr {{.*}}, align 4
1508-
// ZERO-O1-NEXT: %[[I:[^ ]*]] = getelementptr inbounds i8, ptr %custom, i64 1
1509-
// ZERO-O1-NEXT: call void @llvm.memset.{{.*}}({{.*}}, i8 0, i64 3, {{.*}})
1511+
// ZERO-O1: store i32 42, ptr {{.*}}, align 4
15101512

15111513
TEST_UNINIT(unmatchedfp, unmatchedfp);
15121514
// CHECK-LABEL: @test_unmatchedfp_uninit()
@@ -1531,7 +1533,8 @@ TEST_CUSTOM(unmatchedfp, unmatchedfp, { .d = 3.1415926535897932384626433 });
15311533
// CHECK-O0: call void @llvm.memcpy
15321534
// CHECK-NOT: !annotation
15331535
// CHECK-O0: call void @{{.*}}used{{.*}}%custom)
1534-
// CHECK-O1: store double 0x400921FB54442D18, ptr %custom, align 8
1536+
// PATTERN-O1: store double 0x400921FB54442D18, ptr %custom, align 8
1537+
// ZERO-O1: store i64 4614256656552045848, ptr %custom, align 8
15351538
// CHECK-NOT: !annotation
15361539

15371540
TEST_UNINIT(emptyenum, emptyenum);

clang/test/CodeGenOpenCL/amdgpu-printf.cl

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,7 @@ __kernel void test_printf_int(int i) {
3030
// CHECK-NEXT: [[S:%.*]] = alloca [4 x i8], align 1, addrspace(5)
3131
// CHECK-NEXT: store i32 [[I:%.*]], ptr addrspace(5) [[I_ADDR]], align 4, !tbaa [[TBAA8]]
3232
// CHECK-NEXT: call void @llvm.lifetime.start.p5(i64 4, ptr addrspace(5) [[S]]) #[[ATTR5:[0-9]+]]
33-
// CHECK-NEXT: [[LOC0:%.*]] = getelementptr i8, ptr addrspace(5) [[S]], i64 0
34-
// CHECK-NEXT: store i8 102, ptr addrspace(5) [[LOC0]], align 1
35-
// CHECK-NEXT: [[LOC1:%.*]] = getelementptr i8, ptr addrspace(5) [[S]], i64 1
36-
// CHECK-NEXT: store i8 111, ptr addrspace(5) [[LOC1]], align 1
37-
// CHECK-NEXT: [[LOC2:%.*]] = getelementptr i8, ptr addrspace(5) [[S]], i64 2
38-
// CHECK-NEXT: store i8 111, ptr addrspace(5) [[LOC2]], align 1
39-
// CHECK-NEXT: [[LOC3:%.*]] = getelementptr i8, ptr addrspace(5) [[S]], i64 3
40-
// CHECK-NEXT: store i8 0, ptr addrspace(5) [[LOC3]], align 1
33+
// CHECK-NEXT: call void @llvm.memcpy.p5.p4.i64(ptr addrspace(5) align 1 [[S]], ptr addrspace(4) align 1 @__const.test_printf_str_int.s, i64 4, i1 false)
4134
// CHECK-NEXT: [[ARRAYDECAY:%.*]] = getelementptr inbounds [4 x i8], ptr addrspace(5) [[S]], i64 0, i64 0
4235
// CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr addrspace(5) [[I_ADDR]], align 4, !tbaa [[TBAA8]]
4336
// CHECK-NEXT: [[CALL:%.*]] = call i32 (ptr addrspace(4), ...) @printf(ptr addrspace(4) noundef @.str.2, ptr addrspace(5) noundef [[ARRAYDECAY]], i32 noundef [[TMP2]]) #[[ATTR4]]

clang/test/OpenMP/bug54082.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,7 @@ void foo() {
6969
// CHECK-NEXT: [[X_TRAITS:%.*]] = alloca [1 x %struct.omp_alloctrait_t], align 16
7070
// CHECK-NEXT: [[X_ALLOC:%.*]] = alloca i64, align 8
7171
// CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 16, ptr nonnull [[X_TRAITS]]) #[[ATTR5:[0-9]+]]
72-
// CHECK-NEXT: store i32 2, ptr [[X_TRAITS]], align 16
73-
// CHECK-NEXT: [[LOC0:%.*]] = getelementptr inbounds i8, ptr [[X_TRAITS]], i64 8
74-
// CHECK-NEXT: store i64 64, ptr [[LOC0]], align 8
72+
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(16) [[X_TRAITS]], ptr noundef nonnull align 16 dereferenceable(16) @__const.foo.x_traits, i64 16, i1 false)
7573
// CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 8, ptr nonnull [[X_ALLOC]]) #[[ATTR5]]
7674
// CHECK-NEXT: [[CALL:%.*]] = call i64 @omp_init_allocator(i64 noundef 0, i32 noundef 1, ptr noundef nonnull [[X_TRAITS]]) #[[ATTR5]]
7775
// CHECK-NEXT: store i64 [[CALL]], ptr [[X_ALLOC]], align 8, !tbaa [[TBAA3:![0-9]+]]

0 commit comments

Comments
 (0)