This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[PATCH] doloop_optimize miscompiles openssl


Hi,

the appended testcase produces the following insn sequence with -O2 
-fno-branch-count-reg on powerpc-linux-gnu:

[...snip...]
(note 35 33 2918 NOTE_INSN_LOOP_BEG -1347440721)
 
(jump_insn 2918 35 2919 (set (pc)
        (label_ref 36)) -1 (nil)
    (nil))
 
(barrier 2919 2918 2895)
 
(code_label 2895 2919 2929 6 "" "" [1 uses])
 
(note 2929 2895 2898 [bb 1] NOTE_INSN_BASIC_BLOCK -1347440721)
 
(insn 2898 2929 2901 (set (reg/v:SI 86)
        (reg:SI 1058)) -1 (nil)
    (nil))
 
(insn 2901 2898 2904 (set (reg/v:SI 87)
        (reg:SI 1060)) -1 (nil)
    (nil))
 
(insn 2904 2901 2907 (set (reg/v:SI 88)
        (reg:SI 1062)) -1 (nil)
    (nil))
 
(insn 2907 2904 2910 (set (reg/v:SI 89)
        (reg:SI 1064)) -1 (nil)
    (nil))
 
(insn 2910 2907 2913 (set (reg/v:SI 90)
        (reg:SI 1066)) -1 (nil)
    (nil))
 
(insn 2913 2910 2939 (set (reg/v:SI 85)
        (plus:SI (reg/v:SI 85)
            (const_int 64 [0x40]))) -1 (nil)
    (nil))
 
(insn 2939 2913 2915 (set (reg:SI 1068)
        (mem/s:SI (reg/v:SI 82) 7)) -1 (nil)
    (nil))
 
(note 2915 2939 36 NOTE_INSN_LOOP_CONT -1347440721)
 
(code_label 36 2915 2930 3 "" "" [1 uses])
 
(note 2930 36 41 [bb 2] NOTE_INSN_BASIC_BLOCK -1347440721)
 
(insn 41 2930 43 (set (reg:SI 108)
        (mem:SI (reg/v:SI 85) 7)) -1 (nil)
    (nil))
[...snip...]

[...snip...]
(insn 2890 2887 2891 (set (reg/v:SI 84)
        (plus:SI (reg/v:SI 84)
            (const_int -1 [0xffffffff]))) -1 (nil)
    (nil))
 
(insn 2891 2890 2892 (set (reg:CC 1067)
        (compare:CC (reg/v:SI 84)
            (const_int 0 [0x0]))) -1 (nil)
    (nil))
 
(jump_insn 2892 2891 2922 (set (pc)
        (if_then_else (gt (reg:CC 1067)
                (const_int 0 [0x0]))
            (label_ref 2895)
            (pc))) -1 (nil)
    (nil))
 
(note 2922 2892 2924 NOTE_INSN_LOOP_END -1347440721)
 
(note 2924 2922 0 0x300a6d80 NOTE_INSN_BLOCK_END -1347440721)

With -fbranch-count-reg (btw, why is the flag named differently to the 
option?), the code in doloop_modify calls delete_insn(jump_insn) on insn 
2892, which in turn deletes the whole BB 1, because the uses of code_label 
2895 drop to 0.
Incrementing the use count before the delete_insn call prevents the immediate 
deletion, it happens any lateron, because the jump insn is wrongly converted:

[...snip...]
(note 35 2956 2953 NOTE_INSN_LOOP_BEG -1347440721)
 
(code_label 2953 35 2918 8 "" "" [1 uses])
 
(jump_insn 2918 2953 2919 (set (pc)
        (label_ref 36)) -1 (nil)
    (nil))
 
(barrier 2919 2918 2929)
 
(note 2929 2919 2915 [bb 1] NOTE_INSN_BASIC_BLOCK -1347440721)
 
(note 2915 2929 36 NOTE_INSN_LOOP_CONT -1347440721)
 
(code_label 36 2915 2930 3 "" "" [1 uses])
 
