Pārlūkot izejas kodu

Special ICB variables for nops are now arrays for driver compat. (#2775)

Adam Yang 5 gadi atpakaļ
vecāks
revīzija
984048c6de

+ 15 - 4
lib/HLSL/DxilNoops.cpp

@@ -20,7 +20,13 @@ using namespace llvm;
 
 namespace {
 StringRef kNoopName = "dx.noop";
-StringRef kNothingName = "dx.nothing";
+StringRef kNothingName = "dx.nothing.a";
+}
+
+static Constant *GetConstGep(Constant *Ptr, unsigned Idx0, unsigned Idx1) {
+  Type *i32Ty = Type::getInt32Ty(Ptr->getContext());
+  Constant *Indices[] = { ConstantInt::get(i32Ty, Idx0), ConstantInt::get(i32Ty, Idx1) };
+  return ConstantExpr::getGetElementPtr(nullptr, Ptr, Indices);
 }
 
 //==========================================================
@@ -127,14 +133,19 @@ public:
     NothingGV = M.getGlobalVariable(kNothingName);
     if (!NothingGV) {
       Type *i32Ty = Type::getInt32Ty(M.getContext());
+      Type *i32ArrayTy = ArrayType::get(i32Ty, 1);
+      unsigned int Values[1] = { 0 };
+      Constant *InitialValue = llvm::ConstantDataArray::get(M.getContext(), Values);
+
       NothingGV = new GlobalVariable(M,
-        i32Ty, true,
+        i32ArrayTy, true,
         llvm::GlobalValue::InternalLinkage,
-        llvm::ConstantInt::get(i32Ty, 0), kNothingName);
+        InitialValue, kNothingName);
     }
   }
 
-  return new llvm::LoadInst(NothingGV, nullptr, InsertBefore);
+  Constant  *Gep = GetConstGep(NothingGV, 0, 0);
+  return new llvm::LoadInst(Gep, nullptr, InsertBefore);
 }
 
   bool runOnModule(Module &M) override;

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

@@ -60,32 +60,36 @@ float4 depth2(float4 val)
     return val;
 }
 
