home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #19 / NN_1992_19.iso / spool / comp / lang / c / 13188 < prev    next >
Encoding:
Text File  |  1992-09-03  |  2.3 KB  |  76 lines

  1. Xref: sparky comp.lang.c:13188 comp.sys.sun.misc:4076
  2. Path: sparky!uunet!cs.utexas.edu!sun-barr!rutgers!concert!aurs01!throop
  3. From: throop@aurs01.UUCP (Wayne Throop)
  4. Newsgroups: comp.lang.c,comp.sys.sun.misc
  5. Subject: Re: sun cc optimization failure
  6. Summary: deficient optimizer technology
  7. Message-ID: <61124@aurs01.UUCP>
  8. Date: 3 Sep 92 19:12:20 GMT
  9. References: <1992Sep3.040401.16902@mr.med.ge.com> <880@metrix.UUCP>
  10. Sender: news@aurs01.UUCP
  11. Reply-To: throop@aurw44.aur.alcatel.com.UUCP (Wayne Throop)
  12. Organization: Alcatel Network Systems, Raleigh NC
  13. Lines: 61
  14.  
  15. -   #include <stdio.h>
  16. ->> main() {
  17. ->>        int i,j,ax;
  18. ->>        ax = 0;
  19. ->>        for(i=0;i<3;i++){
  20. ->>                j = ax * i;
  21. ->>                puts("in for loop");
  22. ->>        }
  23. -          return 0;
  24. ->> }
  25. ->> when compiled with cc (sun os 4.1 on sparc 1+), the
  26. ->> code runs thru the loop three times. when comiled with
  27. ->> the -O flag it only runs once. 
  28. -> If you look at the assembler output of the compiler using the following
  29.  
  30. Out of curiosity, I ran this through the three compilers I had
  31. available for the MIPS architecture (decstation) machine I have here.  
  32. The two MIPS-based compilers (classic and ansi C) both optimized
  33. the loop to be
  34.  
  35.         move    $16, $0
  36.         la      $17, $$50
  37.         li      $18, 3
  38.   $32:
  39.         move    $4, $17
  40.         jal     puts
  41.         addu    $16, $16, 1
  42.         bne     $16, $18, $32
  43.  
  44. The gcc 1.39 mumble-whatever version I have made it
  45.  
  46.         move    $16,$0
  47.   $L5:
  48.         subu    $sp,$sp,16
  49.         la      $4,$LC0
  50.         jal     puts
  51.         addu    $sp,$sp,16
  52.         addu    $16,$16,1
  53.         ble     $16,2,$L5 
  54.  
  55. In general, this older gcc does significantly more frame-and-stack
  56. pointer twiddling, both in this loop and in the prolog and postlog
  57. code and the like, compared to the MIPS-based compilers.  
  58. (2.0 may do better.)
  59.  
  60. But the thing that struck me was, why didn't the optimizer just
  61.  
  62.         la      $4,$LABEL
  63.         jal     puts
  64.         jal     puts
  65.         jal     puts
  66.  
  67. (or some variation on this theme) as it "should" have?  
  68.  
  69. ( Maybe there are RISCish slot-filling considerations that prevent it... 
  70.   but I really think the compilers just don't do simple loop unrolling,
  71.   even when they've already demolished the innards of the loop anyhows. )
  72.  
  73. Just another of the many things that make me go "Hmmmmmm."
  74.  
  75. Wayne Throop       ...!mcnc!aurgate!throop
  76.