(note 2930 36 41 [bb 2] NOTE_INSN_BASIC_BLOCK -1347440721)
[...snip...]

[...snip...]
(insn 2891 2890 2945 (set (reg:CC 1067)
        (compare:CC (reg/v:SI 84)
            (const_int 0 [0x0]))) -1 (nil)
    (nil))
 
(jump_insn 2945 2891 2922 (parallel[
            (set (pc)
                (if_then_else (ne (reg:SI 1071)
                        (const_int 1 [0x1]))
                    (label_ref 2953)
                    (pc)))
            (set (reg:SI 1071)
                (plus:SI (reg:SI 1071)
                    (const_int -1 [0xffffffff])))
            (clobber (scratch:CC))
            (clobber (scratch:SI))
        ] ) -1 (nil)
    (nil))

So what happens is that the target label of the JUMP insn 2945 incorrectly 
points to the loop start, not to the loop top. This is caused by this code in 
doloop_modify:

  /* Discard original jump to continue loop.  The original compare
     result may still be live, so it cannot be discarded explicitly.  */
  delete_insn (jump_insn);
 
  /* Emit the label that will delimit the start of the loop.  */
  emit_label_after (start_label, loop->start);
  LABEL_NUSES (start_label)++;

The attached patch fixes the testcase, but I may very well have missed some 
important stuff, so please look closely :-). I haven't boostrapped yet either.

Franz.

	* doloop.c (doloop_modify): Prevent delete_insn() from deleting too much.
	Use loop->top as target for the new JUMP insn.

Index: gcc/doloop.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/doloop.c,v
retrieving revision 1.2
diff -u -p -r1.2 doloop.c
--- gcc/doloop.c	2000/08/14 20:55:11	1.2
+++ gcc/doloop.c	2000/09/24 17:38:16
@@ -416,11 +416,14 @@ doloop_modify (loop, iterations, iterati
     }
 
   /* Discard original jump to continue loop.  The original compare
-     result may still be live, so it cannot be discarded explicitly.  */
+     result may still be live, so it cannot be discarded explicitly.
+     Don't delete too much, increment the use count of the target label.  */
+  LABEL_NUSES (JUMP_LABEL (jump_insn))++;
   delete_insn (jump_insn);
+  LABEL_NUSES (JUMP_LABEL (jump_insn))--;
 
-  /* Emit the label that will delimit the start of the loop.  */
-  emit_label_after (start_label, loop->start);
+  /* Emit the label that will delimit the top of the loop.  */
+  emit_label_after (start_label, loop->top);
   LABEL_NUSES (start_label)++;
 
   counter_reg = XEXP (condition, 0);

typedef struct SHAstate_st
        {
        unsigned int h0,h1,h2,h3,h4;
        unsigned int Nl,Nh;
        unsigned int data[16];
        int num;
        } SHA_CTX;

void sha_block_host_order (SHA_CTX *c, const void *p,int num);
void sha_block_data_order (SHA_CTX *c, const void *p,int num);

