Index: llvm/lib/Target/AArch64/AArch64ISelLowering.cpp =================================================================== --- llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -1283,6 +1283,8 @@ FastISel * AArch64TargetLowering::createFastISel(FunctionLoweringInfo &funcInfo, const TargetLibraryInfo *libInfo) const { + if (Subtarget->hasSVE()) + return nullptr; return AArch64::createFastISel(funcInfo, libInfo); } Index: llvm/lib/Target/AArch64/AArch64TargetMachine.cpp =================================================================== --- llvm/lib/Target/AArch64/AArch64TargetMachine.cpp +++ llvm/lib/Target/AArch64/AArch64TargetMachine.cpp @@ -309,7 +309,18 @@ if (getOptLevel() <= EnableGlobalISelAtO && TT.getArch() != Triple::aarch64_32 && !(getCodeModel() == CodeModel::Large && TT.isOSBinFormatMachO())) { - setGlobalISel(true); + + bool HasSVE = false; + SmallVector Features; + FS.split(Features, ','); + for (StringRef Feature : Features) { + if (Feature == "+sve") + HasSVE = true; + else if (Feature == "-sve") + HasSVE = false; + } + + setGlobalISel(!HasSVE); setGlobalISelAbort(GlobalISelAbortMode::Disable); } Index: llvm/test/CodeGen/AArch64/sve-intrinsics-ld1.ll =================================================================== --- llvm/test/CodeGen/AArch64/sve-intrinsics-ld1.ll +++ llvm/test/CodeGen/AArch64/sve-intrinsics-ld1.ll @@ -1,4 +1,5 @@ ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s +; RUN: llc -O0 -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s ; ; LD1B Index: llvm/test/CodeGen/AArch64/sve-intrinsics-st1.ll =================================================================== --- llvm/test/CodeGen/AArch64/sve-intrinsics-st1.ll +++ llvm/test/CodeGen/AArch64/sve-intrinsics-st1.ll @@ -1,4 +1,5 @@ ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s +; RUN: llc -O0 -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s ; ; ST1B