| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 |
| ; RUN: opt < %s -passes=instcombine -S | FileCheck %s |
| |
| define float @tanAtanInverseFast(float %x) { |
| ; CHECK-LABEL: define float @tanAtanInverseFast( |
| ; CHECK-SAME: float [[X:%.*]]) { |
| ; CHECK-NEXT: [[CALL:%.*]] = call fast float @atanf(float [[X]]) |
| ; CHECK-NEXT: ret float [[X]] |
| ; |
| %call = call fast float @atanf(float %x) |
| %call1 = call fast float @tanf(float %call) |
| ret float %call1 |
| } |
| |
| define float @atanhTanhInverseFast(float %x) { |
| ; CHECK-LABEL: define float @atanhTanhInverseFast( |
| ; CHECK-SAME: float [[X:%.*]]) { |
| ; CHECK-NEXT: [[CALL:%.*]] = call fast float @tanhf(float [[X]]) |
| ; CHECK-NEXT: ret float [[X]] |
| ; |
| %call = call fast float @tanhf(float %x) |
| %call1 = call fast float @atanhf(float %call) |
| ret float %call1 |
| } |
| |
| define float @sinhAsinhInverseFast(float %x) { |
| ; CHECK-LABEL: define float @sinhAsinhInverseFast( |
| ; CHECK-SAME: float [[X:%.*]]) { |
| ; CHECK-NEXT: [[CALL:%.*]] = call fast float @asinhf(float [[X]]) |
| ; CHECK-NEXT: ret float [[X]] |
| ; |
| %call = call fast float @asinhf(float %x) |
| %call1 = call fast float @sinhf(float %call) |
| ret float %call1 |
| } |
| |
| define float @asinhSinhInverseFast(float %x) { |
| ; CHECK-LABEL: define float @asinhSinhInverseFast( |
| ; CHECK-SAME: float [[X:%.*]]) { |
| ; CHECK-NEXT: [[CALL:%.*]] = call fast float @sinhf(float [[X]]) |
| ; CHECK-NEXT: ret float [[X]] |
| ; |
| %call = call fast float @sinhf(float %x) |
| %call1 = call fast float @asinhf(float %call) |
| ret float %call1 |
| } |
| |
| define float @coshAcoshInverseFast(float %x) { |
| ; CHECK-LABEL: define float @coshAcoshInverseFast( |
| ; CHECK-SAME: float [[X:%.*]]) { |
| ; CHECK-NEXT: [[CALL:%.*]] = call fast float @acoshf(float [[X]]) |
| ; CHECK-NEXT: ret float [[X]] |
| ; |
| %call = call fast float @acoshf(float %x) |
| %call1 = call fast float @coshf(float %call) |
| ret float %call1 |
| } |
| |
| define float @indirectTanCall(ptr %fptr) { |
| ; CHECK-LABEL: define float @indirectTanCall( |
| ; CHECK-SAME: ptr [[FPTR:%.*]]) { |
| ; CHECK-NEXT: [[CALL1:%.*]] = call fast float [[FPTR]]() |
| ; CHECK-NEXT: [[TAN:%.*]] = call fast float @tanf(float [[CALL1]]) |
| ; CHECK-NEXT: ret float [[TAN]] |
| ; |
| %call1 = call fast float %fptr() |
| %tan = call fast float @tanf(float %call1) |
| ret float %tan |
| } |
| |
| ; No fast-math. |
| |
| define float @tanAtanInverse(float %x) { |
| ; CHECK-LABEL: define float @tanAtanInverse( |
| ; CHECK-SAME: float [[X:%.*]]) { |
| ; CHECK-NEXT: [[CALL:%.*]] = call float @atanf(float [[X]]) |
| ; CHECK-NEXT: [[CALL1:%.*]] = call float @tanf(float [[CALL]]) |
| ; CHECK-NEXT: ret float [[CALL1]] |
| ; |
| %call = call float @atanf(float %x) |
| %call1 = call float @tanf(float %call) |
| ret float %call1 |
| } |
| |
| define float @atanhTanhInverse(float %x) { |
| ; CHECK-LABEL: define float @atanhTanhInverse( |
| ; CHECK-SAME: float [[X:%.*]]) { |
| ; CHECK-NEXT: [[CALL:%.*]] = call float @tanhf(float [[X]]) |
| ; CHECK-NEXT: [[CALL1:%.*]] = call float @atanhf(float [[CALL]]) |
| ; CHECK-NEXT: ret float [[CALL1]] |
| ; |
| %call = call float @tanhf(float %x) |
| %call1 = call float @atanhf(float %call) |
| ret float %call1 |
| } |
| |
| define float @sinhAsinhInverse(float %x) { |
| ; CHECK-LABEL: define float @sinhAsinhInverse( |
| ; CHECK-SAME: float [[X:%.*]]) { |
| ; CHECK-NEXT: [[CALL:%.*]] = call float @asinhf(float [[X]]) |
| ; CHECK-NEXT: [[CALL1:%.*]] = call float @sinhf(float [[CALL]]) |
| ; CHECK-NEXT: ret float [[CALL1]] |
| ; |
| %call = call float @asinhf(float %x) |
| %call1 = call float @sinhf(float %call) |
| ret float %call1 |
| } |
| |
| define float @asinhSinhInverse(float %x) { |
| ; CHECK-LABEL: define float @asinhSinhInverse( |
| ; CHECK-SAME: float [[X:%.*]]) { |
| ; CHECK-NEXT: [[CALL:%.*]] = call float @sinhf(float [[X]]) |
| ; CHECK-NEXT: [[CALL1:%.*]] = call float @asinhf(float [[CALL]]) |
| ; CHECK-NEXT: ret float [[CALL1]] |
| ; |
| %call = call float @sinhf(float %x) |
| %call1 = call float @asinhf(float %call) |
| ret float %call1 |
| } |
| |
| define float @coshAcoshInverse(float %x) { |
| ; CHECK-LABEL: define float @coshAcoshInverse( |
| ; CHECK-SAME: float [[X:%.*]]) { |
| ; CHECK-NEXT: [[CALL:%.*]] = call float @acoshf(float [[X]]) |
| ; CHECK-NEXT: [[CALL1:%.*]] = call float @coshf(float [[CALL]]) |
| ; CHECK-NEXT: ret float [[CALL1]] |
| ; |
| %call = call float @acoshf(float %x) |
| %call1 = call float @coshf(float %call) |
| ret float %call1 |
| } |
| |
| declare float @asinhf(float) |
| declare float @sinhf(float) |
| declare float @acoshf(float) |
| declare float @coshf(float) |
| declare float @tanhf(float) |
| declare float @atanhf(float) |
| declare float @tanf(float) |
| declare float @atanf(float) |