{
ipcp_value<tree> *val;
for (val = lat->values; val; val = val->next)
- ret |= decide_about_value (node, i, -1, val, &avals,
- &self_gen_clones);
+ {
+ /* If some values generated for self-recursive calls with
+ arithmetic jump functions fall outside of the known
+ value_range for the parameter, we can skip them. VR interface
+ supports this only for integers now. */
+ if (TREE_CODE (val->value) == INTEGER_CST
+ && !plats->m_value_range.bottom_p ()
+ && !plats->m_value_range.m_vr.contains_p (val->value))
+ {
+ /* This can happen also if a constant present in the source
+ code falls outside of the range of parameter's type, so we
+ cannot assert. */
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ {
+ fprintf (dump_file, " - skipping%s value ",
+ val->self_recursion_generated_p ()
+ ? " self_recursion_generated" : "");
+ print_ipcp_constant_value (dump_file, val->value);
+ fprintf (dump_file, " because it is outside known "
+ "value range.\n");
+ }
+ continue;
+ }
+ ret |= decide_about_value (node, i, -1, val, &avals,
+ &self_gen_clones);
+ }
}
if (!plats->aggs_bottom)
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O3 -Warray-bounds" } */
+
+extern int block2[7][256];
+
+static int encode_block(int block2[7][256], unsigned level)
+{
+ int best_score = 0;
+
+ for (unsigned x = 0; x < level; x++) {
+ int v = block2[1][x];
+ block2[level][x] = 0;
+ best_score += v * v;
+ }
+
+ if (level > 0 && best_score > 64) {
+ int score = 0;
+
+ score += encode_block(block2, level - 1);
+ score += encode_block(block2, level - 1);
+
+ if (score < best_score) {
+ best_score = score;
+ }
+ }
+
+ return best_score;
+}
+
+int foo(void)
+{
+ return encode_block(block2, 5);
+}