r339207 - [CodeGen] IncompleteArray Support

2018-08-07 Thread Balaji V. Iyer via cfe-commits
Author: bviyer
Date: Tue Aug  7 17:01:21 2018
New Revision: 339207

URL: http://llvm.org/viewvc/llvm-project?rev=339207&view=rev
Log:
[CodeGen] IncompleteArray Support 

Added code to support ArrayType that is not ConstantArray.

https://reviews.llvm.org/D49952
rdar://42476155



Added:
cfe/trunk/test/CodeGenCXX/empty-struct-init-list.cpp
Modified:
cfe/trunk/lib/CodeGen/CGExprConstant.cpp

Modified: cfe/trunk/lib/CodeGen/CGExprConstant.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprConstant.cpp?rev=339207&r1=339206&r2=339207&view=diff
==
--- cfe/trunk/lib/CodeGen/CGExprConstant.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExprConstant.cpp Tue Aug  7 17:01:21 2018
@@ -1968,6 +1968,16 @@ llvm::Constant *ConstantEmitter::tryEmit
   Elts.push_back(C);
 }
 
+// This means that the array type is probably "IncompleteType" or some
+// type that is not ConstantArray.
+if (CAT == nullptr && CommonElementType == nullptr && !NumInitElts) {
+  const ArrayType *AT = CGM.getContext().getAsArrayType(DestType);
+  CommonElementType = CGM.getTypes().ConvertType(AT->getElementType());
+  llvm::ArrayType *AType = llvm::ArrayType::get(CommonElementType,
+NumElements);
+  return llvm::ConstantAggregateZero::get(AType);
+}
+
 return EmitArrayConstant(CGM, CAT, CommonElementType, NumElements, Elts,
  Filler);
   }

Added: cfe/trunk/test/CodeGenCXX/empty-struct-init-list.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/empty-struct-init-list.cpp?rev=339207&view=auto
==
--- cfe/trunk/test/CodeGenCXX/empty-struct-init-list.cpp (added)
+++ cfe/trunk/test/CodeGenCXX/empty-struct-init-list.cpp Tue Aug  7 17:01:21 
2018
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -std=c++11 -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -std=c++14 -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -std=c++17 -emit-llvm -o - %s | FileCheck %s
+
+// CHECK: struct.a
+typedef struct { } a;
+typedef struct {
+  a b[];
+} c;
+
+// CHECK: global %struct.c zeroinitializer, align 1
+c d{ };


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


r339216 - Fixed a breaking test case

2018-08-07 Thread Balaji V. Iyer via cfe-commits
Author: bviyer
Date: Tue Aug  7 19:47:28 2018
New Revision: 339216

URL: http://llvm.org/viewvc/llvm-project?rev=339216&view=rev
Log:
Fixed a breaking test case

Modified:
cfe/trunk/test/CodeGenCXX/empty-struct-init-list.cpp

Modified: cfe/trunk/test/CodeGenCXX/empty-struct-init-list.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/empty-struct-init-list.cpp?rev=339216&r1=339215&r2=339216&view=diff
==
--- cfe/trunk/test/CodeGenCXX/empty-struct-init-list.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/empty-struct-init-list.cpp Tue Aug  7 19:47:28 
2018
@@ -8,5 +8,5 @@ typedef struct {
   a b[];
 } c;
 
-// CHECK: global %struct.c zeroinitializer, align 1
+// CHECK: {{(dso_local )?}}global %struct.c{{.*}}zeroinitializer
 c d{ };


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


r339085 - Performing a test commmit as requested by Chris Lattner.

2018-08-09 Thread Balaji V. Iyer via cfe-commits
Author: bviyer
Date: Mon Aug  6 17:31:44 2018
New Revision: 339085

URL: http://llvm.org/viewvc/llvm-project?rev=339085&view=rev
Log:
Performing a test commmit as requested by Chris Lattner.
-This line, and those below, will be ignored--

MTemplateBase.h

Modified:
cfe/trunk/include/clang/AST/TemplateBase.h

