[llvm] [SDAG] Fix deferring constrained function calls (PR #153029)

Kevin P. Neal via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 23 06:37:33 PDT 2025


kpneal wrote:

I finally got a large enough block of time for this PR. Using this test code:

```
target triple = "x86_64-unknown-linux-gnu"
define float @test(float %a, float %b, float %c, float %d, float %e, float %f, float %g, float %h) strictfp {
entry:
  %mul1 = call float @llvm.experimental.constrained.fmul.f32(float %a, float %b, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
  %mul2 = call float @llvm.experimental.constrained.fmul.f32(float %c, float %d, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
  call void @llvm.set.rounding(i32 3)
  %add1 = call float @llvm.experimental.constrained.fadd.f32(float %mul1, float %mul2, metadata !"round.dynamic", metadata !"fpexcept.ignore")
  %add2 = call float @llvm.experimental.constrained.fadd.f32(float %mul1, float %e, metadata !"round.dynamic", metadata !"fpexcept.ignore")
  %add3 = call float @llvm.experimental.constrained.fadd.f32(float %mul1, float %f, metadata !"round.dynamic", metadata !"fpexcept.ignore")
  call void @externfunc(i32 0)
  %add4 = call float @llvm.experimental.constrained.fsub.f32(float %mul1, float %g, metadata !"round.dynamic", metadata !"fpexcept.strict")
  %add5 = call float @llvm.experimental.constrained.fsub.f32(float %mul1, float %h, metadata !"round.dynamic", metadata !"fpexcept.strict")
  %use1 = call float @llvm.experimental.constrained.fmul.f32(float %add1, float %add2, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
  %use2 = call float @llvm.experimental.constrained.fmul.f32(float %use1, float %add3, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
  %use3 = call float @llvm.experimental.constrained.fmul.f32(float %use2, float %add4, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
  %use4 = call float @llvm.experimental.constrained.fmul.f32(float %use3, float %add5, metadata !"round.dynamic", metadata !"fpexcept.maytrap")
  ret float %use4
}
declare void @externfunc(i32)
```

This patch is strictly an improvement over what we have. I have no more concerns.

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


More information about the llvm-commits mailing list