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

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: r195080
This commit is contained in:
Jakub Jelinek 2013-01-10 10:25:12 +01:00 committed by Jakub Jelinek
parent 0ff4390dd3
commit a57fc74385
4 changed files with 69 additions and 1 deletions

View File

@ -1,3 +1,9 @@
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-10 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
PR target/55718

View File

@ -1,3 +1,8 @@
2013-01-10 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/55921
* gcc.c-torture/compile/pr55921.c: New test.
2013-01-09 Jan Hubicka <jh@suse.cz>
PR tree-optimization/55569

View File

@ -0,0 +1,21 @@
/* PR tree-optimization/55921 */
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

@ -1,5 +1,5 @@
/* Lower complex number operations to scalar operations.
Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
Free Software Foundation, Inc.
This file is part of GCC.
@ -1391,6 +1391,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. */
@ -1403,6 +1433,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;