public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* Re: [patch] Add block debug info to phi_arg_d
@ 2012-07-12 14:27 Uros Bizjak
  2012-07-13  1:36 ` Dehao Chen
  0 siblings, 1 reply; 16+ messages in thread
From: Uros Bizjak @ 2012-07-12 14:27 UTC (permalink / raw)
  To: gcc-patches; +Cc: Dehao Chen, Richard Guenther

Hello!

> A test is added. Is it ok?
>
> gcc/testsuite/ChangeLog
>
> 2012-07-08  Dehao Chen  <dehao@google.com>
>
>         * gcc.dg/debug_info_inline.c: New test.

This test fails on alphaev68-unknown-linux-gnu [1] and other non-x86
targets [2] too:

FAIL: gcc.dg/debug_info_inline.c scan-assembler loc 1 19 0\\n.*\\n.LBB

The relevant output on alpha is:

--cut here--
        .globl bar
        .ent bar
bar:
        .frame $30,0,$26,0
$LFB1:
        .file 1
"/home/uros/gcc-svn/trunk/gcc/testsuite/gcc.dg/debug_info_inline.c"
        .loc 1 17 0
        .cfi_startproc
        ldah $29,0($27)         !gpdisp!1
        lda $29,0($29)          !gpdisp!1
$bar..ng:
        .prologue 1
$LBB4:
$LBB5:
        .loc 1 10 0
        ldq $2,g($29)           !literal
        .loc 1 8 0
        ldq $1,a($29)           !literal
        .loc 1 10 0
        ldl $0,0($2)
        .loc 1 8 0
        ldl $1,0($1)
$LVL0:
        .loc 1 10 0
        lda $2,-9($31)
        cmplt $0,$2,$0
        .loc 1 19 0
        cmpeq $1,0,$1
        cmoveq $0,0,$1
        mov $1,$0
$LBE5:
$LBE4:
        .loc 1 22 0
        ret $31,($26),1
        .cfi_endproc
$LFE1:
        .end bar
--cut here--

[1] http://gcc.gnu.org/ml/gcc-testresults/2012-07/msg00881.html
[2] http://gcc.gnu.org/ml/gcc-testresults/2012-07/msg00882.html

Uros.

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

* Re: [patch] Add block debug info to phi_arg_d
  2012-07-12 14:27 [patch] Add block debug info to phi_arg_d Uros Bizjak
@ 2012-07-13  1:36 ` Dehao Chen
  2012-07-13  7:19   ` Steven Bosscher
  0 siblings, 1 reply; 16+ messages in thread
From: Dehao Chen @ 2012-07-13  1:36 UTC (permalink / raw)
  To: Uros Bizjak; +Cc: gcc-patches, Richard Guenther

This implies:

1. This patch does not fix the inline stack issue completely, because
expression still does not carry block info correctly.
2. It's not easily possible to check the correctness of the inline
stack info by grepping the assembly.

I'd suggest:
1. Remove this unittest for now.
2. Integrate locus with block, and store them as an index. (This will
incur big operation to GCC)

Any suggestions?

Thanks,
Dehao

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

* Re: [patch] Add block debug info to phi_arg_d
  2012-07-13  1:36 ` Dehao Chen
@ 2012-07-13  7:19   ` Steven Bosscher
  2012-07-13  7:36     ` Richard Guenther
  0 siblings, 1 reply; 16+ messages in thread
From: Steven Bosscher @ 2012-07-13  7:19 UTC (permalink / raw)
  To: Dehao Chen; +Cc: Uros Bizjak, gcc-patches, Richard Guenther

On Fri, Jul 13, 2012 at 3:36 AM, Dehao Chen <dehao@google.com> wrote:
> I'd suggest:
> 1. Remove this unittest for now.

And revert the patch for now.


> 2. Integrate locus with block, and store them as an index. (This will
> incur big operation to GCC)

I'm not sure what you mean with "integrate"...?

A lot of the code you'll need already exists in emit-rtl.c. That code
should be split out to a new file and be shared between rtl and
gimple. You'll probably want to make block_locators_locs,
block_locators_blocks, and locations_locators_locs part of struct
function. The biggest challenges will be avoiding bloat and managing
the locators for inlining/cloning...

Ciao!
Steven

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

* Re: [patch] Add block debug info to phi_arg_d
  2012-07-13  7:19   ` Steven Bosscher
@ 2012-07-13  7:36     ` Richard Guenther
  2012-07-13  7:50       ` Steven Bosscher
  2012-07-13  9:41       ` Dehao Chen
  0 siblings, 2 replies; 16+ messages in thread
From: Richard Guenther @ 2012-07-13  7:36 UTC (permalink / raw)
  To: Steven Bosscher; +Cc: Dehao Chen, Uros Bizjak, gcc-patches

On Fri, Jul 13, 2012 at 9:18 AM, Steven Bosscher <stevenb.gcc@gmail.com> wrote:
> On Fri, Jul 13, 2012 at 3:36 AM, Dehao Chen <dehao@google.com> wrote:
>> I'd suggest:
>> 1. Remove this unittest for now.
>
> And revert the patch for now.
>
>
>> 2. Integrate locus with block, and store them as an index. (This will
>> incur big operation to GCC)
>
> I'm not sure what you mean with "integrate"...?
>
> A lot of the code you'll need already exists in emit-rtl.c. That code
> should be split out to a new file and be shared between rtl and
> gimple. You'll probably want to make block_locators_locs,
> block_locators_blocks, and locations_locators_locs part of struct
> function. The biggest challenges will be avoiding bloat and managing
> the locators for inlining/cloning...

Btw, we discussed this briefly on the summit with Dodji and libcpp
virtual locations already provide a way to associate a location_t with
something else resulting in a new location_t.  For inlining we simply have
to say that the location_t's we use would always refer to the original
BLOCK (thus, the abstract origin).  There is no point to update the BLOCKs
to point to the copies as far as debug information is concerned (?).

Richard.

> Ciao!
> Steven

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

* Re: [patch] Add block debug info to phi_arg_d
  2012-07-13  7:36     ` Richard Guenther
@ 2012-07-13  7:50       ` Steven Bosscher
  2012-07-13  8:59         ` Richard Guenther
  2012-07-13  9:41       ` Dehao Chen
  1 sibling, 1 reply; 16+ messages in thread
From: Steven Bosscher @ 2012-07-13  7:50 UTC (permalink / raw)
  To: Richard Guenther; +Cc: Dehao Chen, Uros Bizjak, gcc-patches

On Fri, Jul 13, 2012 at 9:36 AM, Richard Guenther
<richard.guenther@gmail.com> wrote:
> Btw, we discussed this briefly on the summit with Dodji and libcpp
> virtual locations already provide a way to associate a location_t with
> something else resulting in a new location_t.  For inlining we simply have
> to say that the location_t's we use would always refer to the original
> BLOCK (thus, the abstract origin).  There is no point to update the BLOCKs
> to point to the copies as far as debug information is concerned (?).

That may work for DWARF, but what about other debug formats?

Ciao!
Steven

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

* Re: [patch] Add block debug info to phi_arg_d
  2012-07-13  7:50       ` Steven Bosscher
@ 2012-07-13  8:59         ` Richard Guenther
  0 siblings, 0 replies; 16+ messages in thread
From: Richard Guenther @ 2012-07-13  8:59 UTC (permalink / raw)
  To: Steven Bosscher; +Cc: Dehao Chen, Uros Bizjak, gcc-patches

On Fri, Jul 13, 2012 at 9:50 AM, Steven Bosscher <stevenb.gcc@gmail.com> wrote:
> On Fri, Jul 13, 2012 at 9:36 AM, Richard Guenther
> <richard.guenther@gmail.com> wrote:
>> Btw, we discussed this briefly on the summit with Dodji and libcpp
>> virtual locations already provide a way to associate a location_t with
>> something else resulting in a new location_t.  For inlining we simply have
>> to say that the location_t's we use would always refer to the original
>> BLOCK (thus, the abstract origin).  There is no point to update the BLOCKs
>> to point to the copies as far as debug information is concerned (?).
>
> That may work for DWARF, but what about other debug formats?

We also discussed that ;)  Dump all but DWARF and provide DWARF -> STABS
translation.

Richard.

> Ciao!
> Steven

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

* Re: [patch] Add block debug info to phi_arg_d
  2012-07-13  7:36     ` Richard Guenther
  2012-07-13  7:50       ` Steven Bosscher
@ 2012-07-13  9:41       ` Dehao Chen
  2012-07-13 10:06         ` Richard Guenther
  1 sibling, 1 reply; 16+ messages in thread
From: Dehao Chen @ 2012-07-13  9:41 UTC (permalink / raw)
  To: Richard Guenther; +Cc: Steven Bosscher, Uros Bizjak, gcc-patches

On Fri, Jul 13, 2012 at 3:36 PM, Richard Guenther
<richard.guenther@gmail.com> wrote:
>
> On Fri, Jul 13, 2012 at 9:18 AM, Steven Bosscher <stevenb.gcc@gmail.com> wrote:
> > On Fri, Jul 13, 2012 at 3:36 AM, Dehao Chen <dehao@google.com> wrote:
> >> I'd suggest:
> >> 1. Remove this unittest for now.
> >
> > And revert the patch for now.
> >
> >
> >> 2. Integrate locus with block, and store them as an index. (This will
> >> incur big operation to GCC)
> >
> > I'm not sure what you mean with "integrate"...?
> >
> > A lot of the code you'll need already exists in emit-rtl.c. That code
> > should be split out to a new file and be shared between rtl and
> > gimple. You'll probably want to make block_locators_locs,
> > block_locators_blocks, and locations_locators_locs part of struct
> > function. The biggest challenges will be avoiding bloat and managing
> > the locators for inlining/cloning...
>
> Btw, we discussed this briefly on the summit with Dodji and libcpp
> virtual locations already provide a way to associate a location_t with
> something else resulting in a new location_t.  For inlining we simply have
> to say that the location_t's we use would always refer to the original
> BLOCK (thus, the abstract origin).  There is no point to update the BLOCKs
> to point to the copies as far as debug information is concerned (?).

I'm not quite sure if I understand correctly: we will clone all blocks
and update them during function inline/clone, and assign new
location_t to the cloned gimple/phi_arg_t/expr etc. Otherwise, the
inline stack cannot be maintained, right?

Thanks,
Dehao


>
> Richard.
>
> > Ciao!
> > Steven

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

* Re: [patch] Add block debug info to phi_arg_d
  2012-07-13  9:41       ` Dehao Chen
@ 2012-07-13 10:06         ` Richard Guenther
  0 siblings, 0 replies; 16+ messages in thread
From: Richard Guenther @ 2012-07-13 10:06 UTC (permalink / raw)
  To: Dehao Chen; +Cc: Steven Bosscher, Uros Bizjak, gcc-patches

On Fri, Jul 13, 2012 at 11:41 AM, Dehao Chen <dehao@google.com> wrote:
> On Fri, Jul 13, 2012 at 3:36 PM, Richard Guenther
> <richard.guenther@gmail.com> wrote:
>>
>> On Fri, Jul 13, 2012 at 9:18 AM, Steven Bosscher <stevenb.gcc@gmail.com> wrote:
>> > On Fri, Jul 13, 2012 at 3:36 AM, Dehao Chen <dehao@google.com> wrote:
>> >> I'd suggest:
>> >> 1. Remove this unittest for now.
>> >
>> > And revert the patch for now.
>> >
>> >
>> >> 2. Integrate locus with block, and store them as an index. (This will
>> >> incur big operation to GCC)
>> >
>> > I'm not sure what you mean with "integrate"...?
>> >
>> > A lot of the code you'll need already exists in emit-rtl.c. That code
>> > should be split out to a new file and be shared between rtl and
>> > gimple. You'll probably want to make block_locators_locs,
>> > block_locators_blocks, and locations_locators_locs part of struct
>> > function. The biggest challenges will be avoiding bloat and managing
>> > the locators for inlining/cloning...
>>
>> Btw, we discussed this briefly on the summit with Dodji and libcpp
>> virtual locations already provide a way to associate a location_t with
>> something else resulting in a new location_t.  For inlining we simply have
>> to say that the location_t's we use would always refer to the original
>> BLOCK (thus, the abstract origin).  There is no point to update the BLOCKs
>> to point to the copies as far as debug information is concerned (?).
>
> I'm not quite sure if I understand correctly: we will clone all blocks
> and update them during function inline/clone, and assign new
> location_t to the cloned gimple/phi_arg_t/expr etc. Otherwise, the
> inline stack cannot be maintained, right?

That's true.

Richard.

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

* Re: [patch] Add block debug info to phi_arg_d
  2012-07-08  7:30           ` Dehao Chen
@ 2012-07-09  8:14             ` Richard Guenther
  0 siblings, 0 replies; 16+ messages in thread
From: Richard Guenther @ 2012-07-09  8:14 UTC (permalink / raw)
  To: Dehao Chen; +Cc: Steven Bosscher, gcc-patches, Cary Coutant

On Sun, Jul 8, 2012 at 9:29 AM, Dehao Chen <dehao@google.com> wrote:
> Hi, Richard,
>
> A test is added. Is it ok?

Ok.

Thanks,
RIchard.

> Thanks,
> Dehao
>
> gcc/testsuite/ChangeLog
>
> 2012-07-08  Dehao Chen  <dehao@google.com>
>
>         * gcc.dg/debug_info_inline.c: New test.
>
> Index: gcc/testsuite/gcc.dg/debug_info_inline.c
> ===================================================================
> --- gcc/testsuite/gcc.dg/debug_info_inline.c    (revision 0)
> +++ gcc/testsuite/gcc.dg/debug_info_inline.c    (revision 0)
> @@ -0,0 +1,24 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -g" } */
> +
> +int g, a;
> +
> +static int foo ()
> +{
> +  int ret = a;
> +
> +  if (g > -10)
> +    return 10;
> +
> +  return ret;
> +}
> +
> +int bar()
> +{
> +  if (foo())
> +    return 0;
> +  else
> +    return 1;
> +}
> +
> +/* { dg-final { scan-assembler "loc 1 19 0\n.*\n.LBB" } } */

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

* Re: [patch] Add block debug info to phi_arg_d
  2012-07-05 12:10         ` Richard Guenther
@ 2012-07-08  7:30           ` Dehao Chen
  2012-07-09  8:14             ` Richard Guenther
  0 siblings, 1 reply; 16+ messages in thread
From: Dehao Chen @ 2012-07-08  7:30 UTC (permalink / raw)
  To: Richard Guenther; +Cc: Steven Bosscher, gcc-patches, Cary Coutant

Hi, Richard,

A test is added. Is it ok?

Thanks,
Dehao

gcc/testsuite/ChangeLog

2012-07-08  Dehao Chen  <dehao@google.com>

        * gcc.dg/debug_info_inline.c: New test.

Index: gcc/testsuite/gcc.dg/debug_info_inline.c
===================================================================
--- gcc/testsuite/gcc.dg/debug_info_inline.c	(revision 0)
+++ gcc/testsuite/gcc.dg/debug_info_inline.c	(revision 0)
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -g" } */
+
+int g, a;
+
+static int foo ()
+{
+  int ret = a;
+
+  if (g > -10)
+    return 10;
+
+  return ret;
+}
+
+int bar()
+{
+  if (foo())
+    return 0;
+  else
+    return 1;
+}
+
+/* { dg-final { scan-assembler "loc 1 19 0\n.*\n.LBB" } } */

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

* Re: [patch] Add block debug info to phi_arg_d
       [not found]       ` <CAO2gOZXWt_OucnHGs+9Y8b+2Cy1pxXh9UJL36ik7HCE99gZBCQ@mail.gmail.com>
@ 2012-07-05 12:10         ` Richard Guenther
  2012-07-08  7:30           ` Dehao Chen
  0 siblings, 1 reply; 16+ messages in thread
From: Richard Guenther @ 2012-07-05 12:10 UTC (permalink / raw)
  To: Dehao Chen; +Cc: Steven Bosscher, gcc-patches, Cary Coutant

On Thu, Jul 5, 2012 at 12:15 PM, Dehao Chen <dehao@google.com> wrote:
>
> On Thu, Jul 5, 2012 at 5:58 PM, Richard Guenther
> <richard.guenther@gmail.com> wrote:
>>
>> On Thu, Jul 5, 2012 at 11:42 AM, Steven Bosscher <stevenb.gcc@gmail.com>
>> wrote:
>> > On Thu, Jul 5, 2012 at 11:23 AM, Richard Guenther
>> > <richard.guenther@gmail.com> wrote:
>> >> On Thu, Jul 5, 2012 at 11:08 AM, Dehao Chen <dehao@google.com> wrote:
>> >>> Hi,
>> >>>
>> >>> This patch added block field to phi_arg_d to make sure the associated
>> >>> source locus is consistent with its block info.
>> >>>
>> >>> Bootstrapped and passed gcc regression tests.
>> >>>
>> >>> OK for trunk?
>> >>
>> >> Hum - makes me want a location like we have on RTL (which maps to
>> >> location plus block ...).  But oh well ...
>> >>
>> >> struct GTY(()) phi_arg_d {
>> >>   /* imm_use MUST be the first element in struct because we do some
>> >>      pointer arithmetic with it.  See phi_arg_index_from_use.  */
>> >>   struct ssa_use_operand_d imm_use;
>> >> location_t locus;
>> >> +  tree block;
>> >>  };
>> >>
>> >> please place block before locus though.
>> >>
>> >> Ok with that change.
>> >
>> > Ehm, wait a moment, please -- does this have to be a tree pointer? Why
>> > not use BLOCK_NUMBER instead? Adding a pointer to such a
>> > frequently-used structure should be avoided if an int suffices.
>>
>> Well, we re-number blocks frequently enough that this won't work.  In
>> gimple stmts there is also a block tree pointer.  The real solution would
>> of course be to associate location_t with a block, too, like the source
>> locus
>> on RTL does.  It will also be fun do deal with during inlining and LTO
>> streaming.
>
> Yeah, I agree that we should have a uniformed way to represent locus,
> discriminator and block together. But as you mentioned, updating it would be
> non-trivial since blocks are updated regularly (I'm wondering why we need to
> eliminate redundant blocks all the time, just for saving space?). But
> anyway, this patch can at least ensure consist debug info. Shall we get it
> into trunk?

I'd say yes.  But can you add a testcase at least that fails now and is
fixed with your patch?

Thanks,
Richard.

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

* Re: [patch] Add block debug info to phi_arg_d
  2012-07-05  9:58     ` Richard Guenther
@ 2012-07-05 10:18       ` Dehao Chen
       [not found]       ` <CAO2gOZXWt_OucnHGs+9Y8b+2Cy1pxXh9UJL36ik7HCE99gZBCQ@mail.gmail.com>
  1 sibling, 0 replies; 16+ messages in thread
From: Dehao Chen @ 2012-07-05 10:18 UTC (permalink / raw)
  To: Richard Guenther; +Cc: Steven Bosscher, gcc-patches, Cary Coutant

On Thu, Jul 5, 2012 at 5:58 PM, Richard Guenther
<richard.guenther@gmail.com> wrote:
>
> On Thu, Jul 5, 2012 at 11:42 AM, Steven Bosscher <stevenb.gcc@gmail.com> wrote:
> > On Thu, Jul 5, 2012 at 11:23 AM, Richard Guenther
> > <richard.guenther@gmail.com> wrote:
> >> On Thu, Jul 5, 2012 at 11:08 AM, Dehao Chen <dehao@google.com> wrote:
> >>> Hi,
> >>>
> >>> This patch added block field to phi_arg_d to make sure the associated
> >>> source locus is consistent with its block info.
> >>>
> >>> Bootstrapped and passed gcc regression tests.
> >>>
> >>> OK for trunk?
> >>
> >> Hum - makes me want a location like we have on RTL (which maps to
> >> location plus block ...).  But oh well ...
> >>
> >> struct GTY(()) phi_arg_d {
> >>   /* imm_use MUST be the first element in struct because we do some
> >>      pointer arithmetic with it.  See phi_arg_index_from_use.  */
> >>   struct ssa_use_operand_d imm_use;
> >> location_t locus;
> >> +  tree block;
> >>  };
> >>
> >> please place block before locus though.
> >>
> >> Ok with that change.
> >
> > Ehm, wait a moment, please -- does this have to be a tree pointer? Why
> > not use BLOCK_NUMBER instead? Adding a pointer to such a
> > frequently-used structure should be avoided if an int suffices.
>
> Well, we re-number blocks frequently enough that this won't work.  In
> gimple stmts there is also a block tree pointer.  The real solution would
> of course be to associate location_t with a block, too, like the source locus
> on RTL does.  It will also be fun do deal with during inlining and LTO
> streaming.

Yeah, I agree that we should have a uniformed way to represent locus,
discriminator and block together. But as you mentioned, updating it
would be non-trivial since blocks are updated regularly (I'm wondering
why we need to eliminate redundant blocks all the time, just for
saving space?). But anyway, this patch can at least ensure consist
debug info. Shall we get it into trunk?

Thanks,
Dehao

>
> Richard.
>
> > Ciao!
> > Steven

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

* Re: [patch] Add block debug info to phi_arg_d
  2012-07-05  9:43   ` Steven Bosscher
