Files
clang-p2996/llvm/test/Transforms/StructurizeCFG/invert-condition.ll
Jay Foad 0e74d75a29 [StructurizeCFG] Fix boolean not bug
D118623 added code to fold not-of-compare into a compare
with the inverted predicate, if the compare had no other
uses. This relies on accurate use lists in the IR but it
was run before setPhiValues, when some phi inputs are still
stored in a data structure on the side, instead of being
real uses in the IR. The effect was that a phi that should
be using the original compare result would now get an
inverted result instead.

Fix this by moving simplifyConditions after setPhiValues.

Differential Revision: https://reviews.llvm.org/D120312
2022-02-22 17:36:20 +00:00

66 lines
2.0 KiB
LLVM

; 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
}
define void @invert_condition_phi(i32 %arg) {
; CHECK-LABEL: @invert_condition_phi(
; CHECK-NEXT: main_body:
; CHECK-NEXT: [[I5:%.*]] = icmp eq i32 [[ARG:%.*]], 0
; CHECK-NEXT: [[I5_INV:%.*]] = xor i1 [[I5]], true
; CHECK-NEXT: br i1 [[I5_INV]], label [[IF1:%.*]], label [[ENDIF1:%.*]]
; CHECK: if1:
; CHECK-NEXT: br label [[ENDIF1]]
; CHECK: endif1:
; CHECK-NEXT: [[I7:%.*]] = phi i1 [ [[I5]], [[MAIN_BODY:%.*]] ], [ false, [[IF1]] ]
; CHECK-NEXT: [[I7_INV:%.*]] = xor i1 [[I7]], true
; CHECK-NEXT: br i1 [[I7_INV]], label [[IF4:%.*]], label [[ENDIF4:%.*]]
; CHECK: if4:
; CHECK-NEXT: br label [[ENDIF4]]
; CHECK: endif4:
; CHECK-NEXT: ret void
;
main_body:
%i5 = icmp eq i32 %arg, 0
br i1 %i5, label %endif1, label %if1
if1:
br label %endif1
endif1:
%i7 = phi i1 [ false, %if1 ], [ %i5, %main_body ]
br i1 %i7, label %endif4, label %if4
if4:
br label %endif4
endif4:
ret void
}