Explorar o código

Disable CSE, leave it to target backend. (#246)

Xiang Li %!s(int64=8) %!d(string=hai) anos
pai
achega
478a433366

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

@@ -182,7 +182,7 @@ void PassManagerBuilder::populateFunctionPassManager(
     FPM.add(createSROAPass());
     FPM.add(createSROAPass());
   else
   else
     FPM.add(createScalarReplAggregatesPass());
     FPM.add(createScalarReplAggregatesPass());
-  FPM.add(createEarlyCSEPass());
+  // HLSL Change. FPM.add(createEarlyCSEPass());
   FPM.add(createLowerExpectIntrinsicPass());
   FPM.add(createLowerExpectIntrinsicPass());
 }
 }
 
 
@@ -328,7 +328,7 @@ void PassManagerBuilder::populateModulePassManager(
     MPM.add(createSROAPass(/*RequiresDomTree*/ false));
     MPM.add(createSROAPass(/*RequiresDomTree*/ false));
   else
   else
     MPM.add(createScalarReplAggregatesPass(-1, false));
     MPM.add(createScalarReplAggregatesPass(-1, false));
-  MPM.add(createEarlyCSEPass());              // Catch trivial redundancies
+  // HLSL Change. MPM.add(createEarlyCSEPass());              // Catch trivial redundancies
   // HLSL Change. MPM.add(createJumpThreadingPass());         // Thread jumps.
   // HLSL Change. MPM.add(createJumpThreadingPass());         // Thread jumps.
   MPM.add(createCorrelatedValuePropagationPass()); // Propagate conditionals
   MPM.add(createCorrelatedValuePropagationPass()); // Propagate conditionals
   MPM.add(createCFGSimplificationPass());     // Merge & remove BBs
   MPM.add(createCFGSimplificationPass());     // Merge & remove BBs

+ 3 - 3
lib/Transforms/Utils/SimplifyCFG.cpp

@@ -1054,9 +1054,9 @@ static bool passingValueIsAlwaysUndefined(Value *V, Instruction *I);
 static bool HoistThenElseCodeToIf(BranchInst *BI,
 static bool HoistThenElseCodeToIf(BranchInst *BI,
                                   const TargetTransformInfo &TTI) {
                                   const TargetTransformInfo &TTI) {
   // HLSL Change Begins.
   // HLSL Change Begins.
-  // Skip block with control flow hint.
-  if (BI->hasMetadata())
-    return false;
+  // Leave CSE to target backend.
+  // Also wave operations should not be CSEed.
+  return false;
   // HLSL Change Ends.
   // HLSL Change Ends.
 
 
   // This does very trivial matching, with limited scanning, to find identical
   // This does very trivial matching, with limited scanning, to find identical

+ 21 - 0
tools/clang/test/CodeGenHLSL/wave_no_opt.hlsl

@@ -0,0 +1,21 @@
+// RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
+
+// CHECK: call i32 @dx.op.waveActiveOp.i32
+// CHECK: call i32 @dx.op.waveActiveOp.i32
+
+struct PerThreadData {
+    int input;
+    int output;
+};
+RWStructuredBuffer<PerThreadData> g_sb : register(u0);
+[numthreads(8,8,1)]
+void main(uint GI : SV_GroupIndex) {
+    PerThreadData pts = g_sb[GI];
+    if (GI % 2) {
+        pts.output = WaveActiveSum(pts.input);
+    }
+    else {
+        pts.output = WaveActiveSum(pts.input);
+    }
+    g_sb[GI] = pts;
+}

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

@@ -586,6 +586,7 @@ public:
   TEST_METHOD(CodeGenVecCmpCond)
   TEST_METHOD(CodeGenVecCmpCond)
   TEST_METHOD(CodeGenVecTrunc)
   TEST_METHOD(CodeGenVecTrunc)
   TEST_METHOD(CodeGenWave)
   TEST_METHOD(CodeGenWave)
+  TEST_METHOD(CodeGenWaveNoOpt)
   TEST_METHOD(CodeGenWriteMaskBuf)
   TEST_METHOD(CodeGenWriteMaskBuf)
   TEST_METHOD(CodeGenWriteMaskBuf2)
   TEST_METHOD(CodeGenWriteMaskBuf2)
   TEST_METHOD(CodeGenWriteMaskBuf3)
   TEST_METHOD(CodeGenWriteMaskBuf3)
@@ -3238,6 +3239,10 @@ TEST_F(CompilerTest, CodeGenWave) {
   CodeGenTestCheck(L"..\\CodeGenHLSL\\wave.hlsl");
   CodeGenTestCheck(L"..\\CodeGenHLSL\\wave.hlsl");
 }
 }
 
 
+TEST_F(CompilerTest, CodeGenWaveNoOpt) {
+  CodeGenTestCheck(L"..\\CodeGenHLSL\\wave_no_opt.hlsl");
+}
+
 TEST_F(CompilerTest, CodeGenWriteMaskBuf) {
 TEST_F(CompilerTest, CodeGenWriteMaskBuf) {
   CodeGenTestCheck(L"..\\CodeGenHLSL\\writeMaskBuf.hlsl");
   CodeGenTestCheck(L"..\\CodeGenHLSL\\writeMaskBuf.hlsl");
 }
 }