dyung wrote: Hi, we have an internal test that checks that compiling with and without optnone at O0 does not change the code generated by the compiler, and one of the tests we have did change which I bisected back to your change.
The test consists of the following code: ```c++ #include <math.h> extern int printf(const char *format, ...); template <typename T> OPTNONE T &pi(int num_terms) { static T approx = 0; for (int i = 0; i <= num_terms; ++i) { approx += 4 * (pow(-1, i) / ((2 * i) + 1)); } return approx; } OPTNONE int main() { int const num_terms = 5; float f1000 = pi<float>(num_terms); printf("%f\n", f1000); return 0; } ``` When compiled with `-S -O0 -mavx -DOPTNONE=` part of the function pi<float>(int) looks like this: ```assembly vcvtsi2sd xmm1, xmm1, eax vdivsd xmm0, xmm0, xmm1 vmovss xmm2, dword ptr [rip + pi<float>(int)::approx] # xmm2 = mem[0],zero,zero,zero vcvtss2sd xmm1, xmm1, xmm2 vmovsd xmm2, qword ptr [rip + .LCPI1_0] # xmm2 = [4.0E+0,0.0E+0] vmulsd xmm0, xmm0, xmm2 vaddsd xmm1, xmm0, xmm1 vcvtsd2ss xmm0, xmm0, xmm1 vmovss dword ptr [rip + pi<float>(int)::approx], xmm0 ``` When compiled with `-S -O0 -mavx -DOPTNONE=__attribute__((optnone))`, the same code for pi<float>(int) is slightly different: ```assembly vcvtsi2sd xmm1, xmm1, eax vdivsd xmm1, xmm0, xmm1 vmovsd xmm0, qword ptr [rip + .LCPI1_0] # xmm0 = [4.0E+0,0.0E+0] vmulsd xmm1, xmm0, xmm1 vmovss xmm2, dword ptr [rip + pi<float>(int)::approx] # xmm2 = mem[0],zero,zero,zero vcvtss2sd xmm0, xmm0, xmm2 vaddsd xmm1, xmm0, xmm1 vcvtsd2ss xmm0, xmm0, xmm1 vmovss dword ptr [rip + pi<float>(int)::approx], xmm0 ``` You can see this change on godbolt here: https://godbolt.org/z/WTWPoqY51 Is this change intended? https://github.com/llvm/llvm-project/pull/85605 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits