Struct member functions emit unnecessary call to _d_assert_msg

Mike none at none.com
Fri Jan 24 16:59:35 PST 2014


I'm beginning to implement structs in my ARM Cortex-M runtime, 
and I ran across something interesting today.

Consider this struct:
struct TestStruct
{
     uint TestVar;

     void Print()
     {
	trace.WriteLine("TestStruct.Print");
     }
}

And a function that uses that struct:
void MyFunction()
{
     TestStruct test;
     test.Print()
}

Adding this function call created a unresolved reference to 
_d_assert_msg. When I look at the code generations I see this:
  start.TestStruct.Print (struct start.TestStruct & this)
{
   struct  D.3650;
   const struct  t;
   struct  D.3627;
   struct  D.3626;

   <bb 2>:
   if (this_1(D) != 0)
     goto <bb 4>;
   else
     goto <bb 3>;

   <bb 3>:
   D.3626.length = 9;
   D.3626.ptr = "null this";
   D.3627.length = 14;
   D.3627.ptr = "source/start.d";
   _d_assert_msg (D.3626, D.3627, 26);

   <bb 4>:
   MEM[(struct  *)&t] = 16;
   MEM[(struct  *)&t + 4B] = "TestStruct.Print";
   Write (t);
   t ={v} {CLOBBER};
   D.3650.length = 2;
   D.3650.ptr = "\r\n";
   Write (D.3650);
   return;

}

What bothers me is the branch at <bb 2>. It looks like it's 
checking the struct instance to see if it is null. Is it even 
possible for it to be null?  Can this be improved?

I imagine in a tight loop (for example, an alpha blend function 
on an array of pixels), this can be a significant performance 
hindrance if every call has to make this check.

I'd be happy to submit a bug report if you think this has merit.

Mike


More information about the D.gnu mailing list