[llvm] [DAG] SelectionDAG::canCreateUndefOrPoison - add ISD::FMA/FMAD + tests (PR #152187)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 6 06:22:20 PDT 2025
================
@@ -0,0 +1,49 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s --check-prefixes=CHECK
+
+define float @positive_case_fma(float %a0, float %a1, float %a2) {
+; CHECK-LABEL: positive_case_fma:
+; CHECK: // %bb.0:
+; CHECK-NEXT: fnmadd s0, s0, s1, s2
+; CHECK-NEXT: ret
+ %fma = call float @llvm.fma.f32(float %a0, float %a1, float %a2)
+ %freeze = freeze float %fma
+ %fneg = fneg float %freeze
+ ret float %fneg
+}
+
+define float @negative_case_fma(float %a0, float %a1) {
+; CHECK-LABEL: negative_case_fma:
+; CHECK: // %bb.0:
+; CHECK-NEXT: fnmadd s0, s0, s1, s0
+; CHECK-NEXT: ret
+ %fma = call float @llvm.fma.f32(float %a0, float %a1, float poison)
+ %freeze = freeze float %fma
+ %fneg = fneg float %freeze
+ ret float %fneg
+}
+
+define float @positive_case_fmad(float %a0, float %a1, float %a2) {
+; CHECK-LABEL: positive_case_fmad:
+; CHECK: // %bb.0:
+; CHECK-NEXT: fnmadd s0, s0, s1, s2
+; CHECK-NEXT: ret
+ %fma = call float @llvm.fma.f32(float %a0, float %a1, float %a2)
+ %freeze = freeze float %fma
+ %fneg = fneg float %freeze
+ ret float %fneg
+}
+
+define float @negative_case_fmad(float %a0, float %a1) {
+; CHECK-LABEL: negative_case_fmad:
+; CHECK: // %bb.0:
+; CHECK-NEXT: fnmadd s0, s0, s1, s0
----------------
RKSimon wrote:
instcombine will fold this to -0.0f:
```
define float @src(float %a0, float %a1) {
#0:
%fmad = fmuladd float %a0, float %a1, float poison
%freeze = freeze float %fmad
%fneg = fneg float %freeze
ret float %fneg
}
=>
define float @src(float %a0, float %a1) nofree noundef willreturn memory(none) {
#0:
ret float -0.000000
}
```
I don't think missing this in DAG is a regression, it just doesn't get any better - so maybe a better negative test would be something involving poison generating flags (nonnan/noinf etc.) ?
https://github.com/llvm/llvm-project/pull/152187
More information about the llvm-commits
mailing list