-// CHECK: @dx.nothing = internal constant i32 0
-
 [RootSignature("")]
 float4 main( float4 unused : SV_POSITION, float4 color : COLOR ) : SV_Target
 {
     float4 ret1 = localScopeVar_func(color);
     // ** call **
-    // CHECK: load i32, i32* @dx.nothing
+    // CHECK: load i32, i32*
+    // CHECK-SAME: @dx.nothing
     // CHECK: fmul
     // CHECK: fmul
     // CHECK: fmul
     // CHECK: fmul
     // ** return **
-    // CHECK: load i32, i32* @dx.nothing
+    // CHECK: load i32, i32*
+    // CHECK-SAME: @dx.nothing
 
     float4 ret2 = localRegVar_func(ret1);
     // ** call **
-    // CHECK: load i32, i32* @dx.nothing
+    // CHECK: load i32, i32*
+    // CHECK-SAME: @dx.nothing
     // ** copy **
-    // CHECK: load i32, i32* @dx.nothing
+    // CHECK: load i32, i32*
+    // CHECK-SAME: @dx.nothing
     // ** return **
-    // CHECK: load i32, i32* @dx.nothing
+    // CHECK: load i32, i32*
+    // CHECK-SAME: @dx.nothing
 
     float4 ret3 = array_func(ret2);
     // ** call **
-    // CHECK: load i32, i32* @dx.nothing
+    // CHECK: load i32, i32*
+    // CHECK-SAME: @dx.nothing
     // CHECK: store
     // CHECK: store
     // CHECK: store
@@ -95,56 +99,69 @@ float4 main( float4 unused : SV_POSITION, float4 color : COLOR ) : SV_Target
     // CHECK: load
     // CHECK: load
     // ** return **
-    // CHECK: load i32, i32* @dx.nothing
+    // CHECK: load i32, i32*
+    // CHECK-SAME: @dx.nothing
 
     float4 ret4 = typedef_func(ret3);
     // ** call **
-    // CHECK: load i32, i32* @dx.nothing
+    // CHECK: load i32, i32*
+    // CHECK-SAME: @dx.nothing
     // ** copy **
-    // CHECK: load i32, i32* @dx.nothing
+    // CHECK: load i32, i32*
+    // CHECK-SAME: @dx.nothing
     // ** return **
-    // CHECK: load i32, i32* @dx.nothing
+    // CHECK: load i32, i32*
+    // CHECK-SAME: @dx.nothing
 
     float4 ret5 = global_func(ret4);
     // ** call **
-    // CHECK: load i32, i32* @dx.nothing
+    // CHECK: load i32, i32*
+    // CHECK-SAME: @dx.nothing
     // CHECK: fmul
     // CHECK: fmul
     // CHECK: fmul
     // CHECK: fmul
     // ** return **
-    // CHECK: load i32, i32* @dx.nothing
+    // CHECK: load i32, i32*
+    // CHECK-SAME: @dx.nothing
 
     float4 ret6 = depth2(ret5);
     // ** call **
-    // CHECK: load i32, i32* @dx.nothing
+    // CHECK: load i32, i32*
+    // CHECK-SAME: @dx.nothing
     // depth2() {
       // ** call **
-      // CHECK: load i32, i32* @dx.nothing
+      // CHECK: load i32, i32*
+      // CHECK-SAME: @dx.nothing
       // depth3() {
         // ** call **
-        // CHECK: load i32, i32* @dx.nothing
+        // CHECK: load i32, i32*
+        // CHECK-SAME: @dx.nothing
         // depth4() {
           // CHECK: fmul
           // CHECK: fmul
           // CHECK: fmul
           // CHECK: fmul
-          // CHECK: load i32, i32* @dx.nothing
+          // CHECK: load i32, i32*
+          // CHECK-SAME: @dx.nothing
         // }
         // CHECK: fmul
         // CHECK: fmul
         // CHECK: fmul
         // CHECK: fmul
-        // CHECK: load i32, i32* @dx.nothing
+        // CHECK: load i32, i32*
+        // CHECK-SAME: @dx.nothing
       // }
       // CHECK: fmul
       // CHECK: fmul
       // CHECK: fmul
       // CHECK: fmul
-      // CHECK: load i32, i32* @dx.nothing
+      // CHECK: load i32, i32*
+      // CHECK-SAME: @dx.nothing
     // }
 
     return max(ret6, color);
-    // CHECK: load i32, i32* @dx.nothing
+    // CHECK: load i32, i32*
+    // CHECK-SAME: @dx.nothing
 }
 

+ 8 - 6
tools/clang/test/HLSLFileCheck/dxil/debug/noops_no_fold_vec.hlsl

@@ -5,13 +5,12 @@
 Texture2D tex0 : register(t0);
 Texture2D tex1 : register(t1);
 
-// CHECK: @dx.nothing = internal constant i32 0
-
 [RootSignature("DescriptorTable(SRV(t0), SRV(t1))")]
 float4 main() : SV_Target {
 
   float2 xy = float2(10, 20);
-  // CHECK: load i32, i32* @dx.nothing
+  // CHECK: load i32, i32*
+  // CHECK-SAME: @dx.nothing
 
   float2 zw = xy + float2(5, 30);
   // CHECK: fadd
@@ -26,12 +25,14 @@ float4 main() : SV_Target {
   // CHECK: fdiv
 
   Texture2D tex = tex0; 
-  // CHECK: load i32, i32* @dx.nothing
+  // CHECK: load i32, i32*
+  // CHECK-SAME: @dx.nothing
 
   // CHECK: br i1
   if (foo.x+bar.y >= 0) {
     tex = tex1;
-    // CHECK: load i32, i32* @dx.nothing
+    // CHECK: load i32, i32*
+    // CHECK-SAME: @dx.nothing
     // CHECK: br
   }
 
@@ -40,7 +41,8 @@ float4 main() : SV_Target {
   // CHECK: fadd
   // CHECK: fadd
   return tex.Load(0) + float4(foo,bar);
-  // CHECK: load i32, i32* @dx.nothing
+  // CHECK: load i32, i32*
+  // CHECK-SAME: @dx.nothing
 }