Commit a57fc743 by Jakub Jelinek Committed by Jakub Jelinek

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
parent 0ff4390d
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
......
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
......
/* 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;
}
/* 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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment