Feeding vector values to InstCombiner::OptimizeOverflowCheck produces a scalar boolean flag if it proves the overflow check can be eliminated.
This causes InstCombiner::CreateOverflowTuple to crash as it correctly expects a vector of i1 values instead.
Details
Diff Detail
Unit Tests
Time | Test | |
---|---|---|
270 ms | windows > lld.ELF/invalid::symtab-sh-info.s |
Event Timeline
Oh well, it turns out the results are evaluated according to all the elements so it's ok to splat it.
llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | ||
---|---|---|
4599 | This seems like wrong granularity. |
Doesn't the same issue apply to the isNeutralValue branch?
Duh, fixed that too.
llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | ||
---|---|---|
4599 | That's the prettiest way to get a constant i1xN vector I found. I'm not too familiar with the internal LLVM APIs so suggestions are more than welcome. |
Cleaned up the true/false building parts.
Added a note about LLVM not detecting if signed multiplication overflow, not much of a problem and can be fixed later.
Looks good to me, thanks.
Great, can you commit this on my behalf? I have no commit access.
@hans Is it too early to request this patch to be included in 11.0.1?
The name is LemonBoy, you can get the mail from running git log --author=LemonBoy in the LLVM repo.
TIA
llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | ||
---|---|---|
4582–4584 | I think this can be simplified to CmpInst::makeCmpResultType(LHS->getType()) |
llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | ||
---|---|---|
4582–4584 | Yup, I didn't use that because this is not the result of a comparison despite having the same type as one. |
I think this can be simplified to CmpInst::makeCmpResultType(LHS->getType())