Browse Source

Fixing store undef later in the compilation. (#3212)

Adam Yang 4 years ago
parent
commit
3be547b67c

+ 3 - 0
include/dxc/HLSL/DxilGenerationPass.h

@@ -128,4 +128,7 @@ bool AreDxilResourcesDense(llvm::Module *M, hlsl::DxilResourceBase **ppNonDense)
 ModulePass *createDxilNoOptLegalizePass();
 void initializeDxilNoOptLegalizePass(llvm::PassRegistry&);
 
+ModulePass *createDxilNoOptSimplifyInstructionsPass();
+void initializeDxilNoOptSimplifyInstructionsPass(llvm::PassRegistry&);
+
 }

+ 1 - 0
lib/HLSL/DxcOptimizer.cpp

@@ -110,6 +110,7 @@ HRESULT SetupRegistryPassForHLSL() {
     initializeDxilLoopUnrollPass(Registry);
     initializeDxilLowerCreateHandleForLibPass(Registry);
     initializeDxilNoOptLegalizePass(Registry);
+    initializeDxilNoOptSimplifyInstructionsPass(Registry);
     initializeDxilPrecisePropagatePassPass(Registry);
     initializeDxilPreserveAllOutputsPass(Registry);
     initializeDxilPreserveToSelectPass(Registry);

+ 48 - 29
lib/HLSL/DxilNoOptLegalize.cpp

@@ -26,14 +26,9 @@ public:
     initializeDxilNoOptLegalizePass(*PassRegistry::getPassRegistry());
   }
 
-  void getAnalysisUsage(AnalysisUsage &AU) const override {
-    AU.addRequired<DxilValueCache>();
-  }
-
   bool runOnModule(Module &M) override;
   bool RemoveStoreUndefsFromPtr(Value *V);
   bool RemoveStoreUndefs(Module &M);
-  bool SimplifySelects(Module &M);
 };
 char DxilNoOptLegalize::ID;
 
@@ -80,34 +75,10 @@ bool DxilNoOptLegalize::RemoveStoreUndefs(Module &M) {
   return Changed;
 }
 
-bool DxilNoOptLegalize::SimplifySelects(Module &M) {
-  bool Changed = false;
-  DxilValueCache *DVC = &getAnalysis<DxilValueCache>();
-  for (Function &F : M) {
-    for (BasicBlock &BB : F) {
-      for (auto it = BB.begin(), end = BB.end(); it != end;) {
-        Instruction *I = &*(it++);
-        if (I->getOpcode() == Instruction::Select) {
-
-          if (hlsl::IsPreserve(I))
-            continue;
-
-          if (Value *C = DVC->GetValue(I)) {
-            I->replaceAllUsesWith(C);
-            I->eraseFromParent();
-            Changed = true;
-          }
-        }
-      }
-    }
-  }
-  return Changed;
-}
 
 bool DxilNoOptLegalize::runOnModule(Module &M) {
   bool Changed = false;
   Changed |= RemoveStoreUndefs(M);
-  Changed |= SimplifySelects(M);
   return Changed;
 }
 
@@ -116,3 +87,51 @@ ModulePass *llvm::createDxilNoOptLegalizePass() {
 }
 
 INITIALIZE_PASS(DxilNoOptLegalize, "dxil-o0-legalize", "DXIL No-Opt Legalize", false, false)
+
+
+
+class DxilNoOptSimplifyInstructions : public ModulePass {
+  SmallVector<Value *, 16> Worklist;
+
+public:
+  static char ID;
+  DxilNoOptSimplifyInstructions() : ModulePass(ID) {
+    initializeDxilNoOptSimplifyInstructionsPass(*PassRegistry::getPassRegistry());
+  }
+
+  void getAnalysisUsage(AnalysisUsage &AU) const override {
+    AU.addRequired<DxilValueCache>();
+  }
+
+  bool runOnModule(Module &M) override {
+    bool Changed = false;
+    DxilValueCache *DVC = &getAnalysis<DxilValueCache>();
+    for (Function &F : M) {
+      for (BasicBlock &BB : F) {
+        for (auto it = BB.begin(), end = BB.end(); it != end;) {
+          Instruction *I = &*(it++);
+          if (I->getOpcode() == Instruction::Select) {
+
+            if (hlsl::IsPreserve(I))
+              continue;
+
+            if (Value *C = DVC->GetValue(I)) {
+              I->replaceAllUsesWith(C);
+              I->eraseFromParent();
+              Changed = true;
+            }
+          }
+        }
+      }
+    }
+    return Changed;
+  }
+};
+char DxilNoOptSimplifyInstructions::ID;
+
+ModulePass *llvm::createDxilNoOptSimplifyInstructionsPass() {
+  return new DxilNoOptSimplifyInstructions();
+}
+
+INITIALIZE_PASS(DxilNoOptSimplifyInstructions, "dxil-o0-simplify-inst", "DXIL No-Opt Simplify Inst", false, false)
+

