diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-03-01 00:27:26 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-03-01 00:27:26 +0000 |
commit | 0045e505634d3f126b624ca3c89664f380f128bf (patch) | |
tree | 2da1b9137cf43382d6ed2ac1544b88801f0ac8b7 /gcc/tree-sra.c | |
parent | 5da030c97984db9b3ad0792e9b9e054d548c9175 (diff) | |
download | gcc-0045e505634d3f126b624ca3c89664f380f128bf.tar.gz |
2008-03-01 Richard Guenther <rguenther@suse.de>
PR tree-optimization/35411
* tree-sra.c (sra_build_assignment): Split conversion to
final type to a separate statement if we are not assigning
to a register.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@132791 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-sra.c')
-rw-r--r-- | gcc/tree-sra.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 26f1af4196a..1f2d6c25e62 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -2139,7 +2139,7 @@ sra_build_assignment (tree dst, tree src) if (scalar_bitfield_p (src)) { tree var, shift, width; - tree utype, stype, stmp, utmp; + tree utype, stype, stmp, utmp, dtmp; tree list, stmt; bool unsignedp = BIT_FIELD_REF_UNSIGNED (src); @@ -2256,6 +2256,16 @@ sra_build_assignment (tree dst, tree src) var = fold_convert (TREE_TYPE (dst), var); else var = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (dst), var); + + /* If the destination is not a register the conversion needs + to be a separate statement. */ + if (!is_gimple_reg (dst)) + { + dtmp = make_rename_temp (TREE_TYPE (dst), "SR"); + stmt = build_gimple_modify_stmt (dtmp, var); + append_to_statement_list (stmt, &list); + var = dtmp; + } } stmt = build_gimple_modify_stmt (dst, var); append_to_statement_list (stmt, &list); |