mirror of git://gcc.gnu.org/git/gcc.git
tree-ssa-sink.c (statement_sink_location): Stop sinking expression if the target bb post dominates from bb.
* tree-ssa-sink.c (statement_sink_location): Stop sinking expression if the target bb post dominates from bb. * config/i386/i386.c (memory_address_length): Check existence of base register before using it. * gcc.dg/tree-ssa/ssa-sink-5.c: New testcase. From-SVN: r149082
This commit is contained in:
parent
6d984927d5
commit
791b59e35b
|
|
@ -1,3 +1,11 @@
|
|||
2009-06-30 Wei Guozhi <carrot@google.com>
|
||||
|
||||
PR/40416
|
||||
* tree-ssa-sink.c (statement_sink_location): Stop sinking expression
|
||||
if the target bb post dominates from bb.
|
||||
* config/i386/i386.c (memory_address_length): Check existence of base
|
||||
register before using it.
|
||||
|
||||
2009-06-29 DJ Delorie <dj@redhat.com>
|
||||
|
||||
* doc/install.texi (mep-x-elf): Correct chip's full name.
|
||||
|
|
|
|||
|
|
@ -19389,7 +19389,7 @@ memory_address_length (rtx addr)
|
|||
len = 4;
|
||||
}
|
||||
/* ebp always wants a displacement. Similarly r13. */
|
||||
else if (REG_P (base)
|
||||
else if (base && REG_P (base)
|
||||
&& (REGNO (base) == BP_REG || REGNO (base) == R13_REG))
|
||||
len = 1;
|
||||
|
||||
|
|
@ -19398,7 +19398,7 @@ memory_address_length (rtx addr)
|
|||
/* ...like esp (or r12), which always wants an index. */
|
||||
|| base == arg_pointer_rtx
|
||||
|| base == frame_pointer_rtx
|
||||
|| (REG_P (base)
|
||||
|| (base && REG_P (base)
|
||||
&& (REGNO (base) == SP_REG || REGNO (base) == R12_REG)))
|
||||
len += 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,3 +1,8 @@
|
|||
2009-06-30 Wei Guozhi <carrot@google.com>
|
||||
|
||||
PR/40416
|
||||
* gcc.dg/tree-ssa/ssa-sink-5.c: New testcase.
|
||||
|
||||
2009-06-29 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/40274
|
||||
|
|
|
|||
|
|
@ -0,0 +1,48 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -Os -fdump-tree-sink-stats" } */
|
||||
|
||||
typedef short int16_t;
|
||||
typedef unsigned char uint8_t;
|
||||
|
||||
void foo(int16_t runs[], uint8_t alpha[], int x, int count)
|
||||
{
|
||||
int16_t* next_runs = runs + x;
|
||||
uint8_t* next_alpha = alpha + x;
|
||||
|
||||
while (x > 0)
|
||||
{
|
||||
int n = runs[0];
|
||||
|
||||
if (x < n)
|
||||
{
|
||||
alpha[x] = alpha[0];
|
||||
runs[0] = (int16_t)(x);
|
||||
runs[x] = (int16_t)(n - x);
|
||||
break;
|
||||
}
|
||||
runs += n;
|
||||
alpha += n;
|
||||
x -= n;
|
||||
}
|
||||
|
||||
runs = next_runs;
|
||||
alpha = next_alpha;
|
||||
x = count;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
int n = runs[0];
|
||||
|
||||
if (x < n)
|
||||
{
|
||||
alpha[x] = alpha[0];
|
||||
break;
|
||||
}
|
||||
x -= n;
|
||||
runs += n;
|
||||
}
|
||||
}
|
||||
|
||||
/* We should not sink the next_runs = runs + x calculation after the loop. */
|
||||
/* { dg-final { scan-tree-dump-times "Sunk statements:" 0 "sink" } } */
|
||||
/* { dg-final { cleanup-tree-dump "sink" } } */
|
||||
|
|
@ -384,6 +384,11 @@ statement_sink_location (gimple stmt, basic_block frombb,
|
|||
|| sinkbb->loop_father != frombb->loop_father)
|
||||
return false;
|
||||
|
||||
/* Move the expression to a post dominator can't reduce the number of
|
||||
executions. */
|
||||
if (dominated_by_p (CDI_POST_DOMINATORS, frombb, sinkbb))
|
||||
return false;
|
||||
|
||||
*togsi = gsi_for_stmt (use);
|
||||
return true;
|
||||
}
|
||||
|
|
@ -411,6 +416,11 @@ statement_sink_location (gimple stmt, basic_block frombb,
|
|||
|| sinkbb->loop_father != frombb->loop_father)
|
||||
return false;
|
||||
|
||||
/* Move the expression to a post dominator can't reduce the number of
|
||||
executions. */
|
||||
if (dominated_by_p (CDI_POST_DOMINATORS, frombb, sinkbb))
|
||||
return false;
|
||||
|
||||
*togsi = gsi_after_labels (sinkbb);
|
||||
|
||||
return true;
|
||||
|
|
|
|||
Loading…
Reference in New Issue