+ /* allow only one argument to die at pre remat. If two value die check_pre does
+ * not ensure a correct register pressure FIXME (verify this is really necessary!) */
+ foreach_pre_remat(si, irn, tmp) {
+ pset *remat_args = pset_new_ptr(get_irn_arity(tmp));
+ int n;
+ ir_node *remat_arg;
+ op_t *remat_op = get_irn_link(tmp);
+
+ for(n=get_irn_arity(tmp)-1; n>=0; --n) {
+ remat_arg = get_irn_n(tmp, n);
+
+ if(has_reg_class(si, remat_arg)) {
+ pset_insert_ptr(remat_args, remat_arg);
+ }
+ }
+
+ if(pset_count(remat_args)) {
+ /* \sum_args next(lr) >= #args * remat - 1 */
+ ir_snprintf(buf, sizeof(buf), "one_may_die_%N", tmp);
+ cst = lpp_add_cst_uniq(si->lpp, buf, lpp_greater, -1.0);
+ lpp_set_factor_fast(si->lpp, cst, remat_op->attr.remat.ilp, -pset_count(remat_args));
+
+ pset_foreach(remat_args, remat_arg) {
+ op_t *arg_op = get_irn_link(remat_arg);
+
+ if(arg_op->attr.live_range.ilp != ILP_UNDEF) {
+ lpp_set_factor_fast(si->lpp, cst, arg_op->attr.live_range.ilp, 1.0);
+ }
+ }
+ }
+
+ del_pset(remat_args);
+ }
+