[Bug c/39403] Excessive optimization issue

2009-03-09 Thread rguenth at gcc dot gnu dot org


--- Comment #1 from rguenth at gcc dot gnu dot org  2009-03-09 15:36 ---
You need to specify that the registers are clobbered by the asm.  The only
way to do that is to use output constraints (+D, +c, etc.) on proper
temporaries.

  int lent = len;
  char *dstt = dst;
  char *srct = src;
  __asm__ __volatile__(
   cld\n\t
   rep movsb
   : +c (lent), +D(dstt), +S(src)
  );

Otherwise GCC thinks the registers still hold the original value.


-- 

rguenth at gcc dot gnu dot org changed:

   What|Removed |Added

 Status|UNCONFIRMED |RESOLVED
 Resolution||INVALID


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39403



Re: [Bug c/39403] Excessive optimization issue

2009-03-09 Thread Andrew Thomas Pinski



Sent from my iPhone

On Mar 9, 2009, at 8:36 AM, rguenth at gcc dot gnu dot org gcc-bugzi...@gcc.gnu.org 
 wrote:





--- Comment #1 from rguenth at gcc dot gnu dot org  2009-03-09  
15:36 ---
You need to specify that the registers are clobbered by the asm.   
The only
way to do that is to use output constraints (+D, +c, etc.) on  
proper

temporaries.

 int lent = len;
 char *dstt = dst;
 char *srct = src;
 __asm__ __volatile__(
  cld\n\t
  rep movsb
  : +c (lent), +D(dstt), +S(src)
 );
Otherwise GCC thinks the registers still hold the original value.


Oh and mark this inline-ask as clobbering memory.





--

rguenth at gcc dot gnu dot org changed:

  What|Removed |Added
--- 
--- 
--

Status|UNCONFIRMED |RESOLVED
Resolution||INVALID


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39403



[Bug c/39403] Excessive optimization issue

2009-03-09 Thread pinskia at gmail dot com


--- Comment #2 from pinskia at gmail dot com  2009-03-09 15:57 ---
Subject: Re:  Excessive optimization issue



Sent from my iPhone

On Mar 9, 2009, at 8:36 AM, rguenth at gcc dot gnu dot org
gcc-bugzi...@gcc.gnu.org 
  wrote:



 --- Comment #1 from rguenth at gcc dot gnu dot org  2009-03-09  
 15:36 ---
 You need to specify that the registers are clobbered by the asm.   
 The only
 way to do that is to use output constraints (+D, +c, etc.) on  
 proper
 temporaries.

  int lent = len;
  char *dstt = dst;
  char *srct = src;
  __asm__ __volatile__(
   cld\n\t
   rep movsb
   : +c (lent), +D(dstt), +S(src)
  );
 Otherwise GCC thinks the registers still hold the original value.

Oh and mark this inline-ask as clobbering memory.




 -- 

 rguenth at gcc dot gnu dot org changed:

   What|Removed |Added
 --- 
 --- 
 --
 Status|UNCONFIRMED |RESOLVED
 Resolution||INVALID


 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39403



-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39403



[Bug c/39403] Excessive optimization issue

2009-03-09 Thread casmyu at gmail dot com


--- Comment #3 from casmyu at gmail dot com  2009-03-10 01:23 ---
Hi:
I have changed the code as you said, but it is more error now.

  1 #include stdio.h
  2
  3 int main()
  4 {
  5 char src[30] = {This is a test message.\n};
  6 char dst[30];
  7 int len = 25;
  8
  9 __asm__ __volatile__(
 10 cld\n\t
 11 rep movsb
 12 :
 13 //  : (src), D(dst), c(len)
 14 : +c(len), +D(dst), +S(src)
 15 );
 16 printf(%s\t%d\n, dst, len);
 17 return 0;
 18 }

[root][~]# gcc -O2 -o bugtest bugtest.c
bugtest.c: In function ¡®main¡¯:
bugtest.c:15: error: input operand constraint contains ¡®+¡¯
bugtest.c:15: error: input operand constraint contains ¡®+¡¯
bugtest.c:15: error: input operand constraint contains ¡®+¡¯
bugtest.c:9: error: input operand constraint contains ¡®+¡¯
bugtest.c:9: error: input operand constraint contains ¡®+¡¯
bugtest.c:9: error: input operand constraint contains ¡®+¡¯

Please help to re-check this issue.
Thank you!

(In reply to comment #2)
 Subject: Re:  Excessive optimization issue
 
 
 
 Sent from my iPhone
 
 On Mar 9, 2009, at 8:36 AM, rguenth at gcc dot gnu dot org
 gcc-bugzi...@gcc.gnu.org 
   wrote:
 
 
 
  --- Comment #1 from rguenth at gcc dot gnu dot org  2009-03-09  
  15:36 ---
  You need to specify that the registers are clobbered by the asm.   
  The only
  way to do that is to use output constraints (+D, +c, etc.) on  
  proper
  temporaries.
 
   int lent = len;
   char *dstt = dst;
   char *srct = src;
   __asm__ __volatile__(
cld\n\t
rep movsb
: +c (lent), +D(dstt), +S(src)
   );
  Otherwise GCC thinks the registers still hold the original value.
 
 Oh and mark this inline-ask as clobbering memory.
 
 
 
 
  -- 
 
  rguenth at gcc dot gnu dot org changed:
 
What|Removed |Added
  --- 
  --- 
  --
  Status|UNCONFIRMED |RESOLVED
  Resolution||INVALID
 
 
  http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39403
 
 


-- 

casmyu at gmail dot com changed:

   What|Removed |Added

 CC||casmyu at gmail dot com
 Status|RESOLVED|UNCONFIRMED
 Resolution|INVALID |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39403