[PATCH] D79914: [CodeGen][NFC] Fix test/CodeGen/pr45476.cpp to specify target triple.

2020-05-13 Thread Huihui Zhang via Phabricator via cfe-commits
huihuiz created this revision.
huihuiz added reviewers: efriedma, ekatz, rjmccall, rsmith, luismarques.
huihuiz added a project: LLVM.
Herald added subscribers: cfe-commits, jfb, kristof.beyls.
Herald added a project: clang.

Use explicit target triple to match more accurately the output for libcall
or native atomic.

Similar to D74847 , without explicit target 
triple, this test will fail for ARM.

This patch update test pr45476.cpp to check for both native atomic and libcall.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D79914

Files:
  clang/test/CodeGen/pr45476.cpp


Index: clang/test/CodeGen/pr45476.cpp
===
--- clang/test/CodeGen/pr45476.cpp
+++ clang/test/CodeGen/pr45476.cpp
@@ -1,4 +1,5 @@
-// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s
+// RUN: %clang_cc1 -triple arm-unknown-linux-gnueabi -emit-llvm %s -o - | 
FileCheck -check-prefix=LIBCALL %s
+// RUN: %clang_cc1 -triple armv8-eabi -emit-llvm %s -o - | FileCheck 
-check-prefix=NATIVE %s
 // PR45476
 
 // This test used to get into an infinite loop,
@@ -11,8 +12,10 @@
 _Atomic struct s3 a;
 
 extern "C" void foo() {
-  // CHECK-LABEL: @foo
-  // CHECK: store atomic i32
+  // LIBCALL-LABEL: @foo
+  // LIBCALL: call void @__atomic_store
+  // NATIVE-LABEL: @foo
+  // NATIVE: store atomic i32
 
   a = s3{1, 2, 3};
 }


Index: clang/test/CodeGen/pr45476.cpp
===
--- clang/test/CodeGen/pr45476.cpp
+++ clang/test/CodeGen/pr45476.cpp
@@ -1,4 +1,5 @@
-// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s
+// RUN: %clang_cc1 -triple arm-unknown-linux-gnueabi -emit-llvm %s -o - | FileCheck -check-prefix=LIBCALL %s
+// RUN: %clang_cc1 -triple armv8-eabi -emit-llvm %s -o - | FileCheck -check-prefix=NATIVE %s
 // PR45476
 
 // This test used to get into an infinite loop,
@@ -11,8 +12,10 @@
 _Atomic struct s3 a;
 
 extern "C" void foo() {
-  // CHECK-LABEL: @foo
-  // CHECK: store atomic i32
+  // LIBCALL-LABEL: @foo
+  // LIBCALL: call void @__atomic_store
+  // NATIVE-LABEL: @foo
+  // NATIVE: store atomic i32
 
   a = s3{1, 2, 3};
 }
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D79914: [CodeGen][NFC] Fix test/CodeGen/pr45476.cpp to specify target triple.

2020-05-13 Thread Huihui Zhang via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rGfd842d362662: [CodeGen][NFC] Fix test/CodeGen/pr45476.cpp to 
specify target triple. (authored by huihuiz).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D79914/new/

https://reviews.llvm.org/D79914

Files:
  clang/test/CodeGen/pr45476.cpp


Index: clang/test/CodeGen/pr45476.cpp
===
--- clang/test/CodeGen/pr45476.cpp
+++ clang/test/CodeGen/pr45476.cpp
@@ -1,4 +1,5 @@
-// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s
+// RUN: %clang_cc1 -triple arm-unknown-linux-gnueabi -emit-llvm %s -o - | 
FileCheck -check-prefix=LIBCALL %s
+// RUN: %clang_cc1 -triple armv8-eabi -emit-llvm %s -o - | FileCheck 
-check-prefix=NATIVE %s
 // PR45476
 
 // This test used to get into an infinite loop,
