>From your description, if the code is change a little:
  for(i = 0; i< j; i++)
  {
    int t = N*N;
    x += t << 3;
    z = x + N;
    y = y + *x + *z;
  }

Will the N*N be hoisted?


2013/6/27 Yiran Wang <yiran.w...@gmail.com>

> Hi All,
>
> This one looks somewhat similar to the last example, but is different.
>
> int foo(int N, int j, int *x, int *z)
> {
>   int y = N;
>   N += 7;
>   N >>= 3;
>   int i;
>   for(i = 0; i< j; i++)
>   {
>     x += N*N << 3;
>     z = x + N;
>     y = y + *x + *z;
>   }
>   return y;
> }
>
> Assembly of the loop at -O3.
> .p2align 4,,15
> .Lt_0_3586:
>  #<loop> Loop body line 7, nesting depth: 1, estimated iterations: 1000
>  .loc 1 9 0
>  #   8    {
>  #   9      x += N*N << 3;
> movl %eax,%ebx                 # [0]
> .loc 1 11 0
>  #  10      z = x + N;
>  #  11      y = y + *x + *z;
> addl $1,%ebp                   # [0]
> .loc 1 9 0
>  imull %eax,%ebx               # [1]
> shll $3,%ebx                   # [4]
>  shll $2,%ebx                   # [5]
> addl %ebx,%edi                 # [6]
>  addl %ebx,%esi                 # [6]
> .loc 1 11 0
>  movl 0(%edi),%ecx             # [7] id:23
> addl 0(%esi),%ecx             # [10]
>  addl %ecx,%edx                 # [13]
> cmpl 36(%esp),%ebp             # [13] j
>  jl .Lt_0_3586                 # [16]
>
> As we see, the imul instruction remains in the loop.
> (and two consequent shll instructions, my guess is that CG is thinking
> there should not be such input from WOPT, so it is not optimized in CG,
> though it is simple. )
>
> It looks like SSA PRE omitted the rhs of Iv_update statement x+= N*N<<3,
> and VNFRE is only doing one level of CSE, say, promoting the ASHR + LDC 3
> out of the loop.
>
> I am curious why SSA PRE is omitting the expression here.  By disabling
> this in opt_etable.cxx, the result looks good for this test case. I wonder
> if there is any correctness issue for some other test case, or performance
> issue?
>
> It should be noted one strength reduction transformation is done for z for
> this case. Also replacing "N>>=3;" with "N*=5;" results in similar
> sub-optimal code.
>
> Best Regards,
> Yiran Wang
>
>
>
>
> ------------------------------------------------------------------------------
> This SF.net email is sponsored by Windows:
>
> Build for Windows Store.
>
> http://p.sf.net/sfu/windows-dev2dev
> _______________________________________________
> Open64-devel mailing list
> Open64-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/open64-devel
>
>


-- 
Regards,
Lai Jian-Xin
------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to