@ 2012-07-05  9:58     ` Richard Guenther
  2012-07-05 10:18       ` Dehao Chen
       [not found]       ` <CAO2gOZXWt_OucnHGs+9Y8b+2Cy1pxXh9UJL36ik7HCE99gZBCQ@mail.gmail.com>
  0 siblings, 2 replies; 16+ messages in thread
From: Richard Guenther @ 2012-07-05  9:58 UTC (permalink / raw)
  To: Steven Bosscher; +Cc: Dehao Chen, gcc-patches, Cary Coutant

On Thu, Jul 5, 2012 at 11:42 AM, Steven Bosscher <stevenb.gcc@gmail.com> wrote:
> On Thu, Jul 5, 2012 at 11:23 AM, Richard Guenther
> <richard.guenther@gmail.com> wrote:
>> On Thu, Jul 5, 2012 at 11:08 AM, Dehao Chen <dehao@google.com> wrote:
>>> Hi,
>>>
>>> This patch added block field to phi_arg_d to make sure the associated
>>> source locus is consistent with its block info.
>>>
>>> Bootstrapped and passed gcc regression tests.
>>>
>>> OK for trunk?
>>
>> Hum - makes me want a location like we have on RTL (which maps to
>> location plus block ...).  But oh well ...
>>
>> struct GTY(()) phi_arg_d {
>>   /* imm_use MUST be the first element in struct because we do some
>>      pointer arithmetic with it.  See phi_arg_index_from_use.  */
>>   struct ssa_use_operand_d imm_use;
>> location_t locus;
>> +  tree block;
>>  };
>>
>> please place block before locus though.
>>
>> Ok with that change.
>
> Ehm, wait a moment, please -- does this have to be a tree pointer? Why
> not use BLOCK_NUMBER instead? Adding a pointer to such a
> frequently-used structure should be avoided if an int suffices.

Well, we re-number blocks frequently enough that this won't work.  In
gimple stmts there is also a block tree pointer.  The real solution would
of course be to associate location_t with a block, too, like the source locus
on RTL does.  It will also be fun do deal with during inlining and LTO
streaming.

Richard.

> Ciao!
> Steven

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

* Re: [patch] Add block debug info to phi_arg_d
  2012-07-05  9:23 ` Richard Guenther
@ 2012-07-05  9:43   ` Steven Bosscher
  2012-07-05  9:58     ` Richard Guenther
  0 siblings, 1 reply; 16+ messages in thread
From: Steven Bosscher @ 2012-07-05  9:43 UTC (permalink / raw)
  To: Richard Guenther; +Cc: Dehao Chen, gcc-patches, Cary Coutant

On Thu, Jul 5, 2012 at 11:23 AM, Richard Guenther
<richard.guenther@gmail.com> wrote:
> On Thu, Jul 5, 2012 at 11:08 AM, Dehao Chen <dehao@google.com> wrote:
>> Hi,
>>
>> This patch added block field to phi_arg_d to make sure the associated
>> source locus is consistent with its block info.
>>
>> Bootstrapped and passed gcc regression tests.
>>
>> OK for trunk?
>
> Hum - makes me want a location like we have on RTL (which maps to
> location plus block ...).  But oh well ...
>
> struct GTY(()) phi_arg_d {
>   /* imm_use MUST be the first element in struct because we do some
>      pointer arithmetic with it.  See phi_arg_index_from_use.  */
>   struct ssa_use_operand_d imm_use;
> location_t locus;
> +  tree block;
>  };
>
> please place block before locus though.
>
> Ok with that change.

Ehm, wait a moment, please -- does this have to be a tree pointer? Why
not use BLOCK_NUMBER instead? Adding a pointer to such a
frequently-used structure should be avoided if an int suffices.

Ciao!
Steven

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

* Re: [patch] Add block debug info to phi_arg_d
  2012-07-05  9:09 Dehao Chen
@ 2012-07-05  9:23 ` Richard Guenther
  2012-07-05  9:43   ` Steven Bosscher
  0 siblings, 1 reply; 16+ messages in thread
From: Richard Guenther @ 2012-07-05  9:23 UTC (permalink / raw)
  To: Dehao Chen; +Cc: gcc-patches, Cary Coutant

On Thu, Jul 5, 2012 at 11:08 AM, Dehao Chen <dehao@google.com> wrote:
> Hi,
>
> This patch added block field to phi_arg_d to make sure the associated
> source locus is consistent with its block info.
>
> Bootstrapped and passed gcc regression tests.
>
> OK for trunk?

Hum - makes me want a location like we have on RTL (which maps to
location plus block ...).  But oh well ...

struct GTY(()) phi_arg_d {
  /* imm_use MUST be the first element in struct because we do some
     pointer arithmetic with it.  See phi_arg_index_from_use.  */
  struct ssa_use_operand_d imm_use;
location_t locus;
+  tree block;
 };

please place block before locus though.

Ok with that change.

Thanks,
Richard.

