78 lines · plain
1; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx| FileCheck %s2 3; Verify that we generate a single OR instruction for a scalar, vec128, and vec2564; FNABS(x) operation -> FNEG (FABS(x)).5; If the FABS() result isn't used, the AND instruction should be eliminated.6; PR20578: http://llvm.org/bugs/show_bug.cgi?id=205787 8define float @scalar_no_abs(float %a) {9; CHECK-LABEL: scalar_no_abs:10; CHECK: vorps11; CHECK-NEXT: retq12 %fabs = tail call float @fabsf(float %a) #113 %fsub = fsub float -0.0, %fabs14 ret float %fsub15}16 17define float @scalar_uses_abs(float %a) {18; CHECK-LABEL: scalar_uses_abs:19; CHECK-DAG: vandps20; CHECK-DAG: vorps21; CHECK: vmulss22; CHECK-NEXT: retq23 %fabs = tail call float @fabsf(float %a) #124 %fsub = fsub float -0.0, %fabs25 %fmul = fmul float %fsub, %fabs26 ret float %fmul27}28 29define <4 x float> @vector128_no_abs(<4 x float> %a) {30; CHECK-LABEL: vector128_no_abs:31; CHECK: vorps32; CHECK-NEXT: retq33 %fabs = tail call <4 x float> @llvm.fabs.v4f32(< 4 x float> %a) #134 %fsub = fsub <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>, %fabs35 ret <4 x float> %fsub36}37 38define <4 x float> @vector128_uses_abs(<4 x float> %a) {39; CHECK-LABEL: vector128_uses_abs:40; CHECK-DAG: vandps41; CHECK-DAG: vorps42; CHECK: vmulps43; CHECK-NEXT: retq44 %fabs = tail call <4 x float> @llvm.fabs.v4f32(<4 x float> %a) #145 %fsub = fsub <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>, %fabs46 %fmul = fmul <4 x float> %fsub, %fabs47 ret <4 x float> %fmul48}49 50define <8 x float> @vector256_no_abs(<8 x float> %a) {51; CHECK-LABEL: vector256_no_abs:52; CHECK: vorps53; CHECK-NEXT: retq54 %fabs = tail call <8 x float> @llvm.fabs.v8f32(< 8 x float> %a) #155 %fsub = fsub <8 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, %fabs56 ret <8 x float> %fsub57}58 59define <8 x float> @vector256_uses_abs(<8 x float> %a) {60; CHECK-LABEL: vector256_uses_abs:61; CHECK-DAG: vandps62; CHECK-DAG: vorps63; CHECK: vmulps64; CHECK-NEXT: retq65 %fabs = tail call <8 x float> @llvm.fabs.v8f32(<8 x float> %a) #166 %fsub = fsub <8 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, %fabs67 %fmul = fmul <8 x float> %fsub, %fabs68 ret <8 x float> %fmul69}70 71declare <4 x float> @llvm.fabs.v4f32(<4 x float> %p)72declare <8 x float> @llvm.fabs.v8f32(<8 x float> %p)73 74declare float @fabsf(float)75 76attributes #1 = { readnone }77 78