[llvm] [LangRef] Clarify nsz semantics (PR #180906)
Nuno Lopes via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 12 00:15:15 PST 2026
nunoplopes wrote:
Here's one test that breaks with this semantics:
```llvm
; llvm/test/Transforms/InstCombine/intrinsic-select.ll
define double @test_fabs_select_fmf2(i1 %cond, double %a) {
%sel1 = select i1 %cond, double 0.000000, double %a
%fabs = fabs nnan ninf nsz double %sel1
ret double %fabs
}
=>
define double @test_fabs_select_fmf2(i1 %cond, double %a) {
%#1 = fabs double %a
%fabs = select nnan ninf nsz i1 %cond, double 0.000000, double %#1
ret double %fabs
}
Transformation doesn't verify! (unsound)
ERROR: Target's return value is more undefined
Example:
i1 %cond = #x0 (0)
double %a = #x0000000000000000 (+0.0)
Source:
double %sel1 = #x0000000000000000 (+0.0)
double %fabs = #x0000000000000000 (+0.0)
Target:
double %#1 = #x0000000000000000 (+0.0)
double %fabs = #x8000000000000000 (-0.0)
Source value: #x0000000000000000 (+0.0)
Target value: #x8000000000000000 (-0.0)
```
https://github.com/llvm/llvm-project/pull/180906
More information about the llvm-commits
mailing list