Files
clang-p2996/llvm/test/Transforms/StructurizeCFG/invert-constantexpr.ll
Jay Foad d2e5d3512b [StructurizeCFG] Clean up some boolean not instructions
In some cases StructurizeCFG inserts i1 xor instructions to invert
predicates. Add a quick loop to clean these up afterwards if we can get
away with modifying an existing compare instruction instead.
(StructurizeCFG is generally run late in the pipeline so instcombine
does not clean them up for us.)

Differential Revision: https://reviews.llvm.org/D118623
2022-02-01 09:35:37 +00:00

50 lines
1.6 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -S -o - -structurizecfg < %s | FileCheck %s
@g = global i32 0
define void @invert_constantexpr_condition(i32 %arg, i32 %arg1) #0 {
; CHECK-LABEL: @invert_constantexpr_condition(
; CHECK-NEXT: bb:
; CHECK-NEXT: [[TMP:%.*]] = icmp ne i32 [[ARG:%.*]], 0
; CHECK-NEXT: br i1 icmp eq (i32 ptrtoint (i32* @g to i32), i32 0), label [[BB2:%.*]], label [[FLOW:%.*]]
; CHECK: bb2:
; CHECK-NEXT: br label [[FLOW]]
; CHECK: bb3:
; CHECK-NEXT: [[TMP4:%.*]] = phi i1 [ undef, [[FLOW]] ], [ [[TMP7:%.*]], [[BB6:%.*]] ]
; CHECK-NEXT: [[TMP5:%.*]] = or i1 [[TMP4]], icmp eq (i32 ptrtoint (i32* @g to i32), i32 0)
; CHECK-NEXT: br label [[BB8:%.*]]
; CHECK: Flow:
; CHECK-NEXT: [[TMP0:%.*]] = phi i1 [ [[TMP]], [[BB2]] ], [ icmp ne (i32 ptrtoint (i32* @g to i32), i32 0), [[BB:%.*]] ]
; CHECK-NEXT: br i1 [[TMP0]], label [[BB6]], label [[BB3:%.*]]
; CHECK: bb6:
; CHECK-NEXT: [[TMP7]] = icmp slt i32 [[ARG]], [[ARG1:%.*]]
; CHECK-NEXT: br label [[BB3]]
; CHECK: bb8:
; CHECK-NEXT: ret void
;
bb:
%tmp = icmp eq i32 %arg, 0
br i1 icmp eq (i32 ptrtoint (i32* @g to i32), i32 0), label %bb2, label %bb6
bb2:
br i1 %tmp, label %bb3, label %bb6
bb3:
%tmp4 = phi i1 [ %tmp7, %bb6 ], [ undef, %bb2 ]
%tmp5 = or i1 %tmp4, icmp eq (i32 ptrtoint (i32* @g to i32), i32 0)
br i1 %tmp5, label %bb8, label %bb8
bb6:
%tmp7 = icmp slt i32 %arg, %arg1
br label %bb3
bb8:
ret void
}
declare i32 @llvm.amdgcn.workitem.id.x() #1
attributes #0 = { nounwind }
attributes #1 = { nounwind readnone }