aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/torture/20080625-1.C27
-rw-r--r--gcc/tree-vn.c28
4 files changed, 58 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 64423b1..c22cbe7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2008-06-25 Richard Guenther <rguenther@suse.de>
+ * tree-vn.c (vn_add): Handle TRUTH_*_EXPR.
+ (vn_lookup): Likewise.
+
+2008-06-25 Richard Guenther <rguenther@suse.de>
+
PR tree-optimization/35518
* fold-const.c (fold_ternary): Strip trivial BIT_FIELD_REFs.
* tree-sra.c (instantiate_element): Use fold_build3 to build
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2c45e39..20c6345 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2008-06-25 Richard Guenther <rguenther@suse.de>
+
+ * g++.dg/torture/20080625-1.C: New testcase.
+
2008-06-24 Paul Thomas <pault@gcc.gnu.org>
PR fortran/36371
diff --git a/gcc/testsuite/g++.dg/torture/20080625-1.C b/gcc/testsuite/g++.dg/torture/20080625-1.C
new file mode 100644
index 0000000..b18c282
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/20080625-1.C
@@ -0,0 +1,27 @@
+extern "C" {
+ typedef unsigned char sal_Bool;
+ typedef struct _rtl_uString {
+ } rtl_uString;
+ void rtl_uString_release( rtl_uString * str ) throw ();
+}
+class OUString {
+ rtl_uString * pData;
+public:
+ OUString() {}
+ ~OUString() {
+ rtl_uString_release( pData );
+ }
+ sal_Bool equalsIgnoreAsciiCase( const OUString & str ) const;
+};
+bool findAndRemove();
+long getAttributeProps()
+{
+ long nAttrs = 0;
+ OUString aValue;
+ if (findAndRemove()
+ && aValue.equalsIgnoreAsciiCase(OUString()))
+ ;
+ else
+ nAttrs |= 1;
+ return nAttrs;
+}
diff --git a/gcc/tree-vn.c b/gcc/tree-vn.c
index c3cc239..7ec19cd 100644
--- a/gcc/tree-vn.c
+++ b/gcc/tree-vn.c
@@ -196,12 +196,19 @@ vn_add (tree expr, tree val)
SSA_NAME_VALUE (expr) = val;
break;
}
- else if (TREE_CODE (expr) == ADDR_EXPR)
+ switch (TREE_CODE (expr))
{
+ case ADDR_EXPR:
+ case TRUTH_AND_EXPR:
+ case TRUTH_OR_EXPR:
+ case TRUTH_XOR_EXPR:
+ case TRUTH_NOT_EXPR:
vn_nary_op_insert (expr, val);
- break;
+ break;
+ default:
+ gcc_unreachable ();
}
- /* FALLTHROUGH */
+ break;
default:
gcc_unreachable ();
}
@@ -263,9 +270,18 @@ vn_lookup (tree expr)
return vn_reference_lookup (expr, NULL, false);
else if (TREE_CODE (expr) == SSA_NAME)
return SSA_NAME_VALUE (expr);
- else if (TREE_CODE (expr) == ADDR_EXPR)
- return vn_nary_op_lookup (expr);
- /* FALLTHROUGH */
+ switch (TREE_CODE (expr))
+ {
+ case ADDR_EXPR:
+ case TRUTH_AND_EXPR:
+ case TRUTH_OR_EXPR:
+ case TRUTH_XOR_EXPR:
+ case TRUTH_NOT_EXPR:
+ return vn_nary_op_lookup (expr);
+ default:
+ gcc_unreachable ();
+ }
+ break;
default:
gcc_unreachable ();
}