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

Stepan Dyatkovskiy STPWORLD at narod.ru
Mon Jan 2 02:55:53 PST 2012


ID is used very extensively in Type.h. We need to fix a lots, so we need to fix all methods like:
bool isIntegerTy() const { return ID == IntegerTyID; } 

But in the same time we can apply some working decision until gcc bug will fixed.
May be add some dummy field?
  TypeID   ID : 8;                        
  unsigned SubclassData : 24;
  unsigned KungFuPanda;        // Will protect NumContainedTys from overwriting.
  unsigned NumContainedTys; // Will OK.

-Stepan.

02.01.2012, 14:38, "Duncan Sands" <baldrick at free.fr>:
> 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