We use getExtractWithExtendCost to calculate the cost of extractelement and s|zext together when computing the extract cost after vectorization, but we calculate the cost of extractelement and s|zext separately when computing the scalar cost which is larger than it should be.
Details
Details
Diff Detail
Diff Detail
- Repository
- rL LLVM
Event Timeline
test/Transforms/SLPVectorizer/AArch64/ext-trunc.ll | ||
---|---|---|
2 ↗ | (On Diff #141772) | Could you regenerate test checks without your patch and without -instcombine first and commit as NFC? And after that generate these checks with your patch |
lib/Transforms/Vectorize/SLPVectorizer.cpp | ||
---|---|---|
2199 ↗ | (On Diff #142022) | I think you need to check that Ext user is GEP and Ext is used as GEP index. |
lib/Transforms/Vectorize/SLPVectorizer.cpp | ||
---|---|---|
2201 ↗ | (On Diff #142063) | I think you can use just GetElementPtr::classof here as a predicate. Also, it would be good to have negative test(s) for the situation where this should not work. |
lib/Transforms/Vectorize/SLPVectorizer.cpp | ||
---|---|---|
2201 ↗ | (On Diff #142063) | No, I meant that instead of lambda you can just use GetElementPtrInst::classof llvm::all_of(Ext->users(), GetElementPtrInst::classof) |
lib/Transforms/Vectorize/SLPVectorizer.cpp | ||
---|---|---|
2201 ↗ | (On Diff #142063) | I tried, but I got this error when compiling llvm/ADT/STLExtras.h:846:6: note: candidate template ignored: couldn't infer template argument 'UnaryPredicate' |
lib/Transforms/Vectorize/SLPVectorizer.cpp | ||
---|---|---|
2201 ↗ | (On Diff #142063) | Ok then, revert back to isa |