Przeglądaj źródła

Replaced llvm.donothing with loading from a special ICB (#2644)


* Fixed test and dxil prepare

* Removed unused vars and auto

* Stray newline

* No longer giving the loads a name

* Fixed another test
Adam Yang 5 lat temu
rodzic
commit
9501f39cc8

+ 23 - 2
lib/HLSL/DxilNoops.cpp

@@ -20,6 +20,7 @@ using namespace llvm;
 
 
 namespace {
 namespace {
 StringRef kNoopName = "dx.noop";
 StringRef kNoopName = "dx.noop";
+StringRef kNothingName = "dx.nothing";
 }
 }
 
 
 //==========================================================
 //==========================================================
@@ -115,10 +116,27 @@ namespace {
 class DxilFinalizeNoops : public ModulePass {
 class DxilFinalizeNoops : public ModulePass {
 public:
 public:
   static char ID;
   static char ID;
+  GlobalVariable *NothingGV = nullptr;
+
   DxilFinalizeNoops() : ModulePass(ID) {
   DxilFinalizeNoops() : ModulePass(ID) {
     initializeDxilFinalizeNoopsPass(*PassRegistry::getPassRegistry());
     initializeDxilFinalizeNoopsPass(*PassRegistry::getPassRegistry());
   }
   }
 
 
+  Instruction *GetFinalNoopInst(Module &M, Instruction *InsertBefore) {
+  if (!NothingGV) {
+    NothingGV = M.getGlobalVariable(kNothingName);
+    if (!NothingGV) {
+      Type *i32Ty = Type::getInt32Ty(M.getContext());
+      NothingGV = new GlobalVariable(M,
+        i32Ty, true,
+        llvm::GlobalValue::InternalLinkage,
+        llvm::ConstantInt::get(i32Ty, 0), kNothingName);
+    }
+  }
+
+  return new llvm::LoadInst(NothingGV, nullptr, InsertBefore);
+}
+
   bool runOnModule(Module &M) override;
   bool runOnModule(Module &M) override;
   const char *getPassName() const override { return "Dxil Finalize Noops"; }
   const char *getPassName() const override { return "Dxil Finalize Noops"; }
 };
 };
@@ -142,11 +160,14 @@ bool DxilFinalizeNoops::runOnModule(Module &M) {
     return false;
     return false;
 
 
   if (!NoopF->user_empty()) {
   if (!NoopF->user_empty()) {
-    Function *DoNothingF = Intrinsic::getDeclaration(&M, Intrinsic::donothing);
     for (auto It = NoopF->user_begin(), E = NoopF->user_end(); It != E;) {
     for (auto It = NoopF->user_begin(), E = NoopF->user_end(); It != E;) {
       User *U = *(It++);
       User *U = *(It++);
       CallInst *CI = cast<CallInst>(U);
       CallInst *CI = cast<CallInst>(U);
-      CI->setCalledFunction(DoNothingF);
+
+      Instruction *Nop = GetFinalNoopInst(M, CI);
+      Nop->setDebugLoc(CI->getDebugLoc());
+
+      CI->eraseFromParent();
     }
     }
   }
   }
 
 

+ 0 - 25
lib/HLSL/DxilPreparePasses.cpp

@@ -332,27 +332,6 @@ public:
 
 
   const char *getPassName() const override { return "HLSL DXIL Finalize Module"; }
   const char *getPassName() const override { return "HLSL DXIL Finalize Module"; }
 
 
-  void patchDxil_1_5(Module &M) {
-    Function *DoNothingF = nullptr;
-    for (Function &F : M) {
-      if (F.isIntrinsic() && F.getIntrinsicID() == Intrinsic::donothing) {
-        DoNothingF = &F;
-        break;
-      }
-    }
-
-    if (!DoNothingF)
-      return;
-
-    for (auto It = DoNothingF->user_begin(), E = DoNothingF->user_end(); It != E; ) {
-      User *U = *(It++);
-      cast<Instruction>(U)->eraseFromParent();
-    }
-
-    assert(DoNothingF->user_empty() && "Not all users removed from @llvm.donothing");
-    DoNothingF->eraseFromParent();
-  }
-
   void patchValidation_1_1(Module &M) {
   void patchValidation_1_1(Module &M) {
     for (iplist<Function>::iterator F : M.getFunctionList()) {
     for (iplist<Function>::iterator F : M.getFunctionList()) {
       for (Function::iterator BBI = F->begin(), BBE = F->end(); BBI != BBE;
       for (Function::iterator BBI = F->begin(), BBE = F->end(); BBI != BBE;
@@ -403,10 +382,6 @@ public:
           MarkUsedSignatureElements(DM.GetPatchConstantFunction(), DM);
           MarkUsedSignatureElements(DM.GetPatchConstantFunction(), DM);
       }
       }
 
 
-      if (DxilMajor == 1 && DxilMinor <= 5) {
-        patchDxil_1_5(M);
-      }
-
       // Remove store undef output.
       // Remove store undef output.
       hlsl::OP *hlslOP = M.GetDxilModule().GetOP();
       hlsl::OP *hlslOP = M.GetDxilModule().GetOP();
       RemoveStoreUndefOutput(M, hlslOP);
       RemoveStoreUndefOutput(M, hlslOP);

+ 22 - 21
tools/clang/test/HLSLFileCheck/dxil/debug/noops_call.hlsl

@@ -1,4 +1,4 @@
-// RUN: %dxilver 1.7 | %dxc -E main -T ps_6_6 %s -Od | FileCheck %s
+// RUN: %dxc -E main -T ps_6_0 %s -Od | FileCheck %s
 
 
 typedef float4 MyCoolFloat4; 
 typedef float4 MyCoolFloat4; 
 static float4 myStaticGlobalVar = float4(1.0, 1.0, 1.0, 1.0);
 static float4 myStaticGlobalVar = float4(1.0, 1.0, 1.0, 1.0);
@@ -60,30 +60,32 @@ float4 depth2(float4 val)
     return val;
     return val;
 }
 }
 
 
+// CHECK: @dx.nothing = internal constant i32 0
+
 [RootSignature("")]
 [RootSignature("")]
 float4 main( float4 unused : SV_POSITION, float4 color : COLOR ) : SV_Target
 float4 main( float4 unused : SV_POSITION, float4 color : COLOR ) : SV_Target
 {
 {
     float4 ret1 = localScopeVar_func(color);
     float4 ret1 = localScopeVar_func(color);
     // ** call **
     // ** call **
-    // CHECK: call void @llvm.donothing()
+    // CHECK: load i32, i32* @dx.nothing
     // CHECK: fmul
     // CHECK: fmul
     // CHECK: fmul
     // CHECK: fmul
     // CHECK: fmul
     // CHECK: fmul
     // CHECK: fmul
     // CHECK: fmul
     // ** return **
     // ** return **
-    // CHECK: call void @llvm.donothing()
+    // CHECK: load i32, i32* @dx.nothing
 
 
     float4 ret2 = localRegVar_func(ret1);
     float4 ret2 = localRegVar_func(ret1);
     // ** call **
     // ** call **
-    // CHECK: call void @llvm.donothing()
+    // CHECK: load i32, i32* @dx.nothing
     // ** copy **
     // ** copy **
-    // CHECK: call void @llvm.donothing()
+    // CHECK: load i32, i32* @dx.nothing
     // ** return **
     // ** return **
-    // CHECK: call void @llvm.donothing()
+    // CHECK: load i32, i32* @dx.nothing
 
 
     float4 ret3 = array_func(ret2);
     float4 ret3 = array_func(ret2);
     // ** call **
     // ** call **
-    // CHECK: call void @llvm.donothing()
+    // CHECK: load i32, i32* @dx.nothing
     // CHECK: store
     // CHECK: store
     // CHECK: store
     // CHECK: store
     // CHECK: store
     // CHECK: store
@@ -93,57 +95,56 @@ float4 main( float4 unused : SV_POSITION, float4 color : COLOR ) : SV_Target
     // CHECK: load
     // CHECK: load
     // CHECK: load
     // CHECK: load
     // ** return **
     // ** return **
-    // CHECK: call void @llvm.donothing()
+    // CHECK: load i32, i32* @dx.nothing
 
 
     float4 ret4 = typedef_func(ret3);
     float4 ret4 = typedef_func(ret3);
     // ** call **
     // ** call **
-    // CHECK: call void @llvm.donothing()
+    // CHECK: load i32, i32* @dx.nothing
     // ** copy **
     // ** copy **
-    // CHECK: call void @llvm.donothing()
+    // CHECK: load i32, i32* @dx.nothing
     // ** return **
     // ** return **
-    // CHECK: call void @llvm.donothing()
+    // CHECK: load i32, i32* @dx.nothing
 
 
     float4 ret5 = global_func(ret4);
     float4 ret5 = global_func(ret4);
     // ** call **
     // ** call **
-    // CHECK: call void @llvm.donothing()
+    // CHECK: load i32, i32* @dx.nothing
     // CHECK: fmul
     // CHECK: fmul
     // CHECK: fmul
     // CHECK: fmul
     // CHECK: fmul
     // CHECK: fmul
     // CHECK: fmul
     // CHECK: fmul
     // ** return **
     // ** return **
-    // CHECK: call void @llvm.donothing()
+    // CHECK: load i32, i32* @dx.nothing
 
 
     float4 ret6 = depth2(ret5);
     float4 ret6 = depth2(ret5);
     // ** call **
     // ** call **
-    // CHECK: call void @llvm.donothing()
+    // CHECK: load i32, i32* @dx.nothing
     // depth2() {
     // depth2() {
       // ** call **
       // ** call **
-      // CHECK: call void @llvm.donothing()
+      // CHECK: load i32, i32* @dx.nothing
       // depth3() {
       // depth3() {
         // ** call **
         // ** call **
-        // CHECK: call void @llvm.donothing()
+        // CHECK: load i32, i32* @dx.nothing
         // depth4() {
         // depth4() {
           // CHECK: fmul
           // CHECK: fmul
           // CHECK: fmul
           // CHECK: fmul
           // CHECK: fmul
           // CHECK: fmul
           // CHECK: fmul
           // CHECK: fmul
-          // CHECK: call void @llvm.donothing()
+          // CHECK: load i32, i32* @dx.nothing
         // }
         // }
         // CHECK: fmul
         // CHECK: fmul
         // CHECK: fmul
         // CHECK: fmul
         // CHECK: fmul
         // CHECK: fmul
         // CHECK: fmul
         // CHECK: fmul
-        // CHECK: call void @llvm.donothing()
+        // CHECK: load i32, i32* @dx.nothing
       // }
       // }
       // CHECK: fmul
       // CHECK: fmul
       // CHECK: fmul
       // CHECK: fmul
       // CHECK: fmul
       // CHECK: fmul
       // CHECK: fmul
       // CHECK: fmul
-      // CHECK: call void @llvm.donothing()
+      // CHECK: load i32, i32* @dx.nothing
     // }
     // }
 
 
     return max(ret6, color);
     return max(ret6, color);
-    // CHECK: call void @llvm.donothing()
+    // CHECK: load i32, i32* @dx.nothing
 }
 }
 
 
-

+ 5 - 5
tools/clang/test/HLSLFileCheck/dxil/debug/noops_no_fold.hlsl

@@ -1,4 +1,4 @@
-// RUN: %dxilver 1.7 | %dxc -E main -T ps_6_6 %s -Od | FileCheck %s
+// RUN: %dxc -E main -T ps_6_6 %s -Od | FileCheck %s
 
 
 // Test that non-const arithmetic are not optimized away
 // Test that non-const arithmetic are not optimized away
 
 
@@ -9,7 +9,7 @@ Texture2D tex1 : register(t1);
 float4 main() : SV_Target {
 float4 main() : SV_Target {
 
 
   float x = 10;
   float x = 10;
-  // CHECK: call void @llvm.donothing()
+  // CHECK: load i32, i32* @dx.nothing
 
 
   float y = x + 5;
   float y = x + 5;
   // CHECK: fadd
   // CHECK: fadd
@@ -19,12 +19,12 @@ float4 main() : SV_Target {
   // CHECK: fdiv
   // CHECK: fdiv
 
 
   Texture2D tex = tex0; 
   Texture2D tex = tex0; 
-  // CHECK: call void @llvm.donothing()
+  // CHECK: load i32, i32* @dx.nothing
 
 
   // CHECK: br i1
   // CHECK: br i1
   if (w >= 0) {
   if (w >= 0) {
     tex = tex1;
     tex = tex1;
-    // CHECK: call void @llvm.donothing()
+    // CHECK: load i32, i32* @dx.nothing
     // CHECK: br
     // CHECK: br
   }
   }
 
 
@@ -33,6 +33,6 @@ float4 main() : SV_Target {
   // CHECK: fadd
   // CHECK: fadd
   // CHECK: fadd
   // CHECK: fadd
   return tex.Load(0) + float4(x,y,z,w);
   return tex.Load(0) + float4(x,y,z,w);
-  // CHECK: call void @llvm.donothing()
+  // CHECK: load i32, i32* @dx.nothing
 }
 }
 
 

+ 9 - 5
tools/clang/test/HLSLFileCheck/dxil/debug/noops_no_fold_vec.hlsl

@@ -1,15 +1,17 @@
-// RUN: %dxilver 1.7 | %dxc -E main -T ps_6_6 %s -Od | FileCheck %s
+// RUN: %dxc -E main -T ps_6_0 %s -Od | FileCheck %s
 
 
 // Test that non-const arithmetic are not optimized away
 // Test that non-const arithmetic are not optimized away
 
 
 Texture2D tex0 : register(t0);
 Texture2D tex0 : register(t0);
 Texture2D tex1 : register(t1);
 Texture2D tex1 : register(t1);
 
 
+// CHECK: @dx.nothing = internal constant i32 0
+
 [RootSignature("DescriptorTable(SRV(t0), SRV(t1))")]
 [RootSignature("DescriptorTable(SRV(t0), SRV(t1))")]
 float4 main() : SV_Target {
 float4 main() : SV_Target {
 
 
   float2 xy = float2(10, 20);
   float2 xy = float2(10, 20);
-  // CHECK: call void @llvm.donothing()
+  // CHECK: load i32, i32* @dx.nothing
 
 
   float2 zw = xy + float2(5, 30);
   float2 zw = xy + float2(5, 30);
   // CHECK: fadd
   // CHECK: fadd
@@ -24,12 +26,12 @@ float4 main() : SV_Target {
   // CHECK: fdiv
   // CHECK: fdiv
 
 
   Texture2D tex = tex0; 
   Texture2D tex = tex0; 
-  // CHECK: call void @llvm.donothing()
+  // CHECK: load i32, i32* @dx.nothing
 
 
   // CHECK: br i1
   // CHECK: br i1
   if (foo.x+bar.y >= 0) {
   if (foo.x+bar.y >= 0) {
     tex = tex1;
     tex = tex1;
-    // CHECK: call void @llvm.donothing()
+    // CHECK: load i32, i32* @dx.nothing
     // CHECK: br
     // CHECK: br
   }
   }
 
 
@@ -38,6 +40,8 @@ float4 main() : SV_Target {
   // CHECK: fadd
   // CHECK: fadd
   // CHECK: fadd
   // CHECK: fadd
   return tex.Load(0) + float4(foo,bar);
   return tex.Load(0) + float4(foo,bar);
-  // CHECK: call void @llvm.donothing()
+  // CHECK: load i32, i32* @dx.nothing
 }
 }
 
 
+
+