소스 검색

When exit_block is false block, use !exit_cond as exit_cond in RemoveUnstructedLoopExit. (#3701)

Xiang Li 4 년 전
부모
커밋
e23eb7f89c
1개의 변경된 파일5개의 추가작업 그리고 0개의 파일을 삭제
  1. 5 0
      lib/Transforms/Scalar/DxilRemoveUnstructuredLoopExits.cpp

+ 5 - 0
lib/Transforms/Scalar/DxilRemoveUnstructuredLoopExits.cpp

@@ -359,6 +359,11 @@ static bool RemoveUnstructuredLoopExitsIteration(BasicBlock *exiting_block, Loop
 
   BranchInst *exiting_br = cast<BranchInst>(exiting_block->getTerminator());
   Value *exit_cond = exiting_br->getCondition();
+  // When exit_block is false block, use !exit_cond as exit_cond.
+  if (exiting_br->getSuccessor(1) == exit_block) {
+    IRBuilder<> B(exiting_br);
+    exit_cond = B.CreateNot(exit_cond);
+  }
   BasicBlock *new_exiting_block = nullptr;
 
   std::vector<Value_Info> exit_values;