<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/84648>84648</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
`ConditionalOperator` needs to take into account `FPOptionsOverride` set by `#pragma float_control`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
echesakov
</td>
</tr>
</table>
<pre>
When I compile function `foo`
```c
#pragma float_control(precise, on)
float foo(float* x) {
return x[0] == x[1] ? x[1] : x[0];
}
```
with `clang -O2 -ffast-math -S -o - -emit-llvm foo.c`:
```llvm
define nofpclass(nan inf) float @foo(ptr nocapture noundef readonly %x) local_unnamed_addr #0 {
entry:
%0 = load float, ptr %x, align 4, !tbaa !5
ret float %0
}
```
the body of the function is, effectively, folded to
```c
float foo(float* x) {
return x[0];
}
```
However, the transformation is incorrect under `#pragma float_control(precise, on)` for the following cases:
- `x[0]` is `0.0f` and `x[1]` is `-0.0f`
- `x[0]` is `-0.0f` and `x[1]` is `0.0f`
The value returned from `foo` for both cases is zero with the opposite sign.
In order to resolve this:
1. `ConditionalOperator` in AST should be able to store `FPOptionsOverride` set by `#pragma float_control` in the surrounding context.
2. When CodeGen calls `VisitAbstractConditionalOperator` the stored `FPOptionsOverride` should set `CurFPFeatures` of the `CodeGenFunction`.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVU2P2zYQ_TX0ZSCDoiR_HHRw1nCb0wZI0B4DihxZbGiOQFLebH99MZKzuwm627QFDEm0Zh7fezMc6ZTcOSC2onknmuNKT3mg2KIZMOkvdF11ZB_b3wcM8B4MXUbnEfopmOwogNjInkhspJBHIQ-360YuP3Nbq2qM-nzR0HvS-bOhkCN5oXZjROMSCnUHFITav0SZY4HR1W5-FuoAX4Xag9i-W0IAIuYpBvgqmndSNEcQ1VFUx3ldLuvTy8XhKVJUNwyxPf7A-iWJB5cHFmm8Dmco7hUUfa9TLi46D1B8hIKggAIvLhfeXy_Md20YpDr8rSUctPxlsXcBIVA_Gq9TEmoXdAAXeta4qBe1XAwYc4RARo95ipwzBYs9RNSWgn8EoZrZGU9G-89TCPqC9rO2NoJQlXx2DEOOj0_cgBMlmwaetIWbzXfA2y2Yd6C9Oweo-VGoMnda8715UYFvZFUjf8bTPCBwUwH1wM9PzeQSb4J9jya7K_pHXvbkLVrI9FaH_Zde-ckO-JUe8IqRqTDZHHVIPcWLvlEGFwzFiCYDFyVyt_yLht9I6CkuPpD39ODCGYxOmJ6qVDDkE-uN5E3FRsq17Hmlg_0WUH4XUNwi3kQp_hHmO5Tl-mlAuGo_4c1TtNBHujxPg1lTR3lYpDDSnxgJ5uPEWmkcKbmMwMNn_RL7fQCK7GMmiJjIXxHy4NIPB6pc8253FKzjQmh_P2LUmeJMPMDh4ydIA03eQoegO48MmDJF5MTTh_uR89L9FWN0FjktYYbu8a0CLtgsIE0x8imcy0Uh49d8k6HWME_LO7L4CwYw2vvZyN9ccvnQpRy1ya8wn6GZpH2d5aKKybIDUzx9OKHmuZD49e1QzebMBE634yU2cr2ybWX31V6vsC23pZRyL1W5GtquwrouVV1W26Zp0JZ1v8VOa2V03Vfb3cq1SqpaVnJf7iqpynUllUK5sbKrdyh3jaglXrTza55wa4rnlUtpwnZXb-rdyusOfZq_MUoFfID5pVCKPzmx5Zyim85J1NK7lNMzSnbZY_t6rQOiTVzbrL8guJAJtDE0hfy_6ryaom-HnMe58dRJqNPZ5WHq1oYuQp3mOb7cijHSH2iyUKdZVRLqNKv-KwAA__-jozX7">