[llvm-bugs] [Bug 30439] New: [ARMv6] Optimization doesn't consider FPSCR as a register that may get clobbered by function calls
via llvm-bugs
llvm-bugs at lists.llvm.org
Sun Sep 18 11:30:33 PDT 2016
https://llvm.org/bugs/show_bug.cgi?id=30439
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
Assignee: unassignedclangbugs at nondot.org
Reporter: ed at 80386.nl
CC: llvm-bugs at lists.llvm.org
Classification: Unclassified
Consider the following piece of code:
---
extern void bar(void);
int foo(void) {
int x = __builtin_flt_rounds();
bar();
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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20160918/66f19728/attachment.html>
More information about the llvm-bugs
mailing list