[PATCH] D156910: [clang] Add pragma force_vectorize

2023-08-12 Thread Maksim Kita via Phabricator via cfe-commits
kitaisreal updated this revision to Diff 549600.
kitaisreal added a comment.
Herald added a subscriber: zzheng.

Fixed tests.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D156910

Files:
  clang/include/clang/Basic/Attr.td
  clang/include/clang/Basic/DiagnosticFrontendKinds.td
  clang/include/clang/Basic/DiagnosticParseKinds.td
  clang/lib/CodeGen/CGLoopInfo.cpp
  clang/lib/CodeGen/CGLoopInfo.h
  clang/lib/CodeGen/CodeGenAction.cpp
  clang/lib/Parse/ParsePragma.cpp
  clang/lib/Sema/SemaStmtAttr.cpp
  clang/test/Parser/pragma-loop.cpp
  clang/test/Parser/pragma-unroll-and-jam.cpp
  llvm/include/llvm/IR/DiagnosticInfo.h
  llvm/lib/IR/DiagnosticInfo.cpp
  llvm/lib/Transforms/Scalar/WarnMissedTransforms.cpp
  llvm/lib/Transforms/Utils/LoopUtils.cpp

Index: llvm/lib/Transforms/Utils/LoopUtils.cpp
===
--- llvm/lib/Transforms/Utils/LoopUtils.cpp
+++ llvm/lib/Transforms/Utils/LoopUtils.cpp
@@ -389,6 +389,11 @@
 }
 
 TransformationMode llvm::hasVectorizeTransformation(const Loop *L) {
+  std::optional EnableForceVectorize =
+  getOptionalBoolLoopAttribute(L, "llvm.loop.vectorize.force_vectorize");
+  if (EnableForceVectorize == true)
+return TM_ForcedByUser;
+
   std::optional Enable =
   getOptionalBoolLoopAttribute(L, "llvm.loop.vectorize.enable");
 
Index: llvm/lib/Transforms/Scalar/WarnMissedTransforms.cpp
===
--- llvm/lib/Transforms/Scalar/WarnMissedTransforms.cpp
+++ llvm/lib/Transforms/Scalar/WarnMissedTransforms.cpp
@@ -19,8 +19,8 @@
 
 #define DEBUG_TYPE "transform-warning"
 
-/// Emit warnings for forced (i.e. user-defined) loop transformations which have
-/// still not been performed.
+/// Emit warnings or errors for forced (i.e. user-defined) loop transformations
+/// which have still not been performed.
 static void warnAboutLeftoverTransformations(Loop *L,
  OptimizationRemarkEmitter *ORE) {
   if (hasUnrollTransformation(L) == TM_ForcedByUser) {
@@ -51,8 +51,19 @@
 getOptionalElementCountLoopAttribute(L);
 std::optional InterleaveCount =
 getOptionalIntLoopAttribute(L, "llvm.loop.interleave.count");
+std::optional ForceVectorize =
+getOptionalBoolLoopAttribute(L, "llvm.loop.vectorize.force_vectorize");
 
-if (!VectorizeWidth || VectorizeWidth->isVector())
+if (ForceVectorize == true)
+  ORE->emit(
+  DiagnosticInfoOptimizationFailure(
+  DEBUG_TYPE, "FailedRequestedForceVectorization", L->getStartLoc(),
+  L->getHeader(), DS_Error)
+  << "loop not force vectorized: the optimizer was unable to perform "
+ "the "
+ "requested transformation; the transformation might be disabled "
+ "or specified as part of an unsupported transformation ordering");
+else if (!VectorizeWidth || VectorizeWidth->isVector())
   ORE->emit(
   DiagnosticInfoOptimizationFailure(DEBUG_TYPE,
 "FailedRequestedVectorization",
Index: llvm/lib/IR/DiagnosticInfo.cpp
===
--- llvm/lib/IR/DiagnosticInfo.cpp
+++ llvm/lib/IR/DiagnosticInfo.cpp
@@ -351,14 +351,14 @@
 
 DiagnosticInfoOptimizationFailure::DiagnosticInfoOptimizationFailure(
 const char *PassName, StringRef RemarkName, const DiagnosticLocation &Loc,
-const Value *CodeRegion)
+const Value *CodeRegion, DiagnosticSeverity Severity)
 : DiagnosticInfoIROptimization(
-  DK_OptimizationFailure, DS_Warning, PassName, RemarkName,
+  DK_OptimizationFailure, Severity, PassName, RemarkName,
   *cast(CodeRegion)->getParent(), Loc, CodeRegion) {}
 
 bool DiagnosticInfoOptimizationFailure::isEnabled() const {
-  // Only print warnings.
-  return getSeverity() == DS_Warning;
+  // Only print warnings and errors.
+  return getSeverity() == DS_Warning || getSeverity() == DS_Error;
 }
 
 void DiagnosticInfoUnsupported::print(DiagnosticPrinter &DP) const {
Index: llvm/include/llvm/IR/DiagnosticInfo.h
===
--- llvm/include/llvm/IR/DiagnosticInfo.h
+++ llvm/include/llvm/IR/DiagnosticInfo.h
@@ -341,7 +341,7 @@
 
   /// Return the absolute path tot the file.
   std::string getAbsolutePath() const;
-  
+
   const Function &getFunction() const { return Fn; }
   DiagnosticLocation getLocation() const { return Loc; }
 
@@ -983,9 +983,10 @@
   /// of the diagnostic.
   DiagnosticInfoOptimizationFailure(const Function &Fn,
 const DiagnosticLocation &Loc,
-const Twine &Msg)
-  : DiagnosticInfoIROptimization(DK_OptimizationFailure, DS_Warning,
- nullptr, Fn, Loc, Msg) {}
+   

[PATCH] D156910: [clang] Add pragma force_vectorize

2023-08-21 Thread Maksim Kita via Phabricator via cfe-commits
kitaisreal added a comment.
Herald added a subscriber: sunshaoce.

Hello @aaron.ballman, @erichkeane could you please review this revision ? I 
wondering if this feature would be useful.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D156910

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


[PATCH] D156556: [AggressiveInstCombine][NFC] Fix typo

2023-08-02 Thread Maksim Kita via Phabricator via cfe-commits
kitaisreal updated this revision to Diff 546381.
kitaisreal retitled this revision from "[AggressiveInstCombine] Fold strcmp eq, 
not eq operator improvements" to "[AggressiveInstCombine][NFC] Fix typo".
kitaisreal edited the summary of this revision.
kitaisreal added a comment.
Herald added a reviewer: aaron.ballman.
Herald added subscribers: cfe-commits, wangpc.
Herald added a project: clang.

Transformed this to fix typo after https://reviews.llvm.org/D156620 was landed.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D156556

Files:
  clang/include/clang/Basic/Attr.td
  clang/include/clang/Parse/LoopHint.h
  clang/lib/Parse/ParsePragma.cpp
  llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp

Index: llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
===
--- llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
+++ llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
@@ -934,13 +934,8 @@
   size_t ConstantStrSize = ConstantStr.size();
 
   // Trivial cases are optimized during inst combine
-  if (ConstantStrSize == 0) {
+  if (ConstantStrSize == 0 || ConstantStrSize > 2)
 return false;
-  }
-
-  if (ConstantStrSize > 2) {
-return false;
-  }
 
   // Check if strcmp result is only used in a comparison with zero
   if (!isOnlyUsedInZeroComparison(CI))
@@ -960,7 +955,7 @@
   // For strcmp(P, "xy") do the following transformation:
   //
   // (before)
-  // dst = strcmp(P, "x")
+  // dst = strcmp(P, "xy")
   //
   // (after)
   // v0 = P[0] - 'x'
@@ -1000,19 +995,19 @@
 static_cast(ConstantStr[CharacterIndexToCheck]));
 Value *CharacterSub =
 B.CreateNSWSub(StrCharacterValue, ConstantStrCharacterValue);
-Value *IsCharacterSubZero =
+Value *CharacterSubIsZero =
 B.CreateICmpEQ(CharacterSub, ConstantInt::get(RetType, 0));
-BasicBlock *IsCharacterSubZeroBB =
+BasicBlock *CharacterSubIsZeroBB =
 BasicBlock::Create(B.getContext(), "strcmp_expand_sub_is_zero",
InitialBB->getParent(), JoinBlock);
-B.CreateCondBr(IsCharacterSubZero, IsCharacterSubZeroBB, JoinBlock);
+B.CreateCondBr(CharacterSubIsZero, CharacterSubIsZeroBB, JoinBlock);
 
 ResultPHI->addIncoming(CharacterSub, B.GetInsertBlock());
 DTUpdates.emplace_back(DominatorTree::Insert, B.GetInsertBlock(),
-   IsCharacterSubZeroBB);
+   CharacterSubIsZeroBB);
 
-B.SetInsertPoint(IsCharacterSubZeroBB);
-DTUpdates.emplace_back(DominatorTree::Insert, IsCharacterSubZeroBB,
+B.SetInsertPoint(CharacterSubIsZeroBB);
+DTUpdates.emplace_back(DominatorTree::Insert, CharacterSubIsZeroBB,
JoinBlock);
   }
 
Index: clang/lib/Parse/ParsePragma.cpp
===
--- clang/lib/Parse/ParsePragma.cpp
+++ clang/lib/Parse/ParsePragma.cpp
@@ -1362,6 +1362,7 @@
   assert(!Toks.empty() &&
  "PragmaLoopHintInfo::Toks must contain at least one token.");
 
+
   // If no option is specified the argument is assumed to be a constant expr.
   bool OptionUnroll = false;
   bool OptionUnrollAndJam = false;
@@ -1382,6 +1383,7 @@
   OptionPipelineDisabled;
   }
 
+
   bool AssumeSafetyArg = !OptionUnroll && !OptionUnrollAndJam &&
  !OptionDistribute && !OptionPipelineDisabled;
   // Verify loop hint has an argument.
Index: clang/include/clang/Parse/LoopHint.h
===
--- clang/include/clang/Parse/LoopHint.h
+++ clang/include/clang/Parse/LoopHint.h
@@ -27,6 +27,7 @@
   // Name of the loop hint.  Examples: "unroll", "vectorize".  In the
   // "#pragma unroll" and "#pragma nounroll" cases, this is identical to
   // PragmaNameLoc.
+
   IdentifierLoc *OptionLoc = nullptr;
   // Identifier for the hint state argument.  If null, then the state is
   // default value such as for "#pragma unroll".
Index: clang/include/clang/Basic/Attr.td
===
--- clang/include/clang/Basic/Attr.td
+++ clang/include/clang/Basic/Attr.td
@@ -3687,6 +3687,7 @@
 def LoopHint : Attr {
   /// #pragma clang loop  directive
   /// vectorize: vectorizes loop operations if State == Enable.
+  /// force_vectorize: force vectorizes loop operations if State == Enable.
   /// vectorize_width: vectorize loop operations with width 'Value'.
   /// interleave: interleave multiple loop iterations if State == Enable.
   /// interleave_count: interleaves 'Value' loop iterations.
@@ -3709,7 +3710,7 @@
 
   /// State of the loop optimization specified by the spelling.
   let Args = [EnumArgument<"Option", "OptionType",
-  ["vectorize", "vectorize_width", "interleave", "interleave_count",
+  

[PATCH] D156556: [AggressiveInstCombine][NFC] Fix typo

2023-08-02 Thread Maksim Kita via Phabricator via cfe-commits
kitaisreal updated this revision to Diff 546386.
kitaisreal added a comment.

Uploaded correct patch.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D156556

Files:
  llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp


Index: llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
===
--- llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
+++ llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
@@ -934,13 +934,8 @@
   size_t ConstantStrSize = ConstantStr.size();
 
   // Trivial cases are optimized during inst combine
-  if (ConstantStrSize == 0) {
+  if (ConstantStrSize == 0 || ConstantStrSize > 2)
 return false;
-  }
-
-  if (ConstantStrSize > 2) {
-return false;
-  }
 
   // Check if strcmp result is only used in a comparison with zero
   if (!isOnlyUsedInZeroComparison(CI))
@@ -960,7 +955,7 @@
   // For strcmp(P, "xy") do the following transformation:
   //
   // (before)
-  // dst = strcmp(P, "x")
+  // dst = strcmp(P, "xy")
   //
   // (after)
   // v0 = P[0] - 'x'
@@ -1000,19 +995,19 @@
 static_cast(ConstantStr[CharacterIndexToCheck]));
 Value *CharacterSub =
 B.CreateNSWSub(StrCharacterValue, ConstantStrCharacterValue);
-Value *IsCharacterSubZero =
+Value *CharacterSubIsZero =
 B.CreateICmpEQ(CharacterSub, ConstantInt::get(RetType, 0));
-BasicBlock *IsCharacterSubZeroBB =
+BasicBlock *CharacterSubIsZeroBB =
 BasicBlock::Create(B.getContext(), "strcmp_expand_sub_is_zero",
InitialBB->getParent(), JoinBlock);
-B.CreateCondBr(IsCharacterSubZero, IsCharacterSubZeroBB, JoinBlock);
+B.CreateCondBr(CharacterSubIsZero, CharacterSubIsZeroBB, JoinBlock);
 
 ResultPHI->addIncoming(CharacterSub, B.GetInsertBlock());
 DTUpdates.emplace_back(DominatorTree::Insert, B.GetInsertBlock(),
-   IsCharacterSubZeroBB);
+   CharacterSubIsZeroBB);
 
-B.SetInsertPoint(IsCharacterSubZeroBB);
-DTUpdates.emplace_back(DominatorTree::Insert, IsCharacterSubZeroBB,
+B.SetInsertPoint(CharacterSubIsZeroBB);
+DTUpdates.emplace_back(DominatorTree::Insert, CharacterSubIsZeroBB,
JoinBlock);
   }
 


Index: llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
===
--- llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
+++ llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
@@ -934,13 +934,8 @@
   size_t ConstantStrSize = ConstantStr.size();
 
   // Trivial cases are optimized during inst combine
-  if (ConstantStrSize == 0) {
+  if (ConstantStrSize == 0 || ConstantStrSize > 2)
 return false;
-  }
-
-  if (ConstantStrSize > 2) {
-return false;
-  }
 
   // Check if strcmp result is only used in a comparison with zero
   if (!isOnlyUsedInZeroComparison(CI))
@@ -960,7 +955,7 @@
   // For strcmp(P, "xy") do the following transformation:
   //
   // (before)
-  // dst = strcmp(P, "x")
+  // dst = strcmp(P, "xy")
   //
   // (after)
   // v0 = P[0] - 'x'
@@ -1000,19 +995,19 @@
 static_cast(ConstantStr[CharacterIndexToCheck]));
 Value *CharacterSub =
 B.CreateNSWSub(StrCharacterValue, ConstantStrCharacterValue);
-Value *IsCharacterSubZero =
+Value *CharacterSubIsZero =
 B.CreateICmpEQ(CharacterSub, ConstantInt::get(RetType, 0));
-BasicBlock *IsCharacterSubZeroBB =
+BasicBlock *CharacterSubIsZeroBB =
 BasicBlock::Create(B.getContext(), "strcmp_expand_sub_is_zero",
InitialBB->getParent(), JoinBlock);
-B.CreateCondBr(IsCharacterSubZero, IsCharacterSubZeroBB, JoinBlock);
+B.CreateCondBr(CharacterSubIsZero, CharacterSubIsZeroBB, JoinBlock);
 
 ResultPHI->addIncoming(CharacterSub, B.GetInsertBlock());
 DTUpdates.emplace_back(DominatorTree::Insert, B.GetInsertBlock(),
-   IsCharacterSubZeroBB);
+   CharacterSubIsZeroBB);
 
-B.SetInsertPoint(IsCharacterSubZeroBB);
-DTUpdates.emplace_back(DominatorTree::Insert, IsCharacterSubZeroBB,
+B.SetInsertPoint(CharacterSubIsZeroBB);
+DTUpdates.emplace_back(DominatorTree::Insert, CharacterSubIsZeroBB,
JoinBlock);
   }
 
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D156910: [clang] Add pragma force_vectorize

2023-08-02 Thread Maksim Kita via Phabricator via cfe-commits
kitaisreal created this revision.
kitaisreal added a reviewer: aaron.ballman.
kitaisreal added projects: All, LLVM.
Herald added a subscriber: hiraditya.
kitaisreal requested review of this revision.
Herald added subscribers: llvm-commits, cfe-commits, wangpc.
Herald added a project: clang.

Add pragma force_vectorize to emit error if loop is not vectorized.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D156910

Files:
  clang/include/clang/Basic/Attr.td
  clang/include/clang/Basic/DiagnosticParseKinds.td
  clang/lib/CodeGen/CGLoopInfo.cpp
  clang/lib/CodeGen/CGLoopInfo.h
  clang/lib/CodeGen/CodeGenAction.cpp
  clang/lib/Parse/ParsePragma.cpp
  clang/lib/Sema/SemaStmtAttr.cpp
  llvm/include/llvm/IR/DiagnosticInfo.h
  llvm/lib/IR/DiagnosticInfo.cpp
  llvm/lib/Transforms/Scalar/WarnMissedTransforms.cpp
  llvm/lib/Transforms/Utils/LoopUtils.cpp

Index: llvm/lib/Transforms/Utils/LoopUtils.cpp
===
--- llvm/lib/Transforms/Utils/LoopUtils.cpp
+++ llvm/lib/Transforms/Utils/LoopUtils.cpp
@@ -389,6 +389,11 @@
 }
 
 TransformationMode llvm::hasVectorizeTransformation(const Loop *L) {
+  std::optional EnableForceVectorize =
+  getOptionalBoolLoopAttribute(L, "llvm.loop.vectorize.force_vectorize");
+  if (EnableForceVectorize == true)
+return TM_ForcedByUser;
+
   std::optional Enable =
   getOptionalBoolLoopAttribute(L, "llvm.loop.vectorize.enable");
 
Index: llvm/lib/Transforms/Scalar/WarnMissedTransforms.cpp
===
--- llvm/lib/Transforms/Scalar/WarnMissedTransforms.cpp
+++ llvm/lib/Transforms/Scalar/WarnMissedTransforms.cpp
@@ -19,8 +19,8 @@
 
 #define DEBUG_TYPE "transform-warning"
 
-/// Emit warnings for forced (i.e. user-defined) loop transformations which have
-/// still not been performed.
+/// Emit warnings or errors for forced (i.e. user-defined) loop transformations
+/// which have still not been performed.
 static void warnAboutLeftoverTransformations(Loop *L,
  OptimizationRemarkEmitter *ORE) {
   if (hasUnrollTransformation(L) == TM_ForcedByUser) {
@@ -51,8 +51,19 @@
 getOptionalElementCountLoopAttribute(L);
 std::optional InterleaveCount =
 getOptionalIntLoopAttribute(L, "llvm.loop.interleave.count");
+std::optional ForceVectorize =
+getOptionalBoolLoopAttribute(L, "llvm.loop.vectorize.force_vectorize");
 
-if (!VectorizeWidth || VectorizeWidth->isVector())
+if (ForceVectorize == true)
+  ORE->emit(
+  DiagnosticInfoOptimizationFailure(
+  DEBUG_TYPE, "FailedRequestedForceVectorization", L->getStartLoc(),
+  L->getHeader(), DS_Error)
+  << "loop not force vectorized: the optimizer was unable to perform "
+ "the "
+ "requested transformation; the transformation might be disabled "
+ "or specified as part of an unsupported transformation ordering");
+else if (!VectorizeWidth || VectorizeWidth->isVector())
   ORE->emit(
   DiagnosticInfoOptimizationFailure(DEBUG_TYPE,
 "FailedRequestedVectorization",
Index: llvm/lib/IR/DiagnosticInfo.cpp
===
--- llvm/lib/IR/DiagnosticInfo.cpp
+++ llvm/lib/IR/DiagnosticInfo.cpp
@@ -351,14 +351,14 @@
 
 DiagnosticInfoOptimizationFailure::DiagnosticInfoOptimizationFailure(
 const char *PassName, StringRef RemarkName, const DiagnosticLocation &Loc,
-const Value *CodeRegion)
+const Value *CodeRegion, DiagnosticSeverity Severity)
 : DiagnosticInfoIROptimization(
-  DK_OptimizationFailure, DS_Warning, PassName, RemarkName,
+  DK_OptimizationFailure, Severity, PassName, RemarkName,
   *cast(CodeRegion)->getParent(), Loc, CodeRegion) {}
 
 bool DiagnosticInfoOptimizationFailure::isEnabled() const {
-  // Only print warnings.
-  return getSeverity() == DS_Warning;
+  // Only print warnings and errors.
+  return getSeverity() == DS_Warning || getSeverity() == DS_Error;
 }
 
 void DiagnosticInfoUnsupported::print(DiagnosticPrinter &DP) const {
Index: llvm/include/llvm/IR/DiagnosticInfo.h
===
--- llvm/include/llvm/IR/DiagnosticInfo.h
+++ llvm/include/llvm/IR/DiagnosticInfo.h
@@ -341,7 +341,7 @@
 
   /// Return the absolute path tot the file.
   std::string getAbsolutePath() const;
-  
+
   const Function &getFunction() const { return Fn; }
   DiagnosticLocation getLocation() const { return Loc; }
 
@@ -983,9 +983,10 @@
   /// of the diagnostic.
   DiagnosticInfoOptimizationFailure(const Function &Fn,
 const DiagnosticLocation &Loc,
-const Twine &Msg)
-  : DiagnosticInfoIROptimization(DK_OptimizationFailure, DS_Warning,
- nullptr, Fn, Lo

[PATCH] D156910: [clang] Add pragma force_vectorize

2023-08-02 Thread Maksim Kita via Phabricator via cfe-commits
kitaisreal added a comment.

It seems that maybe it is better to specify pragma like this, without 
`(enable)`.

  #pragma clang loop force_vectorize
  for (size_t i = 0; i < size; ++i) {
  sum += data[i];
  }

But maybe ability to enable or disable `force_vectorize` can be helpful if we 
will have pragma for code sections. That way client can disable force 
vectorization for specific loop.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D156910

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


[PATCH] D156556: [AggressiveInstCombine][NFC] Fix typo

2023-08-02 Thread Maksim Kita via Phabricator via cfe-commits
kitaisreal added a comment.

In D156556#4554436 , @goldstein.w.n 
wrote:

> Can you mark the title as NFC?

It seems that title of revision is "[AggressiveInstCombine][NFC] Fix typo". Do 
you mean to put NFC at the beginning ?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D156556

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


[PATCH] D156910: [clang] Add pragma force_vectorize

2023-08-07 Thread Maksim Kita via Phabricator via cfe-commits
kitaisreal updated this revision to Diff 547810.
kitaisreal added a comment.

Fixed build.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D156910

Files:
  clang/include/clang/Basic/Attr.td
  clang/include/clang/Basic/DiagnosticFrontendKinds.td
  clang/include/clang/Basic/DiagnosticParseKinds.td
  clang/lib/CodeGen/CGLoopInfo.cpp
  clang/lib/CodeGen/CGLoopInfo.h
  clang/lib/CodeGen/CodeGenAction.cpp
  clang/lib/Parse/ParsePragma.cpp
  clang/lib/Sema/SemaStmtAttr.cpp
  llvm/include/llvm/IR/DiagnosticInfo.h
  llvm/lib/IR/DiagnosticInfo.cpp
  llvm/lib/Transforms/Scalar/WarnMissedTransforms.cpp
  llvm/lib/Transforms/Utils/LoopUtils.cpp

Index: llvm/lib/Transforms/Utils/LoopUtils.cpp
===
--- llvm/lib/Transforms/Utils/LoopUtils.cpp
+++ llvm/lib/Transforms/Utils/LoopUtils.cpp
@@ -389,6 +389,11 @@
 }
 
 TransformationMode llvm::hasVectorizeTransformation(const Loop *L) {
+  std::optional EnableForceVectorize =
+  getOptionalBoolLoopAttribute(L, "llvm.loop.vectorize.force_vectorize");
+  if (EnableForceVectorize == true)
+return TM_ForcedByUser;
+
   std::optional Enable =
   getOptionalBoolLoopAttribute(L, "llvm.loop.vectorize.enable");
 
Index: llvm/lib/Transforms/Scalar/WarnMissedTransforms.cpp
===
--- llvm/lib/Transforms/Scalar/WarnMissedTransforms.cpp
+++ llvm/lib/Transforms/Scalar/WarnMissedTransforms.cpp
@@ -19,8 +19,8 @@
 
 #define DEBUG_TYPE "transform-warning"
 
-/// Emit warnings for forced (i.e. user-defined) loop transformations which have
-/// still not been performed.
+/// Emit warnings or errors for forced (i.e. user-defined) loop transformations
+/// which have still not been performed.
 static void warnAboutLeftoverTransformations(Loop *L,
  OptimizationRemarkEmitter *ORE) {
   if (hasUnrollTransformation(L) == TM_ForcedByUser) {
@@ -51,8 +51,19 @@
 getOptionalElementCountLoopAttribute(L);
 std::optional InterleaveCount =
 getOptionalIntLoopAttribute(L, "llvm.loop.interleave.count");
+std::optional ForceVectorize =
+getOptionalBoolLoopAttribute(L, "llvm.loop.vectorize.force_vectorize");
 
-if (!VectorizeWidth || VectorizeWidth->isVector())
+if (ForceVectorize == true)
+  ORE->emit(
+  DiagnosticInfoOptimizationFailure(
+  DEBUG_TYPE, "FailedRequestedForceVectorization", L->getStartLoc(),
+  L->getHeader(), DS_Error)
+  << "loop not force vectorized: the optimizer was unable to perform "
+ "the "
+ "requested transformation; the transformation might be disabled "
+ "or specified as part of an unsupported transformation ordering");
+else if (!VectorizeWidth || VectorizeWidth->isVector())
   ORE->emit(
   DiagnosticInfoOptimizationFailure(DEBUG_TYPE,
 "FailedRequestedVectorization",
Index: llvm/lib/IR/DiagnosticInfo.cpp
===
--- llvm/lib/IR/DiagnosticInfo.cpp
+++ llvm/lib/IR/DiagnosticInfo.cpp
@@ -351,14 +351,14 @@
 
 DiagnosticInfoOptimizationFailure::DiagnosticInfoOptimizationFailure(
 const char *PassName, StringRef RemarkName, const DiagnosticLocation &Loc,
-const Value *CodeRegion)
+const Value *CodeRegion, DiagnosticSeverity Severity)
 : DiagnosticInfoIROptimization(
-  DK_OptimizationFailure, DS_Warning, PassName, RemarkName,
+  DK_OptimizationFailure, Severity, PassName, RemarkName,
   *cast(CodeRegion)->getParent(), Loc, CodeRegion) {}
 
 bool DiagnosticInfoOptimizationFailure::isEnabled() const {
-  // Only print warnings.
-  return getSeverity() == DS_Warning;
+  // Only print warnings and errors.
+  return getSeverity() == DS_Warning || getSeverity() == DS_Error;
 }
 
 void DiagnosticInfoUnsupported::print(DiagnosticPrinter &DP) const {
Index: llvm/include/llvm/IR/DiagnosticInfo.h
===
--- llvm/include/llvm/IR/DiagnosticInfo.h
+++ llvm/include/llvm/IR/DiagnosticInfo.h
@@ -341,7 +341,7 @@
 
   /// Return the absolute path tot the file.
   std::string getAbsolutePath() const;
-  
+
   const Function &getFunction() const { return Fn; }
   DiagnosticLocation getLocation() const { return Loc; }
 
@@ -983,9 +983,10 @@
   /// of the diagnostic.
   DiagnosticInfoOptimizationFailure(const Function &Fn,
 const DiagnosticLocation &Loc,
-const Twine &Msg)
-  : DiagnosticInfoIROptimization(DK_OptimizationFailure, DS_Warning,
- nullptr, Fn, Loc, Msg) {}
+const Twine &Msg,
+DiagnosticSeverity Severity = DS_Warning)
+  

[PATCH] D156556: [AggressiveInstCombine][NFC] Fix typo

2023-08-07 Thread Maksim Kita via Phabricator via cfe-commits
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG5dde755188e3: [AggressiveInstCombine][NFC] Fix typo 
(authored by kitaisreal).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D156556

Files:
  llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp


Index: llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
===
--- llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
+++ llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
@@ -934,13 +934,8 @@
   size_t ConstantStrSize = ConstantStr.size();
 
   // Trivial cases are optimized during inst combine
-  if (ConstantStrSize == 0) {
+  if (ConstantStrSize == 0 || ConstantStrSize > 2)
 return false;
-  }
-
-  if (ConstantStrSize > 2) {
-return false;
-  }
 
   // Check if strcmp result is only used in a comparison with zero
   if (!isOnlyUsedInZeroComparison(CI))
@@ -960,7 +955,7 @@
   // For strcmp(P, "xy") do the following transformation:
   //
   // (before)
-  // dst = strcmp(P, "x")
+  // dst = strcmp(P, "xy")
   //
   // (after)
   // v0 = P[0] - 'x'
@@ -1000,19 +995,19 @@
 static_cast(ConstantStr[CharacterIndexToCheck]));
 Value *CharacterSub =
 B.CreateNSWSub(StrCharacterValue, ConstantStrCharacterValue);
-Value *IsCharacterSubZero =
+Value *CharacterSubIsZero =
 B.CreateICmpEQ(CharacterSub, ConstantInt::get(RetType, 0));
-BasicBlock *IsCharacterSubZeroBB =
+BasicBlock *CharacterSubIsZeroBB =
 BasicBlock::Create(B.getContext(), "strcmp_expand_sub_is_zero",
InitialBB->getParent(), JoinBlock);
-B.CreateCondBr(IsCharacterSubZero, IsCharacterSubZeroBB, JoinBlock);
+B.CreateCondBr(CharacterSubIsZero, CharacterSubIsZeroBB, JoinBlock);
 
 ResultPHI->addIncoming(CharacterSub, B.GetInsertBlock());
 DTUpdates.emplace_back(DominatorTree::Insert, B.GetInsertBlock(),
-   IsCharacterSubZeroBB);
+   CharacterSubIsZeroBB);
 
-B.SetInsertPoint(IsCharacterSubZeroBB);
-DTUpdates.emplace_back(DominatorTree::Insert, IsCharacterSubZeroBB,
+B.SetInsertPoint(CharacterSubIsZeroBB);
+DTUpdates.emplace_back(DominatorTree::Insert, CharacterSubIsZeroBB,
JoinBlock);
   }
 


Index: llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
===
--- llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
+++ llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
@@ -934,13 +934,8 @@
   size_t ConstantStrSize = ConstantStr.size();
 
   // Trivial cases are optimized during inst combine
-  if (ConstantStrSize == 0) {
+  if (ConstantStrSize == 0 || ConstantStrSize > 2)
 return false;
-  }
-
-  if (ConstantStrSize > 2) {
-return false;
-  }
 
   // Check if strcmp result is only used in a comparison with zero
   if (!isOnlyUsedInZeroComparison(CI))
@@ -960,7 +955,7 @@
   // For strcmp(P, "xy") do the following transformation:
   //
   // (before)
-  // dst = strcmp(P, "x")
+  // dst = strcmp(P, "xy")
   //
   // (after)
   // v0 = P[0] - 'x'
@@ -1000,19 +995,19 @@
 static_cast(ConstantStr[CharacterIndexToCheck]));
 Value *CharacterSub =
 B.CreateNSWSub(StrCharacterValue, ConstantStrCharacterValue);
-Value *IsCharacterSubZero =
+Value *CharacterSubIsZero =
 B.CreateICmpEQ(CharacterSub, ConstantInt::get(RetType, 0));
-BasicBlock *IsCharacterSubZeroBB =
+BasicBlock *CharacterSubIsZeroBB =
 BasicBlock::Create(B.getContext(), "strcmp_expand_sub_is_zero",
InitialBB->getParent(), JoinBlock);
-B.CreateCondBr(IsCharacterSubZero, IsCharacterSubZeroBB, JoinBlock);
+B.CreateCondBr(CharacterSubIsZero, CharacterSubIsZeroBB, JoinBlock);
 
 ResultPHI->addIncoming(CharacterSub, B.GetInsertBlock());
 DTUpdates.emplace_back(DominatorTree::Insert, B.GetInsertBlock(),
-   IsCharacterSubZeroBB);
+   CharacterSubIsZeroBB);
 
-B.SetInsertPoint(IsCharacterSubZeroBB);
-DTUpdates.emplace_back(DominatorTree::Insert, IsCharacterSubZeroBB,
+B.SetInsertPoint(CharacterSubIsZeroBB);
+DTUpdates.emplace_back(DominatorTree::Insert, CharacterSubIsZeroBB,
JoinBlock);
   }
 
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits