Skip to content

Commit b120d8d

Browse files
committed
[Clang][CodeGen] Add metadata for load from reference
1 parent 3a84a4e commit b120d8d

28 files changed

+4800
-4785
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ C++ Specific Potentially Breaking Changes
6161
- A workaround for libstdc++4.7 has been removed. Note that 4.8.3 remains the oldest
6262
supported libstdc++ version.
6363

64+
- Added ``!nonnull/!align`` metadata to load of references for better codegen.
65+
6466
ABI Changes in This Version
6567
---------------------------
6668

clang/lib/CodeGen/CGExpr.cpp

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2938,9 +2938,30 @@ CodeGenFunction::EmitLoadOfReference(LValue RefLVal,
29382938
llvm::LoadInst *Load =
29392939
Builder.CreateLoad(RefLVal.getAddress(), RefLVal.isVolatile());
29402940
CGM.DecorateInstructionWithTBAA(Load, RefLVal.getTBAAInfo());
2941-
return makeNaturalAddressForPointer(Load, RefLVal.getType()->getPointeeType(),
2942-
CharUnits(), /*ForPointeeType=*/true,
2943-
PointeeBaseInfo, PointeeTBAAInfo);
2941+
QualType PTy = RefLVal.getType()->getPointeeType();
2942+
if (!PTy->isIncompleteType()) {
2943+
llvm::LLVMContext &Ctx = getLLVMContext();
2944+
llvm::MDBuilder MDB(Ctx);
2945+
// Emit !nonnull metadata
2946+
if (CGM.getTypes().getTargetAddressSpace(PTy) == 0 &&
2947+
!CGM.getCodeGenOpts().NullPointerIsValid)
2948+
Load->setMetadata(llvm::LLVMContext::MD_nonnull,
2949+
llvm::MDNode::get(Ctx, {}));
2950+
// Emit !align metadata
2951+
if (PTy->isObjectType()) {
2952+
auto Align =
2953+
CGM.getNaturalPointeeTypeAlignment(RefLVal.getType()).getQuantity();
2954+
if (Align > 1) {
2955+
Load->setMetadata(
2956+
llvm::LLVMContext::MD_align,
2957+
llvm::MDNode::get(Ctx, MDB.createConstant(llvm::ConstantInt::get(
2958+
Builder.getInt64Ty(), Align))));
2959+
}
2960+
}
2961+
}
2962+
return makeNaturalAddressForPointer(Load, PTy, CharUnits(),
2963+
/*ForPointeeType=*/true, PointeeBaseInfo,
2964+
PointeeTBAAInfo);
29442965
}
29452966

