-
Notifications
You must be signed in to change notification settings - Fork 15.3k
[ConstantFolding] Constant fold nextafter and nexttoward #168794
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
base: main
Are you sure you want to change the base?
Changes from 2 commits
0fef7b8
ea98d6b
970370a
2b183ff
1406965
11593f8
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,226 @@ | ||||||
| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 | ||||||
dtcxzyw marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
| ; RUN: cat %S/floating-point-constants.ll %s | opt -passes=instcombine -S | FileCheck %s | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There's no reason to use cat in tests
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I did it that way so I didn't have to copy-paste floating point constants everywhere, and could instead pull in the values from the If it feels too strange, I could copy what other lit tests do. I see other tests like ilogb folding hardcode the constants for example. |
||||||
|
|
||||||
| declare double @nextafter(double, double) #0 | ||||||
| declare float @nextafterf(float, float) #0 | ||||||
|
|
||||||
| attributes #0 = { willreturn memory(errnomem: write) } | ||||||
|
||||||
|
|
||||||
| define double @nextafter_up_direction() { | ||||||
| ; CHECK-LABEL: define double @nextafter_up_direction() { | ||||||
| ; CHECK-NEXT: ret double 0x3FF0000000000001 | ||||||
| ; | ||||||
| %next = call double @nextafter(double 1.0, double 2.0) | ||||||
| ret double %next | ||||||
| } | ||||||
|
|
||||||
| define float @nextafterf_up_direction() { | ||||||
| ; CHECK-LABEL: define float @nextafterf_up_direction() { | ||||||
| ; CHECK-NEXT: ret float 0x3FF0000020000000 | ||||||
| ; | ||||||
| %next = call float @nextafterf(float 1.0, float 2.0) | ||||||
| ret float %next | ||||||
| } | ||||||
|
|
||||||
| define double @nextafter_down_direction() { | ||||||
| ; CHECK-LABEL: define double @nextafter_down_direction() { | ||||||
| ; CHECK-NEXT: ret double 0x3FEFFFFFFFFFFFFF | ||||||
| ; | ||||||
| %next = call double @nextafter(double 1.0, double 0.0) | ||||||
| ret double %next | ||||||
| } | ||||||
|
|
||||||
| define float @nextafterf_down_direction() { | ||||||
| ; CHECK-LABEL: define float @nextafterf_down_direction() { | ||||||
| ; CHECK-NEXT: ret float 0x3FEFFFFFE0000000 | ||||||
| ; | ||||||
| %next = call float @nextafterf(float 1.0, float 0.0) | ||||||
| ret float %next | ||||||
| } | ||||||
|
|
||||||
| define double @nextafter_equal_args() { | ||||||
| ; CHECK-LABEL: define double @nextafter_equal_args() { | ||||||
| ; CHECK-NEXT: ret double 1.000000e+00 | ||||||
| ; | ||||||
| %next = call double @nextafter(double 1.0, double 1.0) | ||||||
| ret double %next | ||||||
| } | ||||||
|
|
||||||
| define float @nextafterf_equal_args() { | ||||||
| ; CHECK-LABEL: define float @nextafterf_equal_args() { | ||||||
| ; CHECK-NEXT: ret float 1.000000e+00 | ||||||
| ; | ||||||
| %next = call float @nextafterf(float 1.0, float 1.0) | ||||||
| ret float %next | ||||||
| } | ||||||
|
|
||||||
| define double @nextafter_nan_with_payload() { | ||||||
| ; CHECK-LABEL: define double @nextafter_nan_with_payload() { | ||||||
| ; CHECK-NEXT: ret double 0x7FF8000000000001 | ||||||
| ; | ||||||
| %nan = load double, double* @dbl_nan | ||||||
| %tmp1 = bitcast double %nan to i64 | ||||||
| %tmp2 = or i64 %tmp1, 1 | ||||||
| %nan_with_payload = bitcast i64 %tmp2 to double | ||||||
| %next = call double @nextafter(double %nan_with_payload, double 1.0) | ||||||
| ret double %next | ||||||
|
|
||||||
| } | ||||||
|
|
||||||
| define float @nextafterf_nan_with_payload() { | ||||||
| ; CHECK-LABEL: define float @nextafterf_nan_with_payload() { | ||||||
| ; CHECK-NEXT: ret float 0x7FF8000020000000 | ||||||
| ; | ||||||
| %nan = load float, float* @flt_nan | ||||||
| %tmp1 = bitcast float %nan to i32 | ||||||
| %tmp2 = or i32 %tmp1, 1 | ||||||
| %nan_with_payload = bitcast i32 %tmp2 to float | ||||||
| %next = call float @nextafterf(float %nan_with_payload, float 1.0) | ||||||
| ret float %next | ||||||
| } | ||||||
|
|
||||||
| define double @nextafter_pos_overflow () { | ||||||
| ; CHECK-LABEL: define double @nextafter_pos_overflow() { | ||||||
| ; CHECK-NEXT: [[NEXT:%.*]] = call double @nextafter(double 0x7FEFFFFFFFFFFFFF, double 0x7FF0000000000000) | ||||||
| ; CHECK-NEXT: ret double 0x7FF0000000000000 | ||||||
| ; | ||||||
| %arg1 = load double, double* @dbl_pos_max | ||||||
| %arg2 = load double, double* @dbl_pos_infinity | ||||||
| %next = call double @nextafter(double %arg1, double %arg2) | ||||||
| ret double %next | ||||||
| } | ||||||
|
|
||||||
| define float @nextafterf_pos_overflow() { | ||||||
| ; CHECK-LABEL: define float @nextafterf_pos_overflow() { | ||||||
| ; CHECK-NEXT: [[NEXT:%.*]] = call float @nextafterf(float 0x47EFFFFFE0000000, float 0x7FF0000000000000) | ||||||
| ; CHECK-NEXT: ret float 0x7FF0000000000000 | ||||||
| ; | ||||||
| %arg1 = load float, float* @flt_pos_max | ||||||
| %arg2 = load float, float* @flt_pos_infinity | ||||||
| %next = call float @nextafterf(float %arg1, float %arg2) | ||||||
| ret float %next | ||||||
| } | ||||||
|
|
||||||
| define double @nextafter_neg_overflow() { | ||||||
| ; CHECK-LABEL: define double @nextafter_neg_overflow() { | ||||||
| ; CHECK-NEXT: [[NEXT:%.*]] = call double @nextafter(double 0xFFEFFFFFFFFFFFFF, double 0xFFF0000000000000) | ||||||
| ; CHECK-NEXT: ret double 0xFFF0000000000000 | ||||||
| ; | ||||||
| %arg1 = load double, double* @dbl_neg_max | ||||||
| %arg2 = load double, double* @dbl_neg_infinity | ||||||
| %next = call double @nextafter(double %arg1, double %arg2) | ||||||
| ret double %next | ||||||
| } | ||||||
|
|
||||||
| define float @nextafterf_neg_overflow() { | ||||||
| ; CHECK-LABEL: define float @nextafterf_neg_overflow() { | ||||||
| ; CHECK-NEXT: [[NEXT:%.*]] = call float @nextafterf(float 0xC7EFFFFFE0000000, float 0xFFF0000000000000) | ||||||
| ; CHECK-NEXT: ret float 0xFFF0000000000000 | ||||||
| ; | ||||||
| %arg1 = load float, float* @flt_neg_max | ||||||
| %arg2 = load float, float* @flt_neg_infinity | ||||||
| %next = call float @nextafterf(float %arg1, float %arg2) | ||||||
| ret float %next | ||||||
| } | ||||||
|
|
||||||
| define double @nextafter_zero_from_above() { | ||||||
| ; CHECK-LABEL: define double @nextafter_zero_from_above() { | ||||||
| ; CHECK-NEXT: [[NEXT:%.*]] = call double @nextafter(double 4.940660e-324, double 0.000000e+00) | ||||||
| ; CHECK-NEXT: ret double 0.000000e+00 | ||||||
| ; | ||||||
| %arg = load double, double* @dbl_pos_min_subnormal | ||||||
| %next = call double @nextafter(double %arg, double 0.0) | ||||||
| ret double %next | ||||||
| } | ||||||
|
|
||||||
| define float @nextafterf_zero_from_above() { | ||||||
| ; CHECK-LABEL: define float @nextafterf_zero_from_above() { | ||||||
| ; CHECK-NEXT: [[NEXT:%.*]] = call float @nextafterf(float 0x36A0000000000000, float 0.000000e+00) | ||||||
| ; CHECK-NEXT: ret float 0.000000e+00 | ||||||
| ; | ||||||
| %arg = load float, float* @flt_pos_min_subnormal | ||||||
| %next = call float @nextafterf(float %arg, float 0.0) | ||||||
| ret float %next | ||||||
| } | ||||||
|
|
||||||
| define double @nextafter_zero_from_below() { | ||||||
| ; CHECK-LABEL: define double @nextafter_zero_from_below() { | ||||||
| ; CHECK-NEXT: [[NEXT:%.*]] = call double @nextafter(double -4.940660e-324, double 0.000000e+00) | ||||||
| ; CHECK-NEXT: ret double -0.000000e+00 | ||||||
| ; | ||||||
| %arg = load double, double* @dbl_neg_min_subnormal | ||||||
| %next = call double @nextafter(double %arg, double 0.0) | ||||||
| ret double %next | ||||||
| } | ||||||
|
|
||||||
| define float @nextafterf_zero_from_below() { | ||||||
| ; CHECK-LABEL: define float @nextafterf_zero_from_below() { | ||||||
| ; CHECK-NEXT: [[NEXT:%.*]] = call float @nextafterf(float 0xB6A0000000000000, float 0.000000e+00) | ||||||
| ; CHECK-NEXT: ret float -0.000000e+00 | ||||||
| ; | ||||||
| %arg = load float, float* @flt_neg_min_subnormal | ||||||
| %next = call float @nextafterf(float %arg, float 0.0) | ||||||
| ret float %next | ||||||
| } | ||||||
|
|
||||||
| define double @nextafter_subnormal() { | ||||||
| ; CHECK-LABEL: define double @nextafter_subnormal() { | ||||||
| ; CHECK-NEXT: [[NEXT:%.*]] = call double @nextafter(double 4.940660e-324, double 0x7FF0000000000000) | ||||||
| ; CHECK-NEXT: ret double 9.881310e-324 | ||||||
| ; | ||||||
| %subnormal = load double, double* @dbl_pos_min_subnormal | ||||||
| %infinity = load double, double* @dbl_pos_infinity | ||||||
| %next = call double @nextafter(double %subnormal, double %infinity) | ||||||
| ret double %next | ||||||
| } | ||||||
|
|
||||||
| define float @nextafterf_subnormal() { | ||||||
| ; CHECK-LABEL: define float @nextafterf_subnormal() { | ||||||
| ; CHECK-NEXT: [[NEXT:%.*]] = call float @nextafterf(float 0x36A0000000000000, float 0x7FF0000000000000) | ||||||
| ; CHECK-NEXT: ret float 0x36B0000000000000 | ||||||
| ; | ||||||
| %subnormal = load float, float* @flt_pos_min_subnormal | ||||||
| %infinity = load float, float* @flt_pos_infinity | ||||||
| %next = call float @nextafterf(float %subnormal, float %infinity) | ||||||
| ret float %next | ||||||
| } | ||||||
|
|
||||||
| define double @nextafter_poison() { | ||||||
| ; CHECK-LABEL: define double @nextafter_poison() { | ||||||
| ; CHECK-NEXT: [[NEXT:%.*]] = call double @nextafter(double poison, double 1.000000e+00) | ||||||
| ; CHECK-NEXT: ret double [[NEXT]] | ||||||
| ; | ||||||
| %next = call double @nextafter(double poison, double 1.0) | ||||||
| ret double %next | ||||||
| } | ||||||
|
|
||||||
| define double @nextafterf_poison() { | ||||||
| ; CHECK-LABEL: define double @nextafterf_poison() { | ||||||
| ; CHECK-NEXT: [[NEXT:%.*]] = call double @nextafterf(float poison, float 1.000000e+00) | ||||||
| ; CHECK-NEXT: ret double [[NEXT]] | ||||||
| ; | ||||||
| %next = call double @nextafterf(float poison, float 1.0) | ||||||
| ret double %next | ||||||
| } | ||||||
|
|
||||||
| define double @nextafter_subnormal_readnone() { | ||||||
| ; CHECK-LABEL: define double @nextafter_subnormal_readnone() { | ||||||
| ; CHECK-NEXT: [[NEXT:%.*]] = call double @nextafter(double 4.940660e-324, double 0x7FF0000000000000) #[[ATTR1:[0-9]+]] | ||||||
| ; CHECK-NEXT: ret double 9.881310e-324 | ||||||
| ; | ||||||
| %subnormal = load double, double* @dbl_pos_min_subnormal | ||||||
| %infinity = load double, double* @dbl_pos_infinity | ||||||
| %next = call double @nextafter(double %subnormal, double %infinity) readnone | ||||||
| ret double %next | ||||||
| } | ||||||
|
|
||||||
| define float @nextafterf_subnormal_readnone() { | ||||||
| ; CHECK-LABEL: define float @nextafterf_subnormal_readnone() { | ||||||
| ; CHECK-NEXT: [[NEXT:%.*]] = call float @nextafterf(float 0x36A0000000000000, float 0x7FF0000000000000) #[[ATTR1]] | ||||||
| ; CHECK-NEXT: ret float 0x36B0000000000000 | ||||||
| ; | ||||||
| %subnormal = load float, float* @flt_pos_min_subnormal | ||||||
| %infinity = load float, float* @flt_pos_infinity | ||||||
| %next = call float @nextafterf(float %subnormal, float %infinity) readnone | ||||||
| ret float %next | ||||||
| } | ||||||
Uh oh!
There was an error while loading. Please reload this page.