Revert "[IndirectFunctions] Skip propagating attributes to address taken functions"
authorKonstantin Zhuravlyov <kzhuravl_dev@outlook.com>
Mon, 25 Jan 2021 20:49:49 +0000 (15:49 -0500)
committerKonstantin Zhuravlyov <kzhuravl_dev@outlook.com>
Mon, 25 Jan 2021 20:58:06 +0000 (15:58 -0500)
This reverts commit dd8ae42674b494e46ec40a22f40068db2b4a8b60.

This commit causes infinite loop when compiling rocThrust and hipCUB.

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

llvm/lib/Target/AMDGPU/AMDGPUPropagateAttributes.cpp
llvm/test/CodeGen/AMDGPU/propagate-attributes-common-callees.ll [deleted file]
llvm/test/CodeGen/AMDGPU/propagate-attributes-direct-indirect-common-callee.ll [deleted file]
llvm/test/CodeGen/AMDGPU/propagate-attributes-direct-indirect.ll [deleted file]
llvm/test/CodeGen/AMDGPU/propagate-attributes-indirect.ll [deleted file]

index b018bc2..cd71c7a 100644 (file)
@@ -240,14 +240,6 @@ bool AMDGPUPropagateAttributes::process() {
       if (F.isDeclaration())
         continue;
 
-      // Skip propagating attributes and features to
-      // address taken functions.
-      if (F.hasAddressTaken()) {
-        if (!Roots.count(&F))
-          NewRoots.insert(&F);
-        continue;
-      }
-
       const FnProperties CalleeProps(*TM, F);
       SmallVector<std::pair<CallBase *, Function *>, 32> ToReplace;
       SmallSet<CallBase *, 32> Visited;
@@ -267,11 +259,7 @@ bool AMDGPUPropagateAttributes::process() {
 
         const FnProperties CallerProps(*TM, *Caller);
 
-        // Convergence is allowed if the caller has its
-        // address taken because all callee's (attributes + features)
-        // may not agree as the callee may be the target of
-        // more than one function (called directly or indirectly).
-        if (Caller->hasAddressTaken() || CalleeProps == CallerProps) {
+        if (CalleeProps == CallerProps) {
           if (!Roots.count(&F))
             NewRoots.insert(&F);
           continue;
diff --git a/llvm/test/CodeGen/AMDGPU/propagate-attributes-common-callees.ll b/llvm/test/CodeGen/AMDGPU/propagate-attributes-common-callees.ll
deleted file mode 100644 (file)
index 2a219fb..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -amdgpu-propagate-attributes-early  %s | FileCheck %s
-
-; Complicated call graph where a function is called
-; directly from a kernel abd also from a function 
-; whose address is taken. 
-
-; CHECK-LABEL: define float @common_callee.gc() #0 {
-define float @common_callee.gc() {
-   ret float 0.0
-}
-
-; CHECK-LABEL: define float @foo() {
-define float @foo() {
-   ret float 0.0
-}
-
-; CHECK-LABEL: define float @bar() {
-define float @bar() {
-   ret float 0.0
-}
-
-; CHECK-LABEL: define float @baz() {
-define float @baz() {
-   ret float 0.0
-}
-
-define amdgpu_kernel void @switch_indirect_kernel(float *%result, i32 %type) #1 {
-  %fn = alloca float ()*
-  switch i32 %type, label %sw.default [
-    i32 1, label %sw.bb
-    i32 2, label %sw.bb2
-    i32 3, label %sw.bb3
-  ]
-
-sw.bb:
-  store float ()* @foo, float ()** %fn
-  br label %sw.epilog
-
-sw.bb2:
-  store float ()* @bar, float ()** %fn
-  br label %sw.epilog
-
-sw.bb3:
-  store float ()* @baz, float ()** %fn
-  br label %sw.epilog
-
-sw.default:
-  br label %sw.epilog
-
-sw.epilog:
-  %fp = load float ()*, float ()** %fn
-  %direct_call = call contract float @common_callee.gc()
-  %indirect_call = call contract float %fp()
-  store float %indirect_call, float* %result
-  ret void
-}
-
-attributes #0 = { "amdgpu-flat-work-group-size"="1,256" "target-features"="-wavefrontsize16,-wavefrontsize32,+wavefrontsize64" }
-attributes #1 = { "amdgpu-flat-work-group-size"="1,256" } 
diff --git a/llvm/test/CodeGen/AMDGPU/propagate-attributes-direct-indirect-common-callee.ll b/llvm/test/CodeGen/AMDGPU/propagate-attributes-direct-indirect-common-callee.ll
deleted file mode 100644 (file)
index 67716db..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -amdgpu-propagate-attributes-early  %s | FileCheck %s
-
-; Test to check if we skip propgating attributes even if
-; a function is called directly as well as
-; indirectly. "baz" is called directly as well indirectly.
-
-; CHECK-LABEL: define float @foo() {
-define float @foo() {
-  ret float 0.0
-}
-
-; CHECK-LABEL: define float @bar() {
-define float @bar() {
- ret float 0.0
-}
-
-; CHECK-LABEL: define float @baz() {
-define float @baz() {
- ret float 0.0
-}
-
-define amdgpu_kernel void @switch_indirect_kernel(float *%result, i32 %type) #1 {
-  %fn = alloca float ()*
-  switch i32 %type, label %sw.default [
-    i32 1, label %sw.bb
-    i32 2, label %sw.bb2
-    i32 3, label %sw.bb3
-  ]
-
-sw.bb:
-  store float ()* @foo, float ()** %fn
-  br label %sw.epilog
-
-sw.bb2:
-  store float ()* @bar, float ()** %fn
-  br label %sw.epilog
-
-sw.bb3:
-  store float ()* @baz, float ()** %fn
-  br label %sw.epilog
-
-sw.default:
-  br label %sw.epilog
-
-sw.epilog:
-  %fp = load float ()*, float ()** %fn
-  %direct_call = call contract float @baz()
-  %indirect_call = call contract float %fp()
-  store float %indirect_call, float* %result
-  ret void
-}
-
-attributes #1 = { "amdgpu-flat-work-group-size"="1,256" } 
diff --git a/llvm/test/CodeGen/AMDGPU/propagate-attributes-direct-indirect.ll b/llvm/test/CodeGen/AMDGPU/propagate-attributes-direct-indirect.ll
deleted file mode 100644 (file)
index 20f2f97..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -amdgpu-propagate-attributes-early  %s | FileCheck %s
-
-; Test to check if we skip attributes on address
-; taken functions but pass to direct callees.
-
-; CHECK-LABEL: define float @foo() {
-define float @foo() {
-  ret float 0.0
-}
-
-; CHECK-LABEL: define float @bar() {
-define float @bar() {
-  ret float 0.0
-}
-
-; CHECK-LABEL: define float @baz() {
-define float @baz() {
-  ret float 0.0
-}
-
-; CHECK-LABEL: define float @baz2() #0 {
-define float @baz2() {
-  ret float 0.0
-}
-
-define amdgpu_kernel void @switch_indirect_kernel(float *%result, i32 %type) #1 {
-  %fn = alloca float ()*
-  switch i32 %type, label %sw.default [
-    i32 1, label %sw.bb
-    i32 2, label %sw.bb2
-    i32 3, label %sw.bb3
-  ]
-
-sw.bb:
-  store float ()* @foo, float ()** %fn
-  br label %sw.epilog
-
-sw.bb2:
-  store float ()* @bar, float ()** %fn
-  br label %sw.epilog
-
-sw.bb3:
-  store float ()* @baz, float ()** %fn
-  br label %sw.epilog
-
-sw.default:
-  br label %sw.epilog
-
-sw.epilog:
-  %fp = load float ()*, float ()** %fn
-  %direct_call = call contract float @baz2()
-  %indirect_call = call contract float %fp()
-  store float %indirect_call, float* %result
-  ret void
-}
-
-attributes #0 = { "amdgpu-flat-work-group-size"="1,256" "target-features"="-wavefrontsize16,-wavefrontsize32,+wavefrontsize64" }
-attributes #1 = { "amdgpu-flat-work-group-size"="1,256"} 
diff --git a/llvm/test/CodeGen/AMDGPU/propagate-attributes-indirect.ll b/llvm/test/CodeGen/AMDGPU/propagate-attributes-indirect.ll
deleted file mode 100644 (file)
index 647e6a4..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -amdgpu-propagate-attributes-early  %s | FileCheck %s
-
-; Test to check if we skip attributes on address
-; taken functions in a simple call graph.
-
-; CHECK-LABEL: define float @foo() {
-define float @foo() {
-  ret float 0.0
-}
-
-; CHECK-LABEL: define float @bar() {
-define float @bar() {
-  ret float 0.0
-}
-
-; CHECK-LABEL: define float @baz() {
-define float @baz() {
-  ret float 0.0
-}
-
-define amdgpu_kernel void @switch_indirect_kernel(float *%result, i32 %type) #1 {
-  %fn = alloca float ()*
-  switch i32 %type, label %sw.default [
-    i32 1, label %sw.bb
-    i32 2, label %sw.bb2
-    i32 3, label %sw.bb3
-  ]
-
-sw.bb:
-  store float ()* @foo, float ()** %fn
-  br label %sw.epilog
-
-sw.bb2:
-  store float ()* @bar, float ()** %fn
-  br label %sw.epilog
-
-sw.bb3:
-  store float ()* @baz, float ()** %fn
-  br label %sw.epilog
-
-sw.default:
-  br label %sw.epilog
-
-sw.epilog:
-  %fp = load float ()*, float ()** %fn
-  %indirect_call = call contract float %fp()
-  store float %indirect_call, float* %result
-  ret void
-}
-
-attributes #1 = { "amdgpu-flat-work-group-size"="1,256" } 
-