| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | |
| ; RUN: opt -passes=early-cse -earlycse-debug-hash -S -o - %s | FileCheck %s | |
| declare double @atan2(double, double) #0 | |
| define double @f_atan2() { | |
| ; CHECK-LABEL: @f_atan2( | |
| ; CHECK-NEXT: ret double f0x3FDDAC6{{.+}} | |
| ; | |
| %res = tail call fast double @atan2(double 1.0, double 2.0) | |
| ret double %res | |
| } | |
| declare float @fmodf(float, float) #0 | |
| define float @f_fmodf() { | |
| ; CHECK-LABEL: @f_fmodf( | |
| ; CHECK-NEXT: ret float 1.000000e+00 | |
| ; | |
| %res = tail call fast float @fmodf(float 1.0, float 2.0) | |
| ret float %res | |
| } | |
| declare float @remainderf(float, float) #0 | |
| define float @f_remainderf_fold1() { | |
| ; CHECK-LABEL: @f_remainderf_fold1( | |
| ; CHECK-NEXT: ret float 1.000000e+00 | |
| ; | |
| %res = tail call fast float @remainderf(float 1.0, float 2.0) | |
| ret float %res | |
| } | |
| define float @f_remainderf_fold2() { | |
| ; CHECK-LABEL: @f_remainderf_fold2( | |
| ; CHECK-NEXT: ret float -5.000000e-01 | |
| ; | |
| %res = tail call fast float @remainderf(float 1.5, float 1.0) | |
| ret float %res | |
| } | |
| define float @f_remainderf_nofold() { | |
| ; CHECK-LABEL: @f_remainderf_nofold( | |
| ; CHECK-NEXT: [[RES:%.*]] = tail call fast float @remainderf(float 1.000000e+00, float 0.000000e+00) | |
| ; CHECK-NEXT: ret float [[RES]] | |
| ; | |
| %res = tail call fast float @remainderf(float 1.0, float 0.0) | |
| ret float %res | |
| } | |
| declare double @remainder(double, double) #0 | |
| define double @f_remainder_fold1() { | |
| ; CHECK-LABEL: @f_remainder_fold1( | |
| ; CHECK-NEXT: ret double 1.000000e+00 | |
| ; | |
| %res = tail call fast double @remainder(double 1.0, double 2.0) | |
| ret double %res | |
| } | |
| define double @f_remainder_fold2() { | |
| ; CHECK-LABEL: @f_remainder_fold2( | |
| ; CHECK-NEXT: ret double -5.000000e-01 | |
| ; | |
| %res = tail call fast double @remainder(double 1.5, double 1.0) | |
| ret double %res | |
| } | |
| define double @f_remainder_nofold() { | |
| ; CHECK-LABEL: @f_remainder_nofold( | |
| ; CHECK-NEXT: [[RES:%.*]] = tail call fast double @remainder(double 1.000000e+00, double 0.000000e+00) | |
| ; CHECK-NEXT: ret double [[RES]] | |
| ; | |
| %res = tail call fast double @remainder(double 1.0, double 0.0) | |
| ret double %res | |
| } | |
| declare double @pow(double, double) #0 | |
| define double @f_pow() { | |
| ; CHECK-LABEL: @f_pow( | |
| ; CHECK-NEXT: ret double 1.000000e+00 | |
| ; | |
| %res = tail call fast double @pow(double 1.0, double 2.0) | |
| ret double %res | |
| } | |
| declare float @llvm.pow.f32(float, float) | |
| define float @i_powf() { | |
| ; CHECK-LABEL: @i_powf( | |
| ; CHECK-NEXT: ret float 1.000000e+00 | |
| ; | |
| %res = tail call fast float @llvm.pow.f32(float 1.0, float 2.0) | |
| ret float %res | |
| } | |
| declare double @llvm.powi.f64.i32(double, i32) | |
| define double @i_powi() { | |
| ; CHECK-LABEL: @i_powi( | |
| ; CHECK-NEXT: ret double 1.000000e+00 | |
| ; | |
| %res = tail call fast double @llvm.powi.f64.i32(double 1.0, i32 2) | |
| ret double %res | |
| } | |
| ; Make sure that the type is correct after constant folding | |
| define half @pr98665() { | |
| ; CHECK-LABEL: @pr98665( | |
| ; CHECK-NEXT: ret half 1.000000e+00 | |
| ; | |
| %x = call half @llvm.powi.f16.i32(half 0xH3C00, i32 1) | |
| ret half %x | |
| } | |
| define float @powi_f32() { | |
| ; CHECK-LABEL: @powi_f32( | |
| ; CHECK-NEXT: ret float 0.000000e+00 | |
| ; | |
| %y = call float @llvm.powi.f32.i32(float 0.0, i32 10) | |
| ret float %y | |
| } | |
| attributes #0 = { nofree nounwind willreturn } |