[llvm] r296865 - [ARM] fpscr read/write intrinsics not aware of each other

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 3 15:33:26 PST 2017


Reverted in r296926 due to https://bugs.llvm.org/show_bug.cgi?id=32134

On Fri, Mar 3, 2017 at 3:40 AM, Ranjeet Singh via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: rsingh
> Date: Fri Mar  3 05:40:07 2017
> New Revision: 296865
>
> URL: http://llvm.org/viewvc/llvm-project?rev=296865&view=rev
> Log:
> [ARM] fpscr read/write intrinsics not aware of each other
>
> The intrinsics __builtin_arm_get_fpscr and __builtin_arm_set_fpscr read and
> write to the fpscr (Floating-Point Status and Control Register) register.
>
> A bug exists in the __builtin_arm_get_fpscr intrinsic definition in llvm which
> treats this intrinsic as a IntroNoMem which means it's not a memory access and
> doesn't have any other side-effects. Having this property on this intrinsic
> means that various optimizations can be done on this such as common
> sub-expression elimination with other reads. This can cause issues if there has
> been write to this register, e.g.
>
> void foo(int *p) {
>      p[0] = __builtin_arm_get_fpscr();
>      __builtin_arm_set_fpscr(1);
>      p[1] = __builtin_arm_get_fpscr();
> }
>
> in the above example the second read is currently CSE'd into the first read,
> this is because llvm isn't aware that the write done by __builtin_arm_set_fpscr
> effects the same register that __builtin_arm_get_fpscr reads from, to fix this
> problem I've removed the property IntrNoMem so that __builtin_arm_get_fpscr is
> treated as a memory access.
>
> Differential Revision: https://reviews.llvm.org/D30542
>
>
> Added:
>     llvm/trunk/test/CodeGen/ARM/fpscr-intrinsics.ll
> Modified:
>     llvm/trunk/include/llvm/IR/IntrinsicsARM.td


More information about the llvm-commits mailing list