backport: re PR middle-end/55921 (Crash in verify_ssa for asm to side-steps complex pessimization)

Backported from mainline
	2013-01-10  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/55921
	* tree-complex.c (expand_complex_asm): New function.
	(expand_complex_operations_1): Call it for GIMPLE_ASM.

	* gcc.c-torture/compile/pr55921.c: New test.

From-SVN: r195655
This commit is contained in:
Jakub Jelinek 2013-02-01 15:08:32 +01:00 committed by Jakub Jelinek
parent 441b3f028c
commit aa5c918af5
4 changed files with 69 additions and 0 deletions

View File

@ -1,6 +1,12 @@
2013-02-01 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
2013-01-10 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/55921
* tree-complex.c (expand_complex_asm): New function.
(expand_complex_operations_1): Call it for GIMPLE_ASM.
2013-01-03 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/55838

View File

@ -1,6 +1,11 @@
2013-02-01 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
2013-01-10 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/55921
* gcc.c-torture/compile/pr55921.c: New test.
2013-01-03 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/55838

View File

@ -0,0 +1,22 @@
/* PR tree-optimization/55921 */
/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
typedef union
{
_Complex float cf;
long long ll;
} ucf;
void
foo (ucf *in, ucf *out, _Complex float r)
{
int i;
ucf ucf1;
_Complex float cf;
ucf1.ll = in[i].ll;
__asm ("" : "=r" (cf) : "0" (ucf1.ll));
cf *= r;
__asm ("" : "=r" (ucf1.ll) : "0" (cf));
out[i].ll = ucf1.ll;
}

View File

@ -1400,6 +1400,36 @@ expand_complex_comparison (gimple_stmt_iterator *gsi, tree ar, tree ai,
update_stmt (stmt);
}
/* Expand inline asm that sets some complex SSA_NAMEs. */
static void
expand_complex_asm (gimple_stmt_iterator *gsi)
{
gimple stmt = gsi_stmt (*gsi);
unsigned int i;
for (i = 0; i < gimple_asm_noutputs (stmt); ++i)
{
tree link = gimple_asm_output_op (stmt, i);
tree op = TREE_VALUE (link);
if (TREE_CODE (op) == SSA_NAME
&& TREE_CODE (TREE_TYPE (op)) == COMPLEX_TYPE)
{
tree type = TREE_TYPE (op);
tree inner_type = TREE_TYPE (type);
tree r = build1 (REALPART_EXPR, inner_type, op);
tree i = build1 (IMAGPART_EXPR, inner_type, op);
gimple_seq list = set_component_ssa_name (op, false, r);
if (list)
gsi_insert_seq_after (gsi, list, GSI_CONTINUE_LINKING);
list = set_component_ssa_name (op, true, i);
if (list)
gsi_insert_seq_after (gsi, list, GSI_CONTINUE_LINKING);
}
}
}
/* Process one statement. If we identify a complex operation, expand it. */
@ -1412,6 +1442,12 @@ expand_complex_operations_1 (gimple_stmt_iterator *gsi)
complex_lattice_t al, bl;
enum tree_code code;
if (gimple_code (stmt) == GIMPLE_ASM)
{
expand_complex_asm (gsi);
return;
}
lhs = gimple_get_lhs (stmt);
if (!lhs && gimple_code (stmt) != GIMPLE_COND)
return;