diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -7070,6 +7070,10 @@ // Prevent floating-point constants from using literal loads // when execute-only is enabled. if (ST->genExecuteOnly()) { + // we shouldn't trigger this for v6m execute-only + if (ST->isThumb1Only() && !ST->hasV8MBaselineOps()) + llvm_unreachable("Unexpected architecture"); + // If we can represent the constant as an immediate, don't lower it if (isFPImmLegal(FPVal, VT)) return Op; diff --git a/llvm/test/CodeGen/Thumb2/float-ops-vmovsr-nofp-xo.ll b/llvm/test/CodeGen/ARM/float-ops-xo.ll rename from llvm/test/CodeGen/Thumb2/float-ops-vmovsr-nofp-xo.ll rename to llvm/test/CodeGen/ARM/float-ops-xo.ll --- a/llvm/test/CodeGen/Thumb2/float-ops-vmovsr-nofp-xo.ll +++ b/llvm/test/CodeGen/ARM/float-ops-xo.ll @@ -1,5 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 ; RUN: llc < %s -mtriple=thumbv8.1m.main-none-eabihf -mattr=+mve,+execute-only | FileCheck %s +; RUN: llc < %s -mtriple=thumbv6m -mattr=+execute-only | FileCheck %s --check-prefix=V6M declare void @ext_fn(float) @@ -12,6 +13,13 @@ ; CHECK-NEXT: vmov s0, r0 ; CHECK-NEXT: bl ext_fn ; CHECK-NEXT: pop {r7, pc} +; +; V6M-LABEL: test1: +; V6M: @ %bb.0: @ %entry +; V6M-NEXT: push {r7, lr} +; V6M-NEXT: movs r0, #0 +; V6M-NEXT: bl ext_fn +; V6M-NEXT: pop {r7, pc} entry: call void @ext_fn(float 0.000000e+00) ret void @@ -24,6 +32,17 @@ ; CHECK-NEXT: movt r0, #16673 ; CHECK-NEXT: vmov s0, r0 ; CHECK-NEXT: bx lr +; +; V6M-LABEL: test2: +; V6M: @ %bb.0: @ %entry +; V6M-NEXT: movs r0, #65 +; V6M-NEXT: lsls r0, r0, #8 +; V6M-NEXT: adds r0, #33 +; V6M-NEXT: lsls r0, r0, #8 +; V6M-NEXT: adds r0, #249 +; V6M-NEXT: lsls r0, r0, #8 +; V6M-NEXT: adds r0, #167 +; V6M-NEXT: bx lr entry: ret float 0x40243F34E0000000 }