[llvm] r332403 - StructurizeCFG: fix inverting conditions

Marek Olsak via llvm-commits llvm-commits at lists.llvm.org
Tue May 15 14:41:55 PDT 2018


Author: mareko
Date: Tue May 15 14:41:55 2018
New Revision: 332403

URL: http://llvm.org/viewvc/llvm-project?rev=332403&view=rev
Log:
StructurizeCFG: fix inverting conditions

Author: Samuel Pitoiset

Without this patch, it appears to me that we are selecting
the wrong operand when inverting conditions. In the attached
test, it will select %tmp3 instead of %tmp4. To fix it, just
use 'A' as everywhere.

This fixes a regression introduced by
"[PatternMatch] define m_Not using m_Xor and cst_pred_ty"

https://reviews.llvm.org/D46351

Added:
    llvm/trunk/test/Transforms/StructurizeCFG/invert-condition.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/StructurizeCFG.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/StructurizeCFG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/StructurizeCFG.cpp?rev=332403&r1=332402&r2=332403&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/StructurizeCFG.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/StructurizeCFG.cpp Tue May 15 14:41:55 2018
@@ -380,8 +380,9 @@ Value *StructurizeCFG::invert(Value *Con
     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

Added: llvm/trunk/test/Transforms/StructurizeCFG/invert-condition.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/StructurizeCFG/invert-condition.ll?rev=332403&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/StructurizeCFG/invert-condition.ll (added)
+++ llvm/trunk/test/Transforms/StructurizeCFG/invert-condition.ll Tue May 15 14:41:55 2018
@@ -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
+}




More information about the llvm-commits mailing list