Modified: cfe/trunk/include/clang/AST/TemplateBase.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/TemplateBase.h?rev=339085&r1=339084&r2=339085&view=diff
==
--- cfe/trunk/include/clang/AST/TemplateBase.h (original)
+++ cfe/trunk/include/clang/AST/TemplateBase.h Mon Aug  6 17:31:44 2018
@@ -467,7 +467,7 @@ public:
   : Argument(Argument), LocInfo(E) {
 
 // Permit any kind of template argument that can be represented with an
-// expression
+// expression.
 assert(Argument.getKind() == TemplateArgument::NullPtr ||
Argument.getKind() == TemplateArgument::Integral ||
Argument.getKind() == TemplateArgument::Declaration ||


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


[mlir] [llvm] [clang-tools-extra] [mlir][Vectorizer] Added support to Vectorize tensor.unpack (PR #76087)

2024-02-04 Thread Balaji V. Iyer. via cfe-commits

https://github.com/bviyer updated 
https://github.com/llvm/llvm-project/pull/76087

>From d97a5729f496fb603f4fb9cf2977b015d8e37ed6 Mon Sep 17 00:00:00 2001
From: "Balaji V. Iyer" 
Date: Thu, 30 Nov 2023 20:39:55 +
Subject: [PATCH 1/3] [mlir][Vectorizer] Vectorize `tensor.unpack`

This patch allows vectorization of a `tensor.unpack` operation.
---
 .../Linalg/Transforms/Vectorization.cpp   | 96 +++
 1 file changed, 96 insertions(+)

diff --git a/mlir/lib/Dialect/Linalg/Transforms/Vectorization.cpp 
b/mlir/lib/Dialect/Linalg/Transforms/Vectorization.cpp
index f9a53a8451a60..7a9846154bf34 100644
--- a/mlir/lib/Dialect/Linalg/Transforms/Vectorization.cpp
+++ b/mlir/lib/Dialect/Linalg/Transforms/Vectorization.cpp
@@ -19,6 +19,7 @@
 #include "mlir/Dialect/Linalg/Transforms/Transforms.h"
 #include "mlir/Dialect/Linalg/Utils/Utils.h"
 #include "mlir/Dialect/Tensor/IR/Tensor.h"
+#include "mlir/Dialect/Utils/IndexingUtils.h"
 #include "mlir/Dialect/Utils/StructuredOpsUtils.h"
 #include "mlir/Dialect/Vector/IR/VectorOps.h"
 #include "mlir/Dialect/Vector/Interfaces/MaskableOpInterface.h"
@@ -1385,6 +1386,88 @@ vectorizeAsLinalgGeneric(RewriterBase &rewriter, 
VectorizationState &state,
 
   return success();
 }
+// Vectorize an `tensor::UnPackOp` without OuterDimsPerms to these 4 Ops:
+//   Vector::TransferReadOp - Reads the Vector Array of Source data
+//   vector::TransposeOp - Transpose the Source
+//   ShapeCastOp - Reshapes the data based on the target.
+//   vector::TransferWriteOp. - Write the result vector back.
+
+static LogicalResult vectorizeAsUnpackOp(RewriterBase &rewriter,
+ tensor::UnPackOp unpackOp,
+ ArrayRef inputVectorSizes,
+ SmallVectorImpl &newResults) {
+
+  if (!unpackOp.getOuterDimsPerm().empty()) {
+LDBG("outer dimensions perms NYI for: " << unpackOp);
+return failure();
+  }
+
+  OpBuilder::InsertionGuard g(rewriter);
+  rewriter.setInsertionPoint(unpackOp);
+
+  RankedTensorType packTensorType = unpackOp.getSourceType();
+  auto maskType =
+  VectorType::get(packTensorType.getShape(), rewriter.getI1Type());
+  auto vectorType = VectorType::get(packTensorType.getShape(),
+packTensorType.getElementType());
+  ReifiedRankedShapedTypeDims reifiedRetShapes;
+  LogicalResult status =
+  cast(unpackOp.getOperation())
+  .reifyResultShapes(rewriter, reifiedRetShapes);
+  if (status.failed()) {
+LDBG("Unable to reify result shapes of " << unpackOp);
+return failure();
+  }
+
+  arith::ConstantIndexOp zeroOp =
+  rewriter.create(unpackOp->getLoc(), 0);
+  Value mask = rewriter.create(
+  unpackOp.getLoc(), maskType,
+  tensor::getMixedSizes(rewriter, unpackOp.getLoc(), 
unpackOp.getSource()));
+
+  vector::TransferReadOp readOp = rewriter.create(
+  unpackOp.getLoc(), vectorType, unpackOp.getSource(),
+  SmallVector(packTensorType.getRank(), zeroOp),
+  rewriter.getMultiDimIdentityMap(packTensorType.getRank()));
+
+  vector::MaskOp maskedOp =
+  cast(mlir::vector::maskOperation(rewriter, readOp, 
mask));
+
+  int64_t numPackedDim = unpackOp.getInnerDimsPos().size();
+  int64_t packRank = packTensorType.getRank();
+  auto lastDims =
+  llvm::to_vector(llvm::seq(packRank - numPackedDim, packRank));
+  PackingMetadata packMetadata =
+  computePackingMetadata(packRank, unpackOp.getInnerDimsPos());
+  SmallVector lastDimToInsertPosPerm = computePermutationVector(
+  packRank, lastDims, packMetadata.insertPositions);
+  SmallVector stripMineShape(packTensorType.getShape());
+  applyPermutationToVector(stripMineShape, lastDimToInsertPosPerm);
+
+  RankedTensorType stripMineTensorType =
+  RankedTensorType::Builder(packTensorType).setShape(stripMineShape);
+
+  RankedTensorType collapsedType = tensor::CollapseShapeOp::inferCollapsedType(
+  stripMineTensorType, packMetadata.reassociations);
+  auto vecCollapsedType =
+  VectorType::get(collapsedType.getShape(), 
collapsedType.getElementType());
+
+  vector::TransposeOp transposeOp = rewriter.create(
+  unpackOp.getLoc(), maskedOp.getResult(0), lastDimToInsertPosPerm);
+
+  vector::ShapeCastOp shapeCastOp = rewriter.create(
+  unpackOp.getLoc(), vecCollapsedType, transposeOp->getResult(0));
+  tensor::EmptyOp emptyOp = rewriter.create(
+  unpackOp.getLoc(), reifiedRetShapes[0], packTensorType.getElementType());
+
+  vector::TransferWriteOp writeOp = rewriter.create(
+  unpackOp.getLoc(), shapeCastOp->getResult(0), emptyOp,
+  SmallVector(lastDims.size(), zeroOp),
+  SmallVector(lastDims.size(), true));
+
+  newResults.push_back(writeOp->getResult(0));
+  return success();
+}
 
 /// Vectorize a `padOp` with (1) static result type, (2) constant padding value
 /// and (3) all-zero lowPad to
@@ -1578,6 +1661,12 @@ vectorizeLinalgOpPrecondition(LinalgOp linalgOp,
   return success