}
else
{
- if (TREE_CODE (arg) == SSA_NAME
- && param_type
+ if (param_type
&& Value_Range::supports_type_p (TREE_TYPE (arg))
&& Value_Range::supports_type_p (param_type)
&& irange::supports_p (TREE_TYPE (arg))
gcc_assert (!jfunc->m_vr);
}
- if (INTEGRAL_TYPE_P (TREE_TYPE (arg))
- && (TREE_CODE (arg) == SSA_NAME || TREE_CODE (arg) == INTEGER_CST))
+ if (INTEGRAL_TYPE_P (TREE_TYPE (arg)) && !vr.undefined_p ())
{
- if (TREE_CODE (arg) == SSA_NAME)
- ipa_set_jfunc_bits (jfunc, 0,
- widest_int::from (get_nonzero_bits (arg),
- TYPE_SIGN (TREE_TYPE (arg))));
- else
- ipa_set_jfunc_bits (jfunc, wi::to_widest (arg), 0);
+ irange &r = as_a <irange> (vr);
+ irange_bitmask bm = r.get_bitmask ();
+ signop sign = TYPE_SIGN (TREE_TYPE (arg));
+ ipa_set_jfunc_bits (jfunc,
+ widest_int::from (bm.value (), sign),
+ widest_int::from (bm.mask (), sign));
}
else if (POINTER_TYPE_P (TREE_TYPE (arg)))
{
/* { dg-do compile } */
-/* { dg-options "-O2 -fno-ipa-vrp -fdump-tree-optimized -fno-tree-ccp -fdisable-tree-evrp" } */
-int *ptr;
-static int barvar;
-static int b(int a);
-/* We can not detect A to be const because it may be interposed by unoptimized
- body. */
-inline
-__attribute__ ((noinline))
-int a(int a)
-{
- if (a>0)
- return b(a-1);
- return *ptr == *ptr;
-}
-inline
-__attribute__ ((noinline))
-static int b(int p)
-{
- if (p<0)
- return a(p+1);
- return 1;
-}
-int main()
-{
- int aa;
- ptr = &barvar;
- aa=!b(3);
- ptr = 0;
- return aa;
-}
+/* { dg-options "-O2 -fno-ipa-vrp -fdump-tree-optimized -fno-tree-ccp -fdisable-tree-evrp -fdisable-tree-vrp1 -fdisable-tree-vrp2 -fno-thread-jumps -fno-tree-dominator-opts" } */
+
+#include "pure-const-3.h"
+
/* { dg-final { scan-tree-dump "barvar" "optimized" } } */