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
50 lines
1.6 KiB
LLVM
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 }
|