+2016-04-04 Jan Hubicka <hubicka@ucw.cz>
+
+ PR ipa/66223
+ * ipa-devirt.c (maybe_record_node): Do not optimize cxa_pure_virtual
+ calls when sanitizing.
+ (possible_polymorphic_call_target_p)" FIx formating.
+
2016-04-04 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
Jakub Jelinek <jakub@redhat.com>
{
gcc_assert (!target_node->global.inlined_to);
gcc_assert (target_node->real_symbol_p ());
+ /* When sanitizing, do not asume that cxa_pure_virutal is not called
+ by valid program. */
+ if (flag_sanitize & SANITIZE_UNDEFINED)
+ ;
/* Only add pure virtual if it is the only possible target. This way
we will preserve the diagnostics about pure virtual called in many
cases without disabling optimization in other. */
- if (pure_virtual)
+ else if (pure_virtual)
{
if (nodes.length ())
return;
bool final;
if (TREE_CODE (TREE_TYPE (n->decl)) == FUNCTION_TYPE
- && ((fcode = DECL_FUNCTION_CODE (n->decl))
- == BUILT_IN_UNREACHABLE
+ && ((fcode = DECL_FUNCTION_CODE (n->decl)) == BUILT_IN_UNREACHABLE
|| fcode == BUILT_IN_TRAP))
return true;
+2016-04-04 Jan Hubicka <hubicka@ucw.cz>
+
+ PR ipa/66223
+ * g++.dg/ipa/devirt-51.C: New testcase.
+
2016-04-04 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
Jakub Jelinek <jakub@redhat.com>
--- /dev/null
+/* Be sure we do not optimize the virtual call into call of the only non-virtual
+ variant. Either keeping virtual call or optimizing to cxa_pure_virtual
+ is fine. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fsanitize=undefined -fdump-tree-optimized" } */
+namespace {
+ struct B {
+ B* self;
+ B() : self( this ) { self->f(); }
+ void E(void);
+ virtual void f() = 0;
+ };
+
+ struct D : B
+ {
+ void f() {}
+ };
+}
+
+struct D e;
+
+__attribute__ ((used))
+void B::E(void)
+ {
+ this->f();
+}
+
+ int main()
+ {
+ D d;
+ }
+/* { dg-final { scan-tree-dump "cxa_pure_virtual" "optimized" } } */