[PATCH] D97667: [loop-idiom] Hoist loop memcpys to loop preheader
Han Zhu via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon May 3 23:16:09 PDT 2021
zhuhan0 added inline comments.
================
Comment at: llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp:869
+
+ if (SizeInBytes != StoreStrideValue && SizeInBytes != -StoreStrideValue) {
+ ORE.emit([&]() {
----------------
lebedev.ri wrote:
> I suspect we will still see crashes here.
> Since you use `getSExtValue()` later, just move that to before this, and compare ints?
I tried that earlier and there was a warning when compiling this code:
```
[1284/2576] Building CXX object lib/Transforms/Scalar/CMakeFiles/LLVMScalarOpts.dir/LoopIdiomRecognize.cpp.o
/data/users/zhuhan/server-llvm/llvm-project/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp:871:19: warning: comparison of integers of different signs: 'uint64_t' (aka 'unsigned long') and 'int64_t' (aka 'long') [-Wsign-compare]
if (SizeInBytes != StoreStrideInt && SizeInBytes != -StoreStrideInt) {
~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~
/data/users/zhuhan/server-llvm/llvm-project/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp:871:52: warning: comparison of integers of different signs: 'uint64_t' (aka 'unsigned long') and 'int64_t' (aka 'long') [-Wsign-compare]
if (SizeInBytes != StoreStrideInt && SizeInBytes != -StoreStrideInt) {
~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~
2 warnings generated.
```
And I think this code should be correct because the != operator of APInt is properly overloaded:
```
inline bool operator!=(uint64_t V1, const APInt &V2) { return V2 != V1; }
```
and
```
bool operator!=(uint64_t Val) const { return !((*this) == Val); }
```
and finally
```
bool operator==(uint64_t Val) const {
return (isSingleWord() || getActiveBits() <= 64) && getZExtValue() == Val;
}
```
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D97667/new/
https://reviews.llvm.org/D97667
More information about the llvm-commits
mailing list