]> gcc.gnu.org Git - gcc.git/commitdiff
re PR middle-end/58742 (pointer arithmetic simplification)
authorRichard Biener <rguenther@suse.de>
Mon, 21 Oct 2013 11:34:04 +0000 (11:34 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 21 Oct 2013 11:34:04 +0000 (11:34 +0000)
2013-10-21  Richard Biener  <rguenther@suse.de>

PR middle-end/58742
* fold-const.c (fold_binary_loc): Fold ((T) (X /[ex] C)) * C
to (T) X for sign-changing conversions (or no conversion).

* c-c++-common/fold-divmul-1.c: New testcase.

From-SVN: r203890

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/fold-divmul-1.c [new file with mode: 0644]

index bbcc371ae7139fd038461a29b8f7999f22abaf9d..99b921abfbd21eb806771408d9131900ccec88e4 100644 (file)
@@ -1,3 +1,9 @@
+2013-10-21  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/58742
+       * fold-const.c (fold_binary_loc): Fold ((T) (X /[ex] C)) * C
+       to (T) X for sign-changing conversions (or no conversion).
+
 2013-10-20  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.md (kxnor<mode>): Add FLAGS_REG clobber.
index c4c09b65eb1be1c5273a63d9376da8ce94360640..2a184109ea1fcc1d6cbbf587f8247a12ecd2b57c 100644 (file)
@@ -11002,6 +11002,13 @@ fold_binary_loc (location_t loc,
                                fold_build2_loc (loc, MULT_EXPR, type,
                                             build_int_cst (type, 2) , arg1));
 
+         /* ((T) (X /[ex] C)) * C cancels out if the conversion is
+            sign-changing only.  */
+         if (TREE_CODE (arg1) == INTEGER_CST
+             && TREE_CODE (arg0) == EXACT_DIV_EXPR
+             && operand_equal_p (arg1, TREE_OPERAND (arg0, 1), 0))
+           return fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
+
          strict_overflow_p = false;
          if (TREE_CODE (arg1) == INTEGER_CST
              && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
index 7acbd3b9b9e173c0d01a03095e7a0037cc6b6426..6add22c389ebb7fbaa72301107def4e8a3bc3c59 100644 (file)
@@ -1,3 +1,8 @@
+2013-10-21  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/58742
+       * c-c++-common/fold-divmul-1.c: New testcase.
+
 2013-10-21  Michael Zolotukhin  <michael.v.zolotukhin@gmail.com>
 
        * gcc.target/i386/memset-vector_loop-1.c: New test.
diff --git a/gcc/testsuite/c-c++-common/fold-divmul-1.c b/gcc/testsuite/c-c++-common/fold-divmul-1.c
new file mode 100644 (file)
index 0000000..5c86792
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-original" } */
+
+int *
+fx (int *b, int *e)
+{
+  return b + (e - b);
+}
+
+/* { dg-final { scan-tree-dump-not "/\\\[ex\\\]" "original" } } */
+/* { dg-final { cleanup-tree-dump "original" } } */
This page took 0.148291 seconds and 5 git commands to generate.