public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* Restrict qualifier doesn't work in TRUNK.
@ 2009-09-11 14:11 Bingfeng Mei
  2009-09-11 14:37 ` Richard Guenther
  0 siblings, 1 reply; 2+ messages in thread
From: Bingfeng Mei @ 2009-09-11 14:11 UTC (permalink / raw)
  To: gcc; +Cc: Richard Guenther

Hello,
I notice the restrict qualifier doesn't work properly in trunk any more. 
In the following example, the memory accesses of a, b, c don't have different
alias set attached any more. Instead, the generic alias set of 2 is used
for all accesses. 

I remember alias analysis part had some big changes since 4.5 branched out.
Is it still in unstable phase, or is there some new hooks I should use for
my port? 

Cheers,
Bingfeng Mei


void foo (int * __restrict__ a, int * __restrict__ b, int * __restrict__ c)
{
   int i;
   for(i = 0; i < 100; i+=4)
     {
       a[i] = b[i] * c[i];
       a[i+1] = b[i+1] * c[i+1];
       a[i+2] = b[i+2] * c[i+2];
       a[i+3] = b[i+3] * c[i+3];
     }
}   

Before expand:

foo (int * restrict a, int * restrict b, int * restrict c)
{
  long unsigned int D.3213;
  long unsigned int ivtmp.32;
  long unsigned int ivtmp.31;
  long unsigned int ivtmp.29;
  int D.3168;
  int D.3167;
  int D.3165;
  int D.3160;
  int D.3159;
  int D.3157;
  int D.3152;
  int D.3151;
  int D.3149;
  int D.3143;
  int D.3142;
  int D.3140;

  # BLOCK 2 freq:385
  # PRED: ENTRY [100.0%]  (fallthru,exec)
  ivtmp.29_77 = (long unsigned int) b_9(D);
  ivtmp.31_74 = (long unsigned int) c_14(D);
  ivtmp.32_83 = (long unsigned int) a_5(D);
  D.3213_85 = ivtmp.32_83 + 400;
  # SUCC: 3 [100.0%]  (fallthru,exec)

  # BLOCK 3 freq:9615
  # PRED: 3 [96.0%]  (true,exec) 2 [100.0%]  (fallthru,exec)
  # ivtmp.29_79 = PHI <ivtmp.29_78(3), ivtmp.29_77(2)>
  # ivtmp.31_76 = PHI <ivtmp.31_75(3), ivtmp.31_74(2)>
  # ivtmp.32_73 = PHI <ivtmp.32_82(3), ivtmp.32_83(2)>
  D.3140_11 = MEM[index: ivtmp.29_79];
  D.3142_16 = MEM[index: ivtmp.31_76];
  D.3143_17 = D.3142_16 * D.3140_11;
  MEM[index: ivtmp.32_73] = D.3143_17;
  D.3149_26 = MEM[index: ivtmp.29_79, offset: 4];
  D.3151_31 = MEM[index: ivtmp.31_76, offset: 4];
  D.3152_32 = D.3151_31 * D.3149_26;
  MEM[index: ivtmp.32_73, offset: 4] = D.3152_32;
  D.3157_41 = MEM[index: ivtmp.29_79, offset: 8];
  D.3159_46 = MEM[index: ivtmp.31_76, offset: 8];
  D.3160_47 = D.3159_46 * D.3157_41;
  MEM[index: ivtmp.32_73, offset: 8] = D.3160_47;
  D.3165_56 = MEM[index: ivtmp.29_79, offset: 12];
  D.3167_61 = MEM[index: ivtmp.31_76, offset: 12];
  D.3168_62 = D.3167_61 * D.3165_56;
  MEM[index: ivtmp.32_73, offset: 12] = D.3168_62;
  ivtmp.29_78 = ivtmp.29_79 + 16;
  ivtmp.31_75 = ivtmp.31_76 + 16;
  ivtmp.32_82 = ivtmp.32_73 + 16;
  if (ivtmp.32_82 != D.3213_85)
    goto <bb 3>;
  else
    goto <bb 4>;
  # SUCC: 3 [96.0%]  (true,exec) 4 [4.0%]  (false,exec)

  # BLOCK 4 freq:385
  # PRED: 3 [4.0%]  (false,exec)
  return;
  # SUCC: EXIT [100.0%] 

}

Part of RTL

...
insn 40 39 41 4 sms-6.c:11 (set (reg:SI 157)
        (mem:SI (reg:SI 151 [ ivtmp.31 ]) [2 S4 A32])) -1 (nil))

(insn 41 40 42 4 sms-6.c:11 (set (reg:SI 158)
        (mem:SI (reg:SI 152 [ ivtmp.29 ]) [2 S4 A32])) -1 (nil))

(insn 42 41 43 4 sms-6.c:11 (set (reg:SI 159)
        (mult:SI (reg:SI 157)
            (reg:SI 158))) -1 (nil))

(insn 43 42 44 4 sms-6.c:11 (set (mem:SI (reg:SI 150 [ ivtmp.32 ]) [2 S4 A32])
        (reg:SI 159)) -1 (nil))

(insn 44 43 45 4 sms-6.c:12 (set (reg:SI 160)
        (mem:SI (plus:SI (reg:SI 151 [ ivtmp.31 ])
                (const_int 4 [0x4])) [2 S4 A32])) -1 (nil))

(insn 45 44 46 4 sms-6.c:12 (set (reg:SI 161)
        (mem:SI (plus:SI (reg:SI 152 [ ivtmp.29 ])
                (const_int 4 [0x4])) [2 S4 A32])) -1 (nil))

(insn 46 45 47 4 sms-6.c:12 (set (reg:SI 162)
        (mult:SI (reg:SI 160)
            (reg:SI 161))) -1 (nil))

(insn 47 46 48 4 sms-6.c:12 (set (mem:SI (plus:SI (reg:SI 150 [ ivtmp.32 ])
                (const_int 4 [0x4])) [2 S4 A32])
        (reg:SI 162)) -1 (nil))

(insn 48 47 49 4 sms-6.c:13 (set (reg:SI 163)
        (mem:SI (plus:SI (reg:SI 151 [ ivtmp.31 ])
                (const_int 8 [0x8])) [2 S4 A32])) -1 (nil))

(insn 49 48 50 4 sms-6.c:13 (set (reg:SI 164)
        (mem:SI (plus:SI (reg:SI 152 [ ivtmp.29 ])
                (const_int 8 [0x8])) [2 S4 A32])) -1 (nil))
...

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Restrict qualifier doesn't work in TRUNK.
  2009-09-11 14:11 Restrict qualifier doesn't work in TRUNK Bingfeng Mei
@ 2009-09-11 14:37 ` Richard Guenther
  0 siblings, 0 replies; 2+ messages in thread
