Issue 161342
Summary [Clang][] `-mlink-builtin-bitcode` may change FP32 denormal mode of linked module
Labels clang:codegen
Assignees Maetveis
Reporter Maetveis
    # Description

`-mlink-builtin-bitcode` may change the FP32 denormal mode of linked module if not explicitly specified.

# Reproducer

```llvm
// a.ll
declare float @add(float, float)

define float @f() #0 {
    ; The constant 0x37F0000000000000 is a denormal number in FP32
    ; 2 x F32(0x37F0000000000000) = F32(0x380000000000000) which is still denormal
 ; This is the expected result. With (incorrect) flushing of denormals we will get +0.
    %1 = call float @add(float 0x37F0000000000000, float 0x37F0000000000000)
    ret float %1
}

attributes #0 = { "denormal-fp-math"="preserve-sign,preserve-sign" }

```

```llvm
// bc.ll
define float @add(float %a, float %b) {
    %1 = fadd float %a, %b
 ret float %1
}
```

Compile `a.ll` and link in the bitcode from `bc.bc`.

```console
> llvm-as bc.ll
> clang -cc1 -fdenormal-fp-math=preserve-sign,preserve-sign -mlink-builtin-bitcode bc.bc -emit-llvm -o - a.ll
```

# Observed behaviour

The attributes on `@add` have been changed to flush denormals (for F32 only):

```llvm
; (...)
define internal float @add(float %a, float %b) #1 {
; (...)
; attributes #1 = { convergent "denormal-fp-math-f32"="preserve-sign,preserve-sign" ... }
```

This changes the behaviour of the program, for example turning on optimizations produces:

```console
> clang -cc1 -O1 -fdenormal-fp-math=preserve-sign,preserve-sign -mlink-builtin-bitcode bc.bc -emit-llvm -o - a.ll
```

```llvm
; (...)
define noundef float @f() local_unnamed_addr #0 {
  ret float 0.000000e+00
}
```

# Expected behaviour

`@add` should have no `denormal-fp-math(-f32)` attributes added to it, this corresponds to the default mode as specified by IEEE.


_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to