[OpenMPOpt] Assume indirect call always changes ICV
authorWei Wang <apollo.mobility@gmail.com>
Fri, 4 Sep 2020 16:05:13 +0000 (09:05 -0700)
committerWenlei He <aktoon@gmail.com>
Fri, 4 Sep 2020 16:05:32 +0000 (09:05 -0700)
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

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

index 8dfe42e..3804a4b 100644 (file)
@@ -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) {
index 19b55cc..560ad2f 100644 (file)
@@ -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:%.*]])