From: Richard Guenther @ 2009-09-11 14:37 UTC (permalink / raw)
  To: Bingfeng Mei; +Cc: gcc

On Fri, Sep 11, 2009 at 4:11 PM, Bingfeng Mei <bmei@broadcom.com> wrote:
> Hello,
> I notice the restrict qualifier doesn't work properly in trunk any more.
> In the following example, the memory accesses of a, b, c don't have different
> alias set attached any more. Instead, the generic alias set of 2 is used
> for all accesses.
>
> I remember alias analysis part had some big changes since 4.5 branched out.
> Is it still in unstable phase, or is there some new hooks I should use for
> my port?

restrict is no longer encoded in the type-based alias-sets but in
the points-to sets that are reachable from the mems MEM_EXPR.
In case of TARGET_MEM_REFs you are (at the moment) out of luck
though.

Richard.

> Cheers,
> Bingfeng Mei
>
>
> void foo (int * __restrict__ a, int * __restrict__ b, int * __restrict__ c)
> {
>   int i;
>   for(i = 0; i < 100; i+=4)
>     {
>       a[i] = b[i] * c[i];
>       a[i+1] = b[i+1] * c[i+1];
>       a[i+2] = b[i+2] * c[i+2];
>       a[i+3] = b[i+3] * c[i+3];
>     }
> }
>
> Before expand:
>
> foo (int * restrict a, int * restrict b, int * restrict c)
> {
>  long unsigned int D.3213;
>  long unsigned int ivtmp.32;
>  long unsigned int ivtmp.31;
>  long unsigned int ivtmp.29;
>  int D.3168;
>  int D.3167;
>  int D.3165;
>  int D.3160;
>  int D.3159;
>  int D.3157;
>  int D.3152;
>  int D.3151;
>  int D.3149;
>  int D.3143;
>  int D.3142;
>  int D.3140;
>
>  # BLOCK 2 freq:385
>  # PRED: ENTRY [100.0%]  (fallthru,exec)
>  ivtmp.29_77 = (long unsigned int) b_9(D);
>  ivtmp.31_74 = (long unsigned int) c_14(D);
>  ivtmp.32_83 = (long unsigned int) a_5(D);
>  D.3213_85 = ivtmp.32_83 + 400;
>  # SUCC: 3 [100.0%]  (fallthru,exec)
>
>  # BLOCK 3 freq:9615
>  # PRED: 3 [96.0%]  (true,exec) 2 [100.0%]  (fallthru,exec)
>  # ivtmp.29_79 = PHI <ivtmp.29_78(3), ivtmp.29_77(2)>
>  # ivtmp.31_76 = PHI <ivtmp.31_75(3), ivtmp.31_74(2)>
>  # ivtmp.32_73 = PHI <ivtmp.32_82(3), ivtmp.32_83(2)>
>  D.3140_11 = MEM[index: ivtmp.29_79];
>  D.3142_16 = MEM[index: ivtmp.31_76];
>  D.3143_17 = D.3142_16 * D.3140_11;
>  MEM[index: ivtmp.32_73] = D.3143_17;
>  D.3149_26 = MEM[index: ivtmp.29_79, offset: 4];
>  D.3151_31 = MEM[index: ivtmp.31_76, offset: 4];
>  D.3152_32 = D.3151_31 * D.3149_26;
>  MEM[index: ivtmp.32_73, offset: 4] = D.3152_32;
>  D.3157_41 = MEM[index: ivtmp.29_79, offset: 8];
>  D.3159_46 = MEM[index: ivtmp.31_76, offset: 8];
>  D.3160_47 = D.3159_46 * D.3157_41;
>  MEM[index: ivtmp.32_73, offset: 8] = D.3160_47;
>  D.3165_56 = MEM[index: ivtmp.29_79, offset: 12];
>  D.3167_61 = MEM[index: ivtmp.31_76, offset: 12];
>  D.3168_62 = D.3167_61 * D.3165_56;
>  MEM[index: ivtmp.32_73, offset: 12] = D.3168_62;
>  ivtmp.29_78 = ivtmp.29_79 + 16;
>  ivtmp.31_75 = ivtmp.31_76 + 16;
>  ivtmp.32_82 = ivtmp.32_73 + 16;
>  if (ivtmp.32_82 != D.3213_85)
>    goto <bb 3>;
>  else
>    goto <bb 4>;
>  # SUCC: 3 [96.0%]  (true,exec) 4 [4.0%]  (false,exec)
>
>  # BLOCK 4 freq:385
>  # PRED: 3 [4.0%]  (false,exec)
>  return;
>  # SUCC: EXIT [100.0%]
>
> }
>
> Part of RTL
>
> ...
> insn 40 39 41 4 sms-6.c:11 (set (reg:SI 157)
>        (mem:SI (reg:SI 151 [ ivtmp.31 ]) [2 S4 A32])) -1 (nil))
>
> (insn 41 40 42 4 sms-6.c:11 (set (reg:SI 158)
>        (mem:SI (reg:SI 152 [ ivtmp.29 ]) [2 S4 A32])) -1 (nil))
>
> (insn 42 41 43 4 sms-6.c:11 (set (reg:SI 159)
>        (mult:SI (reg:SI 157)
>            (reg:SI 158))) -1 (nil))
>
> (insn 43 42 44 4 sms-6.c:11 (set (mem:SI (reg:SI 150 [ ivtmp.32 ]) [2 S4 A32])
>        (reg:SI 159)) -1 (nil))
>
> (insn 44 43 45 4 sms-6.c:12 (set (reg:SI 160)
>        (mem:SI (plus:SI (reg:SI 151 [ ivtmp.31 ])
>                (const_int 4 [0x4])) [2 S4 A32])) -1 (nil))
>
> (insn 45 44 46 4 sms-6.c:12 (set (reg:SI 161)
>        (mem:SI (plus:SI (reg:SI 152 [ ivtmp.29 ])
>                (const_int 4 [0x4])) [2 S4 A32])) -1 (nil))
>
> (insn 46 45 47 4 sms-6.c:12 (set (reg:SI 162)
>        (mult:SI (reg:SI 160)
>            (reg:SI 161))) -1 (nil))
>
> (insn 47 46 48 4 sms-6.c:12 (set (mem:SI (plus:SI (reg:SI 150 [ ivtmp.32 ])
>                (const_int 4 [0x4])) [2 S4 A32])
>        (reg:SI 162)) -1 (nil))
>
> (insn 48 47 49 4 sms-6.c:13 (set (reg:SI 163)
>        (mem:SI (plus:SI (reg:SI 151 [ ivtmp.31 ])
>                (const_int 8 [0x8])) [2 S4 A32])) -1 (nil))
>
> (insn 49 48 50 4 sms-6.c:13 (set (reg:SI 164)
>        (mem:SI (plus:SI (reg:SI 152 [ ivtmp.29 ])
>                (const_int 8 [0x8])) [2 S4 A32])) -1 (nil))
> ...
>

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2009-09-11 14:37 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-09-11 14:11 Restrict qualifier doesn't work in TRUNK Bingfeng Mei
2009-09-11 14:37 ` Richard Guenther

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).