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

            Bug ID: 68930
           Summary: Aggregate replacements not applied to inline function
                    bodies.
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: ipa
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hubicka at gcc dot gnu.org
  Target Milestone: ---

The following testcase:
struct a
{
  int a, b;
};

static inline int
t (struct a a)
{
  if (!__builtin_constant_p (a.a))
    __builtin_abort ();
}

static int __attribute__ ((noinline)) q (struct a a)
{
  t (a);
}

int
main (int argc)
{
  struct a a;
  int i;
  for (i = 0; i < 10000; i++)
    {
      a.a = 1;
      a.b = 2;
      q (a);
    }
  return 0;
}

Fails when compiled with 
./xgcc -B ./ -O3 t.c -S -fdump-ipa-cp -fno-ipa-sra -fno-early-inlining
ipa-cp correctly identifies the inlining oppurtunity:
Estimating effects for main/2, base_time: 1588.                                 
   Estimating body: main/2                                                      
   Known to be false:                                                           
   size:10 time:1588                                                            
 - context independent values, size: 10, time_benefit: 1                        
     good_cloning_opportunity_p (time: 1, size: 10, freq_sum: 0, single_call)
-> evaluation: 0, threshold: 500
   Not cloning for all contexts because !good_cloning_opportunity_p.            

Estimating effects for q/1, base_time: 13.                                      
   Estimating body: q/1                                                         
   Known to be false:                                                           
   size:5 time:13                                                               
 - context independent values, size: 5, time_benefit: 0                         
     Decided to specialize for all known contexts, code not going to grow.      

Estimating effects for t/0, base_time: 5.                                       
   Estimating body: t/0                                                         
   Known to be false: op0[offset: 0] changed                                    
   size:4 time:2                                                                
 - context independent values, size: 4, time_benefit: 3                         
     Decided to specialize for all known contexts, code not going to grow.      

however because the ipa-cp adjustments are applied to the body of q before
inlining we end up with:
__attribute__((noinline))
q.constprop (struct a a)
{
  struct a a;
  int _2;
  int _3;

  <bb 2>:
  a = a;
  _2 = a.a;
  _3 = __builtin_constant_p (_2);
  if (_3 == 0)
    goto <bb 3>;
  else
    goto <bb 4>;

  <bb 3>:
  __builtin_abort ();

  <bb 4>:
  return;

}
i.e. we lose the track that a.a==1

Modification phase of node q.constprop/5
     Aggregate replacements: 0[0]=1, 0[32]=2
__attribute__((noinline))
q.constprop (struct a a)
{
  <bb 3>:

  <bb 2>:
  t (a);
  return;

}

here t is not inlined yet and the clone of t is not modified because it is
inline clone but it should be because it is inline clone of ipa-cp clone.
I wonder if we should not apply the replacements only after inlining. Even if
ipa-cp decided to not clone the callee, inliner might have inlined it and we
ought to use the known constants when optimizing the function body.

Reply via email to