void sha_block_host_order (SHA_CTX *c, const void *d, int num)
        {
        const unsigned int *W=d;
        register unsigned long A,B,C,D,E,T;

        unsigned long XX0, XX1, XX2, XX3, XX4, XX5, XX6, XX7,
                        XX8, XX9,XX10,XX11,XX12,XX13,XX14,XX15;




        A=c->h0;
        B=c->h1;
        C=c->h2;
        D=c->h3;
        E=c->h4;

        for (;;)
                {
        (T)=W[ 0]+(E)+0x5a827999UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(5)); ret; })+(((((C)) ^ ((D))) & ((B))) ^ ((D))); (B)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(30)); ret; });;
        (E)=W[ 1]+(D)+0x5a827999UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(5)); ret; })+(((((B)) ^ ((C))) & ((A))) ^ ((C))); (A)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(30)); ret; });;
        (D)=W[ 2]+(C)+0x5a827999UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(5)); ret; })+(((((A)) ^ ((B))) & ((T))) ^ ((B))); (T)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(30)); ret; });;
        (C)=W[ 3]+(B)+0x5a827999UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(5)); ret; })+(((((T)) ^ ((A))) & ((E))) ^ ((A))); (E)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(30)); ret; });;
        (B)=W[ 4]+(A)+0x5a827999UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(5)); ret; })+(((((E)) ^ ((T))) & ((D))) ^ ((T))); (D)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(30)); ret; });;
        (A)=W[ 5]+(T)+0x5a827999UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(5)); ret; })+(((((D)) ^ ((E))) & ((C))) ^ ((E))); (C)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(30)); ret; });;
        (T)=W[ 6]+(E)+0x5a827999UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(5)); ret; })+(((((C)) ^ ((D))) & ((B))) ^ ((D))); (B)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(30)); ret; });;
        (E)=W[ 7]+(D)+0x5a827999UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(5)); ret; })+(((((B)) ^ ((C))) & ((A))) ^ ((C))); (A)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(30)); ret; });;
        (D)=W[ 8]+(C)+0x5a827999UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(5)); ret; })+(((((A)) ^ ((B))) & ((T))) ^ ((B))); (T)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(30)); ret; });;
        (C)=W[ 9]+(B)+0x5a827999UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(5)); ret; })+(((((T)) ^ ((A))) & ((E))) ^ ((A))); (E)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(30)); ret; });;
        (B)=W[10]+(A)+0x5a827999UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(5)); ret; })+(((((E)) ^ ((T))) & ((D))) ^ ((T))); (D)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(30)); ret; });;
        (A)=W[11]+(T)+0x5a827999UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(5)); ret; })+(((((D)) ^ ((E))) & ((C))) ^ ((E))); (C)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(30)); ret; });;
        (T)=W[12]+(E)+0x5a827999UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(5)); ret; })+(((((C)) ^ ((D))) & ((B))) ^ ((D))); (B)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(30)); ret; });;
        (E)=W[13]+(D)+0x5a827999UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(5)); ret; })+(((((B)) ^ ((C))) & ((A))) ^ ((C))); (A)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(30)); ret; });;
        (D)=W[14]+(C)+0x5a827999UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(5)); ret; })+(((((A)) ^ ((B))) & ((T))) ^ ((B))); (T)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(30)); ret; });;
        (C)=W[15]+(B)+0x5a827999UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(5)); ret; })+(((((T)) ^ ((A))) & ((E))) ^ ((A))); (E)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(30)); ret; });;

        (XX0=(B)=(W[ 0]^W[ 2]^W[ 8]^W[13])); (B)+=(A)+0x5a827999UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(5)); ret; })+(((((E)) ^ ((T))) & ((D))) ^ ((T))); (D)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(30)); ret; });;
        (XX1=(A)=(W[ 1]^W[ 3]^W[ 9]^W[14])); (A)+=(T)+0x5a827999UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(5)); ret; })+(((((D)) ^ ((E))) & ((C))) ^ ((E))); (C)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(30)); ret; });;
        (XX2=(T)=(W[ 2]^W[ 4]^W[10]^W[15])); (T)+=(E)+0x5a827999UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(5)); ret; })+(((((C)) ^ ((D))) & ((B))) ^ ((D))); (B)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(30)); ret; });;
        (XX3=(E)=(W[ 3]^W[ 5]^W[11]^XX0)); (E)+=(D)+0x5a827999UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(5)); ret; })+(((((B)) ^ ((C))) & ((A))) ^ ((C))); (A)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(30)); ret; });;

        (XX4=(D)=(W[ 4]^W[ 6]^W[12]^XX1)); (D)+=(C)+0x6ed9eba1UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(5)); ret; })+(((T)) ^ ((A)) ^ ((B))); (T)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(30)); ret; });;
        (XX5=(C)=(W[ 5]^W[ 7]^W[13]^XX2)); (C)+=(B)+0x6ed9eba1UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(5)); ret; })+(((E)) ^ ((T)) ^ ((A))); (E)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(30)); ret; });;
        (XX6=(B)=(W[ 6]^W[ 8]^W[14]^XX3)); (B)+=(A)+0x6ed9eba1UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(5)); ret; })+(((D)) ^ ((E)) ^ ((T))); (D)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(30)); ret; });;
        (XX7=(A)=(W[ 7]^W[ 9]^W[15]^XX4)); (A)+=(T)+0x6ed9eba1UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(5)); ret; })+(((C)) ^ ((D)) ^ ((E))); (C)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(30)); ret; });;
        (XX8=(T)=(W[ 8]^W[10]^XX0^XX5)); (T)+=(E)+0x6ed9eba1UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(5)); ret; })+(((B)) ^ ((C)) ^ ((D))); (B)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(30)); ret; });;
        (XX9=(E)=(W[ 9]^W[11]^XX1^XX6)); (E)+=(D)+0x6ed9eba1UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(5)); ret; })+(((A)) ^ ((B)) ^ ((C))); (A)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(30)); ret; });;
        (XX10=(D)=(W[10]^W[12]^XX2^XX7)); (D)+=(C)+0x6ed9eba1UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(5)); ret; })+(((T)) ^ ((A)) ^ ((B))); (T)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(30)); ret; });;
        (XX11=(C)=(W[11]^W[13]^XX3^XX8)); (C)+=(B)+0x6ed9eba1UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(5)); ret; })+(((E)) ^ ((T)) ^ ((A))); (E)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(30)); ret; });;
        (XX12=(B)=(W[12]^W[14]^XX4^XX9)); (B)+=(A)+0x6ed9eba1UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(5)); ret; })+(((D)) ^ ((E)) ^ ((T))); (D)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(30)); ret; });;
        (XX13=(A)=(W[13]^W[15]^XX5^XX10)); (A)+=(T)+0x6ed9eba1UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(5)); ret; })+(((C)) ^ ((D)) ^ ((E))); (C)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(30)); ret; });;
        (XX14=(T)=(W[14]^XX0^XX6^XX11)); (T)+=(E)+0x6ed9eba1UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(5)); ret; })+(((B)) ^ ((C)) ^ ((D))); (B)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(30)); ret; });;
        (XX15=(E)=(W[15]^XX1^XX7^XX12)); (E)+=(D)+0x6ed9eba1UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(5)); ret; })+(((A)) ^ ((B)) ^ ((C))); (A)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(30)); ret; });;

        (XX0=(D)=(XX0^XX2^XX8^XX13)); (D)+=(C)+0x6ed9eba1UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(5)); ret; })+(((T)) ^ ((A)) ^ ((B))); (T)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(30)); ret; });;
        (XX1=(C)=(XX1^XX3^XX9^XX14)); (C)+=(B)+0x6ed9eba1UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(5)); ret; })+(((E)) ^ ((T)) ^ ((A))); (E)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(30)); ret; });;
        (XX2=(B)=(XX2^XX4^XX10^XX15)); (B)+=(A)+0x6ed9eba1UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(5)); ret; })+(((D)) ^ ((E)) ^ ((T))); (D)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(30)); ret; });;
        (XX3=(A)=(XX3^XX5^XX11^XX0)); (A)+=(T)+0x6ed9eba1UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(5)); ret; })+(((C)) ^ ((D)) ^ ((E))); (C)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(30)); ret; });;
        (XX4=(T)=(XX4^XX6^XX12^XX1)); (T)+=(E)+0x6ed9eba1UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(5)); ret; })+(((B)) ^ ((C)) ^ ((D))); (B)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(30)); ret; });;
        (XX5=(E)=(XX5^XX7^XX13^XX2)); (E)+=(D)+0x6ed9eba1UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(5)); ret; })+(((A)) ^ ((B)) ^ ((C))); (A)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(30)); ret; });;
        (XX6=(D)=(XX6^XX8^XX14^XX3)); (D)+=(C)+0x6ed9eba1UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(5)); ret; })+(((T)) ^ ((A)) ^ ((B))); (T)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(30)); ret; });;
        (XX7=(C)=(XX7^XX9^XX15^XX4)); (C)+=(B)+0x6ed9eba1UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(5)); ret; })+(((E)) ^ ((T)) ^ ((A))); (E)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(30)); ret; });;

        (XX8=(B)=(XX8^XX10^XX0^XX5)); (B)+=(A)+0x8f1bbcdcUL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(5)); ret; })+((((D)) & ((E))) | ((((D))|((E))) & ((T)))); (D)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(30)); ret; });;
        (XX9=(A)=(XX9^XX11^XX1^XX6)); (A)+=(T)+0x8f1bbcdcUL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(5)); ret; })+((((C)) & ((D))) | ((((C))|((D))) & ((E)))); (C)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(30)); ret; });;
        (XX10=(T)=(XX10^XX12^XX2^XX7)); (T)+=(E)+0x8f1bbcdcUL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(5)); ret; })+((((B)) & ((C))) | ((((B))|((C))) & ((D)))); (B)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(30)); ret; });;
        (XX11=(E)=(XX11^XX13^XX3^XX8)); (E)+=(D)+0x8f1bbcdcUL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(5)); ret; })+((((A)) & ((B))) | ((((A))|((B))) & ((C)))); (A)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(30)); ret; });;
        (XX12=(D)=(XX12^XX14^XX4^XX9)); (D)+=(C)+0x8f1bbcdcUL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(5)); ret; })+((((T)) & ((A))) | ((((T))|((A))) & ((B)))); (T)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(30)); ret; });;
        (XX13=(C)=(XX13^XX15^XX5^XX10)); (C)+=(B)+0x8f1bbcdcUL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(5)); ret; })+((((E)) & ((T))) | ((((E))|((T))) & ((A)))); (E)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(30)); ret; });;
        (XX14=(B)=(XX14^XX0^XX6^XX11)); (B)+=(A)+0x8f1bbcdcUL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(5)); ret; })+((((D)) & ((E))) | ((((D))|((E))) & ((T)))); (D)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(30)); ret; });;
        (XX15=(A)=(XX15^XX1^XX7^XX12)); (A)+=(T)+0x8f1bbcdcUL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(5)); ret; })+((((C)) & ((D))) | ((((C))|((D))) & ((E)))); (C)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(30)); ret; });;
        (XX0=(T)=(XX0^XX2^XX8^XX13)); (T)+=(E)+0x8f1bbcdcUL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(5)); ret; })+((((B)) & ((C))) | ((((B))|((C))) & ((D)))); (B)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(30)); ret; });;
        (XX1=(E)=(XX1^XX3^XX9^XX14)); (E)+=(D)+0x8f1bbcdcUL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(5)); ret; })+((((A)) & ((B))) | ((((A))|((B))) & ((C)))); (A)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(30)); ret; });;
        (XX2=(D)=(XX2^XX4^XX10^XX15)); (D)+=(C)+0x8f1bbcdcUL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(5)); ret; })+((((T)) & ((A))) | ((((T))|((A))) & ((B)))); (T)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(30)); ret; });;
        (XX3=(C)=(XX3^XX5^XX11^XX0)); (C)+=(B)+0x8f1bbcdcUL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(5)); ret; })+((((E)) & ((T))) | ((((E))|((T))) & ((A)))); (E)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(30)); ret; });;
        (XX4=(B)=(XX4^XX6^XX12^XX1)); (B)+=(A)+0x8f1bbcdcUL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(5)); ret; })+((((D)) & ((E))) | ((((D))|((E))) & ((T)))); (D)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(30)); ret; });;
        (XX5=(A)=(XX5^XX7^XX13^XX2)); (A)+=(T)+0x8f1bbcdcUL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(5)); ret; })+((((C)) & ((D))) | ((((C))|((D))) & ((E)))); (C)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(30)); ret; });;
        (XX6=(T)=(XX6^XX8^XX14^XX3)); (T)+=(E)+0x8f1bbcdcUL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(5)); ret; })+((((B)) & ((C))) | ((((B))|((C))) & ((D)))); (B)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(30)); ret; });;
        (XX7=(E)=(XX7^XX9^XX15^XX4)); (E)+=(D)+0x8f1bbcdcUL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(5)); ret; })+((((A)) & ((B))) | ((((A))|((B))) & ((C)))); (A)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(30)); ret; });;
        (XX8=(D)=(XX8^XX10^XX0^XX5)); (D)+=(C)+0x8f1bbcdcUL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(5)); ret; })+((((T)) & ((A))) | ((((T))|((A))) & ((B)))); (T)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(30)); ret; });;
        (XX9=(C)=(XX9^XX11^XX1^XX6)); (C)+=(B)+0x8f1bbcdcUL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(5)); ret; })+((((E)) & ((T))) | ((((E))|((T))) & ((A)))); (E)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(30)); ret; });;
        (XX10=(B)=(XX10^XX12^XX2^XX7)); (B)+=(A)+0x8f1bbcdcUL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(5)); ret; })+((((D)) & ((E))) | ((((D))|((E))) & ((T)))); (D)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(30)); ret; });;
        (XX11=(A)=(XX11^XX13^XX3^XX8)); (A)+=(T)+0x8f1bbcdcUL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(5)); ret; })+((((C)) & ((D))) | ((((C))|((D))) & ((E)))); (C)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(30)); ret; });;

        (XX12=(T)=(XX12^XX14^XX4^XX9)); (T)=XX12+(E)+0xca62c1d6UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(5)); ret; })+(((B)) ^ ((C)) ^ ((D))); (B)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(30)); ret; });;
        (XX13=(E)=(XX13^XX15^XX5^XX10)); (E)=XX13+(D)+0xca62c1d6UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(5)); ret; })+(((A)) ^ ((B)) ^ ((C))); (A)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(30)); ret; });;
        (XX14=(D)=(XX14^XX0^XX6^XX11)); (D)=XX14+(C)+0xca62c1d6UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(5)); ret; })+(((T)) ^ ((A)) ^ ((B))); (T)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(30)); ret; });;
        (XX15=(C)=(XX15^XX1^XX7^XX12)); (C)=XX15+(B)+0xca62c1d6UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(5)); ret; })+(((E)) ^ ((T)) ^ ((A))); (E)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(30)); ret; });;
        (XX0=(B)=(XX0^XX2^XX8^XX13)); (B)=XX0+(A)+0xca62c1d6UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(5)); ret; })+(((D)) ^ ((E)) ^ ((T))); (D)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(30)); ret; });;
        (XX1=(A)=(XX1^XX3^XX9^XX14)); (A)=XX1+(T)+0xca62c1d6UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(5)); ret; })+(((C)) ^ ((D)) ^ ((E))); (C)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(30)); ret; });;
        (XX2=(T)=(XX2^XX4^XX10^XX15)); (T)=XX2+(E)+0xca62c1d6UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(5)); ret; })+(((B)) ^ ((C)) ^ ((D))); (B)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(30)); ret; });;
        (XX3=(E)=(XX3^XX5^XX11^XX0)); (E)=XX3+(D)+0xca62c1d6UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(5)); ret; })+(((A)) ^ ((B)) ^ ((C))); (A)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(30)); ret; });;
        (XX4=(D)=(XX4^XX6^XX12^XX1)); (D)=XX4+(C)+0xca62c1d6UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(5)); ret; })+(((T)) ^ ((A)) ^ ((B))); (T)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(30)); ret; });;
        (XX5=(C)=(XX5^XX7^XX13^XX2)); (C)=XX5+(B)+0xca62c1d6UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(5)); ret; })+(((E)) ^ ((T)) ^ ((A))); (E)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(30)); ret; });;
        (XX6=(B)=(XX6^XX8^XX14^XX3)); (B)=XX6+(A)+0xca62c1d6UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(5)); ret; })+(((D)) ^ ((E)) ^ ((T))); (D)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(30)); ret; });;
        (XX7=(A)=(XX7^XX9^XX15^XX4)); (A)=XX7+(T)+0xca62c1d6UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(5)); ret; })+(((C)) ^ ((D)) ^ ((E))); (C)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(30)); ret; });;
        (XX8=(T)=(XX8^XX10^XX0^XX5)); (T)=XX8+(E)+0xca62c1d6UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(5)); ret; })+(((B)) ^ ((C)) ^ ((D))); (B)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(30)); ret; });;
        (XX9=(E)=(XX9^XX11^XX1^XX6)); (E)=XX9+(D)+0xca62c1d6UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(5)); ret; })+(((A)) ^ ((B)) ^ ((C))); (A)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(30)); ret; });;
        (XX10=(D)=(XX10^XX12^XX2^XX7)); (D)=XX10+(C)+0xca62c1d6UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(5)); ret; })+(((T)) ^ ((A)) ^ ((B))); (T)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(30)); ret; });;
        (XX11=(C)=(XX11^XX13^XX3^XX8)); (C)=XX11+(B)+0xca62c1d6UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(5)); ret; })+(((E)) ^ ((T)) ^ ((A))); (E)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((E)), "I"(30)); ret; });;
        (XX12=(B)=(XX12^XX14^XX4^XX9)); (B)=XX12+(A)+0xca62c1d6UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(5)); ret; })+(((D)) ^ ((E)) ^ ((T))); (D)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((D)), "I"(30)); ret; });;
        (XX13=(A)=(XX13^XX15^XX5^XX10)); (A)=XX13+(T)+0xca62c1d6UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(5)); ret; })+(((C)) ^ ((D)) ^ ((E))); (C)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((C)), "I"(30)); ret; });;
        (XX14=(T)=(XX14^XX0^XX6^XX11)); (T)=XX14+(E)+0xca62c1d6UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(5)); ret; })+(((B)) ^ ((C)) ^ ((D))); (B)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((B)), "I"(30)); ret; });;
        (XX15=(E)=(XX15^XX1^XX7^XX12)); (E)=XX15+(D)+0xca62c1d6UL+({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((T)), "I"(5)); ret; })+(((A)) ^ ((B)) ^ ((C))); (A)=({ register unsigned int ret; asm ( "rlwinm %0,%1,%2,0,31" : "=r"(ret) : "r"((A)), "I"(30)); ret; });;

        c->h0=(c->h0+E)&0xffffffffL;
        c->h1=(c->h1+T)&0xffffffffL;
        c->h2=(c->h2+A)&0xffffffffL;
        c->h3=(c->h3+B)&0xffffffffL;
        c->h4=(c->h4+C)&0xffffffffL;

        if (--num <= 0) break;

        A=c->h0;
        B=c->h1;
        C=c->h2;
        D=c->h3;
        E=c->h4;

        W+=16;
                }
        }

Index: gcc/doloop.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/doloop.c,v
retrieving revision 1.2
diff -u -p -r1.2 doloop.c
--- gcc/doloop.c	2000/08/14 20:55:11	1.2
+++ gcc/doloop.c	2000/09/24 17:38:16
@@ -416,11 +416,14 @@ doloop_modify (loop, iterations, iterati
     }
 
   /* Discard original jump to continue loop.  The original compare
-     result may still be live, so it cannot be discarded explicitly.  */
+     result may still be live, so it cannot be discarded explicitly.
+     Don't delete too much, increment the use count of the target label.  */
+  LABEL_NUSES (JUMP_LABEL (jump_insn))++;
   delete_insn (jump_insn);
+  LABEL_NUSES (JUMP_LABEL (jump_insn))--;
 
-  /* Emit the label that will delimit the start of the loop.  */
-  emit_label_after (start_label, loop->start);
+  /* Emit the label that will delimit the top of the loop.  */
+  emit_label_after (start_label, loop->top);
   LABEL_NUSES (start_label)++;
 
   counter_reg = XEXP (condition, 0);

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]