Anton Korobeynikov
2012-Jan-20 10:41 UTC
[LLVMdev] How to force the creation of arrays with zeroes?
> you can't, you can only get a ConstantAggregateZero. This is actually kind of > annoying, and means that places expecting a ConstantArray have to remember to > also check for ConstantAggregateZero. Perhaps there's a good reason for the > current design, but if not it would be great to eliminate this wart.Well, I think the main reason it so reduce the size of .ll / .bc when all operands are zero. If the array / struct is really big then this can save a lot of space. -- With best regards, Anton Korobeynikov Faculty of Mathematics and Mechanics, Saint Petersburg State University
Duncan Sands
2012-Jan-20 10:50 UTC
[LLVMdev] How to force the creation of arrays with zeroes?
Hi Anton,>> you can't, you can only get a ConstantAggregateZero. This is actually kind of >> annoying, and means that places expecting a ConstantArray have to remember to >> also check for ConstantAggregateZero. Perhaps there's a good reason for the >> current design, but if not it would be great to eliminate this wart. > Well, I think the main reason it so reduce the size of .ll / .bc when > all operands are zero. > If the array / struct is really big then this can save a lot of space.isn't this an orthogonal issue? A ConstantVector consisting of only zeros doesn't have to be represented by storing a vast array of zero values, it could be special cased internally by setting some kind of flag. If done right, an all zero ConstantVector would then act exactly the same as every other kind of ConstantVector as far as users of ConstantVector can tell, but wouldn't take up a lot of storage. Instead, what we have now is essentially the same system only with the flag exposed to users (ConstantAggregateZero playing the role of the flag) so that all users have to worry about it, rather than this flag being hidden in the implementation of ConstantVector and ConstantStruct. Ciao, Duncan.
Stepan Dyatkovskiy
2012-Jan-20 20:16 UTC
[LLVMdev] How to force the creation of arrays with zeroes?
Hi all. I propose to use wrapper for this kind of constant objects. Consider next code: Constant* C = reinterpret_cast<Constant*>(I->getOperand(idx)); Constant* ArrayItem; if (!isa<ConstantAggregateZero>(C)) ArrayItem = reinterpret_cast<Constant*>(I->getOperand(ArrItemIdx)); else ArrayItem = ZeroInt; Code analog within wrapper: ConstOrZero C(I->getOperand(idx)); Constant* ArrayItem = C.getOperand(ArrItemIdx); // Unpleasant work with isa<> inside. Advantages of this approach is that ConstantAggregateZero saves memory and we use it everywhere. And in the same time we needn't dance with isa<ConstantAggregateZero>. If you find it fine, please look at the patch in attachment. -Stepan 20.01.2012, 14:50, "Duncan Sands" <baldrick at free.fr>:> Hi Anton, > >>> you can't, you can only get a ConstantAggregateZero. This is actually kind of >>> annoying, and means that places expecting a ConstantArray have to remember to >>> also check for ConstantAggregateZero. Perhaps there's a good reason for the >>> current design, but if not it would be great to eliminate this wart. >> Well, I think the main reason it so reduce the size of .ll / .bc when >> all operands are zero. >> If the array / struct is really big then this can save a lot of space. > > isn't this an orthogonal issue? A ConstantVector consisting of only zeros > doesn't have to be represented by storing a vast array of zero values, it > could be special cased internally by setting some kind of flag. If done right, > an all zero ConstantVector would then act exactly the same as every other kind > of ConstantVector as far as users of ConstantVector can tell, but wouldn't take > up a lot of storage. Instead, what we have now is essentially the same system > only with the flag exposed to users (ConstantAggregateZero playing the role of > the flag) so that all users have to worry about it, rather than this flag being > hidden in the implementation of ConstantVector and ConstantStruct. > > Ciao, Duncan. > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev-------------- next part -------------- A non-text attachment was scrubbed... Name: const-or-zero.patch Type: application/octet-stream Size: 5951 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120121/ab57d7e1/attachment.obj>
Reasonably Related Threads
- [LLVMdev] How to force the creation of arrays with zeroes?
- [LLVMdev] How to force the creation of arrays with zeroes?
- [LLVMdev] How to force the creation of arrays with zeroes?
- [LLVMdev] identifing mallocs with constant sizes
- [LLVMdev] How to force the creation of arrays with zeroes?