This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix ICE in vn_lookup



This fixes an ICE in vn_lookup/vn_add that happens when building recent openoffice with 4.3 or trunk.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to the
branch and the trunk.

Richard.

2008-06-25 Richard Guenther <rguenther@suse.de>

	* tree-vn.c (vn_add): Handle TRUTH_*_EXPR.
	(vn_lookup): Likewise.

* g++.dg/torture/20080625-1.C: New testcase.

Index: gcc/tree-vn.c
===================================================================
*** gcc/tree-vn.c (revision 137032)
--- gcc/tree-vn.c (working copy)
*************** vn_add (tree expr, tree val)
*** 199,210 ****
SSA_NAME_VALUE (expr) = val;
break;
}
! else if (TREE_CODE (expr) == ADDR_EXPR)
{
vn_unary_op_insert (expr, val);
break;
}
! /* FALLTHROUGH */
default:
gcc_unreachable ();
}
--- 199,217 ----
SSA_NAME_VALUE (expr) = val;
break;
}
! switch (TREE_CODE (expr))
{
+ case ADDR_EXPR:
+ case TRUTH_AND_EXPR:
+ case TRUTH_OR_EXPR:
+ case TRUTH_XOR_EXPR:
+ case TRUTH_NOT_EXPR:
vn_unary_op_insert (expr, val);
break;
+ default:
+ gcc_unreachable ();
}
! break;
default:
gcc_unreachable ();
}
*************** vn_lookup (tree expr)
*** 267,275 ****
return vn_reference_lookup (expr, NULL);
else if (TREE_CODE (expr) == SSA_NAME)
return SSA_NAME_VALUE (expr);
! else if (TREE_CODE (expr) == ADDR_EXPR)
! return vn_unary_op_lookup (expr);
! /* FALLTHROUGH */
default:
gcc_unreachable ();
}
--- 274,291 ----
return vn_reference_lookup (expr, NULL);
else if (TREE_CODE (expr) == SSA_NAME)
return SSA_NAME_VALUE (expr);
! 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_unary_op_lookup (expr);
! default:
! gcc_unreachable ();
! }
! break;
default:
gcc_unreachable ();
}
Index: gcc/testsuite/g++.dg/torture/20080625-1.C
===================================================================
*** gcc/testsuite/g++.dg/torture/20080625-1.C (revision 0)
--- gcc/testsuite/g++.dg/torture/20080625-1.C (revision 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;
+ }



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]