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

            Bug ID: 117984
           Summary: missed IPA constant propagation
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: ipa
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hubicka at gcc dot gnu.org
  Target Milestone: ---

In the following se should optimize away prinf even if the bar call is
commented out.  However we don't do that at all since jump function is missing:



struct a {int a,b;};

void bar (struct a *);
__attribute ((noinline))
static void bar2 (int a)
{
        if (a)
                __builtin_printf ("optimize me away");
}


__attribute ((noinline))
static void
foo(struct a a)
{
        //bar (&a);
        bar2 (a.a);
}

void
test()
{
        foo ({0,1});
}


We get:
Jump functions:
  Jump functions of caller  int __builtin_printf(const char*, ...)/3:
  Jump functions of caller  void test()/2:
    callsite  void test()/2 -> void foo(a)/1 :
       param 0: UNKNOWN
         Aggregate passed by value:
           offset: 0, type: int, CONST: 0
           offset: 32, type: int, CONST: 1
         Unknown VR
  Jump functions of caller  void foo(a)/1:
    callsite  void foo(a)/1 -> void bar2(int)/0 :
       param 0: UNKNOWN
         Unknown VR
  Jump functions of caller  void bar2(int)/0:
    callsite  void bar2(int)/0 -> int __builtin_printf(const char*, ...)/3 :
       no arg info


Modification phase of node void bar2(int)/0
__attribute__((noinline))
void bar2 (int a)
{
  <bb 2> [local count: 1073741824]:
  if (a_2(D) != 0)
    goto <bb 3>; [33.00%]
  else
    goto <bb 4>; [67.00%]

  <bb 3> [local count: 354334800]:
  __builtin_printf ("optimize me away");

  <bb 4> [local count: 1073741824]:
  return;

}



;; Function foo.constprop.isra (_ZL3foo1a.constprop.0.isra.0, funcdef_no=4,
decl_uid=2828, cgraph_uid=6, symbol_order=5)

Modification phase of node void foo(a)/5
__attribute__((noinline))
void foo.constprop.isra ()
{
  struct a a;
  int removed_ipa_cp.7;
  int removed_ipa_cp.6;
  int _1;

  <bb 4> [local count: 1073741824]:
  removed_ipa_cp.7_2 = 1;
  removed_ipa_cp.6_3 = 0;

  <bb 2> [local count: 1073741824]:

  <bb 3> [local count: 1073741824]:
  _1 = removed_ipa_cp.6_3;
  bar2 (_1);
  return;

}



;; Function test (_Z4testv, funcdef_no=2, decl_uid=2805, cgraph_uid=3,
symbol_order=2)

Modification phase of node void test()/2
void test ()
{
  struct a D.2817;

  <bb 2> [local count: 1073741824]:
  D.2817.a = 0;
  D.2817.b = 1;
  foo (D.2817);
  return;

}


So we propagate to test->foo but not foo->bar.
What is also odd is that we don't optimize away the unused parameter of foo.

Reply via email to