[llvm] a9129f8 - [LoadStoreVectorizer] Support opaque pointers

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Sun Jun 27 06:42:27 PDT 2021


Author: Nikita Popov
Date: 2021-06-27T15:42:16+02:00
New Revision: a9129f8964ed8521f7cd0b25a6a6c6c1ce27fe19

URL: https://github.com/llvm/llvm-project/commit/a9129f8964ed8521f7cd0b25a6a6c6c1ce27fe19
DIFF: https://github.com/llvm/llvm-project/commit/a9129f8964ed8521f7cd0b25a6a6c6c1ce27fe19.diff

LOG: [LoadStoreVectorizer] Support opaque pointers

There are remaining redundant bitcasts.

Added: 
    llvm/test/Transforms/LoadStoreVectorizer/X86/opaque-ptr.ll

Modified: 
    llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp b/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
index a61ebac49c0d0..3b90997100f12 100644
--- a/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
@@ -312,8 +312,8 @@ bool Vectorizer::isConsecutiveAccess(Value *A, Value *B) {
     return false;
 
   // Make sure that A and B are 
diff erent pointers of the same size type.
-  Type *PtrATy = PtrA->getType()->getPointerElementType();
-  Type *PtrBTy = PtrB->getType()->getPointerElementType();
+  Type *PtrATy = getLoadStoreType(A);
+  Type *PtrBTy = getLoadStoreType(B);
   if (PtrA == PtrB ||
       PtrATy->isVectorTy() != PtrBTy->isVectorTy() ||
       DL.getTypeStoreSize(PtrATy) != DL.getTypeStoreSize(PtrBTy) ||

diff  --git a/llvm/test/Transforms/LoadStoreVectorizer/X86/opaque-ptr.ll b/llvm/test/Transforms/LoadStoreVectorizer/X86/opaque-ptr.ll
new file mode 100644
index 0000000000000..3d610ea1c947f
--- /dev/null
+++ b/llvm/test/Transforms/LoadStoreVectorizer/X86/opaque-ptr.ll
@@ -0,0 +1,21 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -mtriple=x86_64-unknown-linux-gnu -load-store-vectorizer -S < %s | FileCheck %s
+
+define void @test(ptr %ptr) {
+; CHECK-LABEL: @test(
+; CHECK-NEXT:    [[TMP1:%.*]] = bitcast ptr [[PTR:%.*]] to <2 x i32>*
+; CHECK-NEXT:    [[TMP2:%.*]] = load <2 x i32>, <2 x i32>* [[TMP1]], align 4
+; CHECK-NEXT:    [[L11:%.*]] = extractelement <2 x i32> [[TMP2]], i32 0
+; CHECK-NEXT:    [[L22:%.*]] = extractelement <2 x i32> [[TMP2]], i32 1
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast ptr [[PTR]] to <2 x i32>*
+; CHECK-NEXT:    store <2 x i32> zeroinitializer, <2 x i32>* [[TMP3]], align 4
+; CHECK-NEXT:    ret void
+;
+  %ptr2 = getelementptr i32, ptr %ptr, i64 1
+  %l1 = load i32, ptr %ptr, align 4
+  %l2 = load i32, ptr %ptr2, align 4
+  store i32 0, ptr %ptr, align 4
+  store i32 0, ptr %ptr2, align 4
+  ret void
+}
+


        


More information about the llvm-commits mailing list