+ 2 - 1
lib/Transforms/IPO/PassManagerBuilder.cpp

@@ -360,7 +360,7 @@ void PassManagerBuilder::populateModulePassManager(
     if (!HLSLHighLevel) {
       MPM.add(createDxilConvergentClearPass());
       MPM.add(createDxilRemoveDeadBlocksPass());
-      MPM.add(createDxilNoOptLegalizePass());
+      MPM.add(createDxilNoOptSimplifyInstructionsPass());
       MPM.add(createGlobalOptimizerPass());
       MPM.add(createMultiDimArrayToOneDimArrayPass());
       MPM.add(createDeadCodeEliminationPass());
@@ -368,6 +368,7 @@ void PassManagerBuilder::populateModulePassManager(
       MPM.add(createDxilLowerCreateHandleForLibPass());
       MPM.add(createDxilTranslateRawBuffer());
       MPM.add(createDxilLegalizeSampleOffsetPass());
+      MPM.add(createDxilNoOptLegalizePass());
       MPM.add(createDxilFinalizePreservesPass());
       MPM.add(createDxilFinalizeModulePass());
       MPM.add(createComputeViewIdStatePass());

+ 54 - 0
tools/clang/test/HLSLFileCheck/passes/dxil/dxil_o0_legalize/inout.hlsl

@@ -0,0 +1,54 @@
+// RUN: %dxc %s -T ps_6_0 -Od | FileCheck %s
+
+// Regression test for some `store float undef` not getting cleaned up in O0.
+
+// CHECK: @main
+
+Texture2D t0 : register( t0 );
+SamplerState s0 : register( s0 );
+
+struct Out {
+  float4 color;
+};
+
+struct In {
+  float2 uv;
+  float4 colors[9];
+};
+
+void FillColors(inout In input) {
+  static const int2 offsets[9] = {
+   int2( -1, -1 ),
+   int2(  0, -1 ),
+   int2(  1, -1 ),
+   int2( -1,  0 ),
+   int2(  0,  0 ),
+   int2(  1,  0 ),
+   int2( -1,  1 ),
+   int2(  0,  1 ),
+   int2(  1,  1 ),
+  };
+
+  [unroll]
+  for(uint i = 0; i < 9; i++) {
+    input.colors[ i ] = t0.Sample(s0, input.uv, offsets[i]);
+  }
+}
+
+Out GetColor(inout In input) {
+  Out output;
+  output.color = input.colors[0];
+  return output;
+}
+
+Out Compute(In input) {
+ FillColors(input);
+ return GetColor(input);
+}
+
+float4 main(float2 uv : UV)  : SV_Target {
+ In input;
+ input.uv = uv;
+ return Compute(input).color;
+}
+

+ 1 - 0
utils/hct/hctdb.py

@@ -2145,6 +2145,7 @@ class db_dxil(object):
         add_pass('dxil-erase-dead-region', 'DxilEraseDeadRegion', 'DxilEraseDeadRegion', [])
         add_pass('dxil-remove-dead-blocks', 'DxilRemoveDeadBlocks', 'DxilRemoveDeadBlocks', [])
         add_pass('dxil-o0-legalize', 'DxilNoOptLegalize', 'DXIL No-Opt Legalize', [])
+        add_pass('dxil-o0-simplify-inst', 'DxilNoOptSimplifyInstructions', 'DXIL No-Opt Simplify Inst', [])
         add_pass('loop-deletion', 'LoopDeletion', "Delete dead loops", [])
         add_pass('loop-interchange', 'LoopInterchange', 'Interchanges loops for cache reuse', [])
         add_pass('loop-unroll', 'LoopUnroll', 'Unroll loops', [