https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111083

            Bug ID: 111083
           Summary: Test failure of g++.dg/ipa/pr67056.C on darwin
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: fxcoudert at gcc dot gnu.org
  Target Milestone: ---

On darwin (both aarch64 and x86_64), we see the following test failure:

    FAIL: g++.dg/ipa/pr67056.C   scan-ipa-dump cp "Speculative outer
type:struct CompositeClass"

This is the content generated for pr67056.C.082i.cp:

------

IPA constant propagation start:
Determining dynamic type for call: CompositeClass::~CompositeClass (_3);
  Starting walk at: CompositeClass::~CompositeClass (_3);
  instance pointer: _3  Outer instance pointer: _3 offset: 0 (bits) vtbl
reference: 
  Checking vtbl store: MEM[(struct CompositeClass *)_3]._vptr.CompositeClass =
&MEM <int (*) ()[4]> [(void *)&_ZTV14CompositeClass + 16B];
  Recording type: struct CompositeClass at offset 0
  Determined dynamic type.
Determining dynamic type for call: operator delete (this_2(D));
  Starting walk at: operator delete (this_2(D));
  instance pointer: this_2(D)  Outer instance pointer: this_2(D) offset: 0
(bits) vtbl reference: 
  No dynamic type change found.

IPA structures before propagation:

Jump functions:
  Jump functions of caller  void operator delete(void*)/461:
  Jump functions of caller  void* operator new(std::size_t)/460:
  Jump functions of caller  int main(int, char**)/332:
    callsite  int main(int, char**)/332 -> virtual
CompositeClass::~CompositeClass()/320 : 
       param 0: UNKNOWN
         Aggregate passed by reference:
           offset: 0, type: int (*) () *, CONST: &MEM <int (*) ()[4]> [(void
*)&_ZTV14CompositeClass + 16B]
         Context:     Outer type (dynamic):struct CompositeClass offset 0
         value: 0x0, mask: 0xffffffffffffffff
[irange] void * [1, +INF]
    callsite  int main(int, char**)/332 -> void* operator new(std::size_t)/460
: 
       param 0: CONST: 16
         value: 0x10, mask: 0x0
[irange] size_t [16, 16]
  Jump functions of caller  bool boolFunc()/321:
  Jump functions of caller  virtual CompositeClass::~CompositeClass()/320:
    callsite  virtual CompositeClass::~CompositeClass()/320 -> void operator
delete(void*)/461 : 
       param 0: PASS THROUGH: 0, op nop_expr
         Context:     Outer type (dynamic):struct CompositeClass offset 0
         value: 0x0, mask: 0xffffffffffffffff
[irange] void * [1, +INF]
  Jump functions of caller  virtual CompositeClass::~CompositeClass()/319:
  Jump functions of caller  EmptyClass::EmptyClass()/313:
  Jump functions of caller  EmptyClass::EmptyClass()/312:
    callsite  EmptyClass::EmptyClass()/312 -> EmptyClass::EmptyClass()/313 : 
       param 0: PASS THROUGH: 0, op nop_expr
         value: 0x0, mask: 0xffffffffffffffff
[irange] void * [1, +INF]

 Propagating constants:

Not considering int main(int, char**)/332 for cloning; no hot calls.
Not considering virtual CompositeClass::~CompositeClass()/320 for cloning; no
hot calls.
Not considering virtual CompositeClass::~CompositeClass()/319 for cloning; no
hot calls.
Considering EmptyClass::EmptyClass()/313 for cloning.
Not considering EmptyClass::EmptyClass()/312 for cloning; no hot calls.

overall_size: 28
 - context independent values, size: 9, time_benefit: 2.000000
 - context independent values, size: 2, time_benefit: 1.000000
     Decided to specialize for all known contexts, growth (to 30) deemed
beneficial.

IPA lattices after all propagation:

Lattices:
  Node: int main(int, char**)/332:
    param [0]: BOTTOM
         ctxs: BOTTOM
         Bits unusable (BOTTOM)
         [unsupported_range] VARYING
        AGGS BOTTOM
    param [1]: BOTTOM
         ctxs: BOTTOM
         Bits unusable (BOTTOM)
         [unsupported_range] VARYING
        AGGS BOTTOM
  Node: bool boolFunc()/321:
  Node: virtual CompositeClass::~CompositeClass()/320:
    param [0]: BOTTOM
         ctxs: BOTTOM
         Bits unusable (BOTTOM)
         [unsupported_range] VARYING
        AGGS BOTTOM
  Node: virtual CompositeClass::~CompositeClass()/319:
    param [0]: BOTTOM
         ctxs: BOTTOM
         Bits unusable (BOTTOM)
         [unsupported_range] VARYING
        AGGS BOTTOM
  Node: EmptyClass::EmptyClass()/313:
    param [0]: VARIABLE
         ctxs: VARIABLE
         Bits unusable (BOTTOM)
         [unsupported_range] VARYING
        AGGS VARIABLE
  Node: EmptyClass::EmptyClass()/312:
    param [0]: BOTTOM
         ctxs: BOTTOM
         Bits unusable (BOTTOM)
         [unsupported_range] VARYING
        AGGS BOTTOM

