So while tracking down a hairy address reload for an output reload bug,
copyprop_hardreg_forward_1 was faulting because it was trying to extract move
patterns that didn't work out, and when it came back to the code, it then tries
to access recog_data, but the problem is, the exploration of other instructions
to see if they match, overwrites that data, and there is nothing that restores
the data to a point in which the code below this point expects. It uses
recog_data.operand[i], where i is limited by n_ops, but that value corresponded
to the old data in recog_data. The recog and extract_insn in insn_invalid_p
called from verify_changes called from apply_change_group called from
validate_change wipes the `old' recog_data with new data. This data, for
example, might only have 2 operands, with an invalid value for the third
operand. The old n_ops, might well be 3 from the original data. Accessing
that data can cause a crash.
So, I don't know if people want to data regenerated, or it they want to cache
the data, or if they want to save and restore it underneath a called api...
Ok?
Index: regcprop.c
===================================================================
--- regcprop.c (revision 1831)
+++ regcprop.c (working copy)
@@ -866,6 +866,10 @@ copyprop_hardreg_forward_1 (basic_block
}
}
}
+ extract_insn (insn);
+ if (! constrain_operands (1))
+ fatal_insn_not_found (insn);
+ preprocess_constraints ();
no_move_special_case:
any_replacements = false;