new file mode 100644
@@ -0,0 +1,60 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-ccp1-details" } */
+/* { dg-final { scan-tree-dump-times "gimple_simplified to" 11 "ccp1" } } */
+
+#include <limits.h>
+
+long foo(int a)
+{
+ return (long)(a - 2) + 1;
+}
+
+long bar(int a)
+{
+ return (long)(a + 3) - 1;
+}
+
+long baz(int a)
+{
+ return (long)(a - 1) + 2;
+}
+
+long baf(int a)
+{
+ return (long)(a + 1) - 2;
+}
+
+long bak(int a)
+{
+ return (long)(a + 1) + 3;
+}
+
+long bal(int a)
+{
+ return (long)(a - 7) - 4;
+}
+
+long bam(int a)
+{
+ return (long)(a - 1) - INT_MAX;
+}
+
+long bam2(int a)
+{
+ return (long)(a + 1) + INT_MAX;
+}
+
+long ban(int a)
+{
+ return (long)(a - 1) + INT_MIN;
+}
+
+long ban2(int a)
+{
+ return (long)(a + 1) - INT_MIN;
+}
+
+unsigned long baq(int a)
+{
+ return (unsigned long)(a + 1) - 1;
+}
new file mode 100644
@@ -0,0 +1,41 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-ccp1-details -fdump-tree-vrp1-details" } */
+/* { dg-final { scan-tree-dump-times "gimple_simplified to" 1 "ccp1" } } */
+/* { dg-final { scan-tree-dump-times "gimple_simplified to" 5 "vrp1" } } */
+
+#include <limits.h>
+
+unsigned long oof2(unsigned int a)
+{
+ if (a > 3 && a < INT_MAX - 100)
+ return (unsigned long)(a - 1) + 1;
+}
+
+unsigned long bap(unsigned int a)
+{
+ if (a > 3 && a < INT_MAX - 100)
+ return (unsigned long)(a + 1) + ULONG_MAX;
+}
+
+unsigned long bar3(unsigned int a)
+{
+ if (a > 3 && a < INT_MAX - 100)
+ return (unsigned long)(a + 1) - 5;
+}
+
+unsigned long bar4(unsigned int a)
+{
+ if (a > 3 && a < INT_MAX - 100)
+ return (unsigned long)(a + 1) - 6;
+}
+
+unsigned long baq(int a)
+{
+ return (unsigned long)(a - 2) + 1;
+}
+
+long baq3(unsigned int a)
+{
+ if (a > 3 && a < INT_MAX - 100)
+ return (long)(a - 1) + 1;
+}
new file mode 100644
@@ -0,0 +1,42 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+#include <assert.h>
+#include <limits.h>
+
+unsigned int a = 3;
+int aa = 3;
+int bb = 1;
+int cc = 4;
+
+int main()
+{
+ volatile unsigned long b = (unsigned long)(UINT_MAX + 1) - 1;
+ assert (b == 18446744073709551615ul);
+
+ volatile unsigned long c = (unsigned long)(a - 4) + 1;
+ assert (c == 4294967296);
+
+ volatile unsigned long d = (unsigned long)(a + UINT_MAX - 4) + 2;
+ assert (d == 4294967296);
+
+ volatile unsigned long e = (unsigned long)(a - UINT_MAX) + UINT_MAX;
+ assert (e == 4294967299);
+
+ volatile unsigned long f = (unsigned long)(a + UINT_MAX) - UINT_MAX;
+ assert (f == 18446744069414584323ul);
+
+ volatile long g = (long)(a - 4) + 1;
+ assert (g == 4294967296);
+
+ volatile long h = (long)(aa + UINT_MAX) + 1;
+ assert (h == 3);
+
+ /* Zero-extend. */
+ volatile unsigned long i = (unsigned long)(bb + 4294967294u) + 5000000000;
+ assert (i == 9294967295);
+
+ /* Sign-extend. */
+ volatile unsigned long j = (unsigned long)(cc + 4294967294u) + 8000000000;
+ assert (j == 8000000002);
+}