Skip to content

Commit c5de163

Browse files
committed
[Clang][CodeGen] Add metadata for load from reference
1 parent bcdafc1 commit c5de163

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
@@ -59,6 +59,8 @@ C++ Specific Potentially Breaking Changes
5959
very few users and all the type traits that could benefit from it in the
6060
standard library already have their own bespoke builtins.
6161

62+
- Added ``!nonnull/!align`` metadata to load of references for better codegen.
63+
6264
ABI Changes in This Version
6365
---------------------------
6466

clang/lib/CodeGen/CGExpr.cpp

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2916,9 +2916,30 @@ CodeGenFunction::EmitLoadOfReference(LValue RefLVal,
29162916
llvm::LoadInst *Load =
29172917
Builder.CreateLoad(RefLVal.getAddress(), RefLVal.isVolatile());
29182918
CGM.DecorateInstructionWithTBAA(Load, RefLVal.getTBAAInfo());
2919-
return makeNaturalAddressForPointer(Load, RefLVal.getType()->getPointeeType(),
2920-
CharUnits(), /*ForPointeeType=*/true,
2921-
PointeeBaseInfo, PointeeTBAAInfo);
2919+
QualType PTy = RefLVal.getType()->getPointeeType();
2920+
if (!PTy->isIncompleteType()) {
2921+
llvm::LLVMContext &Ctx = getLLVMContext();
2922+
llvm::MDBuilder MDB(Ctx);
2923+
// Emit !nonnull metadata
2924+
if (CGM.getTypes().getTargetAddressSpace(PTy) == 0 &&
2925+
!CGM.getCodeGenOpts().NullPointerIsValid)
2926+
Load->setMetadata(llvm::LLVMContext::MD_nonnull,
2927+
llvm::MDNode::get(Ctx, {}));
2928+
// Emit !align metadata
2929+
if (PTy->isObjectType()) {
2930+
auto Align =
2931+
CGM.getNaturalPointeeTypeAlignment(RefLVal.getType()).getQuantity();
2932+
if (Align > 1) {
2933+
Load->setMetadata(
2934+
llvm::LLVMContext::MD_align,
2935+
llvm::MDNode::get(Ctx, MDB.createConstant(llvm::ConstantInt::get(
2936+
Builder.getInt64Ty(), Align))));
2937+
}
2938+
}
2939+
}
2940+
return makeNaturalAddressForPointer(Load, PTy, CharUnits(),
2941+
/*ForPointeeType=*/true, PointeeBaseInfo,
2942+
PointeeTBAAInfo);
29222943
}
29232944

29242945
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)