aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimplify.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-03-24 12:19:56 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-03-24 12:19:56 +0000
commited87de55831955ee08398a3c5641ba92d31a39f1 (patch)
treeb905e18c16436656a0109ffc550c078d5d5e84df /gcc/gimplify.c
parentea064934b695dfdb57b9f339eb1f6357d3eae83a (diff)
downloadgcc-ed87de55831955ee08398a3c5641ba92d31a39f1.zip
gcc-ed87de55831955ee08398a3c5641ba92d31a39f1.tar.gz
gcc-ed87de55831955ee08398a3c5641ba92d31a39f1.tar.bz2
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 <rguenther@suse.de> 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
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r--gcc/gimplify.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 5d03435..b9757db 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;