Ping. This is now a P1 bug, as it breaks spec2k gcc on ia64. On Tue, 13 Sep 2011, Alexander Monakov wrote:
> Hello, > > This patches fixes an ICE on an assert that performs a sanity check on > target_available field of expr_t, which is tri-state: LHS register is > available (1), not available (0) or unknown (-1). > > The problem is, when merging expr data of separable exprs with differing > LHSes, we can't claim we know anything about availability of the target > register if the unavailable LHS of the other expr is not the same register. > Thus, we should set the field to -1, not 0. > > Fixed as follows, bootstrapped and regtested on x86_64-linux and ia64-linux > (without java, with one recent SRA patch reverted to unbreak bootstrap) with > sel-sched enabled at -O2. OK for trunk? > > (a small testcase is not available at the moment, but I can try to produce one > using delta before committing) > > > 2011-09-13 Andrey Belevantsev <a...@ispras.ru> > > * sel-sched-ir.c (update_target_availability): LHS register > availability is not known if the unavailable LHS of the other > expression is a different register. > > diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c > index 4878460..b132392 100644 > --- a/gcc/sel-sched-ir.c > +++ b/gcc/sel-sched-ir.c > @@ -1746,7 +1746,13 @@ update_target_availability (expr_t to, expr_t from, > insn_t split_point) > EXPR_TARGET_AVAILABLE (to) = -1; > } > else > - EXPR_TARGET_AVAILABLE (to) &= EXPR_TARGET_AVAILABLE (from); > + if (EXPR_TARGET_AVAILABLE (from) == 0 > + && EXPR_LHS (from) > + && REG_P (EXPR_LHS (from)) > + && REGNO (EXPR_LHS (to)) != REGNO (EXPR_LHS (from))) > + EXPR_TARGET_AVAILABLE (to) = -1; > + else > + EXPR_TARGET_AVAILABLE (to) &= EXPR_TARGET_AVAILABLE (from); > } > } >