summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Transforms/Scalar/StructurizeCFG.cpp5
-rw-r--r--llvm/test/Transforms/StructurizeCFG/invert-condition.ll30
2 files changed, 33 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp b/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp
index f0ddc30beff..12976ee0c9e 100644
--- a/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp
+++ b/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp
@@ -380,8 +380,9 @@ Value *StructurizeCFG::invert(Value *Condition) {
return ConstantExpr::getNot(C);
// Second: If the condition is already inverted, return the original value
- if (match(Condition, m_Not(m_Value(Condition))))
- return Condition;
+ Value *NotCondition;
+ if (match(Condition, m_Not(m_Value(NotCondition))))
+ return NotCondition;
if (Instruction *Inst = dyn_cast<Instruction>(Condition)) {
// Third: Check all the users for an invert
diff --git a/llvm/test/Transforms/StructurizeCFG/invert-condition.ll b/llvm/test/Transforms/StructurizeCFG/invert-condition.ll
new file mode 100644
index 00000000000..c5db5ad0e4d
--- /dev/null
+++ b/llvm/test/Transforms/StructurizeCFG/invert-condition.ll
@@ -0,0 +1,30 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -structurizecfg %s | FileCheck %s
+
+define void @invert_condition(i1 %arg) {
+; CHECK-LABEL: @invert_condition(
+; CHECK-NEXT: bb:
+; CHECK-NEXT: [[TMP:%.*]] = load volatile float, float addrspace(1)* undef
+; CHECK-NEXT: [[TMP1:%.*]] = load volatile float, float addrspace(1)* undef
+; CHECK-NEXT: br label [[BB2:%.*]]
+; CHECK: bb2:
+; CHECK-NEXT: [[TMP3:%.*]] = fcmp oge float [[TMP]], [[TMP1]]
+; CHECK-NEXT: [[TMP4:%.*]] = xor i1 [[ARG:%.*]], [[TMP3]]
+; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[TMP4]], true
+; CHECK-NEXT: br i1 [[TMP0]], label [[BB5:%.*]], label [[BB2]]
+; CHECK: bb5:
+; CHECK-NEXT: ret void
+;
+bb:
+ %tmp = load volatile float, float addrspace(1)* undef
+ %tmp1 = load volatile float, float addrspace(1)* undef
+ br label %bb2
+
+bb2: ; preds = %bb2, %bb
+ %tmp3 = fcmp oge float %tmp, %tmp1
+ %tmp4 = xor i1 %arg, %tmp3
+ br i1 %tmp4, label %bb2, label %bb5
+
+bb5: ; preds = %bb2
+ ret void
+}
OpenPOWER on IntegriCloud