Răsfoiți Sursa

Merged PR 102: Fix noreturn change that assumes new block is pred after split

Fix noreturn change that assumes new block is pred after split

- update test case to not be illegal once validation only permits
  these intrinsics in anyhit shaders.
Tex Riddell 7 ani în urmă
părinte
comite
28137b9ac4

+ 3 - 3
lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp

@@ -5755,10 +5755,10 @@ static void InjectReturnAfterNoReturnPreserveOutput(HLModule &HLM) {
               continue;
             // split block and add return:
             BasicBlock *BB = CI->getParent();
-            BasicBlock *NewBB = BB->splitBasicBlock(pNextI);
-            TerminatorInst *Term = NewBB->getTerminator();
+            BB->splitBasicBlock(pNextI);
+            TerminatorInst *Term = BB->getTerminator();
             Term->eraseFromParent();
-            IRBuilder<> Builder(NewBB);
+            IRBuilder<> Builder(BB);
             llvm::Type *RetTy = CI->getParent()->getParent()->getReturnType();
             if (RetTy->isVoidTy())
               Builder.CreateRetVoid();

+ 27 - 7
tools/clang/test/CodeGenHLSL/quick-test/raytracing_accept_ignore_hit.hlsl

@@ -1,12 +1,32 @@
 // RUN: %dxc -T lib_6_3 -auto-binding-space 11 %s | FileCheck %s
 
 // CHECK: call void @dx.op.acceptHitAndEndSearch(i32 156)
+// CHECK: unreachable
 // CHECK: call void @dx.op.ignoreHit(i32 155)
+// CHECK: unreachable
 
-float4 emit(uint shader)  {
-  if (shader < 2)
-    AcceptHitAndEndSearch();
-  if (shader < 9)
-    IgnoreHit();
-   return 2.6;
-}
+// store at end should be unaffected by writes to result in branches
+// store float 0x4004CCCCC0000000, float*
+
+struct Payload {
+  float foo;
+};
+struct Attr {
+  float2 bary;
+};
+
+[shader("anyhit")]
+void AnyHit(inout Payload p, Attr a)  {
+  float4 result = 2.6;
+  if (p.foo < 2) {
+    result.x = 1;             // unused
+    AcceptHitAndEndSearch();  // does not return
+    result.y = 3;             // dead code
+  }
+  if (a.bary.x < 9) {
+    result.x = 2;             // unused
+    IgnoreHit();              // does not return
+    result.y = 4;             // dead code
+  }
+   p.foo = result;
+}