Skip to content

GVN/test: regen a test with UTC (NFC) #111365

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 8, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
234 changes: 179 additions & 55 deletions llvm/test/Transforms/GVN/edge.ll
Original file line number Diff line number Diff line change
@@ -1,7 +1,17 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -passes=gvn -S < %s | FileCheck %s

define i32 @f1(i32 %x) {
; CHECK-LABEL: define i32 @f1(
; CHECK-LABEL: define i32 @f1(
; CHECK-SAME: i32 [[X:%.*]]) {
; CHECK-NEXT: [[BB0:.*:]]
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X]], 0
; CHECK-NEXT: br i1 [[CMP]], label %[[BB2:.*]], label %[[BB1:.*]]
; CHECK: [[BB1]]:
; CHECK-NEXT: br label %[[BB2]]
; CHECK: [[BB2]]:
; CHECK-NEXT: ret i32 [[X]]
;
bb0:
%cmp = icmp eq i32 %x, 0
br i1 %cmp, label %bb2, label %bb1
Expand All @@ -11,12 +21,19 @@ bb2:
%cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
%foo = add i32 %cond, %x
ret i32 %foo
; CHECK: bb2:
; CHECK: ret i32 %x
}

define i32 @f2(i32 %x) {
; CHECK-LABEL: define i32 @f2(
; CHECK-LABEL: define i32 @f2(
; CHECK-SAME: i32 [[X:%.*]]) {
; CHECK-NEXT: [[BB0:.*:]]
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[X]], 0
; CHECK-NEXT: br i1 [[CMP]], label %[[BB1:.*]], label %[[BB2:.*]]
; CHECK: [[BB1]]:
; CHECK-NEXT: br label %[[BB2]]
; CHECK: [[BB2]]:
; CHECK-NEXT: ret i32 [[X]]
;
bb0:
%cmp = icmp ne i32 %x, 0
br i1 %cmp, label %bb1, label %bb2
Expand All @@ -26,12 +43,20 @@ bb2:
%cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
%foo = add i32 %cond, %x
ret i32 %foo
; CHECK: bb2:
; CHECK: ret i32 %x
}

define i32 @f3(i32 %x) {
; CHECK-LABEL: define i32 @f3(
; CHECK-LABEL: define i32 @f3(
; CHECK-SAME: i32 [[X:%.*]]) {
; CHECK-NEXT: [[BB0:.*:]]
; CHECK-NEXT: switch i32 [[X]], label %[[BB1:.*]] [
; CHECK-NEXT: i32 0, label %[[BB2:.*]]
; CHECK-NEXT: ]
; CHECK: [[BB1]]:
; CHECK-NEXT: br label %[[BB2]]
; CHECK: [[BB2]]:
; CHECK-NEXT: ret i32 [[X]]
;
bb0:
switch i32 %x, label %bb1 [ i32 0, label %bb2]
bb1:
Expand All @@ -40,13 +65,21 @@ bb2:
%cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
%foo = add i32 %cond, %x
ret i32 %foo
; CHECK: bb2:
; CHECK: ret i32 %x
}

declare void @g(i1)
define void @f4(ptr %x) {
; CHECK-LABEL: define void @f4(
; CHECK-SAME: ptr [[X:%.*]]) {
; CHECK-NEXT: [[BB0:.*:]]
; CHECK-NEXT: [[Y:%.*]] = icmp eq ptr null, [[X]]
; CHECK-NEXT: br i1 [[Y]], label %[[BB2:.*]], label %[[BB1:.*]]
; CHECK: [[BB1]]:
; CHECK-NEXT: br label %[[BB2]]
; CHECK: [[BB2]]:
; CHECK-NEXT: call void @g(i1 [[Y]])
; CHECK-NEXT: ret void
;
bb0:
%y = icmp eq ptr null, %x
br i1 %y, label %bb2, label %bb1
Expand All @@ -55,11 +88,22 @@ bb1:
bb2:
%zed = icmp eq ptr null, %x
call void @g(i1 %zed)
; CHECK: call void @g(i1 %y)
ret void
}

define double @fcmp_oeq_not_zero(double %x, double %y) {
; CHECK-LABEL: define double @fcmp_oeq_not_zero(
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y]], 2.000000e+00
; CHECK-NEXT: br i1 [[CMP]], label %[[IF:.*]], label %[[RETURN:.*]]
; CHECK: [[IF]]:
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], 2.000000e+00
; CHECK-NEXT: br label %[[RETURN]]
; CHECK: [[RETURN]]:
; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], %[[IF]] ], [ [[X]], %[[ENTRY]] ]
; CHECK-NEXT: ret double [[RETVAL]]
;
entry:
%cmp = fcmp oeq double %y, 2.0
br i1 %cmp, label %if, label %return
Expand All @@ -71,12 +115,21 @@ if:
return:
%retval = phi double [ %div, %if ], [ %x, %entry ]
ret double %retval

; CHECK-LABEL: define double @fcmp_oeq_not_zero(
; CHECK: %div = fdiv double %x, 2.0
}

define double @fcmp_une_not_zero(double %x, double %y) {
; CHECK-LABEL: define double @fcmp_une_not_zero(
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[Y]], 2.000000e+00
; CHECK-NEXT: br i1 [[CMP]], label %[[RETURN:.*]], label %[[ELSE:.*]]
; CHECK: [[ELSE]]:
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], 2.000000e+00
; CHECK-NEXT: br label %[[RETURN]]
; CHECK: [[RETURN]]:
; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], %[[ELSE]] ], [ [[X]], %[[ENTRY]] ]
; CHECK-NEXT: ret double [[RETVAL]]
;
entry:
%cmp = fcmp une double %y, 2.0
br i1 %cmp, label %return, label %else
Expand All @@ -88,12 +141,21 @@ else:
return:
%retval = phi double [ %div, %else ], [ %x, %entry ]
ret double %retval

