Pārlūkot izejas kodu

Fixed a bug where nops are not generated for memcpy's (#2909)

Adam Yang 5 gadi atpakaļ
vecāks
revīzija
7bb154000b

+ 3 - 2
lib/HLSL/DxilNoops.cpp

@@ -156,9 +156,10 @@ static void FindAllStores(Value *Ptr, std::vector<Store_Info> *Stores, std::vect
 
 
     if (isa<BitCastOperator>(V) || isa<GEPOperator>(V) || isa<GlobalVariable>(V) || isa<AllocaInst>(V) || isa<Argument>(V)) {
     if (isa<BitCastOperator>(V) || isa<GEPOperator>(V) || isa<GlobalVariable>(V) || isa<AllocaInst>(V) || isa<Argument>(V)) {
       for (User *U : V->users()) {
       for (User *U : V->users()) {
+        MemCpyInst *MC = nullptr;
         // Allow load if MC reads from pointer
         // Allow load if MC reads from pointer
-        if (MemCpyInst *MC = dyn_cast<MemCpyInst>(U)) {
-          AllowLoad |= MC->getSource() == V;
+        if ((MC = dyn_cast<MemCpyInst>(U)) && MC->getSource() == V) {
+          AllowLoad = true;
         }
         }
         else if (isa<LoadInst>(U)) {
         else if (isa<LoadInst>(U)) {
           AllowLoad = true;
           AllowLoad = true;

+ 30 - 0
tools/clang/test/HLSLFileCheck/dxil/debug/new_noops_memcpy2.hlsl

@@ -0,0 +1,30 @@
+// RUN: %dxc -E main -T ps_6_0 %s -Od /Zi | FileCheck %s
+
+typedef float4 foo;
+
+[RootSignature("")]
+float4 main(float4 color : COLOR) : SV_Target {
+
+  foo f1 = color;
+  // CHECK: dx.nothing.a, i32 0, i32 0), !dbg !{{[0-9]+}} ; line:8
+
+  foo f2[2];
+
+  f2[0].y = color.y;
+  // CHECK: dx.nothing.a, i32 0, i32 0), !dbg !{{[0-9]+}} ; line:13
+
+  f2[1].w = color.w;
+  // CHECK: dx.nothing.a, i32 0, i32 0), !dbg !{{[0-9]+}} ; line:16
+
+  foo arrayOfFooArray[2][2];
+
+  arrayOfFooArray[0] = f2; // This is a memcpy
+  // CHECK: dx.nothing.a, i32 0, i32 0), !dbg !{{[0-9]+}} ; line:21
+
+  arrayOfFooArray[1] = f2; // This is a memcpy
+  // CHECK: dx.nothing.a, i32 0, i32 0), !dbg !{{[0-9]+}} ; line:24
+
+  return float4(f1.x + f1.z, + f2[0].y + f2[1].w, arrayOfFooArray[0][0].y, arrayOfFooArray[1][1].w) + color;
+  // CHECK: dx.nothing.a, i32 0, i32 0), !dbg !{{[0-9]+}} ; line:27
+}
+