Hola LLVMers,
We saw a problem with some code in LiveIntervalAnalysis.h/.c which we’ve fixed locally. We’d like to get a patch to the mainline and want to know how you’d like it fixed. A couple of things come together to cause the problem:
struct Idx2MBBCompare {
bool operator()(const IdxMBBPair &LHS, const IdxMBBPair &RHS) const {
return LHS.first < RHS.first;
}
This comparator function compares the first elements of the IdxMBBPair. This is in contrast to the default comparator for std::pairs, which compares the second element if the first elements are equal before making a final decision. In this case, it makes a lot of sense given that the second in the pair is just a pointer.
In LiveIntervals::runOnMachineFunction, the map is sorted with this:
std::sort(Idx2MBBMap.begin(), Idx2MBBMap.end(), Idx2MBBCompare());
Ok so far.
Here is where the problem arises:
std::lower_bound(Idx2MBBMap.begin(), Idx2MBBMap.end(), LR.start);
By omitting the explicit comparator operator, the default is used which looks at second. Not a huge problem in general, since you don’t really care that the pointers are sorted.
Visual Studio’s debug STL, however, is quite the stickler. Debug lower_bound checks to see that the container is sorted and since lower_bound isn’t given a comparison function, it uses the default one which isn’t the one used to sort the container, and (boom!) it asserts if the memory stars aren’t aligned properly.
In our code we fixed this by ditching the Idx2MBBCompare operator and just added:
-
inline bool operator<(const IdxMBBPair &LHS, const IdxMBBPair &RHS) {
-
return (LHS.first < RHS.first);
-
}
The alternative is to make sure the Idx2MBBCompare is passed into the appropriate places.
How would you like this to be fixed? I can tool it up, but I don’t want to step on someone else’s feet.
Thanks,
Chuck.