Bug ID: 30439
           Summary: [ARMv6] Optimization doesn't consider FPSCR as a
                    register that may get clobbered by function calls
           Product: clang
           Version: 3.9
          Hardware: Other
                OS: other
            Status: NEW
          Severity: normal
          Priority: P
         Component: -New Bugs
    Classification: Unclassified

Consider the following piece of code:

extern void bar(void);
int foo(void) {
  int x = __builtin_flt_rounds();
  return x + __builtin_flt_rounds();

When built for ARMv6 with Clang 3.9.0, we get the following code:

00000000 <foo>:
   0:   e92d4c10        push    {r4, sl, fp, lr}
   4:   e28db008        add     fp, sp, #8
   8:   eef10a10        vmrs    r0, fpscr
   c:   e3a01003        mov     r1, #3
  10:   e2800501        add     r0, r0, #4194304        ; 0x400000
  14:   e0010b20        and     r0, r1, r0, lsr #22
  18:   e0804000        add     r4, r0, r0
  1c:   ebfffffe        bl      0 <bar>
  20:   e1a00004        mov     r0, r4
  24:   e8bd8c10        pop     {r4, sl, fp, pc}

Notice how FPSCR is only loaded once and multiplied by two, instead of being
loaded separately. This means that if bar() is implemented as a function
calling fesetround(), the result of this function would be incorrect.

You are receiving this mail because:
You are on the CC list for the bug.
llvm-bugs mailing list

Reply via email to