[amdgpu] Remove the GlobalDCE pass prior to the internalization pass.
authorMichael Liao <michael.hliao@gmail.com>
Wed, 7 Jul 2021 20:44:47 +0000 (16:44 -0400)
committerMichael Liao <michael.hliao@gmail.com>
Thu, 8 Jul 2021 14:25:58 +0000 (10:25 -0400)
- In [D98783](https://reviews.llvm.org/D98783), an extra GlobalDCE pass
  is inserted before the internalization pass to ensure a global
  variable without users could be internalized even if there are dead
  users. Instead of inserting a dedicated optimization pass, the
  dead user checking, i.e. 'use_empty()', should be preceeded with
  constant dead user removal to ensure an accurate result.

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

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp

index 7f74204..81d848a 100644 (file)
@@ -431,6 +431,7 @@ static bool mustPreserveGV(const GlobalValue &GV) {
   if (const Function *F = dyn_cast<Function>(&GV))
     return F->isDeclaration() || AMDGPU::isEntryFunctionCC(F->getCallingConv());
 
+  GV.removeDeadConstantUsers();
   return !GV.use_empty();
 }
 
@@ -595,9 +596,6 @@ void AMDGPUTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
         PM.addPass(AMDGPUPrintfRuntimeBindingPass());
 
         if (InternalizeSymbols) {
-          // Global variables may have dead uses which need to be removed.
-          // Otherwise these useless global variables will not get internalized.
-          PM.addPass(GlobalDCEPass());
           PM.addPass(InternalizePass(mustPreserveGV));
         }
         PM.addPass(AMDGPUPropagateAttributesLatePass(*this));