From: Sanjay Patel Date: Fri, 5 Apr 2019 16:52:57 +0000 (+0000) Subject: [InstCombine] add tests for sqrt+fdiv+fmul; NFC X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2ad261a6920f1cbdcef0dccbb7058937b44a0656;p=llvm [InstCombine] add tests for sqrt+fdiv+fmul; NFC Examples based on recent llvm-dev thread. These are specific patterns of more general enhancements that would solve these. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@357780 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/Transforms/InstCombine/fmul-sqrt.ll b/test/Transforms/InstCombine/fmul-sqrt.ll index 61d98c7972c..8161e311ffd 100644 --- a/test/Transforms/InstCombine/fmul-sqrt.ll +++ b/test/Transforms/InstCombine/fmul-sqrt.ll @@ -2,6 +2,7 @@ ; RUN: opt -S -instcombine < %s | FileCheck %s declare double @llvm.sqrt.f64(double) nounwind readnone speculatable +declare <2 x float> @llvm.sqrt.v2f32(<2 x float>) declare void @use(double) ; sqrt(a) * sqrt(b) no math flags @@ -87,3 +88,45 @@ define double @sqrt_a_sqrt_b_sqrt_c_sqrt_d_reassoc(double %a, double %b, double ret double %mul2 } +define double @sqrt_squared(double %x) { +; CHECK-LABEL: @sqrt_squared( +; CHECK-NEXT: [[SQRT:%.*]] = call fast double @llvm.sqrt.f64(double [[X:%.*]]) +; CHECK-NEXT: [[RSQRT:%.*]] = fdiv fast double 1.000000e+00, [[SQRT]] +; CHECK-NEXT: [[SQUARED:%.*]] = fmul fast double [[RSQRT]], [[RSQRT]] +; CHECK-NEXT: ret double [[SQUARED]] +; + %sqrt = call fast double @llvm.sqrt.f64(double %x) + %rsqrt = fdiv fast double 1.0, %sqrt + %squared = fmul fast double %rsqrt, %rsqrt + ret double %squared +} + +define double @sqrt_squared_extra_use(double %x) { +; CHECK-LABEL: @sqrt_squared_extra_use( +; CHECK-NEXT: [[SQRT:%.*]] = call fast double @llvm.sqrt.f64(double [[X:%.*]]) +; CHECK-NEXT: [[RSQRT:%.*]] = fdiv fast double 1.000000e+00, [[SQRT]] +; CHECK-NEXT: call void @use(double [[RSQRT]]) +; CHECK-NEXT: [[SQUARED:%.*]] = fmul fast double [[RSQRT]], [[RSQRT]] +; CHECK-NEXT: ret double [[SQUARED]] +; + %sqrt = call fast double @llvm.sqrt.f64(double %x) + %rsqrt = fdiv fast double 1.0, %sqrt + call void @use(double %rsqrt) + %squared = fmul fast double %rsqrt, %rsqrt + ret double %squared +} + +; Minimal FMF to reassociate fmul+fdiv. + +define <2 x float> @sqrt_squared_vec(<2 x float> %x) { +; CHECK-LABEL: @sqrt_squared_vec( +; CHECK-NEXT: [[SQRT:%.*]] = call <2 x float> @llvm.sqrt.v2f32(<2 x float> [[X:%.*]]) +; CHECK-NEXT: [[RSQRT:%.*]] = fdiv <2 x float> , [[SQRT]] +; CHECK-NEXT: [[SQUARED:%.*]] = fmul reassoc <2 x float> [[RSQRT]], [[RSQRT]] +; CHECK-NEXT: ret <2 x float> [[SQUARED]] +; + %sqrt = call <2 x float> @llvm.sqrt.v2f32(<2 x float> %x) + %rsqrt = fdiv <2 x float> , %sqrt + %squared = fmul reassoc <2 x float> %rsqrt, %rsqrt + ret <2 x float> %squared +}