[llvm-commits] [LLVM, PR11652 PATCH]: Fixed Bug 11652 - assertion failures when Type.cpp is compiled with -Os

Duncan Sands baldrick at free.fr
Mon Jan 2 02:38:10 PST 2012


Hi Stepan,

> I tried it doesn't helps. Now it seems that ID is overwritten. 4807 unexpected failures.

OK, thanks for the info.  How about doing the bit fiddling yourself instead?
I.e. rather than trying to fool the optimizers, don't use bitfields: declare
an unsigned field IDAndSubclassData and store and load values from it using
explicit shifts etc.  This would then completely avoid all problems coming
from misoptimization of bitfields (which has happened a lot historically),
and would be less fragile than trying to fool the optimizers via some magic
incantation.

Ciao, Duncan.

> -Stepan.
>
> 02.01.2012, 14:02, "Duncan Sands"<baldrick at free.fr>:
>> Hi Stepan,
>>
>>>   The problem is in Type.h. The fields in Type class are declared in next order:
>>>   TypeID ID : 8;
>>>   unsigned SubclassData : 24;
>>>   unsigned NumContainedTys;
>>
>> does the problem still occur if you flip the order of ID and SubclassData?
>> I.e.
>>     unsigned SubclassData : 24;
>>     TypeID ID : 8;
>>     unsigned NumContainedTys;
>> ?
>> Ciao, Duncan.
>>
>>>   Attempt to set new SubclassData value rewrites lowest byte in NumContainedTys
>>>   when -Os is set. GCC bug? Anyway setting SubclassData with two workaround
>>>   strings fixes the problem:
>>>
>>>   void setSubclassData(unsigned val) {
>>>   unsigned tmp = NumContainedTys; // Workaround for GCC -Os
>>>   SubclassData = val;
>>>   NumContainedTys = tmp; // Workaround for GCC -Os
>>>   // Ensure we don't have any accidental truncation.
>>>   assert(SubclassData == val&&  "Subclass data too large for field");
>>>   }
>>>
>>>   Probably there is another ways to protect NumContainedTys from overwritting?
>>>
>>>   Please find the patch in attachment for review.
>>>
>>>   -Stepan.
>>>
>>>   _______________________________________________
>>>   llvm-commits mailing list
>>>   llvm-commits at cs.uiuc.edu
>>>   http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list