@@ -136,14 +136,23 @@ path_range_query::range_on_path_entry (irange &r, tree name)
{
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.
new file mode 100644
@@ -0,0 +1,21 @@
+// { 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;
+}
@@ -37,5 +37,5 @@ expand_shift_1 (int code, int unsignedp, int rotate,
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"} } */