Issue 76152
Summary strange usage of pointers in sin/cos optimization
Labels new issue
Assignees
Reporter davemilter
    With such code, clang (17.0.1) able to optimize (-fno-math-errno -O3)
sin/cos calls to one call of sincos:

```c++
#include <cmath>

struct Point3D {
 double x;
    double y;
    double z;
};

Point3D f(double lat, double lon) noexcept
{
   double lat_sin = sin(lat), lat_cos = cos(lat);
   double lon_sin = sin(lon), lon_cos = cos(lon);
   
 return {lat_cos * lon_cos , lat_cos * lon_sin, lat_sin};
}
```

but for some reason it can not use pointers properly:

```asm
        lea     rdi, [rsp + 40]
        lea rsi, [rsp + 32]
        call    sincos@PLT
        movsd   xmm0, qword ptr [rsp + 40]      # xmm0 = mem[0],zero
        movsd   qword ptr [rsp + 8], xmm0       # 8-byte Spill
        lea     rdi, [rsp + 24]
 lea     rsi, [rsp + 16]
        movsd   xmm0, qword ptr [rsp]           # 8-byte Reload
        call    sincos@PLT
```

clang/llvm passes pointer to `sincos` via `[rsp + 40]` and `[rsp + 32]`,
then move stored value to `[rsp + 8]` and `[rsp]`.

If it can use  `[rsp + 8]`  and `[rsp]` directly,
this removes at least two extra save and loads.

[godbolt.org link](https://godbolt.org/#g:!((g:!((g:!((h:compiler,i:(compiler:clang1701,filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',debugCalls:'1',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'0',trim:'1'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:2,lang:c%2B%2B,libs:!(),options:'-fno-math-errno+-O3',overrides:!(),selection:(endColumn:27,endLineNumber:14,positionColumn:27,positionLineNumber:14,selectionStartColumn:6,selectionStartLineNumber:6,startColumn:6,startLineNumber:6),source:1),l:'5',n:'0',o:'+x86-64+clang+17.0.1+(Editor+%231)',t:'0')),header:(),k:47.65625,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,selection:(endColumn:2,endLineNumber:15,positionColumn:1,positionLineNumber:1,selectionStartColumn:2,selectionStartLineNumber:15,startColumn:1,startLineNumber:1),source:'%23include+%3Ccmath%3E%0A%0Astruct+Point3D+%7B%0A++++double+x%3B%0A++++double+y%3B%0A++++double+z%3B%0A%7D%3B%0A%0APoint3D+f(double+lat,+double+lon)+noexcept%0A%7B%0A+++double+lat_sin+%3D+sin(lat),+lat_cos+%3D+cos(lat)%3B%0A+++double+lon_sin+%3D+sin(lon),+lon_cos+%3D+cos(lon)%3B%0A+++%0A+++return+%7Blat_cos+*+lon_cos+,+lat_cos+*+lon_sin,+lat_sin%7D%3B%0A%7D'),l:'5',n:'0',o:'C%2B%2B+source+%231',t:'0')),k:52.34375,l:'4',n:'0',o:'',s:1,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4)
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to