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
66 lines
2.0 KiB
LLVM
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
|
|
}
|