IPA decision stage:

 - Creating a specialized node of EmptyClass::EmptyClass()/313 for all known
contexts.

IPA constant propagation end

Reclaiming functions:
Reclaiming variables:
Clearing address taken flags:
Symbol table:

_ZN10EmptyClassC1Ev.constprop.0/468 (EmptyClass::EmptyClass())
  Type: function definition analyzed
  Visibility:
  References: 
  Referring: 
  Clone of _ZN10EmptyClassC1Ev/313
  Availability: local
  Function flags: count:1073741824 (estimated locally) local icf_merged
  Called by: _ZN10EmptyClassC2Ev/312 (1073741824 (estimated locally),1.00 per
call) 
  Calls: 
_ZTVN10__cxxabiv117__class_type_infoE/463 (int (* const
__cxxabiv1::__class_type_info::_ZTVN10__cxxabiv117__class_type_infoE [])(...))
  Type: variable
  Body removed by symtab_remove_unreachable_nodes
  Visibility: semantic_interposition external public visibility_specified
virtual artificial
  References: 
  Referring: _ZTI14CompositeClass/406 (addr) 
  Availability: not_available
  Varpool flags: read-only
_ZdlPv/461 (void operator delete(void*))
  Type: function
  Visibility: semantic_interposition external public visibility_specified
  References: 
  Referring: 
  Availability: not_available
  Function flags: replaceable_operator_delete
  Called by: _ZN14CompositeClassD0Ev/320 (1073741824 (estimated locally),1.00
per call) 
  Calls: 
_Znwm/460 (void* operator new(std::size_t))
  Type: function
  Visibility: semantic_interposition external public visibility_specified
  References: 
  Referring: 
  Availability: not_available
  Function flags: decl_is_malloc replaceable_operator_new
  Called by: main/332 (1073741824 (estimated locally),1.00 per call) (can throw
external) 
  Calls: 
_ZTS14CompositeClass/407 (const char _ZTS14CompositeClass [17])
  Type: variable definition analyzed
  Visibility: externally_visible semantic_interposition public weak comdat
comdat_group:_ZTS14CompositeClass one_only artificial
  References: 
  Referring: _ZTI14CompositeClass/406 (addr) 
  Availability: available
  Varpool flags: initialized read-only const-value-known
_ZTI14CompositeClass/406 (const __class_type_info_pseudo_8
_ZTI14CompositeClass)
  Type: variable definition analyzed
  Visibility: externally_visible semantic_interposition public weak comdat
comdat_group:_ZTI14CompositeClass one_only artificial
  References: _ZTVN10__cxxabiv117__class_type_infoE/463 (addr)
_ZTS14CompositeClass/407 (addr) 
  Referring: _ZTV14CompositeClass/395 (addr) 
  Availability: available
  Varpool flags: initialized read-only const-value-known
_ZTV14CompositeClass/395 (constexpr int (* CompositeClass::_ZTV14CompositeClass
[4])(...))
  Type: variable definition analyzed
  Visibility: externally_visible semantic_interposition public weak comdat
comdat_group:_ZTV14CompositeClass one_only virtual artificial
  References: _ZTI14CompositeClass/406 (addr) _ZN14CompositeClassD1Ev/319
(addr) _ZN14CompositeClassD0Ev/320 (addr) 
  Referring: main/332 (addr) 
  Availability: available
  Varpool flags: initialized read-only const-value-known
main/332 (int main(int, char**))
  Type: function definition analyzed
  Visibility: externally_visible semantic_interposition public
  References: _ZTV14CompositeClass/395 (addr) 
  Referring: 
  Availability: available
  Function flags: count:1073741824 (estimated locally) body
only_called_at_startup executed_once
  Called by: 
  Calls: _ZN14CompositeClassD0Ev/320 (1073741824 (estimated locally),1.00 per
call) _Znwm/460 (1073741824 (estimated locally),1.00 per call) (can throw
external) 
_Z8boolFuncv/321 (bool boolFunc())
  Type: function definition analyzed
  Visibility: externally_visible semantic_interposition public
  References: 
  Referring: 
  Availability: available
  Function flags: count:1073741824 (estimated locally) body
  Called by: 
  Calls: 
_ZN14CompositeClassD0Ev/320 (virtual CompositeClass::~CompositeClass())
  Type: function definition analyzed
  Visibility: externally_visible semantic_interposition public weak comdat
comdat_group:_ZN14CompositeClassD0Ev one_only virtual
  Address is taken.
  References: 
  Referring: _ZTV14CompositeClass/395 (addr) 
  Availability: available
  Function flags: count:1073741824 (estimated locally) body
  Called by: main/332 (1073741824 (estimated locally),1.00 per call) 
  Calls: _ZdlPv/461 (1073741824 (estimated locally),1.00 per call) 