; CHECK-LABEL: define double @fcmp_une_not_zero(
; CHECK: %div = fdiv double %x, 2.0
}

define double @fcmp_one_possibly_nan(double %x, double %y) {
; CHECK-LABEL: define double @fcmp_one_possibly_nan(
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: [[CMP:%.*]] = fcmp one double [[Y]], 2.000000e+00
; CHECK-NEXT: br i1 [[CMP]], label %[[RETURN:.*]], label %[[ELSE:.*]]
; CHECK: [[ELSE]]:
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], [[Y]]
; CHECK-NEXT: br label %[[RETURN]]
; CHECK: [[RETURN]]:
; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], %[[ELSE]] ], [ [[X]], %[[ENTRY]] ]
; CHECK-NEXT: ret double [[RETVAL]]
;
entry:
%cmp = fcmp one double %y, 2.0
br i1 %cmp, label %return, label %else
Expand All @@ -105,12 +167,21 @@ else:
return:
%retval = phi double [ %div, %else ], [ %x, %entry ]
ret double %retval

; CHECK-LABEL: define double @fcmp_one_possibly_nan(
; CHECK: %div = fdiv double %x, %y
}

define double @fcmp_one_not_zero_or_nan(double %x, double %y) {
; CHECK-LABEL: define double @fcmp_one_not_zero_or_nan(
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan one double [[Y]], 2.000000e+00
; CHECK-NEXT: br i1 [[CMP]], label %[[RETURN:.*]], label %[[ELSE:.*]]
; CHECK: [[ELSE]]:
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], 2.000000e+00
; CHECK-NEXT: br label %[[RETURN]]
; CHECK: [[RETURN]]:
; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], %[[ELSE]] ], [ [[X]], %[[ENTRY]] ]
; CHECK-NEXT: ret double [[RETVAL]]
;
entry:
%cmp = fcmp nnan one double %y, 2.0
br i1 %cmp, label %return, label %else
Expand All @@ -122,15 +193,24 @@ else:
return:
%retval = phi double [ %div, %else ], [ %x, %entry ]
ret double %retval

