From: Richard Biener Date: Thu, 24 Mar 2016 12:19:56 +0000 (+0000) Subject: re PR middle-end/70370 (ICE in execute_todo, at passes.c:2003 when using __real__... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ed87de55831955ee08398a3c5641ba92d31a39f1;p=gcc.git re PR middle-end/70370 (ICE in execute_todo, at passes.c:2003 when using __real__ or __imag__ as lvalue in asm) 2016-03-24 Richard Biener PR middle-end/70370 * gimplify.c (gimplify_asm_expr): Handle !allows_mem outputs with register bases. * gcc.dg/torture/pr70370.c: New testcase. From-SVN: r234453 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3c80e770d24..a4ade25c6ca 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-03-24 Richard Biener + + PR middle-end/70370 + * gimplify.c (gimplify_asm_expr): Handle !allows_mem outputs + with register bases. + 2016-03-24 Richard Biener PR tree-optimization/70372 diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 5d03435cb0a..b9757db4c89 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -5191,6 +5191,32 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) ret = tret; } + /* If the constraint does not allow memory make sure we gimplify + it to a register if it is not already but its base is. This + happens for complex and vector components. */ + if (!allows_mem) + { + tree op = TREE_VALUE (link); + if (! is_gimple_val (op) + && is_gimple_reg_type (TREE_TYPE (op)) + && is_gimple_reg (get_base_address (op))) + { + tree tem = create_tmp_reg (TREE_TYPE (op)); + tree ass; + if (is_inout) + { + ass = build2 (MODIFY_EXPR, TREE_TYPE (tem), + tem, unshare_expr (op)); + gimplify_and_add (ass, pre_p); + } + ass = build2 (MODIFY_EXPR, TREE_TYPE (tem), op, tem); + gimplify_and_add (ass, post_p); + + TREE_VALUE (link) = tem; + tret = GS_OK; + } + } + vec_safe_push (outputs, link); TREE_CHAIN (link) = NULL_TREE; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index be2e416e53d..73cb726f644 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-03-24 Richard Biener + + PR middle-end/70370 + * gcc.dg/torture/pr70370.c: New testcase. + 2016-03-24 Tom de Vries * gfortran.dg/goacc/data-tree.f95: Add missing initialization. diff --git a/gcc/testsuite/gcc.dg/torture/pr70370.c b/gcc/testsuite/gcc.dg/torture/pr70370.c new file mode 100644 index 00000000000..d077bee3f0f --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr70370.c @@ -0,0 +1,45 @@ +/* { dg-do compile } */ + +_Complex float +test1 (_Complex float f) +{ + __asm__ ("" : "+r" (__real f)); + return f; +} + +_Complex float +test2 (_Complex float f) +{ + __asm__ ("" : "=r" (__real f)); + return f; +} + +struct X { int i; }; + +struct X +test3 (struct X x) +{ + __asm__ ("" : "=r" (x.i)); + return x; +} + +struct X +test4 (struct X x) +{ + __asm__ ("" : "+r" (x.i)); + return x; +} + +struct X +test5 (struct X x) +{ + __asm__ ("" : "=r" (x)); + return x; +} + +struct X +test6 (struct X x) +{ + __asm__ ("" : "+r" (x)); + return x; +}