@@ -11,8 +12,10 @@
 _Atomic struct s3 a;
 
 extern "C" void foo() {
-  // CHECK-LABEL: @foo
-  // CHECK: store atomic i32
+  // LIBCALL-LABEL: @foo
+  // LIBCALL: call void @__atomic_store
+  // NATIVE-LABEL: @foo
+  // NATIVE: store atomic i32
 
   a = s3{1, 2, 3};
 }


Index: clang/test/CodeGen/pr45476.cpp
===
--- clang/test/CodeGen/pr45476.cpp
+++ clang/test/CodeGen/pr45476.cpp
@@ -1,4 +1,5 @@
-// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s
+// RUN: %clang_cc1 -triple arm-unknown-linux-gnueabi -emit-llvm %s -o - | FileCheck -check-prefix=LIBCALL %s
+// RUN: %clang_cc1 -triple armv8-eabi -emit-llvm %s -o - | FileCheck -check-prefix=NATIVE %s
 // PR45476
 
 // This test used to get into an infinite loop,
@@ -11,8 +12,10 @@
 _Atomic struct s3 a;
 
 extern "C" void foo() {
-  // CHECK-LABEL: @foo
-  // CHECK: store atomic i32
+  // LIBCALL-LABEL: @foo
+  // LIBCALL: call void @__atomic_store
+  // NATIVE-LABEL: @foo
+  // NATIVE: store atomic i32
 
   a = s3{1, 2, 3};
 }
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D74386: [SVE] Update API ConstantVector::getSplat() to use ElementCount.

2020-03-12 Thread Huihui Zhang via Phabricator via cfe-commits
huihuiz updated this revision to Diff 250001.
huihuiz marked 3 inline comments as done.
huihuiz added a comment.

Addressed review comments.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D74386/new/

https://reviews.llvm.org/D74386

Files:
  clang/lib/CodeGen/CGBuiltin.cpp
  llvm/include/llvm/Analysis/Utils/Local.h
  llvm/include/llvm/IR/Constants.h
  llvm/lib/Analysis/InstructionSimplify.cpp
  llvm/lib/CodeGen/CodeGenPrepare.cpp
  llvm/lib/IR/ConstantFold.cpp
  llvm/lib/IR/Constants.cpp
  llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
  llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp
  llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
  llvm/test/CodeGen/AArch64/scalable-vector-promotion.ll
  llvm/test/Transforms/InstSimplify/gep.ll
  llvm/unittests/FuzzMutate/OperationsTest.cpp
  llvm/unittests/IR/VerifierTest.cpp

Index: llvm/unittests/IR/VerifierTest.cpp
===
--- llvm/unittests/IR/VerifierTest.cpp
+++ llvm/unittests/IR/VerifierTest.cpp
@@ -57,7 +57,7 @@
   ConstantInt *CI = ConstantInt::get(ITy, 0);
 
   // Valid type : freeze(<2 x i32>)
-  Constant *CV = ConstantVector::getSplat(2, CI);
+  Constant *CV = ConstantVector::getSplat({2, false}, CI);
   FreezeInst *FI_vec = new FreezeInst(CV);
   FI_vec->insertBefore(RI);
 
Index: llvm/unittests/FuzzMutate/OperationsTest.cpp
===
--- llvm/unittests/FuzzMutate/OperationsTest.cpp
+++ llvm/unittests/FuzzMutate/OperationsTest.cpp
@@ -92,8 +92,8 @@
   ConstantStruct::get(StructType::create(Ctx, "OpaqueStruct"));
   Constant *a =
   ConstantArray::get(ArrayType::get(i32->getType(), 2), {i32, i32});
-  Constant *v8i8 = ConstantVector::getSplat(8, i8);
-  Constant *v4f16 = ConstantVector::getSplat(4, f16);
+  Constant *v8i8 = ConstantVector::getSplat({8, false}, i8);
+  Constant *v4f16 = ConstantVector::getSplat({4, false}, f16);
   Constant *p0i32 =
   ConstantPointerNull::get(PointerType::get(i32->getType(), 0));
 