; CHECK-LABEL: define double @fcmp_one_not_zero_or_nan(
; CHECK: %div = fdiv double %x, 2.0
}

; PR22376 - We can't propagate zero constants because -0.0
; PR22376 - We can't propagate zero constants because -0.0
; compares equal to 0.0. If %y is -0.0 in this test case,
; we would produce the wrong sign on the infinity return value.
define double @fcmp_oeq_zero(double %x, double %y) {
; CHECK-LABEL: define double @fcmp_oeq_zero(
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y]], 0.000000e+00
; CHECK-NEXT: br i1 [[CMP]], label %[[IF:.*]], label %[[RETURN:.*]]
; CHECK: [[IF]]:
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], [[Y]]
; CHECK-NEXT: br label %[[RETURN]]
; CHECK: [[RETURN]]:
; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], %[[IF]] ], [ [[X]], %[[ENTRY]] ]
; CHECK-NEXT: ret double [[RETVAL]]
;
entry:
%cmp = fcmp oeq double %y, 0.0
br i1 %cmp, label %if, label %return
Expand All @@ -142,12 +222,21 @@ if:
return:
%retval = phi double [ %div, %if ], [ %x, %entry ]
ret double %retval

; CHECK-LABEL: define double @fcmp_oeq_zero(
; CHECK: %div = fdiv double %x, %y
}

define double @fcmp_une_zero(double %x, double %y) {
; CHECK-LABEL: define double @fcmp_une_zero(
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[Y]], -0.000000e+00
; CHECK-NEXT: br i1 [[CMP]], label %[[RETURN:.*]], label %[[ELSE:.*]]
; CHECK: [[ELSE]]:
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], [[Y]]
; CHECK-NEXT: br label %[[RETURN]]
; CHECK: [[RETURN]]:
; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], %[[ELSE]] ], [ [[X]], %[[ENTRY]] ]
; CHECK-NEXT: ret double [[RETVAL]]
;
entry:
%cmp = fcmp une double %y, -0.0
br i1 %cmp, label %return, label %else
Expand All @@ -159,52 +248,81 @@ else:
return:
%retval = phi double [ %div, %else ], [ %x, %entry ]
ret double %retval

; CHECK-LABEL: define double @fcmp_une_zero(
; CHECK: %div = fdiv double %x, %y
}

; We also cannot propagate a value if it's not a constant.
; This is because the value could be 0.0 or -0.0.

define double @fcmp_oeq_maybe_zero(double %x, double %y, double %z1, double %z2) {
; CHECK-LABEL: define double @fcmp_oeq_maybe_zero(
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]], double [[Z1:%.*]], double [[Z2:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: [[Z:%.*]] = fadd double [[Z1]], [[Z2]]
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y]], [[Z]]
; CHECK-NEXT: br i1 [[CMP]], label %[[IF:.*]], label %[[RETURN:.*]]
; CHECK: [[IF]]:
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], [[Z]]
; CHECK-NEXT: br label %[[RETURN]]
; CHECK: [[RETURN]]:
; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], %[[IF]] ], [ [[X]], %[[ENTRY]] ]
; CHECK-NEXT: ret double [[RETVAL]]
;
entry:
%z = fadd double %z1, %z2
%cmp = fcmp oeq double %y, %z
br i1 %cmp, label %if, label %return
%z = fadd double %z1, %z2
%cmp = fcmp oeq double %y, %z
br i1 %cmp, label %if, label %return

if:
%div = fdiv double %x, %z
br label %return
%div = fdiv double %x, %z
br label %return

return:
%retval = phi double [ %div, %if ], [ %x, %entry ]
ret double %retval

