diff options
author | Marek Olsak <marek.olsak@amd.com> | 2018-05-15 21:41:55 +0000 |
---|---|---|
committer | Marek Olsak <marek.olsak@amd.com> | 2018-05-15 21:41:55 +0000 |
commit | 3c5fd145c5f6fc2ee570e9c329700f8a9960eae0 (patch) | |
tree | 3e561416617f0dcf327280d0436c6d55ee2f3600 | |
parent | 091fed94ae701005ccfde290713c4908e25008d4 (diff) | |
download | bcm5719-llvm-3c5fd145c5f6fc2ee570e9c329700f8a9960eae0.tar.gz bcm5719-llvm-3c5fd145c5f6fc2ee570e9c329700f8a9960eae0.zip |
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
llvm-svn: 332403
-rw-r--r-- | llvm/lib/Transforms/Scalar/StructurizeCFG.cpp | 5 | ||||
-rw-r--r-- | llvm/test/Transforms/StructurizeCFG/invert-condition.ll | 30 |
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 +} |