29462967
LValue CodeGenFunction::EmitLoadOfReferenceLValue(LValue RefLVal) {

clang/test/CodeGenCXX/matrix-type-operators.cpp

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

clang/test/CodeGenCXX/reference-field.cpp

Lines changed: 0 additions & 8 deletions
This file was deleted.

clang/test/OpenMP/distribute_parallel_for_simd_firstprivate_codegen.cpp

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

clang/test/OpenMP/distribute_parallel_for_simd_lastprivate_codegen.cpp

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

clang/test/OpenMP/distribute_parallel_for_simd_private_codegen.cpp

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

clang/test/OpenMP/distribute_simd_firstprivate_codegen.cpp

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

clang/test/OpenMP/distribute_simd_lastprivate_codegen.cpp

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

clang/test/OpenMP/distribute_simd_private_codegen.cpp

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

clang/test/OpenMP/parallel_for_simd_codegen.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -796,7 +796,7 @@ for (int i = 0; i < 10; ++i);
796796
// OMP50-LABEL: define internal void @_Z20parallel_simd_atomici.omp_outlined
797797
// OMP50: call void @__kmpc_for_static_init_4
798798
// OMP50: omp.inner.for.body:
799-
// OMP50: %{{[0-9]+}} = atomicrmw add ptr %{{[0-9]+}}, i32 1 monotonic, align 4, !llvm.access.group !47
799+
// OMP50: %{{[0-9]+}} = atomicrmw add ptr %{{[0-9]+}}, i32 1 monotonic, align 4, !llvm.access.group !{{[0-9]+}}
800800

801801
// OMP45-NOT: !{!"llvm.loop.vectorize.enable", i1 false}
802802
// OMP45-DAG: ![[VECT]] = distinct !{![[VECT]], ![[PA:.+]], ![[VM:.+]]}

clang/test/OpenMP/parallel_master_taskloop_simd_codegen.cpp

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

clang/test/OpenMP/simd_private_taskloop_codegen.cpp

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

clang/test/OpenMP/target_in_reduction_codegen.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -552,22 +552,22 @@ int main(int argc, char **argv) {
552552
// CHECK1-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META8:![0-9]+]])
553553
// CHECK1-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META10:![0-9]+]])
554554
// CHECK1-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META12:![0-9]+]])
555-
// CHECK1-NEXT: store i32 [[TMP2]], ptr [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !14
556-
// CHECK1-NEXT: store ptr [[TMP5]], ptr [[DOTPART_ID__ADDR_I]], align 8, !noalias !14
557-
// CHECK1-NEXT: store ptr [[TMP9]], ptr [[DOTPRIVATES__ADDR_I]], align 8, !noalias !14
558-
// CHECK1-NEXT: store ptr @.omp_task_privates_map., ptr [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !14
559-
// CHECK1-NEXT: store ptr [[TMP3]], ptr [[DOTTASK_T__ADDR_I]], align 8, !noalias !14
560-
// CHECK1-NEXT: store ptr [[TMP7]], ptr [[__CONTEXT_ADDR_I]], align 8, !noalias !14
561-
// CHECK1-NEXT: [[TMP12:%.*]] = load ptr, ptr [[__CONTEXT_ADDR_I]], align 8, !noalias !14
555+
// CHECK1-NEXT: store i32 [[TMP2]], ptr [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !{{[0-9]+}}
556+
// CHECK1-NEXT: store ptr [[TMP5]], ptr [[DOTPART_ID__ADDR_I]], align 8, !noalias !{{[0-9]+}}
557+
// CHECK1-NEXT: store ptr [[TMP9]], ptr [[DOTPRIVATES__ADDR_I]], align 8, !noalias !{{[0-9]+}}
558+
// CHECK1-NEXT: store ptr @.omp_task_privates_map., ptr [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !{{[0-9]+}}
559+
// CHECK1-NEXT: store ptr [[TMP3]], ptr [[DOTTASK_T__ADDR_I]], align 8, !noalias !{{[0-9]+}}
560+
// CHECK1-NEXT: store ptr [[TMP7]], ptr [[__CONTEXT_ADDR_I]], align 8, !noalias !{{[0-9]+}}
561+
// CHECK1-NEXT: [[TMP12:%.*]] = load ptr, ptr [[__CONTEXT_ADDR_I]], align 8, !noalias !{{[0-9]+}}
562562
// CHECK1-NEXT: [[TMP13:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON:%.*]], ptr [[TMP12]], i32 0, i32 1
563563
// CHECK1-NEXT: [[TMP14:%.*]] = load i64, ptr [[TMP13]], align 8
564-
// CHECK1-NEXT: [[TMP15:%.*]] = load ptr, ptr [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !14
565-
// CHECK1-NEXT: [[TMP16:%.*]] = load ptr, ptr [[DOTPRIVATES__ADDR_I]], align 8, !noalias !14
564+
// CHECK1-NEXT: [[TMP15:%.*]] = load ptr, ptr [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !{{[0-9]+}}
565+
// CHECK1-NEXT: [[TMP16:%.*]] = load ptr, ptr [[DOTPRIVATES__ADDR_I]], align 8, !noalias !{{[0-9]+}}
566566
// CHECK1-NEXT: call void [[TMP15]](ptr [[TMP16]], ptr [[DOTFIRSTPRIV_PTR_ADDR_I]]) #[[ATTR3]]
567-
// CHECK1-NEXT: [[TMP18:%.*]] = load ptr, ptr [[DOTFIRSTPRIV_PTR_ADDR_I]], align 8, !noalias !14
567+
// CHECK1-NEXT: [[TMP18:%.*]] = load ptr, ptr [[DOTFIRSTPRIV_PTR_ADDR_I]], align 8, !noalias !{{[0-9]+}}
568568
// CHECK1-NEXT: [[TMP20:%.*]] = load ptr, ptr [[TMP12]], align 8
569569
// CHECK1-NEXT: [[TMP21:%.*]] = load ptr, ptr [[TMP18]], align 8
570-
// CHECK1-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !14
570+
// CHECK1-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !{{[0-9]+}}
571571
// CHECK1-NEXT: [[TMP24:%.*]] = call ptr @__kmpc_task_reduction_get_th_data(i32 [[TMP22]], ptr [[TMP21]], ptr [[TMP20]])
572572
// CHECK1-NEXT: [[TMP26:%.*]] = load ptr, ptr [[TMP12]], align 8
573573
// CHECK1-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON]], ptr [[TMP12]], i32 0, i32 2

clang/test/OpenMP/target_map_codegen_35.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ void ref_map() {
116116
// CK35-DAG: store ptr [[S_ADDR]], ptr [[BP3]],
117117
// CK35-DAG: store ptr [[B_ADDR:%.+]], ptr [[P3]],
118118

119-
// CK35-DAG: [[B_ADDR]] = load ptr, ptr [[B_REF:%.+]],
119+
// CK35-DAG: [[B_ADDR]] = load ptr, ptr [[B_REF:%.+]], align {{[0-9]+}}, !nonnull !{{[0-9]+}}, !align !{{[0-9]+}}
120120
// CK35-DAG: [[B_REF]] = getelementptr inbounds nuw %class.S, ptr [[S_ADDR]], i32 0, i32 1
121121

122122
#pragma omp target map(to: s, s.b)

0 commit comments

Comments
 (0)