tree-SSA Bogus dominator optimization

Andrew Haley aph@redhat.com
Wed Aug 4 08:42:00 GMT 2004


Note: this is on my branch, merged from mainline on 20040514.  If
dominator optimizations were known to be broken around that time, I
need to remerge.

I have something weird here: a bug that seems to be caused by dom2.

This block:

  T.10_37 = _otable_org.kxml.parser.XmlParser[4];
  T.11_38 = (<unnamed type>)T.10_37;
  T.12_39 = T.11_38 + this_1;
  T.13_40 = *T.12_39;
  #slot#2#2_41 = T.13_40->length;
  if (#slot#2#2_41 != 1) goto *.LJpc=65; else goto <L3>;

Is followed by:

*.LJpc=65:;
  T.14_52 = _otable_org.kxml.parser.XmlParser[5];
  T.15_53 = (<unnamed type>)T.14_52;
  T.35_54 = T.15_53 + this_1;
  T.36_55 = *T.35_54;
  T.37_56 = (struct java.lang.Object *)T.36_55;
  T.38_57 = T.37_56->vtable;
  T.39_58 = _otable_org.kxml.parser.XmlParser[7];
  T.40_59 = (void * *)T.39_58;
  T.41_60 = T.38_57 + T.40_59;
  T.42_61 = *T.41_60;
  T.43_62 = (java.io.Reader:: *)T.42_61;
  T.10_63 = _otable_org.kxml.parser.XmlParser[4];
  T.11_64 = (<unnamed type>)T.10_63;
  T.44_65 = T.11_64 + this_1;
  T.45_66 = *T.44_65;
  T.46_67 = T.45_66->length;
  T.10_68 = _otable_org.kxml.parser.XmlParser[4];
  T.11_69 = (<unnamed type>)T.10_68;
  T.47_70 = T.11_69 + this_1;
  T.48_71 = *T.47_70;
  #slot#3#5_72 = T.43_62 (T.36_55, T.48_71, 0, T.46_67);

Okay, this looks like a pretty straightforward optimzation: we
shouldn't be repeatedly reading _otable_org.kxml.parser.XmlParser[4].
But dom2 doesn't quite do the right thing:

*.LJpc=65:;
  T.14_52 = _otable_org.kxml.parser.XmlParser[5];
  T.15_53 = (<unnamed type>)T.14_52;
  T.35_54 = T.15_53 + this_1;
  T.36_55 = *T.35_54;
  T.37_56 = (struct java.lang.Object *)T.36_55;
  T.38_57 = T.37_56->vtable;
  T.39_58 = _otable_org.kxml.parser.XmlParser[7];
  T.40_59 = (void * *)T.39_58;
  T.41_60 = T.38_57 + T.40_59;
  T.42_61 = *T.41_60;
  T.43_62 = (java.io.Reader:: *)T.42_61;
  T.10_63 = T.10_37;
  T.11_64 = T.11_38;
  T.44_65 = T.12_39;
  T.45_66 = T.13_40;
  T.46_67 = 0;
  T.10_68 = T.10_37;
  T.11_69 = T.11_38;
  T.47_70 = T.12_39;
  T.48_71 = T.13_40;
  #slot#3#5_72 = T.43_62 (T.36_55, T.13_40, 0, 0);

Note that T.46_67 is now 0, rather than T.13_40->length.  Somehow,
dom2 has decided that it should be 0, but I can't imagine why.

Ta,
Andrew.



More information about the Gcc mailing list