[llvm] 2e7640e - OpenMPOpt: Fix null dereference on missing declaration cache
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 3 13:26:44 PST 2023
Author: Matt Arsenault
Date: 2023-01-03T16:26:37-05:00
New Revision: 2e7640e6dcb45845cebd96ca8a9c00110b675562
URL: https://github.com/llvm/llvm-project/commit/2e7640e6dcb45845cebd96ca8a9c00110b675562
DIFF: https://github.com/llvm/llvm-project/commit/2e7640e6dcb45845cebd96ca8a9c00110b675562.diff
LOG: OpenMPOpt: Fix null dereference on missing declaration cache
Found by llvm-reduce fuzzing.
Added:
llvm/test/Transforms/OpenMP/heap-to-shared-missing-declarations.ll
Modified:
llvm/lib/Transforms/IPO/OpenMPOpt.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/IPO/OpenMPOpt.cpp b/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
index 90f019620b50..25c03e7fe479 100644
--- a/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
+++ b/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
@@ -2981,6 +2981,8 @@ struct AAHeapToSharedFunction : public AAHeapToShared {
auto &OMPInfoCache = static_cast<OMPInformationCache &>(A.getInfoCache());
auto &RFI = OMPInfoCache.RFIs[OMPRTL___kmpc_alloc_shared];
+ if (!RFI.Declaration)
+ return;
Attributor::SimplifictionCallbackTy SCB =
[](const IRPosition &, const AbstractAttribute *,
@@ -3085,6 +3087,9 @@ struct AAHeapToSharedFunction : public AAHeapToShared {
ChangeStatus updateImpl(Attributor &A) override {
auto &OMPInfoCache = static_cast<OMPInformationCache &>(A.getInfoCache());
auto &RFI = OMPInfoCache.RFIs[OMPRTL___kmpc_alloc_shared];
+ if (!RFI.Declaration)
+ return ChangeStatus::UNCHANGED;
+
Function *F = getAnchorScope();
auto NumMallocCalls = MallocCalls.size();
diff --git a/llvm/test/Transforms/OpenMP/heap-to-shared-missing-declarations.ll b/llvm/test/Transforms/OpenMP/heap-to-shared-missing-declarations.ll
new file mode 100644
index 000000000000..13a45c2c11da
--- /dev/null
+++ b/llvm/test/Transforms/OpenMP/heap-to-shared-missing-declarations.ll
@@ -0,0 +1,91 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals
+; REQUIRES: amdgpu-registered-target
+; RUN: opt -mtriple=amdgcn-amd-amdhsa -S -passes=openmp-opt < %s | FileCheck %s
+
+define internal void @outlined0() {
+; CHECK: Function Attrs: nounwind
+; CHECK-LABEL: define {{[^@]+}}@outlined0
+; CHECK-SAME: () #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: bb:
+; CHECK-NEXT: call void @func() #[[ATTR0]]
+; CHECK-NEXT: [[I:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block() #[[ATTR0]]
+; CHECK-NEXT: ret void
+;
+bb:
+ call void @func()
+ %i = call i32 @__kmpc_get_hardware_num_threads_in_block()
+ ret void
+}
+
+define internal void @func() {
+; CHECK: Function Attrs: nounwind
+; CHECK-LABEL: define {{[^@]+}}@func
+; CHECK-SAME: () #[[ATTR0]] {
+; CHECK-NEXT: bb:
+; CHECK-NEXT: [[I:%.*]] = load ptr, ptr null, align 4294967296
+; CHECK-NEXT: store i64 0, ptr [[I]], align 8
+; CHECK-NEXT: ret void
+;
+bb:
+ %i = load ptr, ptr addrspacecast (ptr addrspace(5) null to ptr), align 4294967296
+ store i64 0, ptr %i, align 8
+ ret void
+}
+
+define internal void @outlined1() {
+; CHECK: Function Attrs: nounwind
+; CHECK-LABEL: define {{[^@]+}}@outlined1
+; CHECK-SAME: () #[[ATTR0]] {
+; CHECK-NEXT: bb:
+; CHECK-NEXT: [[I:%.*]] = icmp sle i32 1, 0
+; CHECK-NEXT: br i1 [[I]], label [[BB1:%.*]], label [[BB2:%.*]]
+; CHECK: common.ret:
+; CHECK-NEXT: ret void
+; CHECK: bb1:
+; CHECK-NEXT: call void @func() #[[ATTR0]]
+; CHECK-NEXT: br label [[COMMON_RET:%.*]]
+; CHECK: bb2:
+; CHECK-NEXT: call void @__kmpc_free_shared(ptr null, i64 0) #[[ATTR0]]
+; CHECK-NEXT: br label [[COMMON_RET]]
+;
+bb:
+ %i = icmp sle i32 1, 0
+ br i1 %i, label %bb1, label %bb2
+
+common.ret: ; preds = %bb2, %bb1
+ ret void
+
+bb1: ; preds = %bb
+ call void @func()
+ br label %common.ret
+
+bb2: ; preds = %bb
+ call void @__kmpc_free_shared(ptr null, i64 0)
+ br label %common.ret
+}
+
+define void @user() {
+; CHECK-LABEL: define {{[^@]+}}@user() {
+; CHECK-NEXT: call void @outlined0() #[[ATTR0]]
+; CHECK-NEXT: call void @outlined1() #[[ATTR0]]
+; CHECK-NEXT: ret void
+;
+ call void @outlined0()
+ call void @outlined1()
+ ret void
+}
+
+declare i32 @__kmpc_get_hardware_num_threads_in_block()
+declare void @__kmpc_free_shared(ptr, i64)
+
+!llvm.module.flags = !{!0, !1}
+
+!0 = !{i32 7, !"openmp", i32 50}
+!1 = !{i32 7, !"openmp-device", i32 50}
+;.
+; CHECK: attributes #[[ATTR0]] = { nounwind }
+; CHECK: attributes #[[ATTR1:[0-9]+]] = { nosync nounwind }
+;.
+; CHECK: [[META0:![0-9]+]] = !{i32 7, !"openmp", i32 50}
+; CHECK: [[META1:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
+;.
More information about the llvm-commits
mailing list