Index: llvm/test/Transforms/InstSimplify/gep.ll
===
--- llvm/test/Transforms/InstSimplify/gep.ll
+++ llvm/test/Transforms/InstSimplify/gep.ll
@@ -103,3 +103,69 @@
   ret <8 x i64*> %el
 }
 
+; Check ConstantExpr::getGetElementPtr() using ElementCount for size queries - begin.
+
+; Constant ptr
+
+define i32* @ptr_idx_scalar() {
+; CHECK-LABEL: @ptr_idx_scalar(
+; CHECK-NEXT:ret i32* inttoptr (i64 4 to i32*)
+;
+  %gep = getelementptr <4 x i32>, <4 x i32>* null, i64 0, i64 1
+  ret i32* %gep
+}
+
+define <2 x i32*> @ptr_idx_vector() {
+; CHECK-LABEL: @ptr_idx_vector(
+; CHECK-NEXT:ret <2 x i32*> getelementptr (i32, i32* null, <2 x i64> )
+;
+  %gep = getelementptr i32, i32* null, <2 x i64> 
+  ret <2 x i32*> %gep
+}
+
+define <4 x i32*> @ptr_idx_mix_scalar_vector(){
+; CHECK-LABEL: @ptr_idx_mix_scalar_vector(
+; CHECK-NEXT:ret <4 x i32*> getelementptr ([42 x [3 x i32]], [42 x [3 x i32]]* null, <4 x i64> zeroinitializer, <4 x i64> , <4 x i64> zeroinitializer)
+;
+  %gep = getelementptr [42 x [3 x i32]], [42 x [3 x i32]]* null, i64 0, <4 x i64> , i64 0
+  ret <4 x i32*> %gep
+}
+
+; Constant vector
+
+define <4 x i32*> @vector_idx_scalar() {
+; CHECK-LABEL: @vector_idx_scalar(
+; CHECK-NEXT:ret <4 x i32*> getelementptr (i32, <4 x i32*> zeroinitializer, <4 x i64> )
+;
+  %gep = getelementptr i32, <4 x i32*> zeroinitializer, i64 1
+  ret <4 x i32*> %gep
+}
+
+define <4 x i32*> @vector_idx_vector() {
+; CHECK-LABEL: @vector_idx_vector(
+; CHECK-NEXT:ret <4 x i32*> getelementptr (i32, <4 x i32*> zeroinitializer, <4 x i64> )
+;
+  %gep = getelementptr i32, <4 x i32*> zeroinitializer, <4 x i64> 
+  ret <4 x i32*> %gep
+}
+
+%struct = type { double, float }
+define <4 x float*> @vector_idx_mix_scalar_vector() {
+; CHECK-LABEL: @vector_idx_mix_scalar_vector(
+; CHECK-NEXT:ret <4 x float*> getelementptr (%struct, <4 x %struct*> zeroinitializer, <4 x i64> zeroinitializer, <4 x i32> )
+;
+  %gep = getelementptr %struct, <4 x %struct*> zeroinitializer, i32 0, <4 x i32> 
+  ret <4 x float*> %gep
+}
+
+; Constant scalable
+
+define  @scalable_idx_scalar() {
+; CHECK-LABEL: @scalable_idx_scalar(
+; CHECK-NEXT:ret  getelementptr (i32,  zeroinitializer,  shufflevector ( insertelement ( undef, i64 1, i32 0),  undef,  zeroinitializer))
+;
+  %gep = getelementptr i32,  zeroinitializer, i64 1
+  ret  %gep
+}
+
+; Check ConstantExpr::getGetElementPtr() using ElementCount for size queries - end.
Index: llvm/test/CodeGen/AArch64/scalable-vector-promotion.ll
===
--- /dev/null
+++ llvm/test/CodeGen/AArch64/scalable-vector-promotion.ll
@@ -0,0 +1,23 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -mtriple=aarch64 -codegenprepare -S < %s | FileCheck %s
+
+; This test intends to check vector p

[PATCH] D74386: [SVE] Update API ConstantVector::getSplat() to use ElementCount.

2020-03-12 Thread Huihui Zhang via Phabricator via cfe-commits
huihuiz added inline comments.



Comment at: llvm/lib/CodeGen/CodeGenPrepare.cpp:6542
 
-unsigned End = getTransitionType()->getVectorNumElements();
+auto EC = getTransitionType()->getVectorElementCount();
 if (UseSplat)

efriedma wrote:
> Please write out the type ElementCount.
> 
> This is unfortunately turning the explicit assertion if the type is scalable 
> into a later verifier failure in the case where it isn't a splat.  Please 
> either fix it properly, or change it so the non-splat codepath still asserts.
Good catch! Thanks Eli!

Going with assert for non-splat codepath for scalable vector.

We should implement like:

```
UndefValue *UndefVal = UndefValue::get(getTransitionType());
Type *I32Ty = Type::getInt32Ty(getTransitionType()->getContext());
return ConstantExpr::getInsertElement(UndefVal, Val, ConstantInt::get(I32Ty, 
ExtractIdx));
```

But current target lowering will reject scalable vector earlier while checking 
isTypeLegal(EVT VT). 

I am adding a test to check this. So we get assert once target lowering is 
ready. Then I can bring in this implementation and check for its correctness.

```
define void @simpleOneInstructionPromotion(* %addr1, i32* 
%dest) {
  %in1 = load , * %addr1, align 8
  %extract = extractelement  %in1, i32 1
  %out = or i32 %extract, 1
  store i32 %out, i32* %dest, align 4
  ret void
}

```


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D74386/new/

https://reviews.llvm.org/D74386



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D74386: [SVE] Update API ConstantVector::getSplat() to use ElementCount.

2020-03-12 Thread Huihui Zhang via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rG118abf201738: [SVE] Update API ConstantVector::getSplat() to 
use ElementCount. (authored by huihuiz).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D74386/new/

https://reviews.llvm.org/D74386

Files:
  clang/lib/CodeGen/CGBuiltin.cpp
  llvm/include/llvm/Analysis/Utils/Local.h
  llvm/include/llvm/IR/Constants.h
  llvm/lib/Analysis/InstructionSimplify.cpp
  llvm/lib/CodeGen/CodeGenPrepare.cpp
  llvm/lib/IR/ConstantFold.cpp
  llvm/lib/IR/Constants.cpp
  llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
  llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp
  llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
  llvm/test/CodeGen/AArch64/scalable-vector-promotion.ll
  llvm/test/Transforms/InstSimplify/gep.ll
  llvm/unittests/FuzzMutate/OperationsTest.cpp
  llvm/unittests/IR/VerifierTest.cpp

Index: llvm/unittests/IR/VerifierTest.cpp
===
--- llvm/unittests/IR/VerifierTest.cpp
+++ llvm/unittests/IR/VerifierTest.cpp
@@ -57,7 +57,7 @@
   ConstantInt *CI = ConstantInt::get(ITy, 0);
 
   // Valid type : freeze(<2 x i32>)
-  Constant *CV = ConstantVector::getSplat(2, CI);
+  Constant *CV = ConstantVector::getSplat({2, false}, CI);
   FreezeInst *FI_vec = new FreezeInst(CV);
   FI_vec->insertBefore(RI);
 
Index: llvm/unittests/FuzzMutate/OperationsTest.cpp
===
--- llvm/unittests/FuzzMutate/OperationsTest.cpp
+++ llvm/unittests/FuzzMutate/OperationsTest.cpp
@@ -92,8 +92,8 @@
   ConstantStruct::get(StructType::create(Ctx, "OpaqueStruct"));
   Constant *a =
   ConstantArray::get(ArrayType::get(i32->getType(), 2), {i32, i32});
-  Constant *v8i8 = ConstantVector::getSplat(8, i8);
-  Constant *v4f16 = ConstantVector::getSplat(4, f16);
+  Constant *v8i8 = ConstantVector::getSplat({8, false}, i8);
+  Constant *v4f16 = ConstantVector::getSplat({4, false}, f16);
   Constant *p0i32 =
   ConstantPointerNull::get(PointerType::get(i32->getType(), 0));
 
Index: llvm/test/Transforms/InstSimplify/gep.ll
===
--- llvm/test/Transforms/InstSimplify/gep.ll
+++ llvm/test/Transforms/InstSimplify/gep.ll
@@ -103,3 +103,69 @@
   ret <8 x i64*> %el
 }
 
+; Check ConstantExpr::getGetElementPtr() using ElementCount for size queries - begin.
+
+; Constant ptr
+
+define i32* @ptr_idx_scalar() {
+; CHECK-LABEL: @ptr_idx_scalar(
+; CHECK-NEXT:ret i32* inttoptr (i64 4 to i32*)
+;
+  %gep = getelementptr <4 x i32>, <4 x i32>* null, i64 0, i64 1
+  ret i32* %gep
+}
+
+define <2 x i32*> @ptr_idx_vector() {
+; CHECK-LABEL: @ptr_idx_vector(
+; CHECK-NEXT:ret <2 x i32*> getelementptr (i32, i32* null, <2 x i64> )
+;
+  %gep = getelementptr i32, i32* null, <2 x i64> 
+  ret <2 x i32*> %gep
+}
+
+define <4 x i32*> @ptr_idx_mix_scalar_vector(){
+; CHECK-LABEL: @ptr_idx_mix_scalar_vector(
+; CHECK-NEXT:ret <4 x i32*> getelementptr ([42 x [3 x i32]], [42 x [3 x i32]]* null, <4 x i64> zeroinitializer, <4 x i64> , <4 x i64> zeroinitializer)
+;
+  %gep = getelementptr [42 x [3 x i32]], [42 x [3 x i32]]* null, i64 0, <4 x i64> , i64 0
+  ret <4 x i32*> %gep
+}
+
+; Constant vector
+
+define <4 x i32*> @vector_idx_scalar() {
+; CHECK-LABEL: @vector_idx_scalar(
+; CHECK-NEXT:ret <4 x i32*> getelementptr (i32, <4 x i32*> zeroinitializer, <4 x i64> )
+;
+  %gep = getelementptr i32, <4 x i32*> zeroinitializer, i64 1
+  ret <4 x i32*> %gep
+}
+
+define <4 x i32*> @vector_idx_vector() {
+; CHECK-LABEL: @vector_idx_vector(
+; CHECK-NEXT:ret <4 x i32*> getelementptr (i32, <4 x i32*> zeroinitializer, <4 x i64> )
+;
+  %gep = getelementptr i32, <4 x i32*> zeroinitializer, <4 x i64> 
+  ret <4 x i32*> %gep
+}
+
+%struct = type { double, float }
+define <4 x float*> @vector_idx_mix_scalar_vector() {
+; CHECK-LABEL: @vector_idx_mix_scalar_vector(
+; CHECK-NEXT:ret <4 x float*> getelementptr (%struct, <4 x %struct*> zeroinitializer, <4 x i64> zeroinitializer, <4 x i32> )
+;
+  %gep = getelementptr %struct, <4 x %struct*> zeroinitializer, i32 0, <4 x i32> 
+  ret <4 x float*> %gep
+}
+
+; Constant scalable
+
+define  @scalable_idx_scalar() {
+; CHECK-LABEL: @scalable_idx_scalar(
+; CHECK-NEXT:ret  getelementptr (i32,  zeroinitializer,  shufflevector ( insertelement ( undef, i64 1, i32 0),  undef,  zeroinitializer))
+;
+  %gep = getelementptr i32,  zeroinitializer, i64 1
+  ret  %gep
+}
+
+; Check ConstantExpr::getGetElementPtr() using ElementCount for size queries - end.
Index: llvm/test/CodeGen/AArch64/scalable-vector-promotion.ll
===
--- /dev/null
+++ llvm/test/CodeGen/AArch64/scalable-vector-promotion.ll
@@ -0,0 +1,23 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -mtriple=aarch64 -codegenprepare -S < %s |

[PATCH] D74386: [SVE] Update API ConstantVector::getSplat() to use ElementCount.

2020-02-10 Thread Huihui Zhang via Phabricator via cfe-commits
huihuiz created this revision.
huihuiz added reviewers: sdesmalen, efriedma, apazos, spatel, huntergr, 
willlovett.
huihuiz added a project: LLVM.
Herald added subscribers: cfe-commits, psnobl, rkruppe, hiraditya, tschuett.
Herald added a project: clang.

Support ConstantInt::get() and Constant::getAllOnesValue() for scalable
vector type, this requires ConstantVector::getSplat() to take in 'ElementCount',
instead of 'unsigned' number of element count.

This change is needed for D73753 .


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D74386

Files:
  clang/lib/CodeGen/CGBuiltin.cpp
  llvm/include/llvm/Analysis/Utils/Local.h
  llvm/include/llvm/IR/Constants.h
  llvm/lib/Analysis/InstructionSimplify.cpp
  llvm/lib/CodeGen/CodeGenPrepare.cpp
  llvm/lib/IR/ConstantFold.cpp
  llvm/lib/IR/Constants.cpp
  llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
  llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp
  llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
  llvm/unittests/FuzzMutate/OperationsTest.cpp
  llvm/unittests/IR/VerifierTest.cpp

Index: llvm/unittests/IR/VerifierTest.cpp
===
--- llvm/unittests/IR/VerifierTest.cpp
+++ llvm/unittests/IR/VerifierTest.cpp
@@ -57,7 +57,7 @@
   ConstantInt *CI = ConstantInt::get(ITy, 0);
 
   // Valid type : freeze(<2 x i32>)
-  Constant *CV = ConstantVector::getSplat(2, CI);
+  Constant *CV = ConstantVector::getSplat({2, false}, CI);
   FreezeInst *FI_vec = new FreezeInst(CV);
   FI_vec->insertBefore(RI);
 
Index: llvm/unittests/FuzzMutate/OperationsTest.cpp
===
--- llvm/unittests/FuzzMutate/OperationsTest.cpp
+++ llvm/unittests/FuzzMutate/OperationsTest.cpp
@@ -92,8 +92,8 @@
   ConstantStruct::get(StructType::create(Ctx, "OpaqueStruct"));
   Constant *a =
   ConstantArray::get(ArrayType::get(i32->getType(), 2), {i32, i32});
-  Constant *v8i8 = ConstantVector::getSplat(8, i8);
-  Constant *v4f16 = ConstantVector::getSplat(4, f16);
+  Constant *v8i8 = ConstantVector::getSplat({8, false}, i8);
+  Constant *v4f16 = ConstantVector::getSplat({4, false}, f16);
   Constant *p0i32 =
   ConstantPointerNull::get(PointerType::get(i32->getType(), 0));
 
Index: llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
===
--- llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -1726,9 +1726,10 @@
   // FIXME: If the step is non-constant, we create the vector splat with
   //IRBuilder. IRBuilder can constant-fold the multiply, but it doesn't
   //handle a constant vector splat.
-  Value *SplatVF = isa(Mul)
-   ? ConstantVector::getSplat(VF, cast(Mul))
-   : Builder.CreateVectorSplat(VF, Mul);
+  Value *SplatVF =
+  isa(Mul)
+  ? ConstantVector::getSplat({VF, false}, cast(Mul))
+  : Builder.CreateVectorSplat(VF, Mul);
   Builder.restoreIP(CurrIP);
 
   // We may need to add the step a number of times, depending on the unroll
@@ -3738,7 +3739,7 @@
   // incoming scalar reduction.
   VectorStart = ReductionStartValue;
 } else {
-  Identity = ConstantVector::getSplat(VF, Iden);
+  Identity = ConstantVector::getSplat({VF, false}, Iden);
 
   // This vector is the Identity vector where the first element is the
   // incoming scalar reduction.
Index: llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp
===
--- llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp
@@ -761,7 +761,7 @@
   APInt Bits = APInt::getHighBitsSet(TypeBits, TypeBits - Op1Val);
   Constant *Mask = ConstantInt::get(I.getContext(), Bits);
   if (VectorType *VT = dyn_cast(X->getType()))
-Mask = ConstantVector::getSplat(VT->getNumElements(), Mask);
+Mask = ConstantVector::getSplat(VT->getElementCount(), Mask);
   return BinaryOperator::CreateAnd(X, Mask);
 }
 
@@ -796,7 +796,7 @@
   APInt Bits = APInt::getHighBitsSet(TypeBits, TypeBits - Op1Val);
   Constant *Mask = ConstantInt::get(I.getContext(), Bits);
   if (VectorType *VT = dyn_cast(X->getType()))
-Mask = ConstantVector::getSplat(VT->getNumElements(), Mask);
+Mask = ConstantVector::getSplat(VT->getElementCount(), Mask);
   return BinaryOperator::CreateAnd(X, Mask);
 }
 
Index: llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
===
--- llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -5365,8 +5365,10 @@
   if (ScalarC && ScalarM) {
 // We allow undefs in matching, but this transform remo

[PATCH] D74386: [SVE] Update API ConstantVector::getSplat() to use ElementCount.

2020-02-13 Thread Huihui Zhang via Phabricator via cfe-commits
huihuiz updated this revision to Diff 244546.
huihuiz marked 2 inline comments as done.
huihuiz added a comment.

Thanks Eli for the review!

Add test cases to check for size query changes in 
ConstantExpr::getGetElementPtr().


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D74386/new/

https://reviews.llvm.org/D74386

Files:
  clang/lib/CodeGen/CGBuiltin.cpp
  llvm/include/llvm/Analysis/Utils/Local.h
  llvm/include/llvm/IR/Constants.h
  llvm/lib/Analysis/InstructionSimplify.cpp
  llvm/lib/CodeGen/CodeGenPrepare.cpp
  llvm/lib/IR/ConstantFold.cpp
  llvm/lib/IR/Constants.cpp
  llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
  llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp
  llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
  llvm/test/Transforms/InstSimplify/gep.ll
  llvm/unittests/FuzzMutate/OperationsTest.cpp
  llvm/unittests/IR/VerifierTest.cpp

Index: llvm/unittests/IR/VerifierTest.cpp
===
--- llvm/unittests/IR/VerifierTest.cpp
+++ llvm/unittests/IR/VerifierTest.cpp
@@ -57,7 +57,7 @@
   ConstantInt *CI = ConstantInt::get(ITy, 0);
 
   // Valid type : freeze(<2 x i32>)
-  Constant *CV = ConstantVector::getSplat(2, CI);
+  Constant *CV = ConstantVector::getSplat({2, false}, CI);
   FreezeInst *FI_vec = new FreezeInst(CV);
   FI_vec->insertBefore(RI);
 
Index: llvm/unittests/FuzzMutate/OperationsTest.cpp
===
--- llvm/unittests/FuzzMutate/OperationsTest.cpp
+++ llvm/unittests/FuzzMutate/OperationsTest.cpp
@@ -92,8 +92,8 @@
   ConstantStruct::get(StructType::create(Ctx, "OpaqueStruct"));
   Constant *a =
   ConstantArray::get(ArrayType::get(i32->getType(), 2), {i32, i32});
-  Constant *v8i8 = ConstantVector::getSplat(8, i8);
-  Constant *v4f16 = ConstantVector::getSplat(4, f16);
+  Constant *v8i8 = ConstantVector::getSplat({8, false}, i8);
+  Constant *v4f16 = ConstantVector::getSplat({4, false}, f16);
   Constant *p0i32 =
   ConstantPointerNull::get(PointerType::get(i32->getType(), 0));
 
Index: llvm/test/Transforms/InstSimplify/gep.ll
===
--- llvm/test/Transforms/InstSimplify/gep.ll
+++ llvm/test/Transforms/InstSimplify/gep.ll
@@ -103,3 +103,69 @@
   ret <8 x i64*> %el
 }
 
+; Check ConstantExpr::getGetElementPtr() using ElementCount for size queries - begin.
+
+; Constant ptr
+
+define i32* @ptr_idx_scalar() {
+; CHECK-LABEL: @ptr_idx_scalar(
+; CHECK-NEXT:ret i32* inttoptr (i64 4 to i32*)
+;
+  %gep = getelementptr <4 x i32>, <4 x i32>* null, i64 0, i64 1
+  ret i32* %gep
+}
+
+define <2 x i32*> @ptr_idx_vector() {
+; CHECK-LABEL: @ptr_idx_vector(
+; CHECK-NEXT:ret <2 x i32*> getelementptr (i32, i32* null, <2 x i64> )
+;
+  %gep = getelementptr i32, i32* null, <2 x i64> 
+  ret <2 x i32*> %gep
+}
+
+define <4 x i32*> @ptr_idx_mix_scalar_vector(){
+; CHECK-LABEL: @ptr_idx_mix_scalar_vector(
+; CHECK-NEXT:ret <4 x i32*> getelementptr ([42 x [3 x i32]], [42 x [3 x i32]]* null, <4 x i64> zeroinitializer, <4 x i64> , <4 x i64> zeroinitializer)
+;
+  %gep = getelementptr [42 x [3 x i32]], [42 x [3 x i32]]* null, i64 0, <4 x i64> , i64 0
+  ret <4 x i32*> %gep
+}
+
+; Constant vector
+
+define <4 x i32*> @vector_idx_scalar() {
+; CHECK-LABEL: @vector_idx_scalar(
+; CHECK-NEXT:ret <4 x i32*> getelementptr (i32, <4 x i32*> zeroinitializer, <4 x i64> )
+;
+  %gep = getelementptr i32, <4 x i32*> zeroinitializer, i64 1
+  ret <4 x i32*> %gep
+}
+
+define <4 x i32*> @vector_idx_vector() {
+; CHECK-LABEL: @vector_idx_vector(
+; CHECK-NEXT:ret <4 x i32*> getelementptr (i32, <4 x i32*> zeroinitializer, <4 x i64> )
+;
+  %gep = getelementptr i32, <4 x i32*> zeroinitializer, <4 x i64> 
+  ret <4 x i32*> %gep
+}
+
+%struct = type { double, float }
+define <4 x float*> @vector_idx_mix_scalar_vector() {
+; CHECK-LABEL: @vector_idx_mix_scalar_vector(
+; CHECK-NEXT:ret <4 x float*> getelementptr (%struct, <4 x %struct*> zeroinitializer, <4 x i64> zeroinitializer, <4 x i32> )
+;
+  %gep = getelementptr %struct, <4 x %struct*> zeroinitializer, i32 0, <4 x i32> 
+  ret <4 x float*> %gep
+}
+
+; Constant scalable
+
+define  @scalable_idx_scalar() {
+; CHECK-LABEL: @scalable_idx_scalar(
+; CHECK-NEXT:ret  getelementptr (i32,  zeroinitializer,  shufflevector ( insertelement ( undef, i64 1, i32 0),  undef,  zeroinitializer))
+;
+  %gep = getelementptr i32,  zeroinitializer, i64 1
+  ret  %gep
+}
+
+; Check ConstantExpr::getGetElementPtr() using ElementCount for size queries - end.
Index: llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
===
--- llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -1726,9 +1726,10 @@
   // FIXME: If the step is non-constant, we create the vector splat with
   //IRBuilder. IRBuilder can constant-fol