[llvm] [ARM] Add instruction selection for strict FP (PR #160696)

David Green via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 21 07:21:39 PDT 2025


================
@@ -0,0 +1,144 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple arm-- -mattr=+vfp4 -O0 -o - %s | FileCheck %s
+; RUN: llc -mtriple arm-- -mattr=+vfp4 -O3 -o - %s | FileCheck %s --check-prefix=SUBOPTIMAL
+
+
+declare float @llvm.experimental.constrained.sitofp.f32.i32(i32, metadata, metadata)
+declare float @llvm.experimental.constrained.sitofp.f32.i16(i16, metadata, metadata)
+declare i1 @llvm.experimental.constrained.fcmp.f32(float, float, metadata, metadata)
+declare float @llvm.experimental.constrained.uitofp.f32.i16(i16, metadata, metadata)
+
+define i32 @test() #0 {
+; CHECK-LABEL: test:
+; CHECK:       @ %bb.0: @ %entry
+; CHECK-NEXT:    sub sp, sp, #8
+; CHECK-NEXT:    mov r0, #53477376
+; CHECK-NEXT:    orr r0, r0, #1073741824
+; CHECK-NEXT:    str r0, [sp, #4]
+; CHECK-NEXT:    mov r0, #-2147483647
+; CHECK-NEXT:    str r0, [sp]
+; CHECK-NEXT:    vldr d16, [sp]
+; CHECK-NEXT:    vldr d17, .LCPI0_0
+; CHECK-NEXT:    vsub.f64 d16, d16, d17
+; CHECK-NEXT:    vcvt.f32.f64 s0, d16
+; CHECK-NEXT:    vcmp.f32 s0, s0
+; CHECK-NEXT:    vmrs APSR_nzcv, fpscr
+; CHECK-NEXT:    mov r0, #0
+; CHECK-NEXT:    moveq r0, #1
+; CHECK-NEXT:    add sp, sp, #8
+; CHECK-NEXT:    mov pc, lr
+; CHECK-NEXT:    .p2align 3
+; CHECK-NEXT:  @ %bb.1:
+; CHECK-NEXT:  .LCPI0_0:
+; CHECK-NEXT:    .long 2147483648 @ double 4503601774854144
+; CHECK-NEXT:    .long 1127219200
+;
+; SUBOPTIMAL-LABEL: test:
+; SUBOPTIMAL:       @ %bb.0: @ %entry
+; SUBOPTIMAL-NEXT:    sub sp, sp, #8
+; SUBOPTIMAL-NEXT:    mov r0, #53477376
+; SUBOPTIMAL-NEXT:    orr r0, r0, #1073741824
+; SUBOPTIMAL-NEXT:    str r0, [sp, #4]
+; SUBOPTIMAL-NEXT:    mov r0, #-2147483647
+; SUBOPTIMAL-NEXT:    str r0, [sp]
+; SUBOPTIMAL-NEXT:    vldr d16, [sp]
+; SUBOPTIMAL-NEXT:    vldr d17, .LCPI0_0
+; SUBOPTIMAL-NEXT:    vsub.f64 d16, d16, d17
+; SUBOPTIMAL-NEXT:    vcvt.f32.f64 s0, d16
+; SUBOPTIMAL-NEXT:    vcmp.f32 s0, s0
+; SUBOPTIMAL-NEXT:    vmrs APSR_nzcv, fpscr
+; SUBOPTIMAL-NEXT:    mov r0, #0
+; SUBOPTIMAL-NEXT:    moveq r0, #1
+; SUBOPTIMAL-NEXT:    add sp, sp, #8
+; SUBOPTIMAL-NEXT:    mov pc, lr
+; SUBOPTIMAL-NEXT:    .p2align 3
+; SUBOPTIMAL-NEXT:  @ %bb.1:
+; SUBOPTIMAL-NEXT:  .LCPI0_0:
+; SUBOPTIMAL-NEXT:    .long 2147483648 @ double 4503601774854144
+; SUBOPTIMAL-NEXT:    .long 1127219200
+entry:
+  %conv = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 1, metadata !"round.tonearest", metadata !"fpexcept.strict") #1
----------------
davemgreen wrote:

Should these have argument inputs to make sure they do not fold away, or is the intent to test constants?

https://github.com/llvm/llvm-project/pull/160696


More information about the llvm-commits mailing list