<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/70985>70985</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Missed optimization: inadequate float range propagation
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
bbarenblat
</td>
</tr>
</table>
<pre>
At 604eff60abfce09f956c3b0b1414f8d0d04b5d47, `clang++ -target x86_64-linux-gnu -O3` compiles
```c++
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
int ga, gb;
void F(double x) {
if (x > 5) ++ga;
if (x > 10) ++gb;
}
```
to
```asm
.LCPI0_0:
.quad 0x4014000000000000 # double 5
.LCPI0_1:
.quad 0x4024000000000000 # double 10
_Z1Fd: ucomisd xmm0, qword ptr [rip + .LCPI0_0]
ja .LBB0_1
ucomisd xmm0, qword ptr [rip + .LCPI0_1] # ***
ja .LBB0_3 # ***
.LBB0_4:
ret
.LBB0_1:
inc dword ptr [rip + ga]
ucomisd xmm0, qword ptr [rip + .LCPI0_1]
jbe .LBB0_4
.LBB0_3:
inc dword ptr [rip + gb]
ret
ga: .long 0
gb: .long 0
```
The conditional branch marked with `# ***` will never be taken – in the domain of `double`s, `!(x > 5)` always implies `!(x > 10)`. Telling the compiler this explicitly –
```c++
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
int ga, gb;
void F(double x) {
if (x > 5) {
++ga;
if (x > 10) ++gb;
}
}
```
– produces
```asm
.LCPI0_0:
.quad 0x4014000000000000 # double 5
.LCPI0_1:
.quad 0x4024000000000000 # double 10
_Z1Fd: ucomisd xmm0, qword ptr [rip + .LCPI0_0]
jbe .LBB0_3
inc dword ptr [rip + ga]
ucomisd xmm0, qword ptr [rip + .LCPI0_1]
jbe .LBB0_3
inc dword ptr [rip + gb]
.LBB0_3:
ret
ga: .long 0
gb: .long 0
```
The tautological comparison gets emitted at `-O1` through `-O3` and `-Og`, though not at `-Os` or `-Oz`. `-ffast-math` doesn’t change the behavior.
GCC tip-of-tree emits assembly close to the second case in both cases.
[Compiler Explorer](https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,selection:(endColumn:29,endLineNumber:1,positionColumn:29,positionLineNumber:1,selectionStartColumn:29,selectionStartLineNumber:1,startColumn:29,startLineNumber:1),source:'//+Copyright+2023+Google+LLC%0A//+SPDX-License-Identifier:+Apache-2.0%0A%0Aint+ga,+gb%3B%0A%0Avoid+F(double+x)+%7B%0A++if+(x+%3E+5)+%2B%2Bga%3B%0A++if+(x+%3E+10)+%2B%2Bgb%3B%0A%7D%0A%0Avoid+G(double+x)+%7B%0A++if+(x+%3E+5)+%7B%0A++++%2B%2Bga%3B%0A++++if+(x+%3E+10)+%2B%2Bgb%3B%0A++%7D%0A%7D'),l:'5',n:'0',o:'C%2B%2B+source+%231',t:'0')),k:50,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:clang_trunk,deviceViewOpen:'1',filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',debugCalls:'1',demangle:'1',directives:'0',execute:'1',intel:'0',libraryCode:'0',trim:'1'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,libs:!(),options:'-O3',overrides:!(),selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:'5',n:'0',o:'+x86-64+clang+(trunk)+(Editor+%231)',t:'0')),k:50,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4) for experimentation.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkWN1v47gR_2voF8IGRX1YfvCDpWwWB6TNAnstir4sKHEkcZcivSSVOPfXFySV2MrHXvZ6KFpUMGxzvoec-Q1tZq3oFcAe5RXKr1ZscoM2-6ZhBlQjmVs1mj_sDw4XJIOuKwhruhbIrtvlRZs2pEmyJOtKTjjJmpxnW0RrjArSSqZ6RCtEK7x2zPTg8KksvhTZWgo1nda9mvD6NkUFwa0ej0KCReQKkQMqSHy1UX2m0mtEr3Gtjw9G9IPDlNAUf9S6l4BvbuqF1OdPV_9Y34gWlIX1LxyUE50Ag9IDPhxZO8CabkjUEMrhnvmg-wals7M7LTi-RrTkemok4BOiO4y2Mxdj0WFEyxNG6QecB16ItGdPFpYyCbkQOrtB26tnKcel08_IzI6RsrmpP_1CvhCUHh79xGfzfWIcY0xOGUkycvHgxYNoiuek8oXJ5Icm6ftMJnMCX_6ZXHO_23hq9Sgsx6dxJH6Tv99rw_HRGYzyyoij3xT8lFV-tQzhK5tDuakqH-KC-TOmE5RfxUgRPcyvH3hK8dvPK0aiUvZiBw24S4GXWyxUGz75a6H37MV-_GzKz3Js4CLH7DK09CdDa14Yf8rVN0GkbqRWvS-gmdG8wXhW_b8OgFutuHBCKyZxY5hqBzwy8w04vhdu8PiyPIaC4HshJVZwBwY3gB37BgqjDxSVBO1SLBR2A2CuRyYU1p03EYsWFcTOmIVosmhrb5bJe_ZgsRiPUoB9LhUaGxVkg38FKYXqg5cZzwx2g7AYTkcpWuHkwzme_2GkO_Pwa7D3LuDD-Ax9b2Dg-eiORvOpfTEd_m8xcdHF6X8PoPxUKGcAeQuA_lxAcWxyWupetEyG_mRGWK1wD85iGIVzwDFzvr_Xt4lvfDcYPfVDpIRrClM8rvqAAjV2Q5BQ2j2pWi-oTVz8FpDBf-06Zt16ZG7wfK7BqscC3zncDkz1EKCjgYHdCW02cybh_WNdYyeOa92tnQEI8VrMrIWxkQ-4ldoCdjoYsOCxE7fMgge9RrshLOzCIsqr-hGkPpyOUhsw_kRoOTh3tP4wAr70mjdauo02fSCkfWB5AES0fHsxoPTQag4fuHDaIFqLwC07IUGxEcJqmyDqr4udVu5zy6SnJtlM-JuFT6coRqLYV89GtA4Xy_TQIpp7XAlvtQUJrR8Y0Q8oXms5jX5Jd4jWoPiNUPDXaWwCOnpDR23DjFlKPlJfiD-5-OyYcUulJe-l6isarwkGhp5MO29QPAREq6dhgGjlxwGiVRwIiFZ-JND8cSIgWr09ExCtLqZCVMrDZIgwTuuI0zRPqzPbzwhEq_OUQLQ6hWC90PZR0mO86MJneYq89AOiVf4kOr95R2cHb6nF0brQWwa2vXoR4sd_O8SF6OPr7cD_ePiz5XMS_ts2loCMp5_HuleLLtBxVV9WfzXXTCSkc1u5S71dtPwNpYecnF1kP3ARFx4LyCvW6tdbPmLKueGfKOkh_CL84sykviFac7gTLfxdwP3tEdQSD4R0YCIIlc0itEYoZh4W0pF023yF1i0YrR5HUO5WyYeFDQ7N1NdMSrsQ5zAy1cslNHFhfF_fgV2YgBO0k1uKCuVALqSkaAwzD7XmsKA7I8ZLVb-bnWS9fX03_gR0lKKxF2flHeqjh6s5LT_g4tHfgTGCw3PpH8Br8l50Tf4AuL5k_Q62Ju-C1uTdfeZxpCzWRYZodf5Lo5yrODZ4-Tjlntpv95_owIsM6O8aeU35DoyNR5r5W3qnjf-tAkb4tmF-xzcrvk_5Lt2xFeyTYleWW7ojxWrYZy3pmrbpcpZlTbFNEs4TxlLYAd-RBMqV2Ps5lSQkoQkpKdkU3ZbwtsmStoCky3OUERiZkBsp70Z_wVgJayfYb8muzFeSNSBt-FeKUgX3ODARpSi_Wpm911k3U29RRqSwzp6tOOEk7P8irAWOfZWP4jc2ly4WinH4PjEHuJOaOWzCzeto9JH1QWo1Gbl_dgkSbpiaTatHRK-9n_ljfTQ6oA69DtFZRK9D9P8KAAD__4aXKvw">