; CHECK-LABEL: define double @fcmp_oeq_maybe_zero(
; CHECK: %div = fdiv double %x, %z
%retval = phi double [ %div, %if ], [ %x, %entry ]
ret double %retval
}

define double @fcmp_une_maybe_zero(double %x, double %y, double %z1, double %z2) {
; CHECK-LABEL: define double @fcmp_une_maybe_zero(
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]], double [[Z1:%.*]], double [[Z2:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: [[Z:%.*]] = fadd double [[Z1]], [[Z2]]
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[Y]], [[Z]]
; CHECK-NEXT: br i1 [[CMP]], label %[[RETURN:.*]], label %[[ELSE:.*]]
; CHECK: [[ELSE]]:
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], [[Z]]
; CHECK-NEXT: br label %[[RETURN]]
; CHECK: [[RETURN]]:
; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], %[[ELSE]] ], [ [[X]], %[[ENTRY]] ]
; CHECK-NEXT: ret double [[RETVAL]]
;
entry:
%z = fadd double %z1, %z2
%cmp = fcmp une double %y, %z
br i1 %cmp, label %return, label %else
%z = fadd double %z1, %z2
%cmp = fcmp une double %y, %z
br i1 %cmp, label %return, label %else

else:
%div = fdiv double %x, %z
br label %return
%div = fdiv double %x, %z
br label %return

return:
%retval = phi double [ %div, %else ], [ %x, %entry ]
ret double %retval

; CHECK-LABEL: define double @fcmp_une_maybe_zero(
; CHECK: %div = fdiv double %x, %z
%retval = phi double [ %div, %else ], [ %x, %entry ]
ret double %retval
}


define double @fcmp_ueq_possibly_nan(double %x, double %y) {
; CHECK-LABEL: define double @fcmp_ueq_possibly_nan(
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: [[CMP:%.*]] = fcmp ueq double [[Y]], 2.000000e+00
; CHECK-NEXT: br i1 [[CMP]], label %[[DO_DIV:.*]], label %[[RETURN:.*]]
; CHECK: [[DO_DIV]]:
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], [[Y]]
; CHECK-NEXT: br label %[[RETURN]]
; CHECK: [[RETURN]]:
; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], %[[DO_DIV]] ], [ [[X]], %[[ENTRY]] ]
; CHECK-NEXT: ret double [[RETVAL]]
;
entry:
%cmp = fcmp ueq double %y, 2.0
br i1 %cmp, label %do_div, label %return
Expand All @@ -216,12 +334,21 @@ do_div:
return:
%retval = phi double [ %div, %do_div ], [ %x, %entry ]
ret double %retval

; CHECK-LABEL: define double @fcmp_ueq_possibly_nan(
; CHECK: %div = fdiv double %x, %y
}

define double @fcmp_ueq_not_zero_or_nan(double %x, double %y) {
; CHECK-LABEL: define double @fcmp_ueq_not_zero_or_nan(
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan ueq double [[Y]], 2.000000e+00
; CHECK-NEXT: br i1 [[CMP]], label %[[DO_DIV:.*]], label %[[RETURN:.*]]
; CHECK: [[DO_DIV]]:
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], 2.000000e+00
; CHECK-NEXT: br label %[[RETURN]]
; CHECK: [[RETURN]]:
; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], %[[DO_DIV]] ], [ [[X]], %[[ENTRY]] ]
; CHECK-NEXT: ret double [[RETVAL]]
;
entry:
%cmp = fcmp nnan ueq double %y, 2.0
br i1 %cmp, label %do_div, label %return
Expand All @@ -233,7 +360,4 @@ do_div:
return:
%retval = phi double [ %div, %do_div ], [ %x, %entry ]
ret double %retval

; CHECK-LABEL: define double @fcmp_ueq_not_zero_or_nan(
; CHECK: %div = fdiv double %x, 2.0
}
Loading