浏览代码

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;