[wwwdocs] "Deficiencies of GCC's optimizer" correction

Roger Sayle roger@eyesopen.com
Thu May 16 16:48:00 GMT 2002


The final section of the optimizer deficiencies WWW page covers
"suboptimal code for complex conditionals".  Unfortunately, the x86
sequence suggested as optimal is incorrect.  The "testl %ecx, %edx"
instruction on IA-32 performs a bitwise-and not a truthwise-and, so
cannot be used to implement C's && operator.  As a counter-example,
"and(2,4)" will produce the incorrect value zero with the proposed
implementation instead of the expected value 1.

The patch below simply removes the erroneous bits.  Ok to apply?
[Patch to improve code for complex conditionals in preparation :>]


Index: optimize.html
===================================================================
RCS file: /cvs/gcc/wwwdocs/htdocs/projects/optimize.html,v
retrieving revision 1.5
diff -c -3 -p -r1.5 optimize.html
*** optimize.html	25 Jan 2002 09:57:30 -0000	1.5
--- optimize.html	16 May 2002 23:08:46 -0000
*************** or:
*** 752,785 ****
          ret
  </pre>

! <p>Yay - no branches!  But this code is still not perfect.  For one
! thing, we fail to take advantage of the ability to test two registers
! at once.  For another, what are those trailing <code>andl</code>
! instructions doing there?</p>
!
! <p>Optimal code for this example would look something like:</p>
!
! <pre>
! and:
! 	movl	4(%esp), %edx
! 	movl	8(%esp), %ecx
! 	xorl	%eax, %eax
! 	testl	%ecx, %edx
! 	setne	%al
! 	ret
!
! or:
! 	movl	4(%esp), %edx
! 	xorl	%eax, %eax
! 	movl	8(%esp), %ecx
! 	notl	%edx
! 	notl	%ecx
! 	testl	%ecx, %edx
! 	sete	%al
! 	ret
! </pre>
!
! <p>The 'or' example uses the rule that <code>(a || b) == !(!a && !b)</code>.</p>

  <p>The important scheduling considerations, for PPro/PII anyway, are
  to separate loads from uses by at least one instruction (assuming top
--- 752,758 ----
          ret
  </pre>

! <p>Yay - no branches!</p>

  <p>The important scheduling considerations, for PPro/PII anyway, are
  to separate loads from uses by at least one instruction (assuming top


Roger
--
Roger Sayle,                         E-mail: roger@eyesopen.com
OpenEye Scientific Software,         WWW: http://www.eyesopen.com/
Suite 1107, 3600 Cerrillos Road,     Tel: (+1) 505-473-7385
Santa Fe, New Mexico, 87507.         Fax: (+1) 505-473-0833



More information about the Gcc-patches mailing list