diff mbox

Invalid gimple for nested functions

Message ID 53DFEEF4.3090305@codesourcery.com
State New
Headers show

Commit Message

Bernd Schmidt Aug. 4, 2014, 8:37 p.m. UTC
Some code I added for the ptx backend triggered tree-checking failures 
for gimple created in tree-nested: we can end up taking the address of 
an SSA_NAME, which seems invalid. The problem is that code in 
tree-nested wants to change the rhs of an existing assignment, but just 
using gimple_assign_set_rhs1 is insufficient: the previous rhs was an 
ADDR_EXPR, and that code remains afterwards.

Fixed with the following patch, tested (including Ada) on x86_64-linux. Ok?


Bernd

Comments

Richard Biener Aug. 5, 2014, 8:54 a.m. UTC | #1
On Mon, Aug 4, 2014 at 10:37 PM, Bernd Schmidt <bernds@codesourcery.com> wrote:
> Some code I added for the ptx backend triggered tree-checking failures for
> gimple created in tree-nested: we can end up taking the address of an
> SSA_NAME, which seems invalid. The problem is that code in tree-nested wants
> to change the rhs of an existing assignment, but just using
> gimple_assign_set_rhs1 is insufficient: the previous rhs was an ADDR_EXPR,
> and that code remains afterwards.
>
> Fixed with the following patch, tested (including Ada) on x86_64-linux. Ok?

The better interface for this is gimple_assign_set_rhs_from_tree.  But it
seems the code can be re-structured to avoid re-setting the RHS by
simply doing

   if (!is_gimple_reg (x)
              && is_gimple_reg_type (TREE_TYPE (x))
    x = init_tmp_var (root, x, &gsi);

right after x is assigned to?

Ok with that change.

Thanks,
Richard.

>
> Bernd
diff mbox

Patch

diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c
index 5408fba..1afcf09 100644
--- a/gcc/tree-nested.c
+++ b/gcc/tree-nested.c
@@ -2738,6 +2738,7 @@  finalize_nesting_tree_1 (struct nesting_info *root)
 	      gimple_stmt_iterator gsi = gsi_last (stmt_list);
 	      x = init_tmp_var (root, x, &gsi);
 	      gimple_assign_set_rhs1 (stmt, x);
+	      gimple_assign_set_rhs_code (stmt, TREE_CODE (x));
 	    }
 	}
     }