Index: llvm/trunk/lib/Target/ARM/ARMTargetTransformInfo.h =================================================================== --- llvm/trunk/lib/Target/ARM/ARMTargetTransformInfo.h +++ llvm/trunk/lib/Target/ARM/ARMTargetTransformInfo.h @@ -101,9 +101,9 @@ /// Floating-point computation using ARMv8 AArch32 Advanced /// SIMD instructions remains unchanged from ARMv7. Only AArch64 SIMD - /// is IEEE-754 compliant, but it's not covered in this target. + /// and Arm MVE are IEEE-754 compliant. bool isFPVectorizationPotentiallyUnsafe() { - return !ST->isTargetDarwin(); + return !ST->isTargetDarwin() && !ST->hasMVEFloatOps(); } /// \name Scalar TTI Implementations @@ -126,6 +126,8 @@ if (Vector) { if (ST->hasNEON()) return 16; + if (ST->hasMVEIntegerOps()) + return 8; return 0; } @@ -138,6 +140,8 @@ if (Vector) { if (ST->hasNEON()) return 128; + if (ST->hasMVEIntegerOps()) + return 128; return 0; } Index: llvm/trunk/test/Transforms/LoopVectorize/ARM/arm-ieee-vectorize.ll =================================================================== --- llvm/trunk/test/Transforms/LoopVectorize/ARM/arm-ieee-vectorize.ll +++ llvm/trunk/test/Transforms/LoopVectorize/ARM/arm-ieee-vectorize.ll @@ -1,5 +1,6 @@ ; RUN: opt -mtriple armv7-linux-gnueabihf -loop-vectorize -S %s -debug-only=loop-vectorize -o /dev/null 2>&1 | FileCheck %s --check-prefix=CHECK --check-prefix=LINUX ; RUN: opt -mtriple armv8-linux-gnu -loop-vectorize -S %s -debug-only=loop-vectorize -o /dev/null 2>&1 | FileCheck %s --check-prefix=CHECK --check-prefix=LINUX +; RUN: opt -mtriple armv8.1.m-none-eabi -mattr=+mve.fp -loop-vectorize -S %s -debug-only=loop-vectorize -o /dev/null 2>&1 | FileCheck %s --check-prefix=CHECK --check-prefix=MVE ; RUN: opt -mtriple armv7-unknwon-darwin -loop-vectorize -S %s -debug-only=loop-vectorize -o /dev/null 2>&1 | FileCheck %s --check-prefix=CHECK --check-prefix=DARWIN ; REQUIRES: asserts @@ -44,6 +45,8 @@ ; Floating-point loops need fast-math to be vectorizeable ; LINUX: Checking a loop in "sumf" ; LINUX: Potentially unsafe FP op prevents vectorization +; MVE: Checking a loop in "sumf" +; MVE: We can vectorize this loop! ; DARWIN: Checking a loop in "sumf" ; DARWIN: We can vectorize this loop! define void @sumf(float* noalias nocapture readonly %A, float* noalias nocapture readonly %B, float* noalias nocapture %C, i32 %N) { @@ -110,6 +113,8 @@ ; Floating-point loops need fast-math to be vectorizeable ; LINUX: Checking a loop in "redf" ; LINUX: Potentially unsafe FP op prevents vectorization +; MVE: Checking a loop in "redf" +; MVE: We can vectorize this loop! ; DARWIN: Checking a loop in "redf" ; DARWIN: We can vectorize this loop! define float @redf(float* noalias nocapture readonly %a, float* noalias nocapture readonly %b, i32 %N) {