The problem here is that the solver's code solving unknown SSAs on entry
to a path was returning UNDEFINED if there were no incoming edges to the
start of the path that were not the function entry block. This caused a
cascade of pain down stream.
Tested on x86-64 Linux.
PR tree-optimization/102511
gcc/ChangeLog:
* gimple-range-path.cc (path_range_query::range_on_path_entry):
Return VARYING when nothing found.
gcc/testsuite/ChangeLog:
* gcc.dg/pr102511.c: New test.
* gcc.dg/tree-ssa/ssa-dom-thread-14.c: Adjust.
{
int_range_max tmp;
basic_block entry = entry_bb ();
+ bool changed = false;
+
r.set_undefined ();
for (unsigned i = 0; i < EDGE_COUNT (entry->preds); ++i)
{
edge e = EDGE_PRED (entry, i);
if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun)
&& m_ranger.range_on_edge (tmp, e, name))
- r.union_ (tmp);
+ {
+ r.union_ (tmp);
+ changed = true;
+ }
}
+
+ // Make sure we don't return UNDEFINED by mistake.
+ if (!changed)
+ r.set_varying (TREE_TYPE (name));
}
// Return the range of NAME at the end of the path being analyzed.
--- /dev/null
+// { dg-do run }
+// { dg-options "-O3" }
+
+char arr_15 [8];
+__attribute__((noipa))
+void test(signed char a, unsigned short b, unsigned long long c,
+ unsigned short f) {
+ for (int d = b - 8; d < b; d += 2)
+ for (short e = 0; e < (unsigned short)((f ? 122 : 0) ^ (a ? c : 0)) - 64055;
+ e += 3)
+ arr_15[d] = 42;
+}
+int main() {
+ test(37, 8, 12325048486467861044ULL, 45936);
+ for (int i = 0; i < 8; ++i)
+ {
+ if (arr_15[i] != ((i&1) ? 0 : 42))
+ __builtin_abort();
+ }
+ return 0;
+}
we will enter the TRUE arm of the conditional and we can thread
the test to compute the first first argument of the expand_binop
call if we look backwards through the boolean logicals. */
-/* { dg-final { scan-tree-dump-times "Threaded" 1 "dom2"} } */
+/* { dg-final { scan-tree-dump-times "Threaded" 2 "dom2"} } */