diff options
author | Richard Biener <rguenther@suse.de> | 2016-03-24 12:19:56 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-03-24 12:19:56 +0000 |
commit | ed87de55831955ee08398a3c5641ba92d31a39f1 (patch) | |
tree | b905e18c16436656a0109ffc550c078d5d5e84df /gcc/gimplify.c | |
parent | ea064934b695dfdb57b9f339eb1f6357d3eae83a (diff) | |
download | gcc-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.c | 26 |
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; |