Skip to content

Commit

Permalink
[InstCombine] Add tests for freeze of recurrence with invoke start (NFC)
Browse files Browse the repository at this point in the history
  • Loading branch information
nikic committed Jun 17, 2022
1 parent 3fd9aeb commit 5ae4a17
Showing 1 changed file with 76 additions and 2 deletions.
78 changes: 76 additions & 2 deletions llvm/test/Transforms/InstCombine/freeze.ll
Expand Up @@ -740,8 +740,8 @@ exit: ; preds = %loop
ret void
}

define void @fold_phi_neg_flags(i32 %init, i32 %n) {
; CHECK-LABEL: @fold_phi_neg_flags(
define void @fold_phi_drop_flags(i32 %init, i32 %n) {
; CHECK-LABEL: @fold_phi_drop_flags(
; CHECK-NEXT: entry:
; CHECK-NEXT: br label [[LOOP:%.*]]
; CHECK: loop:
Expand Down Expand Up @@ -917,6 +917,80 @@ exit:
ret void
}

define void @fold_phi_invoke_start_value(i32 %n) personality i8* undef {
; CHECK-LABEL: @fold_phi_invoke_start_value(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[INIT:%.*]] = invoke i32 @get_i32()
; CHECK-NEXT: to label [[LOOP:%.*]] unwind label [[UNWIND:%.*]]
; CHECK: loop:
; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[INIT]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]
; CHECK-NEXT: [[I_FR:%.*]] = freeze i32 [[I]]
; CHECK-NEXT: [[I_NEXT]] = add nuw nsw i32 [[I_FR]], 1
; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N:%.*]]
; CHECK-NEXT: br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]
; CHECK: unwind:
; CHECK-NEXT: [[TMP0:%.*]] = landingpad i8
; CHECK-NEXT: cleanup
; CHECK-NEXT: unreachable
; CHECK: exit:
; CHECK-NEXT: ret void
;
entry:
%init = invoke i32 @get_i32()
to label %loop unwind label %unwind

loop:
%i = phi i32 [ %init, %entry ], [ %i.next, %loop ]
%i.fr = freeze i32 %i
%i.next = add nsw nuw i32 %i.fr, 1
%cond = icmp eq i32 %i.next, %n
br i1 %cond, label %loop, label %exit

unwind:
landingpad i8 cleanup
unreachable

exit:
ret void
}

define void @fold_phi_invoke_noundef_start_value(i32 %n) personality i8* undef {
; CHECK-LABEL: @fold_phi_invoke_noundef_start_value(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[INIT:%.*]] = invoke noundef i32 @get_i32()
; CHECK-NEXT: to label [[LOOP:%.*]] unwind label [[UNWIND:%.*]]
; CHECK: loop:
; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[INIT]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]
; CHECK-NEXT: [[I_FR:%.*]] = freeze i32 [[I]]
; CHECK-NEXT: [[I_NEXT]] = add nuw nsw i32 [[I_FR]], 1
; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N:%.*]]
; CHECK-NEXT: br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]
; CHECK: unwind:
; CHECK-NEXT: [[TMP0:%.*]] = landingpad i8
; CHECK-NEXT: cleanup
; CHECK-NEXT: unreachable
; CHECK: exit:
; CHECK-NEXT: ret void
;
entry:
%init = invoke noundef i32 @get_i32()
to label %loop unwind label %unwind

loop:
%i = phi i32 [ %init, %entry ], [ %i.next, %loop ]
%i.fr = freeze i32 %i
%i.next = add nsw nuw i32 %i.fr, 1
%cond = icmp eq i32 %i.next, %n
br i1 %cond, label %loop, label %exit

unwind:
landingpad i8 cleanup
unreachable

exit:
ret void
}

define i8* @freeze_load_noundef(i8** %ptr) {
; CHECK-LABEL: @freeze_load_noundef(
; CHECK-NEXT: [[P:%.*]] = load i8*, i8** [[PTR:%.*]], align 8, !noundef !0
Expand Down

0 comments on commit 5ae4a17

Please sign in to comment.