[llvm] 4eef14f - [OpenMPOpt] Assume indirect call always changes ICV

Wenlei He via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 4 09:06:30 PDT 2020


Author: Wei Wang
Date: 2020-09-04T09:05:32-07:00
New Revision: 4eef14f9780d9fc9a88096a3cabd669bcfa02bbc

URL: https://github.com/llvm/llvm-project/commit/4eef14f9780d9fc9a88096a3cabd669bcfa02bbc
DIFF: https://github.com/llvm/llvm-project/commit/4eef14f9780d9fc9a88096a3cabd669bcfa02bbc.diff

LOG: [OpenMPOpt] Assume indirect call always changes ICV

When checking call sites, give special handling to indirect call, as the
callee may be unknown and can lead to nullptr dereference later. Assume
conservatively that the ICV always changes in such case.

Reviewed By: sstefan1

Differential Revision: https://reviews.llvm.org/D87104

Added: 
    

Modified: 
    llvm/lib/Transforms/IPO/OpenMPOpt.cpp
    llvm/test/Transforms/OpenMP/icv_tracking.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/IPO/OpenMPOpt.cpp b/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
index 8dfe42ebc27b..3804a4bb7921 100644
--- a/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
+++ b/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
@@ -1480,6 +1480,9 @@ struct AAICVTrackerFunction : public AAICVTracker {
     auto &SetterRFI = OMPInfoCache.RFIs[OMPInfoCache.ICVs[ICV].Setter];
     Function *CalledFunction = CB->getCalledFunction();
 
+    // Indirect call, assume ICV changes.
+    if (CalledFunction == nullptr)
+      return nullptr;
     if (CalledFunction == GetterRFI.Declaration)
       return None;
     if (CalledFunction == SetterRFI.Declaration) {

diff  --git a/llvm/test/Transforms/OpenMP/icv_tracking.ll b/llvm/test/Transforms/OpenMP/icv_tracking.ll
index 19b55cc661b0..560ad2fbcd3d 100644
--- a/llvm/test/Transforms/OpenMP/icv_tracking.ll
+++ b/llvm/test/Transforms/OpenMP/icv_tracking.ll
@@ -30,6 +30,21 @@ define i32 @bad_use(i32 %0) {
   ret i32 %2
 }
 
+define void @indirect_call(void ()* %0) {
+; CHECK-LABEL: define {{[^@]+}}@indirect_call
+; CHECK-SAME: (void ()* [[TMP0:%.*]])
+; CHECK-NEXT:    call void @omp_set_num_threads(i32 4)
+; CHECK-NEXT:    tail call void [[TMP0]]()
+; CHECK-NEXT:    [[TMP2:%.*]] = tail call i32 @omp_get_max_threads()
+; CHECK-NEXT:    tail call void @use(i32 [[TMP2]])
+; CHECK-NEXT:    ret void
+  call void @omp_set_num_threads(i32 4)
+  tail call void %0()
+  %2 = tail call i32 @omp_get_max_threads()
+  tail call void @use(i32 %2)
+  ret void
+}
+
 define dso_local i32 @foo(i32 %0, i32 %1) {
 ; CHECK-LABEL: define {{[^@]+}}@foo
 ; CHECK-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]])


        


More information about the llvm-commits mailing list