Message ID | 1553814161-3750-1-git-send-email-vgupta@synopsys.com |
---|---|
State | New |
Headers | show |
Series | [ARC] PR 88409: miscompilation due to missing cc clobber in longlong.h macros | expand |
On Thu, 28 Mar 2019, Vineet Gupta wrote: > simple test such as below was failing. > > | void main(int argc, char *argv[]) > | { > | size_t total_time = 115424; // expected 115.424 > | double secs = (double)total_time/(double)1000; > | printf("%s %d %lf\n", "secs", total_time, secs); // prints 113.504 > | printf("%d\n", (size_t)secs); > | } > > The printf eventually called into glibc stdlib/divrem.c:__mpn_divrem() > which uses the __arc__ specific inline asm macros from longlong.h which > were causing miscompilation. Hello, do you intend to post similar patches for glibc and gmp, which both have a similar longlong.h?
On 3/28/19 5:07 PM, Marc Glisse wrote: > On Thu, 28 Mar 2019, Vineet Gupta wrote: > >> simple test such as below was failing. >> >> | void main(int argc, char *argv[]) >> | { >> | size_t total_time = 115424; // expected 115.424 >> | double secs = (double)total_time/(double)1000; >> | printf("%s %d %lf\n", "secs", total_time, secs); // prints 113.504 >> | printf("%d\n", (size_t)secs); >> | } >> >> The printf eventually called into glibc stdlib/divrem.c:__mpn_divrem() >> which uses the __arc__ specific inline asm macros from longlong.h which >> were causing miscompilation. > Hello, > > do you intend to post similar patches for glibc and gmp, which both have a > similar longlong.h? Yeah, glibc typically "syncs" longlong.h from gcc so once gcc patch is merged, I'll post a sync patch to glibc. Good tip about gmp, I wasn't aware of that. I suppose I could post there too once dust settles on gcc side. Thx, -Vinet
diff --git a/include/ChangeLog b/include/ChangeLog index be08141deeb9..96d967d10a52 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,10 @@ +2019-03-28 Vineet Gupta <vgupta@synopsys.com> + + PR 89877 + + * longlong.h [__arc__] (add_ssaaaa): Add cc clobber + (sub_ddmmss): Likewise. + 2019-02-11 Philippe Waroquiers <philippe.waroquiers@skynet.be> * splay-tree.h (splay_tree_delete_key_fn): Update comment. diff --git a/include/longlong.h b/include/longlong.h index 3dd8dc3aa80c..1f0ce4204255 100644 --- a/include/longlong.h +++ b/include/longlong.h @@ -199,7 +199,8 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype); : "%r" ((USItype) (ah)), \ "rICal" ((USItype) (bh)), \ "%r" ((USItype) (al)), \ - "rICal" ((USItype) (bl))) + "rICal" ((USItype) (bl)) \ + : "cc") #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ __asm__ ("sub.f %1, %4, %5\n\tsbc %0, %2, %3" \ : "=r" ((USItype) (sh)), \ @@ -207,7 +208,8 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype); : "r" ((USItype) (ah)), \ "rICal" ((USItype) (bh)), \ "r" ((USItype) (al)), \ - "rICal" ((USItype) (bl))) + "rICal" ((USItype) (bl)) \ + : "cc") #define __umulsidi3(u,v) ((UDItype)(USItype)u*(USItype)v) #ifdef __ARC_NORM__
simple test such as below was failing. | void main(int argc, char *argv[]) | { | size_t total_time = 115424; // expected 115.424 | double secs = (double)total_time/(double)1000; | printf("%s %d %lf\n", "secs", total_time, secs); // prints 113.504 | printf("%d\n", (size_t)secs); | } The printf eventually called into glibc stdlib/divrem.c:__mpn_divrem() which uses the __arc__ specific inline asm macros from longlong.h which were causing miscompilation. include/ 2019-03-28 Vineet Gupta <vgupta@synopsys.com> PR 89877 * longlong.h [__arc__] (add_ssaaaa): Add cc clobber (sub_ddmmss): Likewise. Signed-off-by: Vineet Gupta <vgupta@synopsys.com> --- include/ChangeLog | 7 +++++++ include/longlong.h | 6 ++++-- 2 files changed, 11 insertions(+), 2 deletions(-)