61 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -disable-simplify-libcalls -passes=instcombine -S | FileCheck %s3 4declare double @llvm.pow.f64(double, double)5declare double @pow(double, double)6 7define double @sqrt_libcall(double %x) {8; CHECK-LABEL: @sqrt_libcall(9; CHECK-NEXT: [[RETVAL:%.*]] = call double @pow(double [[X:%.*]], double 5.000000e-01)10; CHECK-NEXT: ret double [[RETVAL]]11;12 %retval = call double @pow(double %x, double 0.5)13 ret double %retval14}15 16define double @sqrt_intrinsic(double %x) {17; CHECK-LABEL: @sqrt_intrinsic(18; CHECK-NEXT: [[SQRT:%.*]] = call double @llvm.sqrt.f64(double [[X:%.*]])19; CHECK-NEXT: [[ABS:%.*]] = call double @llvm.fabs.f64(double [[SQRT]])20; CHECK-NEXT: [[ISINF:%.*]] = fcmp oeq double [[X]], 0xFFF000000000000021; CHECK-NEXT: [[RETVAL:%.*]] = select i1 [[ISINF]], double 0x7FF0000000000000, double [[ABS]]22; CHECK-NEXT: ret double [[RETVAL]]23;24 %retval = call double @llvm.pow.f64(double %x, double 0.5)25 ret double %retval26}27 28; Shrinking is disabled too.29 30define float @shrink_libcall(float %f, float %g) {31; CHECK-LABEL: @shrink_libcall(32; CHECK-NEXT: [[DF:%.*]] = fpext float [[F:%.*]] to double33; CHECK-NEXT: [[DG:%.*]] = fpext float [[G:%.*]] to double34; CHECK-NEXT: [[CALL:%.*]] = call fast double @pow(double [[DF]], double [[DG]])35; CHECK-NEXT: [[FR:%.*]] = fptrunc double [[CALL]] to float36; CHECK-NEXT: ret float [[FR]]37;38 %df = fpext float %f to double39 %dg = fpext float %g to double40 %call = call fast double @pow(double %df, double %dg)41 %fr = fptrunc double %call to float42 ret float %fr43}44 45; Shrinking is disabled for the intrinsic too.46 47define float @shrink_intrinsic(float %f, float %g) {48; CHECK-LABEL: @shrink_intrinsic(49; CHECK-NEXT: [[DF:%.*]] = fpext float [[F:%.*]] to double50; CHECK-NEXT: [[DG:%.*]] = fpext float [[G:%.*]] to double51; CHECK-NEXT: [[CALL:%.*]] = call fast double @llvm.pow.f64(double [[DF]], double [[DG]])52; CHECK-NEXT: [[FR:%.*]] = fptrunc double [[CALL]] to float53; CHECK-NEXT: ret float [[FR]]54;55 %df = fpext float %f to double56 %dg = fpext float %g to double57 %call = call fast double @llvm.pow.f64(double %df, double %dg)58 %fr = fptrunc double %call to float59 ret float %fr60}61