Преглед на файлове

Do not create phi on non-default address space. (#273)

Xiang Li преди 8 години
родител
ревизия
7179f13400
променени са 3 файла, в които са добавени 36 реда и са изтрити 0 реда
  1. 5 0
      lib/Transforms/InstCombine/InstCombinePHI.cpp
  2. 26 0
      tools/clang/test/CodeGenHLSL/share_mem_phi.hlsl
  3. 5 0
      tools/clang/unittests/HLSL/CompilerTest.cpp

+ 5 - 0
lib/Transforms/InstCombine/InstCombinePHI.cpp

@@ -298,6 +298,11 @@ Instruction *InstCombiner::FoldPHIArgLoadIntoPHI(PHINode &PN) {
   bool isVolatile = FirstLI->isVolatile();
   unsigned LoadAlignment = FirstLI->getAlignment();
   unsigned LoadAddrSpace = FirstLI->getPointerAddressSpace();
+  // HLSL Change Begin.
+  // Do not create phi on non-default address space.
+  if (LoadAddrSpace != 0)
+    return nullptr;
+  // HLSL Change End.
 
   // We can't sink the load if the loaded value could be modified between the
   // load and the PHI.

+ 26 - 0
tools/clang/test/CodeGenHLSL/share_mem_phi.hlsl

@@ -0,0 +1,26 @@
+// RUN: %dxc -E main -T cs_6_0 %s
+
+groupshared float b;
+groupshared float a;
+
+RWStructuredBuffer<float> fB;
+
+[numthreads(8,8,1)]
+void main( uint2 tid : SV_DispatchThreadID, uint2 gid : SV_GroupID, uint2 gtid : SV_GroupThreadID, uint gidx : SV_GroupIndex )
+{
+    if (tid.x == 0 && tid.y == 0) {
+       b = 1;
+       a = 2;
+    }
+
+    float x = 0;
+    float y = tid.y;
+    if (tid.x > tid.y) {
+       x = a;
+       y = sin(y);
+    }
+    else
+       x = b;
+
+    fB[tid.x] = x + y;
+}

+ 5 - 0
tools/clang/unittests/HLSL/CompilerTest.cpp

@@ -521,6 +521,7 @@ public:
   TEST_METHOD(CodeGenSelectObj5)
   TEST_METHOD(CodeGenSelMat)
   TEST_METHOD(CodeGenShare_Mem_Dbg)
+  TEST_METHOD(CodeGenShare_Mem_Phi)
   TEST_METHOD(CodeGenShare_Mem1)
   TEST_METHOD(CodeGenShare_Mem2)
   TEST_METHOD(CodeGenShare_Mem2Dim)
@@ -2987,6 +2988,10 @@ TEST_F(CompilerTest, CodeGenShare_Mem_Dbg) {
   CodeGenTestCheck(L"..\\CodeGenHLSL\\share_mem_dbg.hlsl");
 }
 
+TEST_F(CompilerTest, CodeGenShare_Mem_Phi) {
+  CodeGenTestCheck(L"..\\CodeGenHLSL\\share_mem_phi.hlsl");
+}
+
 TEST_F(CompilerTest, CodeGenShare_Mem1) {
   CodeGenTestCheck(L"..\\CodeGenHLSL\\share_mem1.hlsl");
 }