summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0182-PR-tree-optimization-48734.patch
blob: 40f3efa78792e2fa9f3d3fc14e30fd17e7c54ff7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Upstream-Status: Inappropriate [Backport]
From a3ac868928384ffe6f10c3aa0fd3ac9ab8cc1aae Mon Sep 17 00:00:00 2001
From: jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Tue, 26 Apr 2011 13:44:51 +0000
Subject: [PATCH 182/200] 	PR tree-optimization/48734
 	* tree-ssa-reassoc.c (eliminate_redundant_comparison): Give up
 	if return value from maybe_fold_*_comparsions isn't something
 	the code is prepared to handle.

	* gcc.c-torture/compile/pr48734.c: New test.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@172969 138bc75d-0d04-0410-961f-82ee72b054a4

index 581f168..566f02e 100644
new file mode 100644
index 0000000..b20ea80
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr48734.c
@@ -0,0 +1,11 @@
+/* PR tree-optimization/48734 */
+
+unsigned int
+foo (int x, unsigned int y, unsigned int z)
+{
+  z &= (x == -__INT_MAX__ - 1 ? x : -x) > y;
+  z &= (x == -__INT_MAX__ - 1 ? x : -x) > y;
+  z &= (x == -__INT_MAX__ - 1 ? x : -x) > y;
+  z &= (x == -__INT_MAX__ - 1 ? x : -x) > y;
+  return z;
+}
diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c
index 904fef8..987ec65 100644
--- a/gcc/tree-ssa-reassoc.c
+++ b/gcc/tree-ssa-reassoc.c
@@ -1,5 +1,6 @@
 /* Reassociation for trees.
-   Copyright (C) 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2007, 2008, 2009, 2010, 2011
+   Free Software Foundation, Inc.
    Contributed by Daniel Berlin <dan@dberlin.org>
 
 This file is part of GCC.
@@ -1279,6 +1280,20 @@ eliminate_redundant_comparison (enum tree_code opcode,
       if (!useless_type_conversion_p (TREE_TYPE (curr->op), TREE_TYPE (t)))
 	t = fold_convert (TREE_TYPE (curr->op), t);
 
+      if (TREE_CODE (t) != INTEGER_CST
+	  && !operand_equal_p (t, curr->op, 0))
+	{
+	  enum tree_code subcode;
+	  tree newop1, newop2;
+	  if (!COMPARISON_CLASS_P (t))
+	    continue;
+	  extract_ops_from_tree (t, &subcode, &newop1, &newop2);
+	  STRIP_USELESS_TYPE_CONVERSION (newop1);
+	  STRIP_USELESS_TYPE_CONVERSION (newop2);
+	  if (!is_gimple_val (newop1) || !is_gimple_val (newop2))
+	    continue;
+	}
+
       if (dump_file && (dump_flags & TDF_DETAILS))
 	{
 	  fprintf (dump_file, "Equivalence: ");
-- 
1.7.0.4

OpenPOWER on IntegriCloud