_ZN14CompositeClassD1Ev/319 (virtual CompositeClass::~CompositeClass())
  Type: function definition analyzed
  Visibility: externally_visible semantic_interposition public weak comdat
comdat_group:_ZN14CompositeClassD1Ev one_only virtual
  Address is taken.
  References: 
  Referring: _ZTV14CompositeClass/395 (addr) 
  Availability: available
  Function flags: count:1073741824 (estimated locally) body
  Called by: 
  Calls: 
_ZN10EmptyClassC1Ev/313 (EmptyClass::EmptyClass())
  Type: function definition analyzed
  Visibility: externally_visible semantic_interposition public
  References: 
  Referring: 
  Availability: available
  Function flags: count:1073741824 (estimated locally) body icf_merged
  Called by: 
  Calls: 
_ZN10EmptyClassC2Ev/312 (EmptyClass::EmptyClass())
  Type: function definition analyzed
  Visibility: externally_visible semantic_interposition public
  References: 
  Referring: 
  Availability: available
  Function flags: count:1073741824 (estimated locally) body icf_merged
  Called by: 
  Calls: _ZN10EmptyClassC1Ev.constprop.0/468 (1073741824 (estimated
locally),1.00 per call) 

;; Function CompositeClass::~CompositeClass (_ZN14CompositeClassD1Ev,
funcdef_no=1542, decl_uid=28304, cgraph_uid=315, symbol_order=319)

Modification phase of node virtual CompositeClass::~CompositeClass()/319
void CompositeClass::~CompositeClass (struct CompositeClass * const this)
{
  <bb 2> [local count: 1073741824]:
  MEM[(struct __as_base  &)this_2(D)] ={v} {CLOBBER};
  return;

}



;; Function CompositeClass::~CompositeClass (_ZN14CompositeClassD0Ev,
funcdef_no=1543, decl_uid=28301, cgraph_uid=316, symbol_order=320)

Modification phase of node virtual CompositeClass::~CompositeClass()/320
void CompositeClass::~CompositeClass (struct CompositeClass * const this)
{
  <bb 2> [local count: 1073741824]:
  MEM[(struct __as_base  &)this_2(D)] ={v} {CLOBBER};
  operator delete (this_2(D));
  return;

}



;; Function EmptyClass::EmptyClass (_ZN10EmptyClassC2Ev, funcdef_no=1619,
decl_uid=28257, cgraph_uid=308, symbol_order=312)

Modification phase of node EmptyClass::EmptyClass()/312
void EmptyClass::EmptyClass (struct EmptyClass * const this)
{
  <bb 2> [local count: 1073741824]:
  EmptyClass::EmptyClass (this_1(D)); [tail call]
  return;

}



;; Function EmptyClass::EmptyClass (_ZN10EmptyClassC1Ev, funcdef_no=1536,
decl_uid=28255, cgraph_uid=309, symbol_order=313)

Modification phase of node EmptyClass::EmptyClass()/313
void EmptyClass::EmptyClass (struct EmptyClass * const this)
{
  <bb 2> [local count: 1073741824]:
  return;

}



;; Function boolFunc (_Z8boolFuncv, funcdef_no=1544, decl_uid=28334,
cgraph_uid=317, symbol_order=321)

Modification phase of node bool boolFunc()/321
bool boolFunc ()
{
  <bb 2> [local count: 1073741824]:
  return 1;

}



;; Function main (main, funcdef_no=1555, decl_uid=31596, cgraph_uid=328,
symbol_order=332) (executed once)

Modification phase of node int main(int, char**)/332
int main (int D.31594, char * * D.31595)
{
  void * _3;

  <bb 2> [local count: 1073741824]:
  _3 = operator new (16);
  MEM[(struct __as_base  &)_3] ={v} {CLOBBER};
  MEM[(struct CompositeClass *)_3]._vptr.CompositeClass = &MEM <int (*) ()[4]>
[(void *)&_ZTV14CompositeClass + 16B];
  CompositeClass::~CompositeClass (_3);
  return 0;

}


------

I am wondering if it is because darwin has PIE forced on. The test also fails
on Linux if I force it with -fPIE.

And if so, what is the right moveā€¦ do we disable the test on darwin?


diff --git a/gcc/testsuite/g++.dg/ipa/pr67056.C
b/gcc/testsuite/g++.dg/ipa/pr67056.C
index f47323b6e5d..350d9c1e840 100644
--- a/gcc/testsuite/g++.dg/ipa/pr67056.C
+++ b/gcc/testsuite/g++.dg/ipa/pr67056.C
@@ -36,4 +36,5 @@ int main(int, char **) {
     return 0;
 }

-/* { dg-final { scan-ipa-dump "Speculative outer type:struct CompositeClass"
"cp"  } } */
+/* Darwin has PIE which defeats the test.  */
+/* { dg-final { scan-ipa-dump "Speculative outer type:struct CompositeClass"
"cp" { target { ! *-*-darwin* } } } } */

Reply via email to