Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 1 | ; NOTE: Assertions have been autogenerated by update_test_checks.py |
Michael Ilseman | 6cdacff | 2012-11-27 01:00:22 +0000 | [diff] [blame] | 2 | ; RUN: opt < %s -instsimplify -S | FileCheck %s |
| 3 | |
| 4 | ;; x * 0 ==> 0 when no-nans and no-signed-zero |
Michael Ilseman | 6cdacff | 2012-11-27 01:00:22 +0000 | [diff] [blame] | 5 | define float @mul_zero_1(float %a) { |
Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 6 | ; CHECK-LABEL: @mul_zero_1( |
| 7 | ; CHECK: ret float 0.000000e+00 |
| 8 | ; |
Michael Ilseman | 6cdacff | 2012-11-27 01:00:22 +0000 | [diff] [blame] | 9 | %b = fmul nsz nnan float %a, 0.0 |
Michael Ilseman | 6cdacff | 2012-11-27 01:00:22 +0000 | [diff] [blame] | 10 | ret float %b |
| 11 | } |
Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 12 | |
Michael Ilseman | 6cdacff | 2012-11-27 01:00:22 +0000 | [diff] [blame] | 13 | define float @mul_zero_2(float %a) { |
Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 14 | ; CHECK-LABEL: @mul_zero_2( |
| 15 | ; CHECK: ret float 0.000000e+00 |
| 16 | ; |
Michael Ilseman | 6cdacff | 2012-11-27 01:00:22 +0000 | [diff] [blame] | 17 | %b = fmul fast float 0.0, %a |
Michael Ilseman | 6cdacff | 2012-11-27 01:00:22 +0000 | [diff] [blame] | 18 | ret float %b |
| 19 | } |
| 20 | |
| 21 | ;; x * 0 =/=> 0 when there could be nans or -0 |
Michael Ilseman | 6cdacff | 2012-11-27 01:00:22 +0000 | [diff] [blame] | 22 | define float @no_mul_zero_1(float %a) { |
Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 23 | ; CHECK-LABEL: @no_mul_zero_1( |
| 24 | ; CHECK: [[B:%.*]] = fmul nsz float %a, 0.000000e+00 |
| 25 | ; CHECK-NEXT: ret float [[B]] |
| 26 | ; |
Michael Ilseman | 6cdacff | 2012-11-27 01:00:22 +0000 | [diff] [blame] | 27 | %b = fmul nsz float %a, 0.0 |
Michael Ilseman | 6cdacff | 2012-11-27 01:00:22 +0000 | [diff] [blame] | 28 | ret float %b |
| 29 | } |
Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 30 | |
Michael Ilseman | 6cdacff | 2012-11-27 01:00:22 +0000 | [diff] [blame] | 31 | define float @no_mul_zero_2(float %a) { |
Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 32 | ; CHECK-LABEL: @no_mul_zero_2( |
| 33 | ; CHECK: [[B:%.*]] = fmul nnan float %a, 0.000000e+00 |
| 34 | ; CHECK-NEXT: ret float [[B]] |
| 35 | ; |
Michael Ilseman | 6cdacff | 2012-11-27 01:00:22 +0000 | [diff] [blame] | 36 | %b = fmul nnan float %a, 0.0 |
Michael Ilseman | 6cdacff | 2012-11-27 01:00:22 +0000 | [diff] [blame] | 37 | ret float %b |
| 38 | } |
Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 39 | |
Michael Ilseman | 6cdacff | 2012-11-27 01:00:22 +0000 | [diff] [blame] | 40 | define float @no_mul_zero_3(float %a) { |
Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 41 | ; CHECK-LABEL: @no_mul_zero_3( |
| 42 | ; CHECK: [[B:%.*]] = fmul float %a, 0.000000e+00 |
| 43 | ; CHECK-NEXT: ret float [[B]] |
| 44 | ; |
Michael Ilseman | 6cdacff | 2012-11-27 01:00:22 +0000 | [diff] [blame] | 45 | %b = fmul float %a, 0.0 |
Michael Ilseman | 6cdacff | 2012-11-27 01:00:22 +0000 | [diff] [blame] | 46 | ret float %b |
| 47 | } |
Michael Ilseman | bb6f691 | 2012-12-12 00:27:46 +0000 | [diff] [blame] | 48 | |
| 49 | ; fadd [nnan ninf] X, (fsub [nnan ninf] 0, X) ==> 0 |
| 50 | ; where nnan and ninf have to occur at least once somewhere in this |
| 51 | ; expression |
Michael Ilseman | bb6f691 | 2012-12-12 00:27:46 +0000 | [diff] [blame] | 52 | define float @fadd_fsub_0(float %a) { |
Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 53 | ; CHECK-LABEL: @fadd_fsub_0( |
| 54 | ; CHECK: [[NOFOLD:%.*]] = fsub float 0.000000e+00, %a |
| 55 | ; CHECK-NEXT: [[NO_ZERO:%.*]] = fadd nnan float [[NOFOLD]], %a |
| 56 | ; CHECK-NEXT: ret float [[NO_ZERO]] |
| 57 | ; |
Michael Ilseman | bb6f691 | 2012-12-12 00:27:46 +0000 | [diff] [blame] | 58 | ; X + -X ==> 0 |
| 59 | %t1 = fsub nnan ninf float 0.0, %a |
| 60 | %zero1 = fadd nnan ninf float %t1, %a |
| 61 | |
| 62 | %t2 = fsub nnan float 0.0, %a |
| 63 | %zero2 = fadd ninf float %t2, %a |
| 64 | |
| 65 | %t3 = fsub nnan ninf float 0.0, %a |
| 66 | %zero3 = fadd float %t3, %a |
| 67 | |
| 68 | %t4 = fsub float 0.0, %a |
| 69 | %zero4 = fadd nnan ninf float %t4, %a |
| 70 | |
| 71 | ; Dont fold this |
Michael Ilseman | bb6f691 | 2012-12-12 00:27:46 +0000 | [diff] [blame] | 72 | %nofold = fsub float 0.0, %a |
Michael Ilseman | bb6f691 | 2012-12-12 00:27:46 +0000 | [diff] [blame] | 73 | %no_zero = fadd nnan float %nofold, %a |
| 74 | |
| 75 | ; Coalesce the folded zeros |
| 76 | %zero5 = fadd float %zero1, %zero2 |
| 77 | %zero6 = fadd float %zero3, %zero4 |
| 78 | %zero7 = fadd float %zero5, %zero6 |
| 79 | |
| 80 | ; Should get folded |
| 81 | %ret = fadd nsz float %no_zero, %zero7 |
| 82 | |
Michael Ilseman | bb6f691 | 2012-12-12 00:27:46 +0000 | [diff] [blame] | 83 | ret float %ret |
| 84 | } |
| 85 | |
Benjamin Kramer | 228680d | 2015-06-14 21:01:20 +0000 | [diff] [blame] | 86 | ; fsub nnan x, x ==> 0.0 |
Michael Ilseman | bb6f691 | 2012-12-12 00:27:46 +0000 | [diff] [blame] | 87 | define float @fsub_x_x(float %a) { |
Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 88 | ; CHECK-LABEL: @fsub_x_x( |
| 89 | ; CHECK: [[NO_ZERO1:%.*]] = fsub ninf float %a, %a |
| 90 | ; CHECK-NEXT: [[NO_ZERO2:%.*]] = fsub float %a, %a |
| 91 | ; CHECK-NEXT: [[NO_ZERO:%.*]] = fadd float [[NO_ZERO1:%.*]], [[NO_ZERO2:%.*]] |
| 92 | ; CHECK-NEXT: ret float [[NO_ZERO]] |
| 93 | ; |
Michael Ilseman | bb6f691 | 2012-12-12 00:27:46 +0000 | [diff] [blame] | 94 | ; X - X ==> 0 |
Benjamin Kramer | 228680d | 2015-06-14 21:01:20 +0000 | [diff] [blame] | 95 | %zero1 = fsub nnan float %a, %a |
Michael Ilseman | bb6f691 | 2012-12-12 00:27:46 +0000 | [diff] [blame] | 96 | |
| 97 | ; Dont fold |
Michael Ilseman | bb6f691 | 2012-12-12 00:27:46 +0000 | [diff] [blame] | 98 | %no_zero1 = fsub ninf float %a, %a |
Benjamin Kramer | 228680d | 2015-06-14 21:01:20 +0000 | [diff] [blame] | 99 | %no_zero2 = fsub float %a, %a |
Michael Ilseman | bb6f691 | 2012-12-12 00:27:46 +0000 | [diff] [blame] | 100 | %no_zero = fadd float %no_zero1, %no_zero2 |
| 101 | |
| 102 | ; Should get folded |
| 103 | %ret = fadd nsz float %no_zero, %zero1 |
| 104 | |
Michael Ilseman | bb6f691 | 2012-12-12 00:27:46 +0000 | [diff] [blame] | 105 | ret float %ret |
| 106 | } |
| 107 | |
Benjamin Kramer | 6bb1502 | 2016-02-29 12:18:25 +0000 | [diff] [blame] | 108 | ; fsub nsz 0.0, (fsub 0.0, X) ==> X |
Benjamin Kramer | 6bb1502 | 2016-02-29 12:18:25 +0000 | [diff] [blame] | 109 | define float @fsub_0_0_x(float %a) { |
Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 110 | ; CHECK-LABEL: @fsub_0_0_x( |
| 111 | ; CHECK: ret float %a |
| 112 | ; |
Benjamin Kramer | 6bb1502 | 2016-02-29 12:18:25 +0000 | [diff] [blame] | 113 | %t1 = fsub float 0.0, %a |
| 114 | %ret = fsub nsz float 0.0, %t1 |
Benjamin Kramer | 6bb1502 | 2016-02-29 12:18:25 +0000 | [diff] [blame] | 115 | ret float %ret |
| 116 | } |
| 117 | |
Michael Ilseman | bb6f691 | 2012-12-12 00:27:46 +0000 | [diff] [blame] | 118 | ; fadd nsz X, 0 ==> X |
Michael Ilseman | bb6f691 | 2012-12-12 00:27:46 +0000 | [diff] [blame] | 119 | define float @nofold_fadd_x_0(float %a) { |
Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 120 | ; CHECK-LABEL: @nofold_fadd_x_0( |
| 121 | ; CHECK: [[NO_ZERO1:%.*]] = fadd ninf float %a, 0.000000e+00 |
| 122 | ; CHECK-NEXT: [[NO_ZERO2:%.*]] = fadd nnan float %a, 0.000000e+00 |
| 123 | ; CHECK-NEXT: [[NO_ZERO:%.*]] = fadd float [[NO_ZERO1:%.*]], [[NO_ZERO2:%.*]] |
| 124 | ; CHECK-NEXT: ret float [[NO_ZERO]] |
| 125 | ; |
Michael Ilseman | bb6f691 | 2012-12-12 00:27:46 +0000 | [diff] [blame] | 126 | ; Dont fold |
Michael Ilseman | bb6f691 | 2012-12-12 00:27:46 +0000 | [diff] [blame] | 127 | %no_zero1 = fadd ninf float %a, 0.0 |
Michael Ilseman | bb6f691 | 2012-12-12 00:27:46 +0000 | [diff] [blame] | 128 | %no_zero2 = fadd nnan float %a, 0.0 |
Michael Ilseman | bb6f691 | 2012-12-12 00:27:46 +0000 | [diff] [blame] | 129 | %no_zero = fadd float %no_zero1, %no_zero2 |
Michael Ilseman | bb6f691 | 2012-12-12 00:27:46 +0000 | [diff] [blame] | 130 | ret float %no_zero |
| 131 | } |
Mehdi Amini | cd3ca6f | 2015-02-23 18:30:25 +0000 | [diff] [blame] | 132 | |
| 133 | ; fdiv nsz nnan 0, X ==> 0 |
| 134 | define double @fdiv_zero_by_x(double %X) { |
| 135 | ; CHECK-LABEL: @fdiv_zero_by_x( |
Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 136 | ; CHECK: ret double 0.000000e+00 |
| 137 | ; |
Mehdi Amini | cd3ca6f | 2015-02-23 18:30:25 +0000 | [diff] [blame] | 138 | ; 0 / X -> 0 |
| 139 | %r = fdiv nnan nsz double 0.0, %X |
| 140 | ret double %r |
Mehdi Amini | cd3ca6f | 2015-02-23 18:30:25 +0000 | [diff] [blame] | 141 | } |
Benjamin Kramer | 4f05246 | 2015-06-14 18:53:58 +0000 | [diff] [blame] | 142 | |
Benjamin Kramer | 1ee59cb | 2015-06-16 14:57:29 +0000 | [diff] [blame] | 143 | define float @fdiv_self(float %f) { |
Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 144 | ; CHECK-LABEL: @fdiv_self( |
| 145 | ; CHECK: ret float 1.000000e+00 |
| 146 | ; |
Benjamin Kramer | 1ee59cb | 2015-06-16 14:57:29 +0000 | [diff] [blame] | 147 | %div = fdiv nnan float %f, %f |
Benjamin Kramer | 4f05246 | 2015-06-14 18:53:58 +0000 | [diff] [blame] | 148 | ret float %div |
Benjamin Kramer | 4f05246 | 2015-06-14 18:53:58 +0000 | [diff] [blame] | 149 | } |
| 150 | |
Benjamin Kramer | 1ee59cb | 2015-06-16 14:57:29 +0000 | [diff] [blame] | 151 | define float @fdiv_self_invalid(float %f) { |
Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 152 | ; CHECK-LABEL: @fdiv_self_invalid( |
| 153 | ; CHECK: [[DIV:%.*]] = fdiv float %f, %f |
| 154 | ; CHECK-NEXT: ret float [[DIV]] |
| 155 | ; |
Benjamin Kramer | 4f05246 | 2015-06-14 18:53:58 +0000 | [diff] [blame] | 156 | %div = fdiv float %f, %f |
| 157 | ret float %div |
Benjamin Kramer | 4f05246 | 2015-06-14 18:53:58 +0000 | [diff] [blame] | 158 | } |
| 159 | |
Benjamin Kramer | 1ee59cb | 2015-06-16 14:57:29 +0000 | [diff] [blame] | 160 | define float @fdiv_neg1(float %f) { |
Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 161 | ; CHECK-LABEL: @fdiv_neg1( |
| 162 | ; CHECK: ret float -1.000000e+00 |
| 163 | ; |
Benjamin Kramer | 4f05246 | 2015-06-14 18:53:58 +0000 | [diff] [blame] | 164 | %neg = fsub fast float -0.000000e+00, %f |
| 165 | %div = fdiv nnan float %neg, %f |
| 166 | ret float %div |
Benjamin Kramer | 4f05246 | 2015-06-14 18:53:58 +0000 | [diff] [blame] | 167 | } |
| 168 | |
Benjamin Kramer | 1ee59cb | 2015-06-16 14:57:29 +0000 | [diff] [blame] | 169 | define float @fdiv_neg2(float %f) { |
Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 170 | ; CHECK-LABEL: @fdiv_neg2( |
| 171 | ; CHECK: ret float -1.000000e+00 |
| 172 | ; |
Benjamin Kramer | 1ee59cb | 2015-06-16 14:57:29 +0000 | [diff] [blame] | 173 | %neg = fsub fast float 0.000000e+00, %f |
| 174 | %div = fdiv nnan float %neg, %f |
| 175 | ret float %div |
Benjamin Kramer | 1ee59cb | 2015-06-16 14:57:29 +0000 | [diff] [blame] | 176 | } |
| 177 | |
| 178 | define float @fdiv_neg_invalid(float %f) { |
Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 179 | ; CHECK-LABEL: @fdiv_neg_invalid( |
| 180 | ; CHECK: [[NEG:%.*]] = fsub fast float -0.000000e+00, %f |
| 181 | ; CHECK-NEXT: [[DIV:%.*]] = fdiv float [[NEG]], %f |
| 182 | ; CHECK-NEXT: ret float [[DIV]] |
| 183 | ; |
Benjamin Kramer | 4f05246 | 2015-06-14 18:53:58 +0000 | [diff] [blame] | 184 | %neg = fsub fast float -0.000000e+00, %f |
| 185 | %div = fdiv float %neg, %f |
| 186 | ret float %div |
Benjamin Kramer | 4f05246 | 2015-06-14 18:53:58 +0000 | [diff] [blame] | 187 | } |
| 188 | |
Benjamin Kramer | 1ee59cb | 2015-06-16 14:57:29 +0000 | [diff] [blame] | 189 | define float @fdiv_neg_swapped1(float %f) { |
Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 190 | ; CHECK-LABEL: @fdiv_neg_swapped1( |
| 191 | ; CHECK: ret float -1.000000e+00 |
| 192 | ; |
Benjamin Kramer | 1ee59cb | 2015-06-16 14:57:29 +0000 | [diff] [blame] | 193 | %neg = fsub float -0.000000e+00, %f |
| 194 | %div = fdiv nnan float %f, %neg |
Benjamin Kramer | 4f05246 | 2015-06-14 18:53:58 +0000 | [diff] [blame] | 195 | ret float %div |
Benjamin Kramer | 1ee59cb | 2015-06-16 14:57:29 +0000 | [diff] [blame] | 196 | } |
| 197 | |
| 198 | define float @fdiv_neg_swapped2(float %f) { |
Sanjay Patel | 6963244 | 2016-03-25 20:12:25 +0000 | [diff] [blame] | 199 | ; CHECK-LABEL: @fdiv_neg_swapped2( |
| 200 | ; CHECK: ret float -1.000000e+00 |
| 201 | ; |
Benjamin Kramer | 1ee59cb | 2015-06-16 14:57:29 +0000 | [diff] [blame] | 202 | %neg = fsub float 0.000000e+00, %f |
| 203 | %div = fdiv nnan float %f, %neg |
| 204 | ret float %div |
Benjamin Kramer | 4f05246 | 2015-06-14 18:53:58 +0000 | [diff] [blame] | 205 | } |