> Thanks,
> Dehao
>
> http://codereview.appspot.com/6349075
>
> gcc/ChangeLog
>
> 2012-07-05  Dehao Chen  <dehao@google.com>
>
>         * tree.h (phi_arg_d): New field.
>         * tree-flow-inline.h (gimple_phi_arg_block): New function.
>         (gimple_phi_arg_block_from_edge): New function.
>         (gimple_phi_arg_set_block): New function.
>         (gimple_phi_arg_has_block): New function.
>         (redirect_edge_var_map_block): New function.
>         * tree-flow.h (_edge_var_map): New field.
>         * tree-ssa-live.c (remove_unused_locals): Mark phi_arg's block
>         as used.
>         * tree-eh.c (cleanup_empty_eh_merge_phis): Add block debug info for
>         redirect_edge_var_map_add.
>         * tree-outof-ssa.c (_elim_graph): New field.
>         (insert_partition_copy_on_edge): New parameter.
>         (insert_value_copy_on_edge): New parameter.
>         (insert_rtx_to_part_on_edge): New parameter.
>         (insert_part_to_rtx_on_edge): New parameter.
>         (elim_graph_add_edge): New parameter.
>         (elim_graph_remove_succ_edge): New parameter.
>         (FOR_EACH_ELIM_GRAPH_SUCC): New parameter.
>         (FOR_EACH_ELIM_GRAPH_PRED): New parameter.
>         (new_elim_graph): Add block debug info.
>         (clear_elim_graph): Likewise.
>         (delete_elim_graph): Likewise.
>         (elim_graph_add_node): Likewise.
>         (elim_graph_add_edge): Likewise.
>         (elim_graph_remove_succ_edge): Likewise.
>         (eliminate_build): Likewise.
>         (elim_forward): Likewise.
>         (elim_unvisited_predecessor): Likewise.
>         (elim_backward): Likewise.
>         (elim_create): Likewise.
>         (eliminate_phi): Likewise.
>         (insert_backedge_copies): Likewise.
>         * tree-into-ssa.c (insert_phi_nodes_for): Add block debug info for
>         add_phi_arg.
>         (rewrite_add_phi_arguments): Likewise.
>         * tree-ssa-loop-im.c (execute_sm_if_changed): Likewise.
>         * tree-ssa-tail-merge.c (replace_block_by): Likewise.
>         * tree-ssa-threadupdate.c (copy_phi_args): Likewise.
>         * tree-loop-distribution.c (update_phis_for_loop_copy): Likewise.
>         * tree-ssa-loop-manip.c (create_iv): Likewise.
>         (add_exit_phis_edge): Likewise.
>         (split_loop_exit_edge): Likewise.
>         (copy_phi_node_args): Likewise.
>         (tree_transform_and_unroll_loop): Likewise.
>         * value-prof.c (gimple_ic): Likewise.
>         (gimple_stringop_fixed_value): Likewise.
>         * tree-tailcall.c (add_successor_phi_arg): Likewise.
>         (eliminate_tail_call): Likewise.
>         (create_tailcall_accumulator): Likewise.
>         (tree_optimize_tail_calls_1): Likewise.
>         * tree-phinodes.c (add_phi_arg): Likewise.
>         (make_phi_node): Likewise.
>         (resize_phi_node): Likewise.
>         (remove_phi_arg_num): Likewise.
>         * omp-low.c (expand_parallel_call): Likewise.
>         (expand_omp_for_static_chunk): Likewise.
>         * tree-vect-loop-manip.c (slpeel_update_phis_for_duplicate_loop):
>         Likewise.
>         (slpeel_update_phi_nodes_for_guard1): Likewise.
>         (slpeel_update_phi_nodes_for_guard2): Likewise.
>         (slpeel_tree_duplicate_loop_to_edge_cfg): Likewise.
>         (set_prologue_iterations): Likewise.
>         (slpeel_tree_peel_loop_to_edge): Likewise.
>         (vect_loop_versioning): Likewise.
>         * tree-parloops.c (create_phi_for_local_result): Likewise.
>         (transform_to_exit_first_loop): Likewise.
>         (create_parallel_loop): Likewise.
>         * ipa-split.c (split_function): Likewise.
>         * tree-vect-loop.c (get_initial_def_for_induction): Likewise.
>         (vect_create_epilog_for_reduction): Likewise.
>         * tree-vect-data-refs.c (vect_setup_realignment): Likewise.
>         * graphite-scop-detection.c (canonicalize_loop_closed_ssa): Likewise.
>         * tree-ssa-phiopt.c (cond_store_replacement): Likewise.
>         (cond_if_else_store_replacement_1): Likewise.
>         * tree-cfgcleanup.c (remove_forwarder_block): Likewise.
>         (remove_forwarder_block_with_phi): Likewise.
>         * tree-ssa-pre.c (insert_into_preds_of_block): Likewise.
>         * tree-predcom.c (initialize_root_vars): Likewise.
>         (initialize_root_vars_lm): Likewise.
>         * sese.c (sese_add_exit_phis_edge): Likewise.
>         * tree-ssa-dce.c (forward_edge_to_pdom): Likewise.
>         * tree-ssa.c (flush_pending_stmts): Likewise.
>         (redirect_edge_var_map_add): Likewise.
>         (ssa_redirect_edge): Likewise.
>         * gimple-streamer-in.c (input_phi): Likewise.
>         * tree-vect-stmts.c (vectorizable_load): Likewise.
>         * tree-inline.c (copy_phis_for_bb): Likewise.
>         * tree-ssa-phiprop.c (phiprop_insert_phi): Likewise.
>         * tree-switch-conversion.c (fix_phi_nodes): Likewise.
>         * tree-cfg.c (reinstall_phi_args): Likewise.
>         (gimple_make_forwarder_block): Likewise.
>         (add_phi_args_after_copy_edge): Likewise.
>         (gimple_duplicate_sese_tail): Likewise.
>
> Index: gcc/tree-into-ssa.c
> ===================================================================
> --- gcc/tree-into-ssa.c (revision 189246)
> +++ gcc/tree-into-ssa.c (working copy)
> @@ -1119,7 +1119,7 @@
>              renamer will use the symbol on the LHS to get its
>              reaching definition.  */
>           FOR_EACH_EDGE (e, ei, bb->preds)
> -           add_phi_arg (phi, var, e, UNKNOWN_LOCATION);
> +           add_phi_arg (phi, var, e, UNKNOWN_LOCATION, NULL);
>         }
>        else
>         {
> @@ -1474,7 +1474,8 @@
>           phi = gsi_stmt (gsi);
>           currdef = get_reaching_def (SSA_NAME_VAR (gimple_phi_result (phi)));
>           stmt = SSA_NAME_DEF_STMT (currdef);
> -         add_phi_arg (phi, currdef, e, gimple_location (stmt));
> +         add_phi_arg (phi, currdef, e, gimple_location (stmt),
> +                      gimple_block (stmt));
>         }
>      }
>  }
> Index: gcc/tree-ssa-loop-im.c
> ===================================================================
> --- gcc/tree-ssa-loop-im.c      (revision 189246)
> +++ gcc/tree-ssa-loop-im.c      (working copy)
> @@ -2086,7 +2086,7 @@
>           if (gimple_phi_arg_edge (phi, i)->src == new_bb)
>             {
>               tree arg = gimple_phi_arg_def (phi, i);
> -             add_phi_arg (phi, arg, then_old_edge, UNKNOWN_LOCATION);
> +             add_phi_arg (phi, arg, then_old_edge, UNKNOWN_LOCATION, NULL);
>               update_stmt (phi);
>             }
>        }
> Index: gcc/tree-ssa-tail-merge.c
> ===================================================================
> --- gcc/tree-ssa-tail-merge.c   (revision 189246)
> +++ gcc/tree-ssa-tail-merge.c   (working copy)
> @@ -1458,7 +1458,7 @@
>        bb2_phi = vop_phi (bb2);
>
>        add_phi_arg (bb2_phi, SSA_NAME_VAR (gimple_phi_result (bb2_phi)),
> -                  pred_edge, UNKNOWN_LOCATION);
> +                  pred_edge, UNKNOWN_LOCATION, NULL);
>      }
>
>    bb2->frequency += bb1->frequency;
> Index: gcc/tree-ssa-threadupdate.c
> ===================================================================
> --- gcc/tree-ssa-threadupdate.c (revision 189246)
> +++ gcc/tree-ssa-threadupdate.c (working copy)
> @@ -316,7 +316,9 @@
>      {
>        gimple phi = gsi_stmt (gsi);
>        source_location locus = gimple_phi_arg_location (phi, src_indx);
> -      add_phi_arg (phi, gimple_phi_arg_def (phi, src_indx), tgt_e, locus);
> +      tree block = gimple_phi_arg_block (phi, src_indx);
> +      add_phi_arg (phi, gimple_phi_arg_def (phi, src_indx), tgt_e, locus,
> +                  block);
>      }
>  }
>
> Index: gcc/tree-loop-distribution.c
> ===================================================================
> --- gcc/tree-loop-distribution.c        (revision 189246)
> +++ gcc/tree-loop-distribution.c        (working copy)
> @@ -171,6 +171,7 @@
>      {
>        tree def;
>        source_location locus;
> +      tree block;
>        gimple phi_new = gsi_stmt (si_new);
>        gimple phi_orig = gsi_stmt (si_orig);
>
> @@ -178,12 +179,14 @@
>          associated with the entry of NEW_LOOP)  */
>        def = PHI_ARG_DEF_FROM_EDGE (phi_orig, orig_entry_e);
>        locus = gimple_phi_arg_location_from_edge (phi_orig, orig_entry_e);
> -      add_phi_arg (phi_new, def, new_loop_entry_e, locus);
> +      block = gimple_phi_arg_block_from_edge (phi_orig, orig_entry_e);
> +      add_phi_arg (phi_new, def, new_loop_entry_e, locus, block);
>
>        /* Add the second phi argument for the phi in NEW_LOOP (the one
>          associated with the latch of NEW_LOOP)  */
>        def = PHI_ARG_DEF_FROM_EDGE (phi_orig, orig_loop_latch);
>        locus = gimple_phi_arg_location_from_edge (phi_orig, orig_loop_latch);
> +      block = gimple_phi_arg_block_from_edge (phi_orig, orig_loop_latch);
>
>        if (TREE_CODE (def) == SSA_NAME)
>         {
> @@ -198,7 +201,8 @@
>         /* Could be an integer.  */
>         new_ssa_name = def;
>
> -      add_phi_arg (phi_new, new_ssa_name, loop_latch_edge (new_loop), locus);
> +      add_phi_arg (phi_new, new_ssa_name, loop_latch_edge (new_loop), locus,
> +                  block);
>      }
>  }
>
> Index: gcc/tree-ssa-loop-manip.c
> ===================================================================
> --- gcc/tree-ssa-loop-manip.c   (revision 189246)
> +++ gcc/tree-ssa-loop-manip.c   (working copy)
> @@ -121,8 +121,9 @@
>
>    stmt = create_phi_node (vb, loop->header);
>    SSA_NAME_DEF_STMT (vb) = stmt;
> -  add_phi_arg (stmt, initial, loop_preheader_edge (loop), UNKNOWN_LOCATION);
> -  add_phi_arg (stmt, va, loop_latch_edge (loop), UNKNOWN_LOCATION);
> +  add_phi_arg (stmt, initial, loop_preheader_edge (loop), UNKNOWN_LOCATION,
> +              NULL);
> +  add_phi_arg (stmt, va, loop_latch_edge (loop), UNKNOWN_LOCATION, NULL);
>  }
>
>  /* Add exit phis for the USE on EXIT.  */
> @@ -152,7 +153,7 @@
>    create_new_def_for (gimple_phi_result (phi), phi,
>                       gimple_phi_result_ptr (phi));
>    FOR_EACH_EDGE (e, ei, exit->preds)
> -    add_phi_arg (phi, use, e, UNKNOWN_LOCATION);
> +    add_phi_arg (phi, use, e, UNKNOWN_LOCATION, NULL);
>  }
>
>  /* Add exit phis for VAR that is used in LIVEIN.
> @@ -485,12 +486,14 @@
>    use_operand_p op_p;
>    gimple_stmt_iterator psi;
>    source_location locus;
> +  tree block;
>
>    for (psi = gsi_start_phis (dest); !gsi_end_p (psi); gsi_next (&psi))
>      {
>        phi = gsi_stmt (psi);
>        op_p = PHI_ARG_DEF_PTR_FROM_EDGE (phi, single_succ_edge (bb));
>        locus = gimple_phi_arg_location_from_edge (phi, single_succ_edge (bb));
> +      block = gimple_phi_arg_block_from_edge (phi, single_succ_edge (bb));
>
>        name = USE_FROM_PTR (op_p);
>
> @@ -504,7 +507,7 @@
>        new_name = duplicate_ssa_name (name, NULL);
>        new_phi = create_phi_node (new_name, bb);
>        SSA_NAME_DEF_STMT (new_name) = new_phi;
> -      add_phi_arg (new_phi, name, exit, locus);
> +      add_phi_arg (new_phi, name, exit, locus, block);
>        SET_USE (op_p, new_name);
>      }
>
> @@ -1024,8 +1027,8 @@
>        phi_rest = create_phi_node (new_init, rest);
>        SSA_NAME_DEF_STMT (new_init) = phi_rest;
>
> -      add_phi_arg (phi_rest, init, precond_edge, UNKNOWN_LOCATION);
> -      add_phi_arg (phi_rest, next, new_exit, UNKNOWN_LOCATION);
> +      add_phi_arg (phi_rest, init, precond_edge, UNKNOWN_LOCATION, NULL);
> +      add_phi_arg (phi_rest, next, new_exit, UNKNOWN_LOCATION, NULL);
>        SET_USE (op, new_init);
>      }
>
> Index: gcc/value-prof.c
> ===================================================================
> --- gcc/value-prof.c    (revision 189246)
> +++ gcc/value-prof.c    (working copy)
> @@ -1245,10 +1245,12 @@
>        SSA_NAME_DEF_STMT (result) = phi;
>        gimple_call_set_lhs (icall_stmt,
>                            make_ssa_name (SSA_NAME_VAR (result), icall_stmt));
> -      add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
> +      add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION,
> +                  NULL);
>        gimple_call_set_lhs (dcall_stmt,
>                            make_ssa_name (SSA_NAME_VAR (result), dcall_stmt));
> -      add_phi_arg (phi, gimple_call_lhs (dcall_stmt), e_dj, UNKNOWN_LOCATION);
> +      add_phi_arg (phi, gimple_call_lhs (dcall_stmt), e_dj, UNKNOWN_LOCATION,
> +                  NULL);
>      }
>
>    /* Build an EH edge for the direct call if necessary.  */
> @@ -1476,10 +1478,12 @@
>        SSA_NAME_DEF_STMT (result) = phi;
>        gimple_call_set_lhs (vcall_stmt,
>                            make_ssa_name (SSA_NAME_VAR (result), vcall_stmt));
> -      add_phi_arg (phi, gimple_call_lhs (vcall_stmt), e_vj, UNKNOWN_LOCATION);
> +      add_phi_arg (phi, gimple_call_lhs (vcall_stmt), e_vj, UNKNOWN_LOCATION,
> +                  NULL);
>        gimple_call_set_lhs (icall_stmt,
>                            make_ssa_name (SSA_NAME_VAR (result), icall_stmt));
> -      add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
> +      add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION,
> +                  NULL);
>      }
>
>    /* Because these are all string op builtins, they're all nothrow.  */
> Index: gcc/tree-tailcall.c
> ===================================================================
> --- gcc/tree-tailcall.c (revision 189246)
> +++ gcc/tree-tailcall.c (working copy)
> @@ -597,7 +597,7 @@
>        break;
>
>    gcc_assert (!gsi_end_p (gsi));
> -  add_phi_arg (gsi_stmt (gsi), phi_arg, e, UNKNOWN_LOCATION);
> +  add_phi_arg (gsi_stmt (gsi), phi_arg, e, UNKNOWN_LOCATION, NULL);
>  }
>
>  /* Creates a GIMPLE statement which computes the operation specified by
> @@ -853,7 +853,7 @@
>        phi = gsi_stmt (gsi);
>        gcc_assert (param == SSA_NAME_VAR (PHI_RESULT (phi)));
>
> -      add_phi_arg (phi, arg, e, gimple_location (stmt));
> +      add_phi_arg (phi, arg, e, gimple_location (stmt), gimple_block (stmt));
>        gsi_next (&gsi);
>      }
>
> @@ -948,7 +948,7 @@
>    phi = create_phi_node (tmp, bb);
>    /* RET_TYPE can be a float when -ffast-maths is enabled.  */
>    add_phi_arg (phi, fold_convert (ret_type, init), single_pred_edge (bb),
> -              UNKNOWN_LOCATION);
> +              UNKNOWN_LOCATION, NULL);
>    return PHI_RESULT (phi);
>  }
>
> @@ -1012,7 +1012,7 @@
>                 phi = create_phi_node (name, first);
>                 SSA_NAME_DEF_STMT (name) = phi;
>                 add_phi_arg (phi, new_name, single_pred_edge (first),
> -                            EXPR_LOCATION (param));
> +                            EXPR_LOCATION (param), NULL);
>               }
>           phis_constructed = true;
>         }
> Index: gcc/tree.h
> ===================================================================
> --- gcc/tree.h  (revision 189246)
> +++ gcc/tree.h  (working copy)
> @@ -2036,6 +2036,7 @@
>    struct ssa_use_operand_d imm_use;
>    tree def;
>    location_t locus;
> +  tree block;
>  };
>
>
> Index: gcc/tree-phinodes.c
> ===================================================================
> --- gcc/tree-phinodes.c (revision 189246)
> +++ gcc/tree-phinodes.c (working copy)
> @@ -205,6 +205,7 @@
>        use_operand_p  imm;
>
>        gimple_phi_arg_set_location (phi, i, UNKNOWN_LOCATION);
> +      gimple_phi_arg_set_block (phi, i ,NULL);
>        imm = gimple_phi_arg_imm_use_ptr (phi, i);
>        imm->use = gimple_phi_arg_def_ptr (phi, i);
>        imm->prev = NULL;
> @@ -275,6 +276,7 @@
>        use_operand_p imm;
>
>        gimple_phi_arg_set_location (new_phi, i, UNKNOWN_LOCATION);
> +      gimple_phi_arg_set_block (new_phi, i, NULL);
>        imm = gimple_phi_arg_imm_use_ptr (new_phi, i);
>        imm->use = gimple_phi_arg_def_ptr (new_phi, i);
>        imm->prev = NULL;
> @@ -362,7 +364,7 @@
>     PHI points to the reallocated phi node when we return.  */
>
>  void
> -add_phi_arg (gimple phi, tree def, edge e, source_location locus)
> +add_phi_arg (gimple phi, tree def, edge e, source_location locus, tree block)
>  {
>    basic_block bb = e->dest;
>
> @@ -386,6 +388,7 @@
>
>    SET_PHI_ARG_DEF (phi, e->dest_idx, def);
>    gimple_phi_arg_set_location (phi, e->dest_idx, locus);
> +  gimple_phi_arg_set_block (phi, e->dest_idx, block);
>  }
>
>
> @@ -417,6 +420,8 @@
>        /* Move the location as well.  */
>        gimple_phi_arg_set_location (phi, i,
>                                    gimple_phi_arg_location (phi, num_elem - 1));
> +      gimple_phi_arg_set_block (phi, i,
> +                               gimple_phi_arg_block (phi, num_elem - 1));
>      }
>
>    /* Shrink the vector and return.  Note that we do not have to clear
> Index: gcc/omp-low.c
> ===================================================================
> --- gcc/omp-low.c       (revision 189246)
> +++ gcc/omp-low.c       (working copy)
> @@ -3061,8 +3061,8 @@
>             {
>               gimple phi = create_phi_node (tmp_join, bb);
>               SSA_NAME_DEF_STMT (tmp_join) = phi;
> -             add_phi_arg (phi, tmp_then, e_then, UNKNOWN_LOCATION);
> -             add_phi_arg (phi, tmp_else, e_else, UNKNOWN_LOCATION);
> +             add_phi_arg (phi, tmp_then, e_then, UNKNOWN_LOCATION, NULL);
> +             add_phi_arg (phi, tmp_else, e_else, UNKNOWN_LOCATION, NULL);
>             }
>
>           val = tmp_join;
> @@ -4597,6 +4597,7 @@
>         {
>           gimple nphi;
>           source_location locus;
> +         tree block;
>
>           phi = gsi_stmt (psi);
>           t = gimple_phi_result (phi);
> @@ -4606,14 +4607,16 @@
>
>           t = PHI_ARG_DEF_FROM_EDGE (phi, se);
>           locus = gimple_phi_arg_location_from_edge (phi, se);
> +         block = gimple_phi_arg_block_from_edge (phi, se);
>
>           /* A special case -- fd->loop.v is not yet computed in
>              iter_part_bb, we need to use v_extra instead.  */
>           if (t == fd->loop.v)
>             t = v_extra;
> -         add_phi_arg (nphi, t, ene, locus);
> +         add_phi_arg (nphi, t, ene, locus, block);
>           locus = redirect_edge_var_map_location (vm);
> -         add_phi_arg (nphi, redirect_edge_var_map_def (vm), re, locus);
> +         block = redirect_edge_var_map_block (vm);
> +         add_phi_arg (nphi, redirect_edge_var_map_def (vm), re, locus, block);
>         }
>        gcc_assert (!gsi_end_p (psi) && i == VEC_length (edge_var_map, head));
>        redirect_edge_var_map_clear (re);
> @@ -4629,9 +4632,9 @@
>        phi = create_phi_node (trip_main, iter_part_bb);
>        SSA_NAME_DEF_STMT (trip_main) = phi;
>        add_phi_arg (phi, trip_back, single_succ_edge (trip_update_bb),
> -                  UNKNOWN_LOCATION);
> +                  UNKNOWN_LOCATION, NULL);
>        add_phi_arg (phi, trip_init, single_succ_edge (entry_bb),
> -                  UNKNOWN_LOCATION);
> +                  UNKNOWN_LOCATION, NULL);
>      }
>
>    set_immediate_dominator (CDI_DOMINATORS, trip_update_bb, cont_bb);
> Index: gcc/tree-vect-loop-manip.c
> ===================================================================
> --- gcc/tree-vect-loop-manip.c  (revision 189246)
> +++ gcc/tree-vect-loop-manip.c  (working copy)
> @@ -294,13 +294,15 @@
>         gsi_next (&gsi_new), gsi_next (&gsi_orig))
>      {
>        source_location locus;
> +      tree block;
>        phi_new = gsi_stmt (gsi_new);
>        phi_orig = gsi_stmt (gsi_orig);
>
>        /* step 1.  */
>        def = PHI_ARG_DEF_FROM_EDGE (phi_orig, entry_arg_e);
>        locus = gimple_phi_arg_location_from_edge (phi_orig, entry_arg_e);
> -      add_phi_arg (phi_new, def, new_loop_entry_e, locus);
> +      block = gimple_phi_arg_block_from_edge (phi_orig, entry_arg_e);
> +      add_phi_arg (phi_new, def, new_loop_entry_e, locus, block);
>
>        /* step 2.  */
>        def = PHI_ARG_DEF_FROM_EDGE (phi_orig, orig_loop_latch);
> @@ -317,7 +319,8 @@
>         }
>
>        /* An ordinary ssa name defined in the loop.  */
> -      add_phi_arg (phi_new, new_ssa_name, loop_latch_edge (new_loop), locus);
> +      add_phi_arg (phi_new, new_ssa_name, loop_latch_edge (new_loop), locus,
> +                  block);
>
>        /* Drop any debug references outside the loop, if they would
>          become ill-formed SSA.  */
> @@ -512,6 +515,7 @@
>         gsi_next (&gsi_orig), gsi_next (&gsi_update))
>      {
>        source_location loop_locus, guard_locus;
> +      tree loop_block, guard_block;
>        orig_phi = gsi_stmt (gsi_orig);
>        update_phi = gsi_stmt (gsi_update);
>
> @@ -527,13 +531,19 @@
>        loop_locus = gimple_phi_arg_location_from_edge (orig_phi,
>                                                       EDGE_SUCC (loop->latch,
>                                                                  0));
> +      loop_block = gimple_phi_arg_block_from_edge (orig_phi,
> +                                                  EDGE_SUCC (loop->latch,
> +                                                             0));
> +
>        guard_arg = PHI_ARG_DEF_FROM_EDGE (orig_phi, loop_preheader_edge (loop));
>        guard_locus
>         = gimple_phi_arg_location_from_edge (orig_phi,
>                                              loop_preheader_edge (loop));
> +      guard_block = gimple_phi_arg_block_from_edge (orig_phi,
> +                                                   loop_preheader_edge (loop));
>
> -      add_phi_arg (new_phi, loop_arg, new_exit_e, loop_locus);
> -      add_phi_arg (new_phi, guard_arg, guard_edge, guard_locus);
> +      add_phi_arg (new_phi, loop_arg, new_exit_e, loop_locus, loop_block);
> +      add_phi_arg (new_phi, guard_arg, guard_edge, guard_locus, guard_block);
>
>        /* 1.3. Update phi in successor block.  */
>        gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi, e) == loop_arg
> @@ -552,7 +562,7 @@
>                                   *new_exit_bb);
>
>        /* 2.2. NEW_EXIT_BB has one incoming edge: the exit-edge of the loop.  */
> -      add_phi_arg (new_phi, loop_arg, single_exit (loop), loop_locus);
> +      add_phi_arg (new_phi, loop_arg, single_exit (loop), loop_locus,
> loop_block);
>
>        /* 2.3. Update phi in successor of NEW_EXIT_BB:  */
>        gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi2, new_exit_e) == loop_arg);
> @@ -680,8 +690,8 @@
>        if (new_name2)
>          guard_arg = new_name2;
>
> -      add_phi_arg (new_phi, loop_arg, new_exit_e, UNKNOWN_LOCATION);
> -      add_phi_arg (new_phi, guard_arg, guard_edge, UNKNOWN_LOCATION);
> +      add_phi_arg (new_phi, loop_arg, new_exit_e, UNKNOWN_LOCATION, NULL);
> +      add_phi_arg (new_phi, guard_arg, guard_edge, UNKNOWN_LOCATION, NULL);
>
>        /* 1.3. Update phi in successor block.  */
>        gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi, e) == orig_def);
> @@ -696,7 +706,8 @@
>                                   *new_exit_bb);
>
>        /* 2.2. NEW_EXIT_BB has one incoming edge: the exit-edge of the loop.  */
> -      add_phi_arg (new_phi, loop_arg, single_exit (loop), UNKNOWN_LOCATION);
> +      add_phi_arg (new_phi, loop_arg, single_exit (loop), UNKNOWN_LOCATION,
> +                  NULL);
>
>        /* 2.3. Update phi in successor of NEW_EXIT_BB:  */
>        gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi2, new_exit_e) == loop_arg);
> @@ -733,7 +744,7 @@
>        /* 3.3. GUARD_BB has one incoming edge:  */
>        gcc_assert (EDGE_COUNT (guard_edge->src->preds) == 1);
>        add_phi_arg (new_phi, arg, EDGE_PRED (guard_edge->src, 0),
> -                  UNKNOWN_LOCATION);
> +                  UNKNOWN_LOCATION, NULL);
>
>        /* 3.4. Update phi in successor of GUARD_BB:  */
>        gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi2, guard_edge)
> @@ -859,14 +870,16 @@
>         {
>           edge new_loop_exit_edge;
>           source_location locus;
> +         tree block;
>
>           locus = gimple_phi_arg_location_from_edge (phi, single_exit (loop));
> +         block = gimple_phi_arg_block_from_edge (phi, single_exit (loop));
>           if (EDGE_SUCC (new_loop->header, 0)->dest == new_loop->latch)
>             new_loop_exit_edge = EDGE_SUCC (new_loop->header, 1);
>           else
>             new_loop_exit_edge = EDGE_SUCC (new_loop->header, 0);
>
> -         add_phi_arg (phi, phi_arg, new_loop_exit_edge, locus);
> +         add_phi_arg (phi, phi_arg, new_loop_exit_edge, locus, block);
>         }
>      }
>
> @@ -905,7 +918,8 @@
>           phi_arg = PHI_ARG_DEF_FROM_EDGE (phi, entry_e);
>           if (phi_arg)
>             add_phi_arg (phi, phi_arg, new_exit_e,
> -                        gimple_phi_arg_location_from_edge (phi, entry_e));
> +                        gimple_phi_arg_location_from_edge (phi, entry_e),
> +                        gimple_phi_arg_block_from_edge (phi, entry_e));
>         }
>
>        redirect_edge_and_branch_force (entry_e, new_loop->header);
> @@ -1089,8 +1103,8 @@
>
>    newphi = create_phi_node (var, bb_before_first_loop);
>    add_phi_arg (newphi, prologue_after_cost_adjust_name, e_fallthru,
> -              UNKNOWN_LOCATION);
> -  add_phi_arg (newphi, *first_niters, e_false, UNKNOWN_LOCATION);
> +              UNKNOWN_LOCATION, NULL);
> +  add_phi_arg (newphi, *first_niters, e_false, UNKNOWN_LOCATION, NULL);
>
>    *first_niters = PHI_RESULT (newphi);
>  }
> @@ -1193,7 +1207,7 @@
>                                           new_phi);
>             use_operand_p use_p;
>
> -           add_phi_arg (new_phi, vop, exit_e, UNKNOWN_LOCATION);
> +           add_phi_arg (new_phi, vop, exit_e, UNKNOWN_LOCATION, NULL);
>             gimple_phi_set_result (new_phi, new_vop);
>             FOR_EACH_IMM_USE_STMT (stmt, imm_iter, vop)
>               if (stmt != new_phi && gimple_bb (stmt) != loop->header)
> @@ -2551,7 +2565,8 @@
>                                   new_exit_bb);
>        arg = PHI_ARG_DEF_FROM_EDGE (orig_phi, e);
>        add_phi_arg (new_phi, arg, new_exit_e,
> -                  gimple_phi_arg_location_from_edge (orig_phi, e));
> +                  gimple_phi_arg_location_from_edge (orig_phi, e),
> +                  gimple_phi_arg_block_from_edge (orig_phi, e));
>        adjust_phi_and_debug_stmts (orig_phi, e, PHI_RESULT (new_phi));
>      }
>
> Index: gcc/tree-parloops.c
> ===================================================================
> --- gcc/tree-parloops.c (revision 189246)
> +++ gcc/tree-parloops.c (working copy)
> @@ -998,6 +998,7 @@
>    basic_block store_bb;
>    tree local_res;
>    source_location locus;
> +  tree block;
>
>    /* STORE_BB is the block where the phi
>       should be stored.  It is the destination of the loop exit.
> @@ -1017,11 +1018,12 @@
>      = make_ssa_name (SSA_NAME_VAR (gimple_assign_lhs (reduc->reduc_stmt)),
>                      NULL);
>    locus = gimple_location (reduc->reduc_stmt);
> +  block = gimple_block (reduc->reduc_stmt);
>    new_phi = create_phi_node (local_res, store_bb);
>    SSA_NAME_DEF_STMT (local_res) = new_phi;
> -  add_phi_arg (new_phi, reduc->init, e, locus);
> +  add_phi_arg (new_phi, reduc->init, e, locus, block);
>    add_phi_arg (new_phi, gimple_assign_lhs (reduc->reduc_stmt),
> -              FALLTHRU_EDGE (loop->latch), locus);
> +              FALLTHRU_EDGE (loop->latch), locus, block);
>    reduc->new_phi = new_phi;
>
>    return 1;
> @@ -1500,7 +1502,7 @@
>        SET_PHI_RESULT (phi, t);
>        nphi = create_phi_node (res, orig_header);
>        SSA_NAME_DEF_STMT (res) = nphi;
> -      add_phi_arg (nphi, t, hpred, UNKNOWN_LOCATION);
> +      add_phi_arg (nphi, t, hpred, UNKNOWN_LOCATION, NULL);
>
>        if (res == control)
>         {
> @@ -1656,6 +1658,7 @@
>    for (gsi = gsi_start_phis (ex_bb); !gsi_end_p (gsi); gsi_next (&gsi))
>      {
>        source_location locus;
> +      tree block;
>        tree def;
>        phi = gsi_stmt (gsi);
>        stmt = SSA_NAME_DEF_STMT (PHI_ARG_DEF_FROM_EDGE (phi, exit));
> @@ -1663,11 +1666,14 @@
>        def = PHI_ARG_DEF_FROM_EDGE (stmt, loop_preheader_edge (loop));
>        locus = gimple_phi_arg_location_from_edge (stmt,
>                                                  loop_preheader_edge (loop));
> -      add_phi_arg (phi, def, guard, locus);
> +      block = gimple_phi_arg_block_from_edge (stmt,
> +                                             loop_preheader_edge (loop));
> +      add_phi_arg (phi, def, guard, locus, block);
>
>        def = PHI_ARG_DEF_FROM_EDGE (stmt, loop_latch_edge (loop));
>        locus = gimple_phi_arg_location_from_edge (stmt, loop_latch_edge (loop));
> -      add_phi_arg (phi, def, end, locus);
> +      block = gimple_phi_arg_block_from_edge (stmt, loop_latch_edge (loop));
> +      add_phi_arg (phi, def, end, locus, block);
>      }
>    e = redirect_edge_and_branch (exit, nexit->dest);
>    PENDING_STMT (e) = NULL;
> Index: gcc/tree-eh.c
> ===================================================================
> --- gcc/tree-eh.c       (revision 189246)
> +++ gcc/tree-eh.c       (working copy)
> @@ -3853,13 +3853,15 @@
>           FOR_EACH_EDGE (e, ei, old_bb->preds)
>             {
>               location_t oloc;
> +             tree oblock;
>               tree oop;
>
>               if ((e->flags & EDGE_EH) == 0)
>                 continue;
>               oop = gimple_phi_arg_def (ophi, e->dest_idx);
>               oloc = gimple_phi_arg_location (ophi, e->dest_idx);
> -             redirect_edge_var_map_add (e, nresult, oop, oloc);
> +             oblock = gimple_phi_arg_block (ophi, e->dest_idx);
> +             redirect_edge_var_map_add (e, nresult, oop, oloc, oblock);
>             }
>         }
>        /* If we didn't find the PHI, but it's a VOP, remember to rename
> @@ -3874,8 +3876,9 @@
>         {
>           location_t nloc
>             = gimple_phi_arg_location (nphi, old_bb_out->dest_idx);
> +         tree nblock = gimple_phi_arg_block (nphi, old_bb_out->dest_idx);
>           FOR_EACH_EDGE (e, ei, old_bb->preds)
> -           redirect_edge_var_map_add (e, nresult, nop, nloc);
> +           redirect_edge_var_map_add (e, nresult, nop, nloc, nblock);
>         }
>      }
>
> Index: gcc/ipa-split.c
> ===================================================================
> --- gcc/ipa-split.c     (revision 189246)
> +++ gcc/ipa-split.c     (working copy)
> @@ -1286,7 +1286,8 @@
>                   /* When there is PHI, just update its value.  */
>                   if (TREE_CODE (retval) == SSA_NAME
>                       && !gsi_end_p (psi))
> -                   add_phi_arg (gsi_stmt (psi), retval, e, UNKNOWN_LOCATION);
> +                   add_phi_arg (gsi_stmt (psi), retval, e, UNKNOWN_LOCATION,
> +                                NULL);
>                   /* Otherwise update the return BB itself.
>                      find_return_bb allows at most one assignment to return value,
>                      so update first statement.  */
> Index: gcc/tree-vect-loop.c
> ===================================================================
> --- gcc/tree-vect-loop.c        (revision 189246)
> +++ gcc/tree-vect-loop.c        (working copy)
> @@ -3131,9 +3131,9 @@
>                                                     NULL));
>
>    /* Set the arguments of the phi node:  */
> -  add_phi_arg (induction_phi, vec_init, pe, UNKNOWN_LOCATION);
> +  add_phi_arg (induction_phi, vec_init, pe, UNKNOWN_LOCATION, NULL);
>    add_phi_arg (induction_phi, vec_def, loop_latch_edge (iv_loop),
> -              UNKNOWN_LOCATION);
> +              UNKNOWN_LOCATION, NULL);
>
>
>    /* In case that vectorization factor (VF) is bigger than the number
> @@ -3617,13 +3617,13 @@
>          {
>            /* Set the loop-entry arg of the reduction-phi.  */
>            add_phi_arg (phi, vec_init_def, loop_preheader_edge (loop),
> -                       UNKNOWN_LOCATION);
> +                       UNKNOWN_LOCATION, NULL);
>
>            /* Set the loop-latch arg for the reduction-phi.  */
>            if (j > 0)
>              def = vect_get_vec_def_for_stmt_copy (vect_unknown_def_type, def);
>
> -          add_phi_arg (phi, def, loop_latch_edge (loop), UNKNOWN_LOCATION);
> +          add_phi_arg (phi, def, loop_latch_edge (loop),
> UNKNOWN_LOCATION, NULL);
>
>            if (vect_print_dump_info (REPORT_DETAILS))
>              {
> @@ -4241,9 +4241,10 @@
>                    /* Update phi node arguments with vs0 and vs2.  */
>                    add_phi_arg (vect_phi, vect_phi_init,
>                                 loop_preheader_edge (outer_loop),
> -                               UNKNOWN_LOCATION);
> +                               UNKNOWN_LOCATION, NULL);
>                    add_phi_arg (vect_phi, PHI_RESULT (inner_phi),
> -                               loop_latch_edge (outer_loop), UNKNOWN_LOCATION);
> +                               loop_latch_edge (outer_loop), UNKNOWN_LOCATION,
> +                              NULL);
>                    if (vect_print_dump_info (REPORT_DETAILS))
>                      {
>                        fprintf (vect_dump, "created double reduction phi "
> Index: gcc/tree-flow-inline.h
> ===================================================================
> --- gcc/tree-flow-inline.h      (revision 189246)
> +++ gcc/tree-flow-inline.h      (working copy)
> @@ -483,6 +483,22 @@
>    return gimple_phi_arg (gs, e->dest_idx)->locus;
>  }
>
> +/* Return the block location of gimple argument I of phi node GS.  */
> +
> +static inline tree
> +gimple_phi_arg_block (gimple gs, size_t i)
> +{
> +  return gimple_phi_arg (gs, i)->block;
> +}
> +
> +/* Return the block location of the argument on edge E of phi node GS.  */
> +
> +static inline tree
> +gimple_phi_arg_block_from_edge (gimple gs, edge e)
> +{
> +  return gimple_phi_arg (gs, e->dest_idx)->block;
> +}
> +
>  /* Set the source location of gimple argument I of phi node GS to LOC.  */
>
>  static inline void
> @@ -491,6 +507,14 @@
>    gimple_phi_arg (gs, i)->locus = loc;
>  }
>
> +/* Set the block location of gimple argument I of phi node GS to BLOCK.  */
> +
> +static inline void
> +gimple_phi_arg_set_block (gimple gs, size_t i, tree block)
> +{
> +  gimple_phi_arg (gs, i)->block = block;
> +}
> +
>  /* Return TRUE if argument I of phi node GS has a location record.  */
>
>  static inline bool
> @@ -499,6 +523,13 @@
>    return gimple_phi_arg_location (gs, i) != UNKNOWN_LOCATION;
>  }
>
> +/* Return TRUE if argument I of phi node GS has a location record.  */
> +
> +static inline bool
> +gimple_phi_arg_has_block (gimple gs, size_t i)
> +{
> +  return gimple_phi_arg_block (gs, i) != NULL;
> +}
>
>  /* Return the PHI nodes for basic block BB, or NULL if there are no
>     PHI nodes.  */
> @@ -1217,6 +1248,13 @@
>    return v->locus;
>  }
>
> +/* Given an edge_var_map V, return the PHI arg location.  */
> +
> +static inline tree
> +redirect_edge_var_map_block (edge_var_map *v)
> +{
> +  return v->block;
> +}
>
>  /* Return an SSA_NAME node for variable VAR defined in statement STMT
>     in function cfun.  */
> Index: gcc/tree-vect-data-refs.c
> ===================================================================
> --- gcc/tree-vect-data-refs.c   (revision 189246)
> +++ gcc/tree-vect-data-refs.c   (working copy)
> @@ -4407,7 +4407,7 @@
>    msq = make_ssa_name (vec_dest, NULL);
>    phi_stmt = create_phi_node (msq, containing_loop->header);
>    SSA_NAME_DEF_STMT (msq) = phi_stmt;
> -  add_phi_arg (phi_stmt, msq_init, pe, UNKNOWN_LOCATION);
> +  add_phi_arg (phi_stmt, msq_init, pe, UNKNOWN_LOCATION, NULL);
>
>    return msq;
>  }
> Index: gcc/graphite-scop-detection.c
> ===================================================================
> --- gcc/graphite-scop-detection.c       (revision 189246)
> +++ gcc/graphite-scop-detection.c       (working copy)
> @@ -1331,7 +1331,7 @@
>                                           gimple_phi_result_ptr (close_phi));
>                 add_phi_arg (close_phi, arg,
>                              gimple_phi_arg_edge (close_phi, 0),
> -                            UNKNOWN_LOCATION);
> +                            UNKNOWN_LOCATION, NULL);
>                 use_p = gimple_phi_arg_imm_use_ptr (phi, i);
>                 replace_exp (use_p, res);
>                 update_stmt (phi);
> Index: gcc/tree-ssa-phiopt.c
> ===================================================================
> --- gcc/tree-ssa-phiopt.c       (revision 189246)
> +++ gcc/tree-ssa-phiopt.c       (working copy)
> @@ -1454,6 +1454,7 @@
>    gimple newphi, new_stmt;
>    gimple_stmt_iterator gsi;
>    source_location locus;
> +  tree block;
>
>    /* Check if middle_bb contains of only one store.  */
>    if (!assign
> @@ -1461,6 +1462,7 @@
>      return false;
>
>    locus = gimple_location (assign);
> +  block = gimple_block (assign);
>    lhs = gimple_assign_lhs (assign);
>    rhs = gimple_assign_rhs1 (assign);
>    if (TREE_CODE (lhs) != MEM_REF
> @@ -1494,14 +1496,15 @@
>    name = make_ssa_name (condstoretemp, new_stmt);
>    gimple_assign_set_lhs (new_stmt, name);
>    gimple_set_location (new_stmt, locus);
> +  gimple_set_block (new_stmt, block);
>    gsi_insert_on_edge (e1, new_stmt);
>
>    /* 4) Create a PHI node at the join block, with one argument
>          holding the old RHS, and the other holding the temporary
>          where we stored the old memory contents.  */
>    newphi = create_phi_node (condstoretemp, join_bb);
> -  add_phi_arg (newphi, rhs, e0, locus);
> -  add_phi_arg (newphi, name, e1, locus);
> +  add_phi_arg (newphi, rhs, e0, locus, block);
> +  add_phi_arg (newphi, name, e1, locus, block);
>
>    lhs = unshare_expr (lhs);
>    new_stmt = gimple_build_assign (lhs, PHI_RESULT (newphi));
> @@ -1528,6 +1531,7 @@
>  {
>    tree lhs_base, lhs, then_rhs, else_rhs;
>    source_location then_locus, else_locus;
> +  tree then_block, else_block;
>    gimple_stmt_iterator gsi;
>    gimple newphi, new_stmt;
>
> @@ -1553,6 +1557,8 @@
>    else_rhs = gimple_assign_rhs1 (else_assign);
>    then_locus = gimple_location (then_assign);
>    else_locus = gimple_location (else_assign);
> +  then_block = gimple_block (then_assign);
> +  else_block = gimple_block (else_assign);
>
>    /* Now we've checked the constraints, so do the transformation:
>       1) Remove the stores.  */
> @@ -1576,8 +1582,10 @@
>         holding the old RHS, and the other holding the temporary
>         where we stored the old memory contents.  */
>    newphi = create_phi_node (condstoretemp, join_bb);
> -  add_phi_arg (newphi, then_rhs, EDGE_SUCC (then_bb, 0), then_locus);
> -  add_phi_arg (newphi, else_rhs, EDGE_SUCC (else_bb, 0), else_locus);
> +  add_phi_arg (newphi, then_rhs, EDGE_SUCC (then_bb, 0), then_locus,
> +              then_block);
> +  add_phi_arg (newphi, else_rhs, EDGE_SUCC (else_bb, 0), else_locus,
> +              else_block);
>
>    new_stmt = gimple_build_assign (lhs, PHI_RESULT (newphi));
>
> Index: gcc/tree-cfgcleanup.c
> ===================================================================
> --- gcc/tree-cfgcleanup.c       (revision 189246)
> +++ gcc/tree-cfgcleanup.c       (working copy)
> @@ -444,7 +444,9 @@
>             {
>               gimple phi = gsi_stmt (gsi);
>               source_location l = gimple_phi_arg_location_from_edge (phi, succ);
> -             add_phi_arg (phi, gimple_phi_arg_def (phi, succ->dest_idx), s, l);
> +             tree b = gimple_phi_arg_block_from_edge (phi, succ);
> +             add_phi_arg (phi, gimple_phi_arg_def (phi, succ->dest_idx), s, l,
> +                          b);
>             }
>         }
>      }
> @@ -871,6 +873,7 @@
>           gimple phi = gsi_stmt (gsi);
>           tree def = gimple_phi_arg_def (phi, succ->dest_idx);
>           source_location locus = gimple_phi_arg_location_from_edge (phi, succ);
> +         tree block = gimple_phi_arg_block_from_edge (phi, succ);
>
>           if (TREE_CODE (def) == SSA_NAME)
>             {
> @@ -891,12 +894,13 @@
>                     {
>                       def = new_arg;
>                       locus = redirect_edge_var_map_location (vm);
> +                     block = redirect_edge_var_map_block (vm);
>                       break;
>                     }
>                 }
>             }
>
> -         add_phi_arg (phi, def, s, locus);
> +         add_phi_arg (phi, def, s, locus, block);
>         }
>
>        redirect_edge_var_map_clear (e);
> Index: gcc/tree-ssa-pre.c
> ===================================================================
> --- gcc/tree-ssa-pre.c  (revision 189246)
> +++ gcc/tree-ssa-pre.c  (working copy)
> @@ -3403,10 +3403,10 @@
>        gcc_assert (get_expr_type (ae) == type
>                   || useless_type_conversion_p (type, get_expr_type (ae)));
>        if (ae->kind == CONSTANT)
> -       add_phi_arg (phi, PRE_EXPR_CONSTANT (ae), pred, UNKNOWN_LOCATION);
> +       add_phi_arg (phi, PRE_EXPR_CONSTANT (ae), pred, UNKNOWN_LOCATION, NULL);
>        else
>         add_phi_arg (phi, PRE_EXPR_NAME (avail[pred->src->index]), pred,
> -                    UNKNOWN_LOCATION);
> +                    UNKNOWN_LOCATION, NULL);
>      }
>
>    newphi = get_or_alloc_expr_for_name (gimple_phi_result (phi));
> Index: gcc/tree-ssa-live.c
> ===================================================================
> --- gcc/tree-ssa-live.c (revision 189246)
> +++ gcc/tree-ssa-live.c (working copy)
> @@ -765,6 +765,10 @@
>            FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_ALL_USES)
>              {
>               tree arg = USE_FROM_PTR (arg_p);
> +             int index = PHI_ARG_INDEX_FROM_USE (arg_p);
> +             tree block = gimple_phi_arg_block (phi, index);
> +             if (block != NULL)
> +               TREE_USED (block) = true;
>               mark_all_vars_used (&arg, global_unused_vars);
>              }
>          }
> Index: gcc/tree-predcom.c
> ===================================================================
> --- gcc/tree-predcom.c  (revision 189246)
> +++ gcc/tree-predcom.c  (working copy)
> @@ -1531,8 +1531,8 @@
>
>        phi = create_phi_node (var, loop->header);
>        SSA_NAME_DEF_STMT (var) = phi;
> -      add_phi_arg (phi, init, entry, UNKNOWN_LOCATION);
> -      add_phi_arg (phi, next, latch, UNKNOWN_LOCATION);
> +      add_phi_arg (phi, init, entry, UNKNOWN_LOCATION, NULL);
> +      add_phi_arg (phi, next, latch, UNKNOWN_LOCATION, NULL);
>      }
>  }
>
> @@ -1595,8 +1595,8 @@
>        next = VEC_index (tree, *vars, 1);
>        phi = create_phi_node (var, loop->header);
>        SSA_NAME_DEF_STMT (var) = phi;
> -      add_phi_arg (phi, init, entry, UNKNOWN_LOCATION);
> -      add_phi_arg (phi, next, latch, UNKNOWN_LOCATION);
> +      add_phi_arg (phi, init, entry, UNKNOWN_LOCATION, NULL);
> +      add_phi_arg (phi, next, latch, UNKNOWN_LOCATION, NULL);
>      }
>    else
>      {
> Index: gcc/sese.c
> ===================================================================
> --- gcc/sese.c  (revision 189246)
> +++ gcc/sese.c  (working copy)
> @@ -349,8 +349,8 @@
>
>    create_new_def_for (gimple_phi_result (phi), phi,
>                       gimple_phi_result_ptr (phi));
> -  add_phi_arg (phi, use, false_e, UNKNOWN_LOCATION);
> -  add_phi_arg (phi, use, true_e, UNKNOWN_LOCATION);
> +  add_phi_arg (phi, use, false_e, UNKNOWN_LOCATION, NULL);
> +  add_phi_arg (phi, use, true_e, UNKNOWN_LOCATION, NULL);
>  }
>
>  /* Insert in the block BB phi nodes for variables defined in REGION
> Index: gcc/tree-ssa-dce.c
> ===================================================================
> --- gcc/tree-ssa-dce.c  (revision 189246)
> +++ gcc/tree-ssa-dce.c  (working copy)
> @@ -1129,6 +1129,7 @@
>           gimple phi = gsi_stmt (gsi);
>           tree op;
>           source_location locus;
> +         tree block;
>
>           /* PHIs for virtuals have no control dependency relation on them.
>              We are lost here and must force renaming of the symbol.  */
> @@ -1148,7 +1149,8 @@
>
>           op = gimple_phi_arg_def (phi, e2->dest_idx);
>           locus = gimple_phi_arg_location (phi, e2->dest_idx);
> -         add_phi_arg (phi, op, e, locus);
> +         block = gimple_phi_arg_block (phi, e2->dest_idx);
> +         add_phi_arg (phi, op, e, locus, block);
>           /* The resulting PHI if not dead can only be degenerate.  */
>           gcc_assert (degenerate_phi_p (phi));
>           gsi_next (&gsi);
> Index: gcc/tree-ssa.c
> ===================================================================
> --- gcc/tree-ssa.c      (revision 189246)
> +++ gcc/tree-ssa.c      (working copy)
> @@ -51,7 +51,8 @@
>  /* Add a mapping with PHI RESULT and PHI DEF associated with edge E.  */
>
>  void
> -redirect_edge_var_map_add (edge e, tree result, tree def,
> source_location locus)
> +redirect_edge_var_map_add (edge e, tree result, tree def,
> source_location locus,
> +                          tree block)
>  {
>    void **slot;
>    edge_var_map_vector old_head, head;
> @@ -70,6 +71,7 @@
>    new_node.def = def;
>    new_node.result = result;
>    new_node.locus = locus;
> +  new_node.block = block;
>
>    VEC_safe_push (edge_var_map, heap, head, &new_node);
>    if (old_head != head)
> @@ -193,15 +195,17 @@
>      {
>        tree def;
>        source_location locus ;
> +      tree block;
>
>        phi = gsi_stmt (gsi);
>        def = gimple_phi_arg_def (phi, e->dest_idx);
>        locus = gimple_phi_arg_location (phi, e->dest_idx);
> +      block = gimple_phi_arg_block (phi, e->dest_idx);
>
>        if (def == NULL_TREE)
>         continue;
>
> -      redirect_edge_var_map_add (e, gimple_phi_result (phi), def, locus);
> +      redirect_edge_var_map_add (e, gimple_phi_result (phi), def,
> locus, block);
>      }
>
>    e = redirect_edge_succ_nodup (e, dest);
> @@ -234,7 +238,8 @@
>
>        phi = gsi_stmt (gsi);
>        def = redirect_edge_var_map_def (vm);
> -      add_phi_arg (phi, def, e, redirect_edge_var_map_location (vm));
> +      add_phi_arg (phi, def, e, redirect_edge_var_map_location (vm),
> +                  redirect_edge_var_map_block (vm));
>      }
>
>    redirect_edge_var_map_clear (e);
> Index: gcc/gimple-streamer-in.c
> ===================================================================
> --- gcc/gimple-streamer-in.c    (revision 189246)
> +++ gcc/gimple-streamer-in.c    (working copy)
> @@ -67,7 +67,7 @@
>             break;
>           }
>
> -      add_phi_arg (result, def, e, arg_loc);
> +      add_phi_arg (result, def, e, arg_loc, NULL);
>      }
>
>    return result;
> Index: gcc/tree-vect-stmts.c
> ===================================================================
> --- gcc/tree-vect-stmts.c       (revision 189246)
> +++ gcc/tree-vect-stmts.c       (working copy)
> @@ -5117,7 +5117,7 @@
>                       if (i == vec_num - 1 && j == ncopies - 1)
>                         add_phi_arg (phi, lsq,
>                                      loop_latch_edge (containing_loop),
> -                                    UNKNOWN_LOCATION);
> +                                    UNKNOWN_LOCATION, NULL);
>                       msq = lsq;
>                     }
>                 }
> Index: gcc/tree-inline.c
> ===================================================================
> --- gcc/tree-inline.c   (revision 189246)
> +++ gcc/tree-inline.c   (working copy)
> @@ -2019,6 +2019,7 @@
>               tree arg;
>               tree new_arg;
>               tree block = id->block;
> +             tree arg_block, *n;
>               edge_iterator ei2;
>
>               /* When doing partial cloning, we allow PHIs on the entry block
> @@ -2046,8 +2047,15 @@
>                   gsi_insert_seq_on_edge (new_edge, stmts);
>                   inserted = true;
>                 }
> +             n = (tree *) pointer_map_contains (id->decl_map,
> +               gimple_phi_arg_block_from_edge (phi, old_edge));
> +             if (n)
> +               arg_block = *n;
> +             else
> +               arg_block = NULL;
>               add_phi_arg (new_phi, new_arg, new_edge,
> -                          gimple_phi_arg_location_from_edge (phi, old_edge));
> +                          gimple_phi_arg_location_from_edge (phi, old_edge),
> +                          arg_block);
>             }
>         }
>      }
> Index: gcc/tree-ssa-phiprop.c
> ===================================================================
> --- gcc/tree-ssa-phiprop.c      (revision 189246)
> +++ gcc/tree-ssa-phiprop.c      (working copy)
> @@ -159,9 +159,11 @@
>        tree old_arg, new_var;
>        gimple tmp;
>        source_location locus;
> +      tree block;
>
>        old_arg = PHI_ARG_DEF_FROM_EDGE (phi, e);
>        locus = gimple_phi_arg_location_from_edge (phi, e);
> +      block = gimple_phi_arg_block_from_edge (phi, e);
>        while (TREE_CODE (old_arg) == SSA_NAME
>              && (SSA_NAME_VERSION (old_arg) >= n
>                  || phivn[SSA_NAME_VERSION (old_arg)].value == NULL_TREE))
> @@ -169,6 +171,7 @@
>           gimple def_stmt = SSA_NAME_DEF_STMT (old_arg);
>           old_arg = gimple_assign_rhs1 (def_stmt);
>           locus = gimple_location (def_stmt);
> +         block = gimple_block (def_stmt);
>         }
>
>        if (TREE_CODE (old_arg) == SSA_NAME)
> @@ -203,6 +206,7 @@
>           new_var = make_ssa_name (new_var, tmp);
>           gimple_assign_set_lhs (tmp, new_var);
>           gimple_set_location (tmp, locus);
> +         gimple_set_block (tmp, block);
>
>           gsi_insert_on_edge (e, tmp);
>           update_stmt (tmp);
> @@ -216,7 +220,7 @@
>             }
>         }
>
> -      add_phi_arg (new_phi, new_var, e, locus);
> +      add_phi_arg (new_phi, new_var, e, locus, block);
>      }
>
>    update_stmt (new_phi);
> Index: gcc/tree-outof-ssa.c
> ===================================================================
> --- gcc/tree-outof-ssa.c        (revision 189246)
> +++ gcc/tree-outof-ssa.c        (working copy)
> @@ -78,6 +78,9 @@
>    /* Source locus on each edge */
>    VEC(source_location,heap) *edge_locus;
>
> +  /* Block location on each edge.  */
> +  VEC(tree,heap) *edge_block;
> +
>    /* Visited vector.  */
>    sbitmap visited;
>
> @@ -96,6 +99,9 @@
>
>    /* Source locations for any constant copies.  */
>    VEC(source_location,heap) *copy_locus;
> +
> +  /* Block locations for any constant copies.  */
> +  VEC(tree,heap) *copy_block;
>  } *elim_graph;
>
>
> @@ -174,7 +180,8 @@
>  /* Insert a copy instruction from partition SRC to DEST onto edge E.  */
>
>  static void
> -insert_partition_copy_on_edge (edge e, int dest, int src,
> source_location locus)
> +insert_partition_copy_on_edge (edge e, int dest, int src,
> source_location locus,
> +                              tree block)
>  {
>    tree var;
>    rtx seq;
> @@ -194,7 +201,10 @@
>    set_location_for_edge (e);
>    /* If a locus is provided, override the default.  */
>    if (locus)
> -    set_curr_insn_source_location (locus);
> +    {
> +      set_curr_insn_source_location (locus);
> +      set_curr_insn_block (block);
> +    }
>
>    var = partition_to_var (SA.map, src);
>    seq = emit_partition_copy (SA.partition_to_pseudo[dest],
> @@ -209,7 +219,8 @@
>     onto edge E.  */
>
>  static void
> -insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus)
> +insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus,
> +                          tree block)
>  {
>    rtx seq, x;
>    enum machine_mode dest_mode, src_mode;
> @@ -231,7 +242,10 @@
>    set_location_for_edge (e);
>    /* If a locus is provided, override the default.  */
>    if (locus)
> -    set_curr_insn_source_location (locus);
> +    {
> +      set_curr_insn_source_location (locus);
> +      set_curr_insn_block (block);
> +    }
>
>    start_sequence ();
>
> @@ -269,7 +283,7 @@
>
>  static void
>  insert_rtx_to_part_on_edge (edge e, int dest, rtx src, int unsignedsrcp,
> -                           source_location locus)
> +                           source_location locus, tree block)
>  {
>    rtx seq;
>    if (dump_file && (dump_flags & TDF_DETAILS))
> @@ -287,7 +301,10 @@
>    set_location_for_edge (e);
>    /* If a locus is provided, override the default.  */
>    if (locus)
> -    set_curr_insn_source_location (locus);
> +    {
> +      set_curr_insn_source_location (locus);
> +      set_curr_insn_block (block);
> +    }
>
>    /* We give the destination as sizeexp in case src/dest are BLKmode
>       mems.  Usually we give the source.  As we result from SSA names
> @@ -304,7 +321,8 @@
>     onto edge E.  */
>
>  static void
> -insert_part_to_rtx_on_edge (edge e, rtx dest, int src, source_location locus)
> +insert_part_to_rtx_on_edge (edge e, rtx dest, int src, source_location locus,
> +                           tree block)
>  {
>    tree var;
>    rtx seq;
> @@ -323,7 +341,10 @@
>    set_location_for_edge (e);
>    /* If a locus is provided, override the default.  */
>    if (locus)
> -    set_curr_insn_source_location (locus);
> +    {
> +      set_curr_insn_source_location (locus);
> +      set_curr_insn_block (block);
> +    }
>
>    var = partition_to_var (SA.map, src);
>    seq = emit_partition_copy (dest,
> @@ -347,8 +368,10 @@
>    g->const_dests = VEC_alloc (int, heap, 20);
>    g->const_copies = VEC_alloc (tree, heap, 20);
>    g->copy_locus = VEC_alloc (source_location, heap, 10);
> +  g->copy_block = VEC_alloc (tree, heap, 10);
>    g->edge_list = VEC_alloc (int, heap, 20);
>    g->edge_locus = VEC_alloc (source_location, heap, 10);
> +  g->edge_block = VEC_alloc (tree, heap, 10);
>    g->stack = VEC_alloc (int, heap, 30);
>
>    g->visited = sbitmap_alloc (size);
> @@ -365,6 +388,7 @@
>    VEC_truncate (int, g->nodes, 0);
>    VEC_truncate (int, g->edge_list, 0);
>    VEC_truncate (source_location, g->edge_locus, 0);
> +  VEC_truncate (tree, g->edge_block, 0);
>  }
>
>
> @@ -380,7 +404,9 @@
>    VEC_free (int, heap, g->const_dests);
>    VEC_free (int, heap, g->nodes);
>    VEC_free (source_location, heap, g->copy_locus);
> +  VEC_free (tree, heap, g->copy_block);
>    VEC_free (source_location, heap, g->edge_locus);
> +  VEC_free (tree, heap, g->edge_block);
>
>    free (g);
>  }
> @@ -413,11 +439,13 @@
>  /* Add the edge PRED->SUCC to graph G.  */
>
>  static inline void
> -elim_graph_add_edge (elim_graph g, int pred, int succ, source_location locus)
> +elim_graph_add_edge (elim_graph g, int pred, int succ, source_location locus,
> +                    tree block)
>  {
>    VEC_safe_push (int, heap, g->edge_list, pred);
>    VEC_safe_push (int, heap, g->edge_list, succ);
>    VEC_safe_push (source_location, heap, g->edge_locus, locus);
> +  VEC_safe_push (tree, heap, g->edge_block, block);
>  }
>
>
> @@ -425,7 +453,8 @@
>     return the successor node.  -1 is returned if there is no such edge.  */
>
>  static inline int
> -elim_graph_remove_succ_edge (elim_graph g, int node, source_location *locus)
> +elim_graph_remove_succ_edge (elim_graph g, int node, source_location *locus,
> +                            tree *block)
>  {
>    int y;
>    unsigned x;
> @@ -437,9 +466,12 @@
>         VEC_replace (int, g->edge_list, x + 1, -1);
>         *locus = VEC_index (source_location, g->edge_locus, x / 2);
>         VEC_replace (source_location, g->edge_locus, x / 2, UNKNOWN_LOCATION);
> +       *block = VEC_index (tree, g->edge_block, x / 2);
> +       VEC_replace (tree, g->edge_block, x / 2, NULL);
>         return y;
>        }
>    *locus = UNKNOWN_LOCATION;
> +  *block = NULL;
>    return -1;
>  }
>
> @@ -448,7 +480,7 @@
>     edge list.  VAR will hold the partition number found.  CODE is the
>     code fragment executed for every node found.  */
>
> -#define FOR_EACH_ELIM_GRAPH_SUCC(GRAPH, NODE, VAR, LOCUS, CODE)                \
> +#define FOR_EACH_ELIM_GRAPH_SUCC(GRAPH, NODE, VAR, LOCUS, BLOCK, CODE) \
>  do {                                                                   \
>    unsigned x_;                                                         \
>    int y_;                                                              \
> @@ -460,6 +492,8 @@
>        (void) ((VAR) = VEC_index (int, (GRAPH)->edge_list, x_ + 1));    \
>        (void) ((LOCUS) = VEC_index (source_location,                    \
>                                    (GRAPH)->edge_locus, x_ / 2));       \
> +      (void) ((BLOCK) = VEC_index (tree,                               \
> +                                  (GRAPH)->edge_block, x_ / 2));       \
>        CODE;                                                            \
>      }                                                                  \
>  } while (0)
> @@ -469,7 +503,7 @@
>     GRAPH.  VAR will hold the partition number found.  CODE is the
>     code fragment executed for every node found.  */
>
> -#define FOR_EACH_ELIM_GRAPH_PRED(GRAPH, NODE, VAR, LOCUS, CODE)                \
> +#define FOR_EACH_ELIM_GRAPH_PRED(GRAPH, NODE, VAR, LOCUS, BLOCK, CODE) \
>  do {                                                                   \
>    unsigned x_;                                                         \
>    int y_;                                                              \
> @@ -481,6 +515,8 @@
>        (void) ((VAR) = VEC_index (int, (GRAPH)->edge_list, x_));                \
>        (void) ((LOCUS) = VEC_index (source_location,                    \
>                                    (GRAPH)->edge_locus, x_ / 2));       \
> +      (void) ((BLOCK) = VEC_index (tree,                               \
> +                                  (GRAPH)->edge_block, x_ / 2));       \
>        CODE;                                                            \
>      }                                                                  \
>  } while (0)
> @@ -511,6 +547,7 @@
>      {
>        gimple phi = gsi_stmt (gsi);
>        source_location locus;
> +      tree block;
>
>        p0 = var_to_partition (g->map, gimple_phi_result (phi));
>        /* Ignore results which are not in partitions.  */
> @@ -519,6 +556,7 @@
>
>        Ti = PHI_ARG_DEF (phi, g->e->dest_idx);
>        locus = gimple_phi_arg_location_from_edge (phi, g->e);
> +      block = gimple_phi_arg_block_from_edge (phi, g->e);
>
>        /* If this argument is a constant, or a SSA_NAME which is being
>          left in SSA form, just queue a copy to be emitted on this
> @@ -532,6 +570,7 @@
>           VEC_safe_push (int, heap, g->const_dests, p0);
>           VEC_safe_push (tree, heap, g->const_copies, Ti);
>           VEC_safe_push (source_location, heap, g->copy_locus, locus);
> +         VEC_safe_push (tree, heap, g->copy_block, block);
>         }
>        else
>          {
> @@ -540,7 +579,7 @@
>             {
>               eliminate_name (g, p0);
>               eliminate_name (g, pi);
> -             elim_graph_add_edge (g, p0, pi, locus);
> +             elim_graph_add_edge (g, p0, pi, locus, block);
>             }
>         }
>      }
> @@ -554,9 +593,10 @@
>  {
>    int S;
>    source_location locus;
> +  tree block;
>
>    SET_BIT (g->visited, T);
> -  FOR_EACH_ELIM_GRAPH_SUCC (g, T, S, locus,
> +  FOR_EACH_ELIM_GRAPH_SUCC (g, T, S, locus, block,
>      {
>        if (!TEST_BIT (g->visited, S))
>          elim_forward (g, S);
> @@ -572,8 +612,9 @@
>  {
>    int P;
>    source_location locus;
> +  tree block;
>
> -  FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus,
> +  FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus, block,
>      {
>        if (!TEST_BIT (g->visited, P))
>          return 1;
> @@ -588,14 +629,15 @@
>  {
>    int P;
>    source_location locus;
> +  tree block;
>
>    SET_BIT (g->visited, T);
> -  FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus,
> +  FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus, block,
>      {
>        if (!TEST_BIT (g->visited, P))
>          {
>           elim_backward (g, P);
> -         insert_partition_copy_on_edge (g->e, P, T, locus);
> +         insert_partition_copy_on_edge (g->e, P, T, locus, block);
>         }
>      });
>  }
> @@ -624,6 +666,7 @@
>  {
>    int P, S;
>    source_location locus;
> +  tree block;
>
>    if (elim_unvisited_predecessor (g, T))
>      {
> @@ -631,23 +674,24 @@
>        rtx U = get_temp_reg (var);
>        int unsignedsrcp = TYPE_UNSIGNED (TREE_TYPE (var));
>
> -      insert_part_to_rtx_on_edge (g->e, U, T, UNKNOWN_LOCATION);
> -      FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus,
> +      insert_part_to_rtx_on_edge (g->e, U, T, UNKNOWN_LOCATION, NULL);
> +      FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus, block,
>         {
>           if (!TEST_BIT (g->visited, P))
>             {
>               elim_backward (g, P);
> -             insert_rtx_to_part_on_edge (g->e, P, U, unsignedsrcp, locus);
> +             insert_rtx_to_part_on_edge (g->e, P, U, unsignedsrcp, locus,
> +                                         block);
>             }
>         });
>      }
>    else
>      {
> -      S = elim_graph_remove_succ_edge (g, T, &locus);
> +      S = elim_graph_remove_succ_edge (g, T, &locus, &block);
>        if (S != -1)
>         {
>           SET_BIT (g->visited, T);
> -         insert_partition_copy_on_edge (g->e, T, S, locus);
> +         insert_partition_copy_on_edge (g->e, T, S, locus, block);
>         }
>      }
>  }
> @@ -662,6 +706,7 @@
>
>    gcc_assert (VEC_length (tree, g->const_copies) == 0);
>    gcc_assert (VEC_length (source_location, g->copy_locus) == 0);
> +  gcc_assert (VEC_length (tree, g->copy_block) == 0);
>
>    /* Abnormal edges already have everything coalesced.  */
>    if (e->flags & EDGE_ABNORMAL)
> @@ -699,11 +744,13 @@
>        int dest;
>        tree src;
>        source_location locus;
> +      tree block;
>
>        src = VEC_pop (tree, g->const_copies);
>        dest = VEC_pop (int, g->const_dests);
>        locus = VEC_pop (source_location, g->copy_locus);
> -      insert_value_copy_on_edge (e, dest, src, locus);
> +      block = VEC_pop (tree, g->copy_block);
> +      insert_value_copy_on_edge (e, dest, src, locus, block);
>      }
>  }
>
> @@ -1088,8 +1135,12 @@
>
>                   /* copy location if present.  */
>                   if (gimple_phi_arg_has_location (phi, i))
> -                   gimple_set_location (stmt,
> -                                        gimple_phi_arg_location (phi, i));
> +                   {
> +                     gimple_set_location (stmt,
> +                                          gimple_phi_arg_location (phi, i));
> +                     gimple_set_block (stmt,
> +                                       gimple_phi_arg_block (phi, i));
> +                   }
>
>                   /* Insert the new statement into the block and update
>                      the PHI node.  */
> Index: gcc/tree-flow.h
> ===================================================================
> --- gcc/tree-flow.h     (revision 189246)
> +++ gcc/tree-flow.h     (working copy)
> @@ -506,7 +506,7 @@
>  extern void reserve_phi_args_for_new_edge (basic_block);
>  extern void add_phi_node_to_bb (gimple phi, basic_block bb);
>  extern gimple create_phi_node (tree, basic_block);
> -extern void add_phi_arg (gimple, tree, edge, source_location);
> +extern void add_phi_arg (gimple, tree, edge, source_location, tree);
>  extern void remove_phi_args (edge);
>  extern void remove_phi_node (gimple_stmt_iterator *, bool);
>  extern void remove_phi_nodes (basic_block);
> @@ -530,6 +530,7 @@
>    tree result;                 /* PHI result.  */
>    tree def;                    /* PHI arg definition.  */
>    source_location locus;        /* PHI arg location.  */
> +  tree block;                  /* PHI arg block.  */
>  };
>  typedef struct _edge_var_map edge_var_map;
>
> @@ -540,7 +541,7 @@
>  typedef VEC(edge_var_map, heap) *edge_var_map_vector;
>
>  extern void init_tree_ssa (struct function *);
> -extern void redirect_edge_var_map_add (edge, tree, tree, source_location);
> +extern void redirect_edge_var_map_add (edge, tree, tree,
> source_location, tree);
>  extern void redirect_edge_var_map_clear (edge);
>  extern void redirect_edge_var_map_dup (edge, edge);
>  extern edge_var_map_vector redirect_edge_var_map_vector (edge);
> Index: gcc/tree-switch-conversion.c
> ===================================================================
> --- gcc/tree-switch-conversion.c        (revision 189246)
> +++ gcc/tree-switch-conversion.c        (working copy)
> @@ -1189,8 +1189,10 @@
>         !gsi_end_p (gsi); gsi_next (&gsi), i++)
>      {
>        gimple phi = gsi_stmt (gsi);
> -      add_phi_arg (phi, info->target_inbound_names[i], e1f, UNKNOWN_LOCATION);
> -      add_phi_arg (phi, info->target_outbound_names[i], e2f, UNKNOWN_LOCATION);
> +      add_phi_arg (phi, info->target_inbound_names[i], e1f, UNKNOWN_LOCATION,
> +                  NULL);
> +      add_phi_arg (phi, info->target_outbound_names[i], e2f, UNKNOWN_LOCATION,
> +                  NULL);
>      }
>  }
>
> Index: gcc/tree-cfg.c
> ===================================================================
> --- gcc/tree-cfg.c      (revision 189246)
> +++ gcc/tree-cfg.c      (working copy)
> @@ -2554,7 +2554,8 @@
>
>        gcc_assert (result == gimple_phi_result (phi));
>
> -      add_phi_arg (phi, arg, new_edge, redirect_edge_var_map_location (vm));
> +      add_phi_arg (phi, arg, new_edge, redirect_edge_var_map_location (vm),
> +                  redirect_edge_var_map_block (vm));
>      }
>
>    redirect_edge_var_map_clear (old_edge);
> @@ -5014,7 +5015,7 @@
>        SSA_NAME_DEF_STMT (var) = new_phi;
>        gimple_phi_set_result (phi, make_ssa_name (SSA_NAME_VAR (var), phi));
>        add_phi_arg (new_phi, gimple_phi_result (phi), fallthru,
> -                  UNKNOWN_LOCATION);
> +                  UNKNOWN_LOCATION, NULL);
>      }
>
>    /* Add the arguments we have stored on edges.  */
> @@ -5475,7 +5476,8 @@
>        phi_copy = gsi_stmt (psi_copy);
>        def = PHI_ARG_DEF_FROM_EDGE (phi, e);
>        add_phi_arg (phi_copy, def, e_copy,
> -                  gimple_phi_arg_location_from_edge (phi, e));
> +                  gimple_phi_arg_location_from_edge (phi, e),
> +                  gimple_phi_arg_block_from_edge (phi, e));
>      }
>  }
>
> @@ -5850,7 +5852,8 @@
>           {
>             phi = gsi_stmt (psi);
>             def = PHI_ARG_DEF (phi, nexits[0]->dest_idx);
> -           add_phi_arg (phi, def, e, gimple_phi_arg_location_from_edge (phi, e));
> +           add_phi_arg (phi, def, e, gimple_phi_arg_location_from_edge (phi, e),
> +                        gimple_phi_arg_block_from_edge (phi, e));
>           }
>        }
>    e = redirect_edge_and_branch (nexits[1], nexits[0]->dest);
> @@ -7426,7 +7429,8 @@
>        phi1 = gsi_stmt (psi1);
>        phi2 = gsi_stmt (psi2);
>        def = PHI_ARG_DEF (phi2, e2->dest_idx);
> -      add_phi_arg (phi1, def, e, gimple_phi_arg_location_from_edge (phi2, e2));
> +      add_phi_arg (phi1, def, e, gimple_phi_arg_location_from_edge (phi2, e2),
> +                  gimple_phi_arg_block_from_edge (phi2, e2));
>      }
>  }

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

