From 2cdb34efdac51d35da66b0017a1c1e00f65ef88d Mon Sep 17 00:00:00 2001 From: Konstantin Zhuravlyov Date: Mon, 25 Jan 2021 15:49:49 -0500 Subject: [PATCH] Revert "[IndirectFunctions] Skip propagating attributes to address taken functions" This reverts commit dd8ae42674b494e46ec40a22f40068db2b4a8b60. This commit causes infinite loop when compiling rocThrust and hipCUB. Differential Revision: https://reviews.llvm.org/D95389 --- .../Target/AMDGPU/AMDGPUPropagateAttributes.cpp | 14 +---- .../AMDGPU/propagate-attributes-common-callees.ll | 59 ---------------------- ...ate-attributes-direct-indirect-common-callee.ll | 53 ------------------- .../AMDGPU/propagate-attributes-direct-indirect.ll | 58 --------------------- .../AMDGPU/propagate-attributes-indirect.ll | 52 ------------------- 5 files changed, 1 insertion(+), 235 deletions(-) delete mode 100644 llvm/test/CodeGen/AMDGPU/propagate-attributes-common-callees.ll delete mode 100644 llvm/test/CodeGen/AMDGPU/propagate-attributes-direct-indirect-common-callee.ll delete mode 100644 llvm/test/CodeGen/AMDGPU/propagate-attributes-direct-indirect.ll delete mode 100644 llvm/test/CodeGen/AMDGPU/propagate-attributes-indirect.ll diff --git a/llvm/lib/Target/AMDGPU/AMDGPUPropagateAttributes.cpp b/llvm/lib/Target/AMDGPU/AMDGPUPropagateAttributes.cpp index b018bc2..cd71c7a 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUPropagateAttributes.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUPropagateAttributes.cpp @@ -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, 32> ToReplace; SmallSet 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 index 2a219fb..0000000 --- a/llvm/test/CodeGen/AMDGPU/propagate-attributes-common-callees.ll +++ /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 index 67716db..0000000 --- a/llvm/test/CodeGen/AMDGPU/propagate-attributes-direct-indirect-common-callee.ll +++ /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 index 20f2f97..0000000 --- a/llvm/test/CodeGen/AMDGPU/propagate-attributes-direct-indirect.ll +++ /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 index 647e6a4..0000000 --- a/llvm/test/CodeGen/AMDGPU/propagate-attributes-indirect.ll +++ /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" } - -- 2.7.4