From 2ec2984b80f97ad455add5278f1d3129ced02b3d Mon Sep 17 00:00:00 2001 From: Andreas Zwinkau Date: Mon, 21 Feb 2011 15:27:12 +0000 Subject: [PATCH] Skip shift dependency if no other users If a shift operation has a dependency operand (64bit shifts), then instruction selection inserts a dependency edge between them, so the scheduler orders them correctly. However, if the operand is not used, the scheduler is confused about the dependency edge, which is never resolved. Fixes opt/longlong.c testcase [r28434] --- ir/be/ia32/ia32_transform.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ir/be/ia32/ia32_transform.c b/ir/be/ia32/ia32_transform.c index 6832fcfe4..403b615d8 100644 --- a/ir/be/ia32/ia32_transform.c +++ b/ir/be/ia32/ia32_transform.c @@ -1144,8 +1144,12 @@ static ir_node *gen_shift_binop(ir_node *node, ir_node *op1, ir_node *op2, /* lowered shift instruction may have a dependency operand, handle it here */ if (get_irn_arity(node) == 3) { /* we have a dependency */ - ir_node *new_dep = be_transform_node(get_irn_n(node, 2)); - add_irn_dep(new_node, new_dep); + ir_node* dep = get_irn_n(node, 2); + if (get_irn_n_edges(dep) > 1) { + /* ... which has at least one user other than 'node' */ + ir_node *new_dep = be_transform_node(dep); + add_irn_dep(new_node, new_dep); + } } return new_node; -- 2.20.1