* [patch] Add block debug info to phi_arg_d
@ 2012-07-05  9:09 Dehao Chen
  2012-07-05  9:23 ` Richard Guenther
  0 siblings, 1 reply; 16+ messages in thread
From: Dehao Chen @ 2012-07-05  9:09 UTC (permalink / raw)
  To: gcc-patches; +Cc: Richard Guenther, Cary Coutant

Hi,

This patch added block field to phi_arg_d to make sure the associated
source locus is consistent with its block info.

Bootstrapped and passed gcc regression tests.

OK for trunk?

Thanks,
Dehao

http://codereview.appspot.com/6349075

gcc/ChangeLog

2012-07-05  Dehao Chen  <dehao@google.com>

	* tree.h (phi_arg_d): New field.
	* tree-flow-inline.h (gimple_phi_arg_block): New function.
	(gimple_phi_arg_block_from_edge): New function.
	(gimple_phi_arg_set_block): New function.
	(gimple_phi_arg_has_block): New function.
	(redirect_edge_var_map_block): New function.
	* tree-flow.h (_edge_var_map): New field.
	* tree-ssa-live.c (remove_unused_locals): Mark phi_arg's block
	as used.
	* tree-eh.c (cleanup_empty_eh_merge_phis): Add block debug info for
	redirect_edge_var_map_add.
	* tree-outof-ssa.c (_elim_graph): New field.
	(insert_partition_copy_on_edge): New parameter.
	(insert_value_copy_on_edge): New parameter.
	(insert_rtx_to_part_on_edge): New parameter.
	(insert_part_to_rtx_on_edge): New parameter.
	(elim_graph_add_edge): New parameter.
	(elim_graph_remove_succ_edge): New parameter.
	(FOR_EACH_ELIM_GRAPH_SUCC): New parameter.
	(FOR_EACH_ELIM_GRAPH_PRED): New parameter.
	(new_elim_graph): Add block debug info.
	(clear_elim_graph): Likewise.
	(delete_elim_graph): Likewise.
	(elim_graph_add_node): Likewise.
	(elim_graph_add_edge): Likewise.
	(elim_graph_remove_succ_edge): Likewise.
	(eliminate_build): Likewise.
	(elim_forward): Likewise.
	(elim_unvisited_predecessor): Likewise.
	(elim_backward): Likewise.
	(elim_create): Likewise.
	(eliminate_phi): Likewise.
	(insert_backedge_copies): Likewise.
	* tree-into-ssa.c (insert_phi_nodes_for): Add block debug info for
	add_phi_arg.
	(rewrite_add_phi_arguments): Likewise.
	* tree-ssa-loop-im.c (execute_sm_if_changed): Likewise.
	* tree-ssa-tail-merge.c (replace_block_by): Likewise.
	* tree-ssa-threadupdate.c (copy_phi_args): Likewise.
	* tree-loop-distribution.c (update_phis_for_loop_copy): Likewise.
	* tree-ssa-loop-manip.c (create_iv): Likewise.
	(add_exit_phis_edge): Likewise.
	(split_loop_exit_edge): Likewise.
	(copy_phi_node_args): Likewise.
	(tree_transform_and_unroll_loop): Likewise.
	* value-prof.c (gimple_ic): Likewise.
	(gimple_stringop_fixed_value): Likewise.
	* tree-tailcall.c (add_successor_phi_arg): Likewise.
	(eliminate_tail_call): Likewise.
	(create_tailcall_accumulator): Likewise.
	(tree_optimize_tail_calls_1): Likewise.
	* tree-phinodes.c (add_phi_arg): Likewise.
	(make_phi_node): Likewise.
	(resize_phi_node): Likewise.
	(remove_phi_arg_num): Likewise.
	* omp-low.c (expand_parallel_call): Likewise.
	(expand_omp_for_static_chunk): Likewise.
	* tree-vect-loop-manip.c (slpeel_update_phis_for_duplicate_loop):
	Likewise.
	(slpeel_update_phi_nodes_for_guard1): Likewise.
	(slpeel_update_phi_nodes_for_guard2): Likewise.
	(slpeel_tree_duplicate_loop_to_edge_cfg): Likewise.
	(set_prologue_iterations): Likewise.
	(slpeel_tree_peel_loop_to_edge): Likewise.
	(vect_loop_versioning): Likewise.
	* tree-parloops.c (create_phi_for_local_result): Likewise.
	(transform_to_exit_first_loop): Likewise.
	(create_parallel_loop): Likewise.
	* ipa-split.c (split_function): Likewise.
	* tree-vect-loop.c (get_initial_def_for_induction): Likewise.
	(vect_create_epilog_for_reduction): Likewise.
	* tree-vect-data-refs.c (vect_setup_realignment): Likewise.
	* graphite-scop-detection.c (canonicalize_loop_closed_ssa): Likewise.
	* tree-ssa-phiopt.c (cond_store_replacement): Likewise.
	(cond_if_else_store_replacement_1): Likewise.
	* tree-cfgcleanup.c (remove_forwarder_block): Likewise.
	(remove_forwarder_block_with_phi): Likewise.
	* tree-ssa-pre.c (insert_into_preds_of_block): Likewise.
	* tree-predcom.c (initialize_root_vars): Likewise.
	(initialize_root_vars_lm): Likewise.
	* sese.c (sese_add_exit_phis_edge): Likewise.
	* tree-ssa-dce.c (forward_edge_to_pdom): Likewise.
	* tree-ssa.c (flush_pending_stmts): Likewise.
	(redirect_edge_var_map_add): Likewise.
	(ssa_redirect_edge): Likewise.
	* gimple-streamer-in.c (input_phi): Likewise.
	* tree-vect-stmts.c (vectorizable_load): Likewise.
	* tree-inline.c (copy_phis_for_bb): Likewise.
	* tree-ssa-phiprop.c (phiprop_insert_phi): Likewise.
	* tree-switch-conversion.c (fix_phi_nodes): Likewise.
	* tree-cfg.c (reinstall_phi_args): Likewise.
	(gimple_make_forwarder_block): Likewise.
	(add_phi_args_after_copy_edge): Likewise.
	(gimple_duplicate_sese_tail): Likewise.

Index: gcc/tree-into-ssa.c
===================================================================
--- gcc/tree-into-ssa.c	(revision 189246)
+++ gcc/tree-into-ssa.c	(working copy)
@@ -1119,7 +1119,7 @@
 	     renamer will use the symbol on the LHS to get its
 	     reaching definition.  */
 	  FOR_EACH_EDGE (e, ei, bb->preds)
-	    add_phi_arg (phi, var, e, UNKNOWN_LOCATION);
+	    add_phi_arg (phi, var, e, UNKNOWN_LOCATION, NULL);
 	}
       else
 	{
@@ -1474,7 +1474,8 @@
 	  phi = gsi_stmt (gsi);
 	  currdef = get_reaching_def (SSA_NAME_VAR (gimple_phi_result (phi)));
 	  stmt = SSA_NAME_DEF_STMT (currdef);
-	  add_phi_arg (phi, currdef, e, gimple_location (stmt));
+	  add_phi_arg (phi, currdef, e, gimple_location (stmt),
+		       gimple_block (stmt));
 	}
     }
 }
Index: gcc/tree-ssa-loop-im.c
===================================================================
--- gcc/tree-ssa-loop-im.c	(revision 189246)
+++ gcc/tree-ssa-loop-im.c	(working copy)
@@ -2086,7 +2086,7 @@
 	  if (gimple_phi_arg_edge (phi, i)->src == new_bb)
 	    {
 	      tree arg = gimple_phi_arg_def (phi, i);
-	      add_phi_arg (phi, arg, then_old_edge, UNKNOWN_LOCATION);
+	      add_phi_arg (phi, arg, then_old_edge, UNKNOWN_LOCATION, NULL);
 	      update_stmt (phi);
 	    }
       }
Index: gcc/tree-ssa-tail-merge.c
===================================================================
--- gcc/tree-ssa-tail-merge.c	(revision 189246)
+++ gcc/tree-ssa-tail-merge.c	(working copy)
@@ -1458,7 +1458,7 @@
       bb2_phi = vop_phi (bb2);

       add_phi_arg (bb2_phi, SSA_NAME_VAR (gimple_phi_result (bb2_phi)),
-		   pred_edge, UNKNOWN_LOCATION);
+		   pred_edge, UNKNOWN_LOCATION, NULL);
     }

   bb2->frequency += bb1->frequency;
Index: gcc/tree-ssa-threadupdate.c
===================================================================
--- gcc/tree-ssa-threadupdate.c	(revision 189246)
+++ gcc/tree-ssa-threadupdate.c	(working copy)
@@ -316,7 +316,9 @@
     {
       gimple phi = gsi_stmt (gsi);
       source_location locus = gimple_phi_arg_location (phi, src_indx);
-      add_phi_arg (phi, gimple_phi_arg_def (phi, src_indx), tgt_e, locus);
+      tree block = gimple_phi_arg_block (phi, src_indx);
+      add_phi_arg (phi, gimple_phi_arg_def (phi, src_indx), tgt_e, locus,
+		   block);
     }
 }

Index: gcc/tree-loop-distribution.c
===================================================================
--- gcc/tree-loop-distribution.c	(revision 189246)
+++ gcc/tree-loop-distribution.c	(working copy)
@@ -171,6 +171,7 @@
     {
       tree def;
       source_location locus;
+      tree block;
       gimple phi_new = gsi_stmt (si_new);
       gimple phi_orig = gsi_stmt (si_orig);

@@ -178,12 +179,14 @@
 	 associated with the entry of NEW_LOOP)  */
       def = PHI_ARG_DEF_FROM_EDGE (phi_orig, orig_entry_e);
       locus = gimple_phi_arg_location_from_edge (phi_orig, orig_entry_e);
-      add_phi_arg (phi_new, def, new_loop_entry_e, locus);
+      block = gimple_phi_arg_block_from_edge (phi_orig, orig_entry_e);
+      add_phi_arg (phi_new, def, new_loop_entry_e, locus, block);

       /* Add the second phi argument for the phi in NEW_LOOP (the one
 	 associated with the latch of NEW_LOOP)  */
       def = PHI_ARG_DEF_FROM_EDGE (phi_orig, orig_loop_latch);
       locus = gimple_phi_arg_location_from_edge (phi_orig, orig_loop_latch);
+      block = gimple_phi_arg_block_from_edge (phi_orig, orig_loop_latch);

       if (TREE_CODE (def) == SSA_NAME)
 	{
@@ -198,7 +201,8 @@
 	/* Could be an integer.  */
 	new_ssa_name = def;

-      add_phi_arg (phi_new, new_ssa_name, loop_latch_edge (new_loop), locus);
+      add_phi_arg (phi_new, new_ssa_name, loop_latch_edge (new_loop), locus,
+		   block);
     }
 }

Index: gcc/tree-ssa-loop-manip.c
===================================================================
--- gcc/tree-ssa-loop-manip.c	(revision 189246)
+++ gcc/tree-ssa-loop-manip.c	(working copy)
@@ -121,8 +121,9 @@

   stmt = create_phi_node (vb, loop->header);
   SSA_NAME_DEF_STMT (vb) = stmt;
-  add_phi_arg (stmt, initial, loop_preheader_edge (loop), UNKNOWN_LOCATION);
-  add_phi_arg (stmt, va, loop_latch_edge (loop), UNKNOWN_LOCATION);
+  add_phi_arg (stmt, initial, loop_preheader_edge (loop), UNKNOWN_LOCATION,
+	       NULL);
+  add_phi_arg (stmt, va, loop_latch_edge (loop), UNKNOWN_LOCATION, NULL);
 }

 /* Add exit phis for the USE on EXIT.  */
@@ -152,7 +153,7 @@
   create_new_def_for (gimple_phi_result (phi), phi,
 		      gimple_phi_result_ptr (phi));
   FOR_EACH_EDGE (e, ei, exit->preds)
-    add_phi_arg (phi, use, e, UNKNOWN_LOCATION);
+    add_phi_arg (phi, use, e, UNKNOWN_LOCATION, NULL);
 }

 /* Add exit phis for VAR that is used in LIVEIN.
@@ -485,12 +486,14 @@
   use_operand_p op_p;
   gimple_stmt_iterator psi;
   source_location locus;
+  tree block;

   for (psi = gsi_start_phis (dest); !gsi_end_p (psi); gsi_next (&psi))
     {
       phi = gsi_stmt (psi);
       op_p = PHI_ARG_DEF_PTR_FROM_EDGE (phi, single_succ_edge (bb));
       locus = gimple_phi_arg_location_from_edge (phi, single_succ_edge (bb));
+      block = gimple_phi_arg_block_from_edge (phi, single_succ_edge (bb));

       name = USE_FROM_PTR (op_p);

@@ -504,7 +507,7 @@
       new_name = duplicate_ssa_name (name, NULL);
       new_phi = create_phi_node (new_name, bb);
       SSA_NAME_DEF_STMT (new_name) = new_phi;
-      add_phi_arg (new_phi, name, exit, locus);
+      add_phi_arg (new_phi, name, exit, locus, block);
       SET_USE (op_p, new_name);
     }

@@ -1024,8 +1027,8 @@
       phi_rest = create_phi_node (new_init, rest);
       SSA_NAME_DEF_STMT (new_init) = phi_rest;

-      add_phi_arg (phi_rest, init, precond_edge, UNKNOWN_LOCATION);
-      add_phi_arg (phi_rest, next, new_exit, UNKNOWN_LOCATION);
+      add_phi_arg (phi_rest, init, precond_edge, UNKNOWN_LOCATION, NULL);
+      add_phi_arg (phi_rest, next, new_exit, UNKNOWN_LOCATION, NULL);
       SET_USE (op, new_init);
     }

Index: gcc/value-prof.c
===================================================================
--- gcc/value-prof.c	(revision 189246)
+++ gcc/value-prof.c	(working copy)
@@ -1245,10 +1245,12 @@
       SSA_NAME_DEF_STMT (result) = phi;
       gimple_call_set_lhs (icall_stmt,
 			   make_ssa_name (SSA_NAME_VAR (result), icall_stmt));
-      add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
+      add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION,
+		   NULL);
       gimple_call_set_lhs (dcall_stmt,
 			   make_ssa_name (SSA_NAME_VAR (result), dcall_stmt));
-      add_phi_arg (phi, gimple_call_lhs (dcall_stmt), e_dj, UNKNOWN_LOCATION);
+      add_phi_arg (phi, gimple_call_lhs (dcall_stmt), e_dj, UNKNOWN_LOCATION,
+		   NULL);
     }

   /* Build an EH edge for the direct call if necessary.  */
@@ -1476,10 +1478,12 @@
       SSA_NAME_DEF_STMT (result) = phi;
       gimple_call_set_lhs (vcall_stmt,
 			   make_ssa_name (SSA_NAME_VAR (result), vcall_stmt));
-      add_phi_arg (phi, gimple_call_lhs (vcall_stmt), e_vj, UNKNOWN_LOCATION);
+      add_phi_arg (phi, gimple_call_lhs (vcall_stmt), e_vj, UNKNOWN_LOCATION,
+		   NULL);
       gimple_call_set_lhs (icall_stmt,
 			   make_ssa_name (SSA_NAME_VAR (result), icall_stmt));
-      add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
+      add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION,
+		   NULL);
     }

   /* Because these are all string op builtins, they're all nothrow.  */
Index: gcc/tree-tailcall.c
===================================================================
--- gcc/tree-tailcall.c	(revision 189246)
+++ gcc/tree-tailcall.c	(working copy)
@@ -597,7 +597,7 @@
       break;

   gcc_assert (!gsi_end_p (gsi));
-  add_phi_arg (gsi_stmt (gsi), phi_arg, e, UNKNOWN_LOCATION);
+  add_phi_arg (gsi_stmt (gsi), phi_arg, e, UNKNOWN_LOCATION, NULL);
 }

 /* Creates a GIMPLE statement which computes the operation specified by
@@ -853,7 +853,7 @@
       phi = gsi_stmt (gsi);
       gcc_assert (param == SSA_NAME_VAR (PHI_RESULT (phi)));

-      add_phi_arg (phi, arg, e, gimple_location (stmt));
+      add_phi_arg (phi, arg, e, gimple_location (stmt), gimple_block (stmt));
       gsi_next (&gsi);
     }

@@ -948,7 +948,7 @@
   phi = create_phi_node (tmp, bb);
   /* RET_TYPE can be a float when -ffast-maths is enabled.  */
   add_phi_arg (phi, fold_convert (ret_type, init), single_pred_edge (bb),
-	       UNKNOWN_LOCATION);
+	       UNKNOWN_LOCATION, NULL);
   return PHI_RESULT (phi);
 }

@@ -1012,7 +1012,7 @@
 		phi = create_phi_node (name, first);
 		SSA_NAME_DEF_STMT (name) = phi;
 		add_phi_arg (phi, new_name, single_pred_edge (first),
-			     EXPR_LOCATION (param));
+			     EXPR_LOCATION (param), NULL);
 	      }
 	  phis_constructed = true;
 	}
Index: gcc/tree.h
===================================================================
--- gcc/tree.h	(revision 189246)
+++ gcc/tree.h	(working copy)
@@ -2036,6 +2036,7 @@
   struct ssa_use_operand_d imm_use;
   tree def;
   location_t locus;
+  tree block;
 };

 \f
Index: gcc/tree-phinodes.c
===================================================================
--- gcc/tree-phinodes.c	(revision 189246)
+++ gcc/tree-phinodes.c	(working copy)
@@ -205,6 +205,7 @@
       use_operand_p  imm;

       gimple_phi_arg_set_location (phi, i, UNKNOWN_LOCATION);
+      gimple_phi_arg_set_block (phi, i ,NULL);
       imm = gimple_phi_arg_imm_use_ptr (phi, i);
       imm->use = gimple_phi_arg_def_ptr (phi, i);
       imm->prev = NULL;
@@ -275,6 +276,7 @@
       use_operand_p imm;

       gimple_phi_arg_set_location (new_phi, i, UNKNOWN_LOCATION);
+      gimple_phi_arg_set_block (new_phi, i, NULL);
       imm = gimple_phi_arg_imm_use_ptr (new_phi, i);
       imm->use = gimple_phi_arg_def_ptr (new_phi, i);
       imm->prev = NULL;
@@ -362,7 +364,7 @@
    PHI points to the reallocated phi node when we return.  */

 void
-add_phi_arg (gimple phi, tree def, edge e, source_location locus)
+add_phi_arg (gimple phi, tree def, edge e, source_location locus, tree block)
 {
   basic_block bb = e->dest;

@@ -386,6 +388,7 @@

   SET_PHI_ARG_DEF (phi, e->dest_idx, def);
   gimple_phi_arg_set_location (phi, e->dest_idx, locus);
+  gimple_phi_arg_set_block (phi, e->dest_idx, block);
 }


@@ -417,6 +420,8 @@
       /* Move the location as well.  */
       gimple_phi_arg_set_location (phi, i,
 				   gimple_phi_arg_location (phi, num_elem - 1));
+      gimple_phi_arg_set_block (phi, i,
+				gimple_phi_arg_block (phi, num_elem - 1));
     }

   /* Shrink the vector and return.  Note that we do not have to clear
Index: gcc/omp-low.c
===================================================================
--- gcc/omp-low.c	(revision 189246)
+++ gcc/omp-low.c	(working copy)
@@ -3061,8 +3061,8 @@
 	    {
 	      gimple phi = create_phi_node (tmp_join, bb);
 	      SSA_NAME_DEF_STMT (tmp_join) = phi;
-	      add_phi_arg (phi, tmp_then, e_then, UNKNOWN_LOCATION);
-	      add_phi_arg (phi, tmp_else, e_else, UNKNOWN_LOCATION);
+	      add_phi_arg (phi, tmp_then, e_then, UNKNOWN_LOCATION, NULL);
+	      add_phi_arg (phi, tmp_else, e_else, UNKNOWN_LOCATION, NULL);
 	    }

 	  val = tmp_join;
@@ -4597,6 +4597,7 @@
 	{
 	  gimple nphi;
 	  source_location locus;
+	  tree block;

 	  phi = gsi_stmt (psi);
 	  t = gimple_phi_result (phi);
@@ -4606,14 +4607,16 @@

 	  t = PHI_ARG_DEF_FROM_EDGE (phi, se);
 	  locus = gimple_phi_arg_location_from_edge (phi, se);
+	  block = gimple_phi_arg_block_from_edge (phi, se);

 	  /* A special case -- fd->loop.v is not yet computed in
 	     iter_part_bb, we need to use v_extra instead.  */
 	  if (t == fd->loop.v)
 	    t = v_extra;
-	  add_phi_arg (nphi, t, ene, locus);
+	  add_phi_arg (nphi, t, ene, locus, block);
 	  locus = redirect_edge_var_map_location (vm);
-	  add_phi_arg (nphi, redirect_edge_var_map_def (vm), re, locus);
+	  block = redirect_edge_var_map_block (vm);
+	  add_phi_arg (nphi, redirect_edge_var_map_def (vm), re, locus, block);
 	}
       gcc_assert (!gsi_end_p (psi) && i == VEC_length (edge_var_map, head));
       redirect_edge_var_map_clear (re);
@@ -4629,9 +4632,9 @@
       phi = create_phi_node (trip_main, iter_part_bb);
       SSA_NAME_DEF_STMT (trip_main) = phi;
       add_phi_arg (phi, trip_back, single_succ_edge (trip_update_bb),
-		   UNKNOWN_LOCATION);
+		   UNKNOWN_LOCATION, NULL);
       add_phi_arg (phi, trip_init, single_succ_edge (entry_bb),
-		   UNKNOWN_LOCATION);
+		   UNKNOWN_LOCATION, NULL);
     }

   set_immediate_dominator (CDI_DOMINATORS, trip_update_bb, cont_bb);
Index: gcc/tree-vect-loop-manip.c
===================================================================
--- gcc/tree-vect-loop-manip.c	(revision 189246)
+++ gcc/tree-vect-loop-manip.c	(working copy)
@@ -294,13 +294,15 @@
        gsi_next (&gsi_new), gsi_next (&gsi_orig))
     {
       source_location locus;
+      tree block;
       phi_new = gsi_stmt (gsi_new);
       phi_orig = gsi_stmt (gsi_orig);

       /* step 1.  */
       def = PHI_ARG_DEF_FROM_EDGE (phi_orig, entry_arg_e);
       locus = gimple_phi_arg_location_from_edge (phi_orig, entry_arg_e);
-      add_phi_arg (phi_new, def, new_loop_entry_e, locus);
+      block = gimple_phi_arg_block_from_edge (phi_orig, entry_arg_e);
+      add_phi_arg (phi_new, def, new_loop_entry_e, locus, block);

       /* step 2.  */
       def = PHI_ARG_DEF_FROM_EDGE (phi_orig, orig_loop_latch);
@@ -317,7 +319,8 @@
 	}

       /* An ordinary ssa name defined in the loop.  */
-      add_phi_arg (phi_new, new_ssa_name, loop_latch_edge (new_loop), locus);
+      add_phi_arg (phi_new, new_ssa_name, loop_latch_edge (new_loop), locus,
+		   block);

       /* Drop any debug references outside the loop, if they would
 	 become ill-formed SSA.  */
@@ -512,6 +515,7 @@
        gsi_next (&gsi_orig), gsi_next (&gsi_update))
     {
       source_location loop_locus, guard_locus;
+      tree loop_block, guard_block;
       orig_phi = gsi_stmt (gsi_orig);
       update_phi = gsi_stmt (gsi_update);

@@ -527,13 +531,19 @@
       loop_locus = gimple_phi_arg_location_from_edge (orig_phi,
 						      EDGE_SUCC (loop->latch,
 								 0));
+      loop_block = gimple_phi_arg_block_from_edge (orig_phi,
+						   EDGE_SUCC (loop->latch,
+							      0));
+
       guard_arg = PHI_ARG_DEF_FROM_EDGE (orig_phi, loop_preheader_edge (loop));
       guard_locus
 	= gimple_phi_arg_location_from_edge (orig_phi,
 					     loop_preheader_edge (loop));
+      guard_block = gimple_phi_arg_block_from_edge (orig_phi,
+						    loop_preheader_edge (loop));

-      add_phi_arg (new_phi, loop_arg, new_exit_e, loop_locus);
-      add_phi_arg (new_phi, guard_arg, guard_edge, guard_locus);
+      add_phi_arg (new_phi, loop_arg, new_exit_e, loop_locus, loop_block);
+      add_phi_arg (new_phi, guard_arg, guard_edge, guard_locus, guard_block);

       /* 1.3. Update phi in successor block.  */
       gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi, e) == loop_arg
@@ -552,7 +562,7 @@
                                  *new_exit_bb);

       /* 2.2. NEW_EXIT_BB has one incoming edge: the exit-edge of the loop.  */
-      add_phi_arg (new_phi, loop_arg, single_exit (loop), loop_locus);
+      add_phi_arg (new_phi, loop_arg, single_exit (loop), loop_locus,
loop_block);

       /* 2.3. Update phi in successor of NEW_EXIT_BB:  */
       gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi2, new_exit_e) == loop_arg);
@@ -680,8 +690,8 @@
       if (new_name2)
         guard_arg = new_name2;

-      add_phi_arg (new_phi, loop_arg, new_exit_e, UNKNOWN_LOCATION);
-      add_phi_arg (new_phi, guard_arg, guard_edge, UNKNOWN_LOCATION);
+      add_phi_arg (new_phi, loop_arg, new_exit_e, UNKNOWN_LOCATION, NULL);
+      add_phi_arg (new_phi, guard_arg, guard_edge, UNKNOWN_LOCATION, NULL);

       /* 1.3. Update phi in successor block.  */
       gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi, e) == orig_def);
@@ -696,7 +706,8 @@
                                  *new_exit_bb);

       /* 2.2. NEW_EXIT_BB has one incoming edge: the exit-edge of the loop.  */
-      add_phi_arg (new_phi, loop_arg, single_exit (loop), UNKNOWN_LOCATION);
+      add_phi_arg (new_phi, loop_arg, single_exit (loop), UNKNOWN_LOCATION,
+		   NULL);

       /* 2.3. Update phi in successor of NEW_EXIT_BB:  */
       gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi2, new_exit_e) == loop_arg);
@@ -733,7 +744,7 @@
       /* 3.3. GUARD_BB has one incoming edge:  */
       gcc_assert (EDGE_COUNT (guard_edge->src->preds) == 1);
       add_phi_arg (new_phi, arg, EDGE_PRED (guard_edge->src, 0),
-		   UNKNOWN_LOCATION);
+		   UNKNOWN_LOCATION, NULL);

       /* 3.4. Update phi in successor of GUARD_BB:  */
       gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi2, guard_edge)
@@ -859,14 +870,16 @@
 	{
 	  edge new_loop_exit_edge;
 	  source_location locus;
+	  tree block;

 	  locus = gimple_phi_arg_location_from_edge (phi, single_exit (loop));
+	  block = gimple_phi_arg_block_from_edge (phi, single_exit (loop));
 	  if (EDGE_SUCC (new_loop->header, 0)->dest == new_loop->latch)
 	    new_loop_exit_edge = EDGE_SUCC (new_loop->header, 1);
 	  else
 	    new_loop_exit_edge = EDGE_SUCC (new_loop->header, 0);

-	  add_phi_arg (phi, phi_arg, new_loop_exit_edge, locus);
+	  add_phi_arg (phi, phi_arg, new_loop_exit_edge, locus, block);
 	}
     }

@@ -905,7 +918,8 @@
 	  phi_arg = PHI_ARG_DEF_FROM_EDGE (phi, entry_e);
 	  if (phi_arg)
 	    add_phi_arg (phi, phi_arg, new_exit_e,
-			 gimple_phi_arg_location_from_edge (phi, entry_e));
+			 gimple_phi_arg_location_from_edge (phi, entry_e),
+			 gimple_phi_arg_block_from_edge (phi, entry_e));
 	}

       redirect_edge_and_branch_force (entry_e, new_loop->header);
@@ -1089,8 +1103,8 @@

   newphi = create_phi_node (var, bb_before_first_loop);
   add_phi_arg (newphi, prologue_after_cost_adjust_name, e_fallthru,
-	       UNKNOWN_LOCATION);
-  add_phi_arg (newphi, *first_niters, e_false, UNKNOWN_LOCATION);
+	       UNKNOWN_LOCATION, NULL);
+  add_phi_arg (newphi, *first_niters, e_false, UNKNOWN_LOCATION, NULL);

   *first_niters = PHI_RESULT (newphi);
 }
@@ -1193,7 +1207,7 @@
 					  new_phi);
 	    use_operand_p use_p;

-	    add_phi_arg (new_phi, vop, exit_e, UNKNOWN_LOCATION);
+	    add_phi_arg (new_phi, vop, exit_e, UNKNOWN_LOCATION, NULL);
 	    gimple_phi_set_result (new_phi, new_vop);
 	    FOR_EACH_IMM_USE_STMT (stmt, imm_iter, vop)
 	      if (stmt != new_phi && gimple_bb (stmt) != loop->header)
@@ -2551,7 +2565,8 @@
 				  new_exit_bb);
       arg = PHI_ARG_DEF_FROM_EDGE (orig_phi, e);
       add_phi_arg (new_phi, arg, new_exit_e,
-		   gimple_phi_arg_location_from_edge (orig_phi, e));
+		   gimple_phi_arg_location_from_edge (orig_phi, e),
+ 		   gimple_phi_arg_block_from_edge (orig_phi, e));
       adjust_phi_and_debug_stmts (orig_phi, e, PHI_RESULT (new_phi));
     }

Index: gcc/tree-parloops.c
===================================================================
--- gcc/tree-parloops.c	(revision 189246)
+++ gcc/tree-parloops.c	(working copy)
@@ -998,6 +998,7 @@
   basic_block store_bb;
   tree local_res;
   source_location locus;
+  tree block;

   /* STORE_BB is the block where the phi
      should be stored.  It is the destination of the loop exit.
@@ -1017,11 +1018,12 @@
     = make_ssa_name (SSA_NAME_VAR (gimple_assign_lhs (reduc->reduc_stmt)),
 		     NULL);
   locus = gimple_location (reduc->reduc_stmt);
+  block = gimple_block (reduc->reduc_stmt);
   new_phi = create_phi_node (local_res, store_bb);
   SSA_NAME_DEF_STMT (local_res) = new_phi;
-  add_phi_arg (new_phi, reduc->init, e, locus);
+  add_phi_arg (new_phi, reduc->init, e, locus, block);
   add_phi_arg (new_phi, gimple_assign_lhs (reduc->reduc_stmt),
-	       FALLTHRU_EDGE (loop->latch), locus);
+	       FALLTHRU_EDGE (loop->latch), locus, block);
   reduc->new_phi = new_phi;

   return 1;
@@ -1500,7 +1502,7 @@
       SET_PHI_RESULT (phi, t);
       nphi = create_phi_node (res, orig_header);
       SSA_NAME_DEF_STMT (res) = nphi;
-      add_phi_arg (nphi, t, hpred, UNKNOWN_LOCATION);
+      add_phi_arg (nphi, t, hpred, UNKNOWN_LOCATION, NULL);

       if (res == control)
 	{
@@ -1656,6 +1658,7 @@
   for (gsi = gsi_start_phis (ex_bb); !gsi_end_p (gsi); gsi_next (&gsi))
     {
       source_location locus;
+      tree block;
       tree def;
       phi = gsi_stmt (gsi);
       stmt = SSA_NAME_DEF_STMT (PHI_ARG_DEF_FROM_EDGE (phi, exit));
@@ -1663,11 +1666,14 @@
       def = PHI_ARG_DEF_FROM_EDGE (stmt, loop_preheader_edge (loop));
       locus = gimple_phi_arg_location_from_edge (stmt,
 						 loop_preheader_edge (loop));
-      add_phi_arg (phi, def, guard, locus);
+      block = gimple_phi_arg_block_from_edge (stmt,
+					      loop_preheader_edge (loop));
+      add_phi_arg (phi, def, guard, locus, block);

       def = PHI_ARG_DEF_FROM_EDGE (stmt, loop_latch_edge (loop));
       locus = gimple_phi_arg_location_from_edge (stmt, loop_latch_edge (loop));
-      add_phi_arg (phi, def, end, locus);
+      block = gimple_phi_arg_block_from_edge (stmt, loop_latch_edge (loop));
+      add_phi_arg (phi, def, end, locus, block);
     }
   e = redirect_edge_and_branch (exit, nexit->dest);
   PENDING_STMT (e) = NULL;
Index: gcc/tree-eh.c
===================================================================
--- gcc/tree-eh.c	(revision 189246)
+++ gcc/tree-eh.c	(working copy)
@@ -3853,13 +3853,15 @@
 	  FOR_EACH_EDGE (e, ei, old_bb->preds)
 	    {
 	      location_t oloc;
+	      tree oblock;
 	      tree oop;

 	      if ((e->flags & EDGE_EH) == 0)
 		continue;
 	      oop = gimple_phi_arg_def (ophi, e->dest_idx);
 	      oloc = gimple_phi_arg_location (ophi, e->dest_idx);
-	      redirect_edge_var_map_add (e, nresult, oop, oloc);
+	      oblock = gimple_phi_arg_block (ophi, e->dest_idx);
+	      redirect_edge_var_map_add (e, nresult, oop, oloc, oblock);
 	    }
 	}
       /* If we didn't find the PHI, but it's a VOP, remember to rename
@@ -3874,8 +3876,9 @@
 	{
 	  location_t nloc
 	    = gimple_phi_arg_location (nphi, old_bb_out->dest_idx);
+	  tree nblock = gimple_phi_arg_block (nphi, old_bb_out->dest_idx);
 	  FOR_EACH_EDGE (e, ei, old_bb->preds)
-	    redirect_edge_var_map_add (e, nresult, nop, nloc);
+	    redirect_edge_var_map_add (e, nresult, nop, nloc, nblock);
 	}
     }

Index: gcc/ipa-split.c
===================================================================
--- gcc/ipa-split.c	(revision 189246)
+++ gcc/ipa-split.c	(working copy)
@@ -1286,7 +1286,8 @@
 		  /* When there is PHI, just update its value.  */
 		  if (TREE_CODE (retval) == SSA_NAME
 		      && !gsi_end_p (psi))
-		    add_phi_arg (gsi_stmt (psi), retval, e, UNKNOWN_LOCATION);
+		    add_phi_arg (gsi_stmt (psi), retval, e, UNKNOWN_LOCATION,
+				 NULL);
 		  /* Otherwise update the return BB itself.
 		     find_return_bb allows at most one assignment to return value,
 		     so update first statement.  */
Index: gcc/tree-vect-loop.c
===================================================================
--- gcc/tree-vect-loop.c	(revision 189246)
+++ gcc/tree-vect-loop.c	(working copy)
@@ -3131,9 +3131,9 @@
                                                    NULL));

   /* Set the arguments of the phi node:  */
-  add_phi_arg (induction_phi, vec_init, pe, UNKNOWN_LOCATION);
+  add_phi_arg (induction_phi, vec_init, pe, UNKNOWN_LOCATION, NULL);
   add_phi_arg (induction_phi, vec_def, loop_latch_edge (iv_loop),
-	       UNKNOWN_LOCATION);
+	       UNKNOWN_LOCATION, NULL);


   /* In case that vectorization factor (VF) is bigger than the number
@@ -3617,13 +3617,13 @@
         {
           /* Set the loop-entry arg of the reduction-phi.  */
           add_phi_arg (phi, vec_init_def, loop_preheader_edge (loop),
-                       UNKNOWN_LOCATION);
+                       UNKNOWN_LOCATION, NULL);

           /* Set the loop-latch arg for the reduction-phi.  */
           if (j > 0)
             def = vect_get_vec_def_for_stmt_copy (vect_unknown_def_type, def);

-          add_phi_arg (phi, def, loop_latch_edge (loop), UNKNOWN_LOCATION);
+          add_phi_arg (phi, def, loop_latch_edge (loop),
UNKNOWN_LOCATION, NULL);

           if (vect_print_dump_info (REPORT_DETAILS))
             {
@@ -4241,9 +4241,10 @@
                   /* Update phi node arguments with vs0 and vs2.  */
                   add_phi_arg (vect_phi, vect_phi_init,
                                loop_preheader_edge (outer_loop),
-                               UNKNOWN_LOCATION);
+                               UNKNOWN_LOCATION, NULL);
                   add_phi_arg (vect_phi, PHI_RESULT (inner_phi),
-                               loop_latch_edge (outer_loop), UNKNOWN_LOCATION);
+                               loop_latch_edge (outer_loop), UNKNOWN_LOCATION,
+			       NULL);
                   if (vect_print_dump_info (REPORT_DETAILS))
                     {
                       fprintf (vect_dump, "created double reduction phi "
Index: gcc/tree-flow-inline.h
===================================================================
--- gcc/tree-flow-inline.h	(revision 189246)
+++ gcc/tree-flow-inline.h	(working copy)
@@ -483,6 +483,22 @@
   return gimple_phi_arg (gs, e->dest_idx)->locus;
 }

+/* Return the block location of gimple argument I of phi node GS.  */
+
+static inline tree
+gimple_phi_arg_block (gimple gs, size_t i)
+{
+  return gimple_phi_arg (gs, i)->block;
+}
+
+/* Return the block location of the argument on edge E of phi node GS.  */
+
+static inline tree
+gimple_phi_arg_block_from_edge (gimple gs, edge e)
+{
+  return gimple_phi_arg (gs, e->dest_idx)->block;
+}
+
 /* Set the source location of gimple argument I of phi node GS to LOC.  */

 static inline void
@@ -491,6 +507,14 @@
   gimple_phi_arg (gs, i)->locus = loc;
 }

+/* Set the block location of gimple argument I of phi node GS to BLOCK.  */
+
+static inline void
+gimple_phi_arg_set_block (gimple gs, size_t i, tree block)
+{
+  gimple_phi_arg (gs, i)->block = block;
+}
+
 /* Return TRUE if argument I of phi node GS has a location record.  */

 static inline bool
@@ -499,6 +523,13 @@
   return gimple_phi_arg_location (gs, i) != UNKNOWN_LOCATION;
 }

+/* Return TRUE if argument I of phi node GS has a location record.  */
+
+static inline bool
+gimple_phi_arg_has_block (gimple gs, size_t i)
+{
+  return gimple_phi_arg_block (gs, i) != NULL;
+}

 /* Return the PHI nodes for basic block BB, or NULL if there are no
    PHI nodes.  */
@@ -1217,6 +1248,13 @@
   return v->locus;
 }

+/* Given an edge_var_map V, return the PHI arg location.  */
+
+static inline tree
+redirect_edge_var_map_block (edge_var_map *v)
+{
+  return v->block;
+}

 /* Return an SSA_NAME node for variable VAR defined in statement STMT
    in function cfun.  */
Index: gcc/tree-vect-data-refs.c
===================================================================
--- gcc/tree-vect-data-refs.c	(revision 189246)
+++ gcc/tree-vect-data-refs.c	(working copy)
@@ -4407,7 +4407,7 @@
   msq = make_ssa_name (vec_dest, NULL);
   phi_stmt = create_phi_node (msq, containing_loop->header);
   SSA_NAME_DEF_STMT (msq) = phi_stmt;
-  add_phi_arg (phi_stmt, msq_init, pe, UNKNOWN_LOCATION);
+  add_phi_arg (phi_stmt, msq_init, pe, UNKNOWN_LOCATION, NULL);

   return msq;
 }
Index: gcc/graphite-scop-detection.c
===================================================================
--- gcc/graphite-scop-detection.c	(revision 189246)
+++ gcc/graphite-scop-detection.c	(working copy)
@@ -1331,7 +1331,7 @@
 					  gimple_phi_result_ptr (close_phi));
 		add_phi_arg (close_phi, arg,
 			     gimple_phi_arg_edge (close_phi, 0),
-			     UNKNOWN_LOCATION);
+			     UNKNOWN_LOCATION, NULL);
 		use_p = gimple_phi_arg_imm_use_ptr (phi, i);
 		replace_exp (use_p, res);
 		update_stmt (phi);
Index: gcc/tree-ssa-phiopt.c
===================================================================
--- gcc/tree-ssa-phiopt.c	(revision 189246)
+++ gcc/tree-ssa-phiopt.c	(working copy)
@@ -1454,6 +1454,7 @@
   gimple newphi, new_stmt;
   gimple_stmt_iterator gsi;
   source_location locus;
+  tree block;

   /* Check if middle_bb contains of only one store.  */
   if (!assign
@@ -1461,6 +1462,7 @@
     return false;

   locus = gimple_location (assign);
+  block = gimple_block (assign);
   lhs = gimple_assign_lhs (assign);
   rhs = gimple_assign_rhs1 (assign);
   if (TREE_CODE (lhs) != MEM_REF
@@ -1494,14 +1496,15 @@
   name = make_ssa_name (condstoretemp, new_stmt);
   gimple_assign_set_lhs (new_stmt, name);
   gimple_set_location (new_stmt, locus);
+  gimple_set_block (new_stmt, block);
   gsi_insert_on_edge (e1, new_stmt);

   /* 4) Create a PHI node at the join block, with one argument
         holding the old RHS, and the other holding the temporary
         where we stored the old memory contents.  */
   newphi = create_phi_node (condstoretemp, join_bb);
-  add_phi_arg (newphi, rhs, e0, locus);
-  add_phi_arg (newphi, name, e1, locus);
+  add_phi_arg (newphi, rhs, e0, locus, block);
+  add_phi_arg (newphi, name, e1, locus, block);

   lhs = unshare_expr (lhs);
   new_stmt = gimple_build_assign (lhs, PHI_RESULT (newphi));
@@ -1528,6 +1531,7 @@
 {
   tree lhs_base, lhs, then_rhs, else_rhs;
   source_location then_locus, else_locus;
+  tree then_block, else_block;
   gimple_stmt_iterator gsi;
   gimple newphi, new_stmt;

@@ -1553,6 +1557,8 @@
   else_rhs = gimple_assign_rhs1 (else_assign);
   then_locus = gimple_location (then_assign);
   else_locus = gimple_location (else_assign);
+  then_block = gimple_block (then_assign);
+  else_block = gimple_block (else_assign);

   /* Now we've checked the constraints, so do the transformation:
      1) Remove the stores.  */
@@ -1576,8 +1582,10 @@
 	holding the old RHS, and the other holding the temporary
 	where we stored the old memory contents.  */
   newphi = create_phi_node (condstoretemp, join_bb);
-  add_phi_arg (newphi, then_rhs, EDGE_SUCC (then_bb, 0), then_locus);
-  add_phi_arg (newphi, else_rhs, EDGE_SUCC (else_bb, 0), else_locus);
+  add_phi_arg (newphi, then_rhs, EDGE_SUCC (then_bb, 0), then_locus,
+	       then_block);
+  add_phi_arg (newphi, else_rhs, EDGE_SUCC (else_bb, 0), else_locus,
+	       else_block);

   new_stmt = gimple_build_assign (lhs, PHI_RESULT (newphi));

Index: gcc/tree-cfgcleanup.c
===================================================================
--- gcc/tree-cfgcleanup.c	(revision 189246)
+++ gcc/tree-cfgcleanup.c	(working copy)
@@ -444,7 +444,9 @@
 	    {
 	      gimple phi = gsi_stmt (gsi);
 	      source_location l = gimple_phi_arg_location_from_edge (phi, succ);
-	      add_phi_arg (phi, gimple_phi_arg_def (phi, succ->dest_idx), s, l);
+	      tree b = gimple_phi_arg_block_from_edge (phi, succ);
+	      add_phi_arg (phi, gimple_phi_arg_def (phi, succ->dest_idx), s, l,
+			   b);
 	    }
 	}
     }
@@ -871,6 +873,7 @@
 	  gimple phi = gsi_stmt (gsi);
 	  tree def = gimple_phi_arg_def (phi, succ->dest_idx);
 	  source_location locus = gimple_phi_arg_location_from_edge (phi, succ);
+	  tree block = gimple_phi_arg_block_from_edge (phi, succ);

 	  if (TREE_CODE (def) == SSA_NAME)
 	    {
@@ -891,12 +894,13 @@
 		    {
 		      def = new_arg;
 		      locus = redirect_edge_var_map_location (vm);
+		      block = redirect_edge_var_map_block (vm);
 		      break;
 		    }
 		}
 	    }

-	  add_phi_arg (phi, def, s, locus);
+	  add_phi_arg (phi, def, s, locus, block);
 	}

       redirect_edge_var_map_clear (e);
Index: gcc/tree-ssa-pre.c
===================================================================
--- gcc/tree-ssa-pre.c	(revision 189246)
+++ gcc/tree-ssa-pre.c	(working copy)
@@ -3403,10 +3403,10 @@
       gcc_assert (get_expr_type (ae) == type
 		  || useless_type_conversion_p (type, get_expr_type (ae)));
       if (ae->kind == CONSTANT)
-	add_phi_arg (phi, PRE_EXPR_CONSTANT (ae), pred, UNKNOWN_LOCATION);
+	add_phi_arg (phi, PRE_EXPR_CONSTANT (ae), pred, UNKNOWN_LOCATION, NULL);
       else
 	add_phi_arg (phi, PRE_EXPR_NAME (avail[pred->src->index]), pred,
-		     UNKNOWN_LOCATION);
+		     UNKNOWN_LOCATION, NULL);
     }

   newphi = get_or_alloc_expr_for_name (gimple_phi_result (phi));
Index: gcc/tree-ssa-live.c
===================================================================
--- gcc/tree-ssa-live.c	(revision 189246)
+++ gcc/tree-ssa-live.c	(working copy)
@@ -765,6 +765,10 @@
           FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_ALL_USES)
             {
 	      tree arg = USE_FROM_PTR (arg_p);
+	      int index = PHI_ARG_INDEX_FROM_USE (arg_p);
+	      tree block = gimple_phi_arg_block (phi, index);
+	      if (block != NULL)
+		TREE_USED (block) = true;
 	      mark_all_vars_used (&arg, global_unused_vars);
             }
         }
Index: gcc/tree-predcom.c
===================================================================
--- gcc/tree-predcom.c	(revision 189246)
+++ gcc/tree-predcom.c	(working copy)
@@ -1531,8 +1531,8 @@

       phi = create_phi_node (var, loop->header);
       SSA_NAME_DEF_STMT (var) = phi;
-      add_phi_arg (phi, init, entry, UNKNOWN_LOCATION);
-      add_phi_arg (phi, next, latch, UNKNOWN_LOCATION);
+      add_phi_arg (phi, init, entry, UNKNOWN_LOCATION, NULL);
+      add_phi_arg (phi, next, latch, UNKNOWN_LOCATION, NULL);
     }
 }

@@ -1595,8 +1595,8 @@
       next = VEC_index (tree, *vars, 1);
       phi = create_phi_node (var, loop->header);
       SSA_NAME_DEF_STMT (var) = phi;
-      add_phi_arg (phi, init, entry, UNKNOWN_LOCATION);
-      add_phi_arg (phi, next, latch, UNKNOWN_LOCATION);
+      add_phi_arg (phi, init, entry, UNKNOWN_LOCATION, NULL);
+      add_phi_arg (phi, next, latch, UNKNOWN_LOCATION, NULL);
     }
   else
     {
Index: gcc/sese.c
===================================================================
--- gcc/sese.c	(revision 189246)
+++ gcc/sese.c	(working copy)
@@ -349,8 +349,8 @@

   create_new_def_for (gimple_phi_result (phi), phi,
 		      gimple_phi_result_ptr (phi));
-  add_phi_arg (phi, use, false_e, UNKNOWN_LOCATION);
-  add_phi_arg (phi, use, true_e, UNKNOWN_LOCATION);
+  add_phi_arg (phi, use, false_e, UNKNOWN_LOCATION, NULL);
+  add_phi_arg (phi, use, true_e, UNKNOWN_LOCATION, NULL);
 }

 /* Insert in the block BB phi nodes for variables defined in REGION
Index: gcc/tree-ssa-dce.c
===================================================================
--- gcc/tree-ssa-dce.c	(revision 189246)
+++ gcc/tree-ssa-dce.c	(working copy)
@@ -1129,6 +1129,7 @@
 	  gimple phi = gsi_stmt (gsi);
 	  tree op;
 	  source_location locus;
+	  tree block;

 	  /* PHIs for virtuals have no control dependency relation on them.
 	     We are lost here and must force renaming of the symbol.  */
@@ -1148,7 +1149,8 @@

 	  op = gimple_phi_arg_def (phi, e2->dest_idx);
 	  locus = gimple_phi_arg_location (phi, e2->dest_idx);
-	  add_phi_arg (phi, op, e, locus);
+	  block = gimple_phi_arg_block (phi, e2->dest_idx);
+	  add_phi_arg (phi, op, e, locus, block);
 	  /* The resulting PHI if not dead can only be degenerate.  */
 	  gcc_assert (degenerate_phi_p (phi));
 	  gsi_next (&gsi);
Index: gcc/tree-ssa.c
===================================================================
--- gcc/tree-ssa.c	(revision 189246)
+++ gcc/tree-ssa.c	(working copy)
@@ -51,7 +51,8 @@
 /* Add a mapping with PHI RESULT and PHI DEF associated with edge E.  */

 void
-redirect_edge_var_map_add (edge e, tree result, tree def,
source_location locus)
+redirect_edge_var_map_add (edge e, tree result, tree def,
source_location locus,
+			   tree block)
 {
   void **slot;
   edge_var_map_vector old_head, head;
@@ -70,6 +71,7 @@
   new_node.def = def;
   new_node.result = result;
   new_node.locus = locus;
+  new_node.block = block;

   VEC_safe_push (edge_var_map, heap, head, &new_node);
   if (old_head != head)
@@ -193,15 +195,17 @@
     {
       tree def;
       source_location locus ;
+      tree block;

       phi = gsi_stmt (gsi);
       def = gimple_phi_arg_def (phi, e->dest_idx);
       locus = gimple_phi_arg_location (phi, e->dest_idx);
+      block = gimple_phi_arg_block (phi, e->dest_idx);

       if (def == NULL_TREE)
 	continue;

-      redirect_edge_var_map_add (e, gimple_phi_result (phi), def, locus);
+      redirect_edge_var_map_add (e, gimple_phi_result (phi), def,
locus, block);
     }

   e = redirect_edge_succ_nodup (e, dest);
@@ -234,7 +238,8 @@

       phi = gsi_stmt (gsi);
       def = redirect_edge_var_map_def (vm);
-      add_phi_arg (phi, def, e, redirect_edge_var_map_location (vm));
+      add_phi_arg (phi, def, e, redirect_edge_var_map_location (vm),
+		   redirect_edge_var_map_block (vm));
     }

   redirect_edge_var_map_clear (e);
Index: gcc/gimple-streamer-in.c
===================================================================
--- gcc/gimple-streamer-in.c	(revision 189246)
+++ gcc/gimple-streamer-in.c	(working copy)
@@ -67,7 +67,7 @@
 	    break;
 	  }

-      add_phi_arg (result, def, e, arg_loc);
+      add_phi_arg (result, def, e, arg_loc, NULL);
     }

   return result;
Index: gcc/tree-vect-stmts.c
===================================================================
--- gcc/tree-vect-stmts.c	(revision 189246)
+++ gcc/tree-vect-stmts.c	(working copy)
@@ -5117,7 +5117,7 @@
 		      if (i == vec_num - 1 && j == ncopies - 1)
 			add_phi_arg (phi, lsq,
 				     loop_latch_edge (containing_loop),
-				     UNKNOWN_LOCATION);
+				     UNKNOWN_LOCATION, NULL);
 		      msq = lsq;
 		    }
 		}
Index: gcc/tree-inline.c
===================================================================
--- gcc/tree-inline.c	(revision 189246)
+++ gcc/tree-inline.c	(working copy)
@@ -2019,6 +2019,7 @@
 	      tree arg;
 	      tree new_arg;
 	      tree block = id->block;
+	      tree arg_block, *n;
 	      edge_iterator ei2;

 	      /* When doing partial cloning, we allow PHIs on the entry block
@@ -2046,8 +2047,15 @@
 		  gsi_insert_seq_on_edge (new_edge, stmts);
 		  inserted = true;
 		}
+	      n = (tree *) pointer_map_contains (id->decl_map,
+		gimple_phi_arg_block_from_edge (phi, old_edge));
+	      if (n)
+		arg_block = *n;
+	      else
+		arg_block = NULL;
 	      add_phi_arg (new_phi, new_arg, new_edge,
-			   gimple_phi_arg_location_from_edge (phi, old_edge));
+			   gimple_phi_arg_location_from_edge (phi, old_edge),
+			   arg_block);
 	    }
 	}
     }
Index: gcc/tree-ssa-phiprop.c
===================================================================
--- gcc/tree-ssa-phiprop.c	(revision 189246)
+++ gcc/tree-ssa-phiprop.c	(working copy)
@@ -159,9 +159,11 @@
       tree old_arg, new_var;
       gimple tmp;
       source_location locus;
+      tree block;

       old_arg = PHI_ARG_DEF_FROM_EDGE (phi, e);
       locus = gimple_phi_arg_location_from_edge (phi, e);
+      block = gimple_phi_arg_block_from_edge (phi, e);
       while (TREE_CODE (old_arg) == SSA_NAME
 	     && (SSA_NAME_VERSION (old_arg) >= n
 	         || phivn[SSA_NAME_VERSION (old_arg)].value == NULL_TREE))
@@ -169,6 +171,7 @@
 	  gimple def_stmt = SSA_NAME_DEF_STMT (old_arg);
 	  old_arg = gimple_assign_rhs1 (def_stmt);
 	  locus = gimple_location (def_stmt);
+	  block = gimple_block (def_stmt);
 	}

       if (TREE_CODE (old_arg) == SSA_NAME)
@@ -203,6 +206,7 @@
 	  new_var = make_ssa_name (new_var, tmp);
 	  gimple_assign_set_lhs (tmp, new_var);
 	  gimple_set_location (tmp, locus);
+	  gimple_set_block (tmp, block);

 	  gsi_insert_on_edge (e, tmp);
 	  update_stmt (tmp);
@@ -216,7 +220,7 @@
 	    }
 	}

-      add_phi_arg (new_phi, new_var, e, locus);
+      add_phi_arg (new_phi, new_var, e, locus, block);
     }

   update_stmt (new_phi);
Index: gcc/tree-outof-ssa.c
===================================================================
--- gcc/tree-outof-ssa.c	(revision 189246)
+++ gcc/tree-outof-ssa.c	(working copy)
@@ -78,6 +78,9 @@
   /* Source locus on each edge */
   VEC(source_location,heap) *edge_locus;

+  /* Block location on each edge.  */
+  VEC(tree,heap) *edge_block;
+
   /* Visited vector.  */
   sbitmap visited;

@@ -96,6 +99,9 @@

   /* Source locations for any constant copies.  */
   VEC(source_location,heap) *copy_locus;
+
+  /* Block locations for any constant copies.  */
+  VEC(tree,heap) *copy_block;
 } *elim_graph;


@@ -174,7 +180,8 @@
 /* Insert a copy instruction from partition SRC to DEST onto edge E.  */

 static void
-insert_partition_copy_on_edge (edge e, int dest, int src,
source_location locus)
+insert_partition_copy_on_edge (edge e, int dest, int src,
source_location locus,
+			       tree block)
 {
   tree var;
   rtx seq;
@@ -194,7 +201,10 @@
   set_location_for_edge (e);
   /* If a locus is provided, override the default.  */
   if (locus)
-    set_curr_insn_source_location (locus);
+    {
+      set_curr_insn_source_location (locus);
+      set_curr_insn_block (block);
+    }

   var = partition_to_var (SA.map, src);
   seq = emit_partition_copy (SA.partition_to_pseudo[dest],
@@ -209,7 +219,8 @@
    onto edge E.  */

 static void
-insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus)
+insert_value_copy_on_edge (edge e, int dest, tree src, source_location locus,
+			   tree block)
 {
   rtx seq, x;
   enum machine_mode dest_mode, src_mode;
@@ -231,7 +242,10 @@
   set_location_for_edge (e);
   /* If a locus is provided, override the default.  */
   if (locus)
-    set_curr_insn_source_location (locus);
+    {
+      set_curr_insn_source_location (locus);
+      set_curr_insn_block (block);
+    }

   start_sequence ();

@@ -269,7 +283,7 @@

 static void
 insert_rtx_to_part_on_edge (edge e, int dest, rtx src, int unsignedsrcp,
-			    source_location locus)
+			    source_location locus, tree block)
 {
   rtx seq;
   if (dump_file && (dump_flags & TDF_DETAILS))
@@ -287,7 +301,10 @@
   set_location_for_edge (e);
   /* If a locus is provided, override the default.  */
   if (locus)
-    set_curr_insn_source_location (locus);
+    {
+      set_curr_insn_source_location (locus);
+      set_curr_insn_block (block);
+    }

   /* We give the destination as sizeexp in case src/dest are BLKmode
      mems.  Usually we give the source.  As we result from SSA names
@@ -304,7 +321,8 @@
    onto edge E.  */

 static void
-insert_part_to_rtx_on_edge (edge e, rtx dest, int src, source_location locus)
+insert_part_to_rtx_on_edge (edge e, rtx dest, int src, source_location locus,
+			    tree block)
 {
   tree var;
   rtx seq;
@@ -323,7 +341,10 @@
   set_location_for_edge (e);
   /* If a locus is provided, override the default.  */
   if (locus)
-    set_curr_insn_source_location (locus);
+    {
+      set_curr_insn_source_location (locus);
+      set_curr_insn_block (block);
+    }

   var = partition_to_var (SA.map, src);
   seq = emit_partition_copy (dest,
@@ -347,8 +368,10 @@
   g->const_dests = VEC_alloc (int, heap, 20);
   g->const_copies = VEC_alloc (tree, heap, 20);
   g->copy_locus = VEC_alloc (source_location, heap, 10);
+  g->copy_block = VEC_alloc (tree, heap, 10);
   g->edge_list = VEC_alloc (int, heap, 20);
   g->edge_locus = VEC_alloc (source_location, heap, 10);
+  g->edge_block = VEC_alloc (tree, heap, 10);
   g->stack = VEC_alloc (int, heap, 30);

   g->visited = sbitmap_alloc (size);
@@ -365,6 +388,7 @@
   VEC_truncate (int, g->nodes, 0);
   VEC_truncate (int, g->edge_list, 0);
   VEC_truncate (source_location, g->edge_locus, 0);
+  VEC_truncate (tree, g->edge_block, 0);
 }


@@ -380,7 +404,9 @@
   VEC_free (int, heap, g->const_dests);
   VEC_free (int, heap, g->nodes);
   VEC_free (source_location, heap, g->copy_locus);
+  VEC_free (tree, heap, g->copy_block);
   VEC_free (source_location, heap, g->edge_locus);
+  VEC_free (tree, heap, g->edge_block);

   free (g);
 }
@@ -413,11 +439,13 @@
 /* Add the edge PRED->SUCC to graph G.  */

 static inline void
-elim_graph_add_edge (elim_graph g, int pred, int succ, source_location locus)
+elim_graph_add_edge (elim_graph g, int pred, int succ, source_location locus,
+		     tree block)
 {
   VEC_safe_push (int, heap, g->edge_list, pred);
   VEC_safe_push (int, heap, g->edge_list, succ);
   VEC_safe_push (source_location, heap, g->edge_locus, locus);
+  VEC_safe_push (tree, heap, g->edge_block, block);
 }


@@ -425,7 +453,8 @@
    return the successor node.  -1 is returned if there is no such edge.  */

 static inline int
-elim_graph_remove_succ_edge (elim_graph g, int node, source_location *locus)
+elim_graph_remove_succ_edge (elim_graph g, int node, source_location *locus,
+			     tree *block)
 {
   int y;
   unsigned x;
@@ -437,9 +466,12 @@
 	VEC_replace (int, g->edge_list, x + 1, -1);
 	*locus = VEC_index (source_location, g->edge_locus, x / 2);
 	VEC_replace (source_location, g->edge_locus, x / 2, UNKNOWN_LOCATION);
+	*block = VEC_index (tree, g->edge_block, x / 2);
+	VEC_replace (tree, g->edge_block, x / 2, NULL);
 	return y;
       }
   *locus = UNKNOWN_LOCATION;
+  *block = NULL;
   return -1;
 }

@@ -448,7 +480,7 @@
    edge list.  VAR will hold the partition number found.  CODE is the
    code fragment executed for every node found.  */

-#define FOR_EACH_ELIM_GRAPH_SUCC(GRAPH, NODE, VAR, LOCUS, CODE)		\
+#define FOR_EACH_ELIM_GRAPH_SUCC(GRAPH, NODE, VAR, LOCUS, BLOCK, CODE)	\
 do {									\
   unsigned x_;								\
   int y_;								\
@@ -460,6 +492,8 @@
       (void) ((VAR) = VEC_index (int, (GRAPH)->edge_list, x_ + 1));	\
       (void) ((LOCUS) = VEC_index (source_location,			\
 				   (GRAPH)->edge_locus, x_ / 2));	\
+      (void) ((BLOCK) = VEC_index (tree,				\
+				   (GRAPH)->edge_block, x_ / 2));	\
       CODE;								\
     }									\
 } while (0)
@@ -469,7 +503,7 @@
    GRAPH.  VAR will hold the partition number found.  CODE is the
    code fragment executed for every node found.  */

-#define FOR_EACH_ELIM_GRAPH_PRED(GRAPH, NODE, VAR, LOCUS, CODE)		\
+#define FOR_EACH_ELIM_GRAPH_PRED(GRAPH, NODE, VAR, LOCUS, BLOCK, CODE)	\
 do {									\
   unsigned x_;								\
   int y_;								\
@@ -481,6 +515,8 @@
       (void) ((VAR) = VEC_index (int, (GRAPH)->edge_list, x_));		\
       (void) ((LOCUS) = VEC_index (source_location,			\
 				   (GRAPH)->edge_locus, x_ / 2));	\
+      (void) ((BLOCK) = VEC_index (tree,				\
+				   (GRAPH)->edge_block, x_ / 2));	\
       CODE;								\
     }									\
 } while (0)
@@ -511,6 +547,7 @@
     {
       gimple phi = gsi_stmt (gsi);
       source_location locus;
+      tree block;

       p0 = var_to_partition (g->map, gimple_phi_result (phi));
       /* Ignore results which are not in partitions.  */
@@ -519,6 +556,7 @@

       Ti = PHI_ARG_DEF (phi, g->e->dest_idx);
       locus = gimple_phi_arg_location_from_edge (phi, g->e);
+      block = gimple_phi_arg_block_from_edge (phi, g->e);

       /* If this argument is a constant, or a SSA_NAME which is being
 	 left in SSA form, just queue a copy to be emitted on this
@@ -532,6 +570,7 @@
 	  VEC_safe_push (int, heap, g->const_dests, p0);
 	  VEC_safe_push (tree, heap, g->const_copies, Ti);
 	  VEC_safe_push (source_location, heap, g->copy_locus, locus);
+	  VEC_safe_push (tree, heap, g->copy_block, block);
 	}
       else
         {
@@ -540,7 +579,7 @@
 	    {
 	      eliminate_name (g, p0);
 	      eliminate_name (g, pi);
-	      elim_graph_add_edge (g, p0, pi, locus);
+	      elim_graph_add_edge (g, p0, pi, locus, block);
 	    }
 	}
     }
@@ -554,9 +593,10 @@
 {
   int S;
   source_location locus;
+  tree block;

   SET_BIT (g->visited, T);
-  FOR_EACH_ELIM_GRAPH_SUCC (g, T, S, locus,
+  FOR_EACH_ELIM_GRAPH_SUCC (g, T, S, locus, block,
     {
       if (!TEST_BIT (g->visited, S))
         elim_forward (g, S);
@@ -572,8 +612,9 @@
 {
   int P;
   source_location locus;
+  tree block;

-  FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus,
+  FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus, block,
     {
       if (!TEST_BIT (g->visited, P))
         return 1;
@@ -588,14 +629,15 @@
 {
   int P;
   source_location locus;
+  tree block;

   SET_BIT (g->visited, T);
-  FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus,
+  FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus, block,
     {
       if (!TEST_BIT (g->visited, P))
         {
 	  elim_backward (g, P);
-	  insert_partition_copy_on_edge (g->e, P, T, locus);
+	  insert_partition_copy_on_edge (g->e, P, T, locus, block);
 	}
     });
 }
@@ -624,6 +666,7 @@
 {
   int P, S;
   source_location locus;
+  tree block;

   if (elim_unvisited_predecessor (g, T))
     {
@@ -631,23 +674,24 @@
       rtx U = get_temp_reg (var);
       int unsignedsrcp = TYPE_UNSIGNED (TREE_TYPE (var));

-      insert_part_to_rtx_on_edge (g->e, U, T, UNKNOWN_LOCATION);
-      FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus,
+      insert_part_to_rtx_on_edge (g->e, U, T, UNKNOWN_LOCATION, NULL);
+      FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus, block,
 	{
 	  if (!TEST_BIT (g->visited, P))
 	    {
 	      elim_backward (g, P);
-	      insert_rtx_to_part_on_edge (g->e, P, U, unsignedsrcp, locus);
+	      insert_rtx_to_part_on_edge (g->e, P, U, unsignedsrcp, locus,
+					  block);
 	    }
 	});
     }
   else
     {
-      S = elim_graph_remove_succ_edge (g, T, &locus);
+      S = elim_graph_remove_succ_edge (g, T, &locus, &block);
       if (S != -1)
 	{
 	  SET_BIT (g->visited, T);
-	  insert_partition_copy_on_edge (g->e, T, S, locus);
+	  insert_partition_copy_on_edge (g->e, T, S, locus, block);
 	}
     }
 }
@@ -662,6 +706,7 @@

   gcc_assert (VEC_length (tree, g->const_copies) == 0);
   gcc_assert (VEC_length (source_location, g->copy_locus) == 0);
+  gcc_assert (VEC_length (tree, g->copy_block) == 0);

   /* Abnormal edges already have everything coalesced.  */
   if (e->flags & EDGE_ABNORMAL)
@@ -699,11 +744,13 @@
       int dest;
       tree src;
       source_location locus;
+      tree block;

       src = VEC_pop (tree, g->const_copies);
       dest = VEC_pop (int, g->const_dests);
       locus = VEC_pop (source_location, g->copy_locus);
-      insert_value_copy_on_edge (e, dest, src, locus);
+      block = VEC_pop (tree, g->copy_block);
+      insert_value_copy_on_edge (e, dest, src, locus, block);
     }
 }

@@ -1088,8 +1135,12 @@

 		  /* copy location if present.  */
 		  if (gimple_phi_arg_has_location (phi, i))
-		    gimple_set_location (stmt,
-					 gimple_phi_arg_location (phi, i));
+		    {
+		      gimple_set_location (stmt,
+					   gimple_phi_arg_location (phi, i));
+		      gimple_set_block (stmt,
+					gimple_phi_arg_block (phi, i));
+		    }

 		  /* Insert the new statement into the block and update
 		     the PHI node.  */
Index: gcc/tree-flow.h
===================================================================
--- gcc/tree-flow.h	(revision 189246)
+++ gcc/tree-flow.h	(working copy)
@@ -506,7 +506,7 @@
 extern void reserve_phi_args_for_new_edge (basic_block);
 extern void add_phi_node_to_bb (gimple phi, basic_block bb);
 extern gimple create_phi_node (tree, basic_block);
-extern void add_phi_arg (gimple, tree, edge, source_location);
+extern void add_phi_arg (gimple, tree, edge, source_location, tree);
 extern void remove_phi_args (edge);
 extern void remove_phi_node (gimple_stmt_iterator *, bool);
 extern void remove_phi_nodes (basic_block);
@@ -530,6 +530,7 @@
   tree result;			/* PHI result.  */
   tree def;			/* PHI arg definition.  */
   source_location locus;        /* PHI arg location.  */
+  tree block;			/* PHI arg block.  */
 };
 typedef struct _edge_var_map edge_var_map;

@@ -540,7 +541,7 @@
 typedef VEC(edge_var_map, heap) *edge_var_map_vector;

 extern void init_tree_ssa (struct function *);
-extern void redirect_edge_var_map_add (edge, tree, tree, source_location);
+extern void redirect_edge_var_map_add (edge, tree, tree,
source_location, tree);
 extern void redirect_edge_var_map_clear (edge);
 extern void redirect_edge_var_map_dup (edge, edge);
 extern edge_var_map_vector redirect_edge_var_map_vector (edge);
Index: gcc/tree-switch-conversion.c
===================================================================
--- gcc/tree-switch-conversion.c	(revision 189246)
+++ gcc/tree-switch-conversion.c	(working copy)
@@ -1189,8 +1189,10 @@
        !gsi_end_p (gsi); gsi_next (&gsi), i++)
     {
       gimple phi = gsi_stmt (gsi);
-      add_phi_arg (phi, info->target_inbound_names[i], e1f, UNKNOWN_LOCATION);
-      add_phi_arg (phi, info->target_outbound_names[i], e2f, UNKNOWN_LOCATION);
+      add_phi_arg (phi, info->target_inbound_names[i], e1f, UNKNOWN_LOCATION,
+		   NULL);
+      add_phi_arg (phi, info->target_outbound_names[i], e2f, UNKNOWN_LOCATION,
+		   NULL);
     }
 }

Index: gcc/tree-cfg.c
===================================================================
--- gcc/tree-cfg.c	(revision 189246)
+++ gcc/tree-cfg.c	(working copy)
@@ -2554,7 +2554,8 @@

       gcc_assert (result == gimple_phi_result (phi));

-      add_phi_arg (phi, arg, new_edge, redirect_edge_var_map_location (vm));
+      add_phi_arg (phi, arg, new_edge, redirect_edge_var_map_location (vm),
+		   redirect_edge_var_map_block (vm));
     }

   redirect_edge_var_map_clear (old_edge);
@@ -5014,7 +5015,7 @@
       SSA_NAME_DEF_STMT (var) = new_phi;
       gimple_phi_set_result (phi, make_ssa_name (SSA_NAME_VAR (var), phi));
       add_phi_arg (new_phi, gimple_phi_result (phi), fallthru,
-		   UNKNOWN_LOCATION);
+		   UNKNOWN_LOCATION, NULL);
     }

   /* Add the arguments we have stored on edges.  */
@@ -5475,7 +5476,8 @@
       phi_copy = gsi_stmt (psi_copy);
       def = PHI_ARG_DEF_FROM_EDGE (phi, e);
       add_phi_arg (phi_copy, def, e_copy,
-		   gimple_phi_arg_location_from_edge (phi, e));
+		   gimple_phi_arg_location_from_edge (phi, e),
+		   gimple_phi_arg_block_from_edge (phi, e));
     }
 }

@@ -5850,7 +5852,8 @@
 	  {
 	    phi = gsi_stmt (psi);
 	    def = PHI_ARG_DEF (phi, nexits[0]->dest_idx);
-	    add_phi_arg (phi, def, e, gimple_phi_arg_location_from_edge (phi, e));
+	    add_phi_arg (phi, def, e, gimple_phi_arg_location_from_edge (phi, e),
+			 gimple_phi_arg_block_from_edge (phi, e));
 	  }
       }
   e = redirect_edge_and_branch (nexits[1], nexits[0]->dest);
@@ -7426,7 +7429,8 @@
       phi1 = gsi_stmt (psi1);
       phi2 = gsi_stmt (psi2);
       def = PHI_ARG_DEF (phi2, e2->dest_idx);
-      add_phi_arg (phi1, def, e, gimple_phi_arg_location_from_edge (phi2, e2));
+      add_phi_arg (phi1, def, e, gimple_phi_arg_location_from_edge (phi2, e2),
+		   gimple_phi_arg_block_from_edge (phi2, e2));
     }
 }

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

end of thread, other threads:[~2012-07-13 10:06 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-12 14:27 [patch] Add block debug info to phi_arg_d Uros Bizjak
2012-07-13  1:36 ` Dehao Chen
2012-07-13  7:19   ` Steven Bosscher
2012-07-13  7:36     ` Richard Guenther
2012-07-13  7:50       ` Steven Bosscher
2012-07-13  8:59         ` Richard Guenther
2012-07-13  9:41       ` Dehao Chen
2012-07-13 10:06         ` Richard Guenther
  -- strict thread matches above, loose matches on Subject: below --
2012-07-05  9:09 Dehao Chen
2012-07-05  9:23 ` Richard Guenther
2012-07-05  9:43   ` Steven Bosscher
2012-07-05  9:58     ` Richard Guenther
2012-07-05 10:18       ` Dehao Chen
     [not found]       ` <CAO2gOZXWt_OucnHGs+9Y8b+2Cy1pxXh9UJL36ik7HCE99gZBCQ@mail.gmail.com>
2012-07-05 12:10         ` Richard Guenther
2012-07-08  7:30           ` Dehao Chen
2012-07-09  8:14             ` 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).