[clang-tools-extra] r273786 - [clang-tidy] Add modernize-use-using

2016-06-25 Thread Krystyna Gajczyk via cfe-commits
Author: krystynka
Date: Sat Jun 25 13:37:53 2016
New Revision: 273786

URL: http://llvm.org/viewvc/llvm-project?rev=273786=rev
Log:
[clang-tidy] Add modernize-use-using

http://reviews.llvm.org/D18919

Added:
clang-tools-extra/trunk/clang-tidy/modernize/UseUsingCheck.cpp
clang-tools-extra/trunk/clang-tidy/modernize/UseUsingCheck.h
clang-tools-extra/trunk/docs/clang-tidy/checks/modernize-use-using.rst
clang-tools-extra/trunk/test/clang-tidy/modernize-use-using.cpp
Modified:
clang-tools-extra/trunk/clang-tidy/modernize/CMakeLists.txt
clang-tools-extra/trunk/clang-tidy/modernize/ModernizeTidyModule.cpp
clang-tools-extra/trunk/docs/ReleaseNotes.rst
clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst

Modified: clang-tools-extra/trunk/clang-tidy/modernize/CMakeLists.txt
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/modernize/CMakeLists.txt?rev=273786=273785=273786=diff
==
--- clang-tools-extra/trunk/clang-tidy/modernize/CMakeLists.txt (original)
+++ clang-tools-extra/trunk/clang-tidy/modernize/CMakeLists.txt Sat Jun 25 
13:37:53 2016
@@ -20,6 +20,7 @@ add_clang_library(clangTidyModernizeModu
   UseEmplaceCheck.cpp
   UseNullptrCheck.cpp
   UseOverrideCheck.cpp
+  UseUsingCheck.cpp
 
   LINK_LIBS
   clangAST

Modified: clang-tools-extra/trunk/clang-tidy/modernize/ModernizeTidyModule.cpp
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/modernize/ModernizeTidyModule.cpp?rev=273786=273785=273786=diff
==
--- clang-tools-extra/trunk/clang-tidy/modernize/ModernizeTidyModule.cpp 
(original)
+++ clang-tools-extra/trunk/clang-tidy/modernize/ModernizeTidyModule.cpp Sat 
Jun 25 13:37:53 2016
@@ -26,6 +26,7 @@
 #include "UseEmplaceCheck.h"
 #include "UseNullptrCheck.h"
 #include "UseOverrideCheck.h"
+#include "UseUsingCheck.h"
 
 using namespace clang::ast_matchers;
 
@@ -58,6 +59,7 @@ public:
 CheckFactories.registerCheck("modernize-use-emplace");
 CheckFactories.registerCheck("modernize-use-nullptr");
 CheckFactories.registerCheck("modernize-use-override");
+CheckFactories.registerCheck("modernize-use-using");
   }
 
   ClangTidyOptions getModuleOptions() override {

Added: clang-tools-extra/trunk/clang-tidy/modernize/UseUsingCheck.cpp
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/modernize/UseUsingCheck.cpp?rev=273786=auto
==
--- clang-tools-extra/trunk/clang-tidy/modernize/UseUsingCheck.cpp (added)
+++ clang-tools-extra/trunk/clang-tidy/modernize/UseUsingCheck.cpp Sat Jun 25 
13:37:53 2016
@@ -0,0 +1,93 @@
+//===--- UseUsingCheck.cpp - 
clang-tidy===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===--===//
+
+#include "UseUsingCheck.h"
+#include "../utils/LexerUtils.h"
+
+using namespace clang::ast_matchers;
+
+namespace clang {
+namespace tidy {
+namespace modernize {
+
+void UseUsingCheck::registerMatchers(MatchFinder *Finder) {
+  if (!getLangOpts().CPlusPlus11)
+return;
+  Finder->addMatcher(typedefDecl().bind("typedef"), this);
+}
+
+// Checks if 'typedef' keyword can be removed - we do it only if
+// it is the only declaration in a declaration chain.
+static bool CheckRemoval(SourceManager , const SourceLocation ,
+ const SourceLocation , ASTContext ,
+ SourceRange ) {
+  FileID FID = SM.getFileID(LocEnd);
+  llvm::MemoryBuffer *Buffer = SM.getBuffer(FID, LocEnd);
+  Lexer DeclLexer(SM.getLocForStartOfFile(FID), Context.getLangOpts(),
+  Buffer->getBufferStart(), SM.getCharacterData(LocStart),
+  Buffer->getBufferEnd());
+  Token DeclToken;
+  bool result = false;
+  int parenthesisLevel = 0;
+
+  while (!DeclLexer.LexFromRawLexer(DeclToken)) {
+if (DeclToken.getKind() == tok::TokenKind::l_paren)
+  parenthesisLevel++;
+if (DeclToken.getKind() == tok::TokenKind::r_paren)
+  parenthesisLevel--;
+if (DeclToken.getKind() == tok::TokenKind::semi)
+  break;
+// if there is comma and we are not between open parenthesis then it is
+// two or more declatarions in this chain
+if (parenthesisLevel == 0 && DeclToken.getKind() == tok::TokenKind::comma)
+  return false;
+
+if (DeclToken.isOneOf(tok::TokenKind::identifier,
+  tok::TokenKind::raw_identifier)) {
+  auto TokenStr = DeclToken.getRawIdentifier().str();
+
+  if (TokenStr == "typedef") {
+ResultRange =
+SourceRange(DeclToken.getLocation(), DeclToken.getEndLoc());
+result = 

Re: [PATCH] D21673: [libcxx] guard throw with exception enabling check

2016-06-25 Thread Marshall Clow via cfe-commits
mclow.lists added subscribers: EricWF, mclow.lists.
mclow.lists added a comment.

Just a reminder - the people who can approve patches for libc++ are 
@mclow.lists and @ericWF.


Repository:
  rL LLVM

http://reviews.llvm.org/D21673



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


Re: [PATCH] D21392: [clang-tidy] Enhance redundant-expression check

2016-06-25 Thread Alexander Kornienko via cfe-commits
alexfh added a comment.

A few nits.



Comment at: clang-tidy/misc/RedundantExpressionCheck.cpp:135
@@ +134,3 @@
+  llvm::APSInt ValueLHS_plus1;
+  if (((OpcodeLHS == BO_LE && OpcodeRHS == BO_LT) ||
+   (OpcodeLHS == BO_GT && OpcodeRHS == BO_GE)) &&

How about replacing `if (x) return true; return false;` with `return x;`?

BTW, next function looks fine in this regard, since it has a chain of `if (x) 
return true; if (y) return true; ...`.


Comment at: clang-tidy/misc/RedundantExpressionCheck.cpp:182
@@ +181,3 @@
+  incrementWithoutOverflow(ValueLHS, ValueLHS_plus1) &&
+  llvm::APSInt::compareValues(ValueLHS_plus1, ValueRHS) == 0) {
+return true;

Remove braces for consistency.


Comment at: clang-tidy/misc/RedundantExpressionCheck.cpp:191
@@ +190,3 @@
+// expressions covers the whole domain (i.e. x < 10  and  x > 0).
+static bool doRangesFullyCoverDomain(BinaryOperatorKind OpcodeLHS,
+ const llvm::APSInt ,

I'd slightly prefer it without "do": `rangesFullyCoverDomain`, 
`rangeSubsumesRange`, etc.


Comment at: clang-tidy/misc/RedundantExpressionCheck.cpp:266
@@ +265,3 @@
+  }
+  return false;
+}

The last return seems to be dead code.


Comment at: clang-tidy/misc/RedundantExpressionCheck.cpp:364
@@ +363,3 @@
+
+  // A cast can be matched as a comparator to zero.
+  const auto CastExpr =

Not sure I understand this comment.


Comment at: clang-tidy/misc/RedundantExpressionCheck.cpp:628
@@ +627,3 @@
+
+llvm::APSInt LhsValue, RhsValue;
+const Expr *LhsSymbol = nullptr;

`using llvm::APSInt;` to remove some boilerplate?


Comment at: clang-tidy/misc/RedundantExpressionCheck.cpp:651
@@ +650,3 @@
+if (LhsOpcode == BO_Or && (LhsConstant | RhsConstant) != RhsConstant) {
+  if (Opcode == BO_EQ)
+diag(ComparisonOperator->getOperatorLoc(),

Please add braces, when the body is more than one line.


Comment at: clang-tidy/misc/RedundantExpressionCheck.cpp:655
@@ +654,3 @@
+  else if (Opcode == BO_NE)
+diag(ComparisonOperator->getOperatorLoc(),
+ "logical expression is always true");

`ComparisonOperator->getOperatorLoc()` and the message are repeated too many 
times. Pull them to local variables / constants?


http://reviews.llvm.org/D21392



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


Re: [PATCH] D18919: [Clang-tidy] Add check "modernize use using"

2016-06-25 Thread Krystyna via cfe-commits
krystyna updated this revision to Diff 61895.
krystyna marked 5 inline comments as done.

Repository:
  rL LLVM

http://reviews.llvm.org/D18919

Files:
  clang-tidy/modernize/CMakeLists.txt
  clang-tidy/modernize/ModernizeTidyModule.cpp
  clang-tidy/modernize/UseUsingCheck.cpp
  clang-tidy/modernize/UseUsingCheck.h
  docs/ReleaseNotes.rst
  docs/clang-tidy/checks/list.rst
  docs/clang-tidy/checks/modernize-use-using.rst
  test/clang-tidy/modernize-use-using.cpp

Index: test/clang-tidy/modernize-use-using.cpp
===
--- /dev/null
+++ test/clang-tidy/modernize-use-using.cpp
@@ -0,0 +1,87 @@
+// RUN: %check_clang_tidy %s modernize-use-using %t
+
+typedef int Type;
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' [modernize-use-using]
+// CHECK-FIXES: using Type = int;
+
+typedef long LL;
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef'
+// CHECK-FIXES: using LL = long;
+
+typedef int Bla;
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef'
+// CHECK-FIXES: using Bla = int;
+
+typedef Bla Bla2;
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef'
+// CHECK-FIXES: using Bla2 = Bla;
+
+typedef void (*type)(int, int);
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef'
+// CHECK-FIXES: using type = void (*)(int, int);
+
+typedef void (*type2)();
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef'
+// CHECK-FIXES: using type2 = void (*)();
+
+class Class {
+  typedef long long Type;
+  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use 'using' instead of 'typedef'
+  // CHECK-FIXES: using Type = long long;
+};
+
+typedef void (Class::*MyPtrType)(Bla) const;
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef'
+// CHECK-FIXES: using MyPtrType = void (Class::*)(Bla) const;
+
+class Iterable {
+public:
+  class Iterator {};
+};
+
+template 
+class Test {
+  typedef typename T::iterator Iter;
+  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use 'using' instead of 'typedef'
+  // CHECK-FIXES: using Iter = typename T::iterator;
+};
+
+using balba = long long;
+
+union A {};
+
+typedef void (A::*PtrType)(int, int) const;
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef'
+// CHECK-FIXES: using PtrType = void (A::*)(int, int) const;
+
+typedef Class some_class;
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef'
+// CHECK-FIXES: using some_class = Class;
+
+typedef Class Cclass;
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef'
+// CHECK-FIXES: using Cclass = Class;
+
+typedef Cclass cclass2;
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef'
+// CHECK-FIXES: using cclass2 = Cclass;
+
+class cclass {};
+
+typedef void (cclass::*MyPtrType3)(Bla);
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef'
+// CHECK-FIXES: using MyPtrType3 = void (cclass::*)(Bla);
+
+using my_class = int;
+
+typedef Test another;
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef'
+// CHECK-FIXES: using another = Test;
+
+typedef int bla1, bla2, bla3;
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef'
+
+#define CODE typedef int INT
+
+CODE;
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef'
Index: docs/clang-tidy/checks/modernize-use-using.rst
===
--- /dev/null
+++ docs/clang-tidy/checks/modernize-use-using.rst
@@ -0,0 +1,26 @@
+.. title:: clang-tidy - modernize-use-using
+
+modernize-use-using
+===
+
+Use C++11's ``using`` instead of ``typedef``.
+
+Before:
+
+.. code:: c++
+
+  typedef int variable;
+
+  class Class{};
+  typedef void (Class::* MyPtrType)() const;
+
+After:
+
+.. code:: c++
+
+  using variable = int;
+
+  class Class{};
+  using MyPtrType = void (Class::*)() const;
+
+This check requires using C++11 or higher to run.
Index: docs/clang-tidy/checks/list.rst
===
--- docs/clang-tidy/checks/list.rst
+++ docs/clang-tidy/checks/list.rst
@@ -107,6 +107,7 @@
modernize-use-emplace
modernize-use-nullptr
modernize-use-override
+   modernize-use-using
performance-faster-string-find
performance-for-range-copy
performance-implicit-cast-in-loop
Index: docs/ReleaseNotes.rst
===
--- docs/ReleaseNotes.rst
+++ docs/ReleaseNotes.rst
@@ -225,6 +225,11 @@
 
   Finds calls that could be changed to emplace.
 
+- New `modernize-use-using
+  `_ check
+
+  Finds typedefs and replaces it with usings.
+
 - New `performance-faster-string-find
   

r273783 - Fix unused variable warning after r273754.

2016-06-25 Thread James Y Knight via cfe-commits
Author: jyknight
Date: Sat Jun 25 11:40:53 2016
New Revision: 273783

URL: http://llvm.org/viewvc/llvm-project?rev=273783=rev
Log:
Fix unused variable warning after r273754.

Modified:
cfe/trunk/lib/Sema/Sema.cpp

Modified: cfe/trunk/lib/Sema/Sema.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=273783=273782=273783=diff
==
--- cfe/trunk/lib/Sema/Sema.cpp (original)
+++ cfe/trunk/lib/Sema/Sema.cpp Sat Jun 25 11:40:53 2016
@@ -525,6 +525,7 @@ static void checkUndefinedButUsed(Sema &
   S.Diag(ND->getLocation(), diag::warn_undefined_internal)
 << isa(ND) << ND;
 } else if (auto *FD = dyn_cast(ND)) {
+  (void)FD;
   assert(FD->getMostRecentDecl()->isInlined() &&
  "used object requires definition but isn't inline or internal?");
   // FIXME: This is ill-formed; we should reject.


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


Re: [PATCH] D21642: [clang-tidy] boost-use-to-string arg expr location bugfix

2016-06-25 Thread Piotr Padlewski via cfe-commits
Prazek added a comment.

ping anyone. This is nobrainer fix.


http://reviews.llvm.org/D21642



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


Re: [PATCH] D20196: [clang-tidy] Inefficient string operation

2016-06-25 Thread Bittner Barni via cfe-commits
bittnerbarni updated this revision to Diff 61893.

http://reviews.llvm.org/D20196

Files:
  clang-tidy/performance/CMakeLists.txt
  clang-tidy/performance/InefficientStringConcatenationCheck.cpp
  clang-tidy/performance/InefficientStringConcatenationCheck.h
  clang-tidy/performance/PerformanceTidyModule.cpp
  docs/ReleaseNotes.rst
  docs/clang-tidy/checks/list.rst
  docs/clang-tidy/checks/performance-inefficient-string-concatenation.rst
  test/clang-tidy/performance-inefficient-string-concatenation.cpp

Index: test/clang-tidy/performance-inefficient-string-concatenation.cpp
===
--- /dev/null
+++ test/clang-tidy/performance-inefficient-string-concatenation.cpp
@@ -0,0 +1,44 @@
+// RUN: %check_clang_tidy %s performance-inefficient-string-concatenation %t
+
+namespace std {
+template 
+class basic_string {
+public:
+  basic_string() {}
+  ~basic_string() {}
+  basic_string *operator+=(const basic_string &) {}
+  friend basic_string operator+(const basic_string &, const basic_string &) {}
+};
+typedef basic_string string;
+typedef basic_string wstring;
+}
+
+void f(std::string) {}
+std::string g(std::string) {}
+
+int main() {
+  std::string mystr1, mystr2;
+  std::wstring mywstr1, mywstr2;
+
+  for (int i = 0; i < 10; ++i) {
+f(mystr1 + mystr2 + mystr1);
+// CHECK-MESSAGES: :[[@LINE-1]]:23: warning: string concatenation results in allocation of unnecessary temporary strings; consider using 'operator+=' or 'string::append()' instead
+mystr1 = mystr1 + mystr2;
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: string concatenation
+mystr1 = mystr2 + mystr2 + mystr2;
+// CHECK-MESSAGES: :[[@LINE-1]]:30: warning: string concatenation
+mystr1 = mystr2 + mystr1;
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: string concatenation
+mywstr1 = mywstr2 + mywstr1;
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: string concatenation
+mywstr1 = mywstr2 + mywstr2 + mywstr2;
+// CHECK-MESSAGES: :[[@LINE-1]]:33: warning: string concatenation
+
+mywstr1 = mywstr2 + mywstr2;
+mystr1 = mystr2 + mystr2;
+mystr1 += mystr2;
+f(mystr2 + mystr1);
+mystr1 = g(mystr1);
+  }
+  return 0;
+}
Index: docs/clang-tidy/checks/performance-inefficient-string-concatenation.rst
===
--- /dev/null
+++ docs/clang-tidy/checks/performance-inefficient-string-concatenation.rst
@@ -0,0 +1,49 @@
+.. title:: clang-tidy - performance-inefficient-string-concatenation
+
+performance-inefficient-string-concatenation
+
+
+This check warns about the performance overhead arising from concatenating strings using the ``operator+``, for instance:
+
+.. code:: c++
+
+std::string a("Foo"), b("Bar");
+a = a + b;
+
+Instead of this structure you should use ``operator+=`` or ``std::string``'s (``std::basic_string``) class member function ``append()``. For instance:
+   
+.. code:: c++
+
+   std::string a("Foo"), b("Baz");
+   for (int i = 0; i < 2; ++i) {
+   a = a + "Bar" + b;
+   }
+
+Could be rewritten in a greatly more efficient way like:
+
+.. code:: c++
+
+   std::string a("Foo"), b("Baz");
+   for (int i = 0; i < 2; ++i) {
+   a.append("Bar").append(b);
+   } 
+
+And this can be rewritten too:
+
+.. code:: c++
+
+   void f(const std::string&) {}
+   std::string a("Foo"), b("Baz");
+   void g() {
+   f(a + "Bar" + b);
+   }
+
+In a slightly more efficient way like:
+
+.. code:: c++
+
+   void f(const std::string&) {}
+   std::string a("Foo"), b("Baz");
+   void g() {
+   f(std::string(a).append("Bar").append(b));
+   }
Index: docs/clang-tidy/checks/list.rst
===
--- docs/clang-tidy/checks/list.rst
+++ docs/clang-tidy/checks/list.rst
@@ -102,6 +102,7 @@
performance-faster-string-find
performance-for-range-copy
performance-implicit-cast-in-loop
+   performance-inefficient-string-concatenation
performance-unnecessary-copy-initialization
performance-unnecessary-value-param
readability-avoid-const-params-in-decls
Index: docs/ReleaseNotes.rst
===
--- docs/ReleaseNotes.rst
+++ docs/ReleaseNotes.rst
@@ -184,6 +184,12 @@
   Warns about range-based loop with a loop variable of const ref type where the
   type of the variable does not match the one returned by the iterator.
 
+- New `performance-inefficient-string-concatenation
+  `_ check
+
+  This check is to warn about the performance overhead arising from concatenating 
+  strings, using the ``operator+``, instead of ``operator+=``.
+  
 - New `performance-unnecessary-value-param
   `_ check
 
Index: 

[PATCH] D21729: [Clang][BuiltIn][AVX512] adding _mm{|256|512}_mask_cvt{s|us|}epi16_storeu_epi8 intrinsics

2016-06-25 Thread michael zuckerman via cfe-commits
m_zuckerman created this revision.
m_zuckerman added reviewers: AsafBadouh, igorb, delena.
m_zuckerman added a subscriber: cfe-commits.

http://reviews.llvm.org/D21729

Files:
  include/clang/Basic/BuiltinsX86.def
  lib/Headers/avx512bwintrin.h
  lib/Headers/avx512vlbwintrin.h
  test/CodeGen/avx512bw-builtins.c
  test/CodeGen/avx512vlbw-builtins.c

Index: test/CodeGen/avx512vlbw-builtins.c
===
--- test/CodeGen/avx512vlbw-builtins.c
+++ test/CodeGen/avx512vlbw-builtins.c
@@ -2446,3 +2446,45 @@
   // CHECK: select <16 x i1> %{{.*}}, <16 x i16> %{{.*}}, <16 x i16> %{{.*}}
   return _mm256_maskz_shufflelo_epi16(__U, __A, 5); 
 }
+
+void test_mm_mask_cvtepi16_storeu_epi8 (void * __P, __mmask8 __M, __m128i __A)
+{
+ // CHECK-LABEL:@test_mm_mask_cvtepi16_storeu_epi8
+ // CHECK: @llvm.x86.avx512.mask.pmov.wb.mem.128
+ _mm_mask_cvtepi16_storeu_epi8 (__P, __M, __A);
+}
+
+void test_mm_mask_cvtsepi16_storeu_epi8 (void * __P, __mmask8 __M, __m128i __A)
+{
+ // CHECK-LABEL:@test_mm_mask_cvtsepi16_storeu_epi8
+ // CHECK: @llvm.x86.avx512.mask.pmovs.wb.mem.128
+  _mm_mask_cvtsepi16_storeu_epi8 ( __P,  __M, __A);
+}
+
+void test_mm_mask_cvtusepi16_storeu_epi8 (void * __P, __mmask8 __M, __m128i __A)
+{
+ // CHECK-LABEL:@test_mm_mask_cvtusepi16_storeu_epi8
+ // CHECK: @llvm.x86.avx512.mask.pmovus.wb.mem.128
+  _mm_mask_cvtusepi16_storeu_epi8 (__P, __M, __A);
+}
+
+void test_mm256_mask_cvtusepi16_storeu_epi8 (void * __P, __mmask16 __M, __m256i __A)
+{
+ // CHECK-LABEL:@test_mm256_mask_cvtusepi16_storeu_epi8
+ // CHECK: @llvm.x86.avx512.mask.pmovus.wb.mem.256
+  _mm256_mask_cvtusepi16_storeu_epi8 ( __P, __M, __A);
+}
+
+void test_mm256_mask_cvtepi16_storeu_epi8 (void * __P, __mmask16 __M, __m256i __A)
+{
+ // CHECK-LABEL:@test_mm256_mask_cvtepi16_storeu_epi8
+ // CHECK: @llvm.x86.avx512.mask.pmov.wb.mem.256
+  _mm256_mask_cvtepi16_storeu_epi8 ( __P,  __M, __A);
+}
+
+void test_mm256_mask_cvtsepi16_storeu_epi8 (void * __P, __mmask16 __M, __m256i __A)
+{
+ // CHECK-LABEL:@test_mm256_mask_cvtsepi16_storeu_epi8
+ // CHECK: @llvm.x86.avx512.mask.pmovs.wb.mem.256
+ _mm256_mask_cvtsepi16_storeu_epi8 ( __P, __M, __A);
+}
Index: test/CodeGen/avx512bw-builtins.c
===
--- test/CodeGen/avx512bw-builtins.c
+++ test/CodeGen/avx512bw-builtins.c
@@ -1554,3 +1554,23 @@
   return _mm512_movepi16_mask(__A); 
 }
 
+void test_mm512_mask_cvtepi16_storeu_epi8 (void * __P, __mmask32 __M, __m512i __A)
+{
+ // CHECK-LABEL: @test_mm512_mask_cvtepi16_storeu_epi8
+ // CHECK: @llvm.x86.avx512.mask.pmov.wb.mem.512
+ __builtin_ia32_pmovwb512mem_mask ( __P,  __A, __M);
+}
+
+void test_mm512_mask_cvtsepi16_storeu_epi8 (void * __P, __mmask32 __M, __m512i __A)
+{
+ // CHECK-LABEL: @test_mm512_mask_cvtsepi16_storeu_epi8
+ // CHECK: @llvm.x86.avx512.mask.pmovs.wb.mem.512
+ __builtin_ia32_pmovswb512mem_mask ( __P,  __A, __M);
+}
+
+void test_mm512_mask_cvtusepi16_storeu_epi8 (void * __P, __mmask32 __M, __m512i __A)
+{
+ // CHECK-LABEL: @test_mm512_mask_cvtusepi16_storeu_epi8
+ // CHECK: @llvm.x86.avx512.mask.pmovus.wb.mem.512
+ __builtin_ia32_pmovuswb512mem_mask ( __P, __A, __M);
+}
Index: lib/Headers/avx512vlbwintrin.h
===
--- lib/Headers/avx512vlbwintrin.h
+++ lib/Headers/avx512vlbwintrin.h
@@ -1999,6 +1999,25 @@
__M);
 }
 
+static __inline__ void __DEFAULT_FN_ATTRS
+_mm_mask_cvtepi16_storeu_epi8 (void * __P, __mmask8 __M, __m128i __A)
+{
+  __builtin_ia32_pmovwb128mem_mask ((__v16qi *) __P, (__v8hi) __A, __M);
+}
+
+
+static __inline__ void __DEFAULT_FN_ATTRS
+_mm_mask_cvtsepi16_storeu_epi8 (void * __P, __mmask8 __M, __m128i __A)
+{
+  __builtin_ia32_pmovswb128mem_mask ((__v16qi *) __P, (__v8hi) __A, __M);
+}
+
+static __inline__ void __DEFAULT_FN_ATTRS
+_mm_mask_cvtusepi16_storeu_epi8 (void * __P, __mmask8 __M, __m128i __A)
+{
+  __builtin_ia32_pmovuswb128mem_mask ((__v16qi *) __P, (__v8hi) __A, __M);
+}
+
 static __inline__ __m128i __DEFAULT_FN_ATTRS
 _mm256_cvtepi16_epi8 (__m256i __A) {
   return (__m128i) __builtin_ia32_pmovwb256_mask ((__v16hi) __A,
@@ -2020,6 +2039,23 @@
__M);
 }
 
+static __inline__ void __DEFAULT_FN_ATTRS
+_mm256_mask_cvtepi16_storeu_epi8 (void * __P, __mmask16 __M, __m256i __A)
+{
+  __builtin_ia32_pmovwb256mem_mask ((__v16qi *) __P, (__v16hi) __A, __M);
+}
+
+static __inline__ void __DEFAULT_FN_ATTRS
+_mm256_mask_cvtsepi16_storeu_epi8 (void * __P, __mmask16 __M, __m256i __A)
+{
+  __builtin_ia32_pmovswb256mem_mask ((__v16qi *) __P, (__v16hi) __A, __M);
+}
+
+static __inline__ void __DEFAULT_FN_ATTRS
+_mm256_mask_cvtusepi16_storeu_epi8 (void * __P, __mmask8 __M, __m256i __A)
+{
+  __builtin_ia32_pmovuswb256mem_mask ((__v16qi*) __P, (__v16hi) __A, __M);
+}
 static __inline__ __m128i __DEFAULT_FN_ATTRS
 _mm_mask_mulhrs_epi16 (__m128i __W, __mmask8 __U, __m128i __X, __m128i __Y) {
   return (__m128i) 

r273775 - [X86] Fix pslldq/psrldq intrinsics to not fail compilation with immediates larger than 16. This was accidentally broken in r272246.

2016-06-25 Thread Craig Topper via cfe-commits
Author: ctopper
Date: Sat Jun 25 02:31:14 2016
New Revision: 273775

URL: http://llvm.org/viewvc/llvm-project?rev=273775=rev
Log:
[X86] Fix pslldq/psrldq intrinsics to not fail compilation with immediates 
larger than 16. This was accidentally broken in r272246.

Modified:
cfe/trunk/lib/Headers/avx2intrin.h
cfe/trunk/lib/Headers/avx512bwintrin.h
cfe/trunk/lib/Headers/emmintrin.h
cfe/trunk/test/CodeGen/sse2-builtins.c

Modified: cfe/trunk/lib/Headers/avx2intrin.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/avx2intrin.h?rev=273775=273774=273775=diff
==
--- cfe/trunk/lib/Headers/avx2intrin.h (original)
+++ cfe/trunk/lib/Headers/avx2intrin.h Sat Jun 25 02:31:14 2016
@@ -552,42 +552,41 @@ _mm256_sign_epi32(__m256i __a, __m256i _
 }
 
 #define _mm256_slli_si256(a, imm) __extension__ ({ \
-  ((char)(imm)&0xF0) ? _mm256_setzero_si256() :  \
-   (__m256i)__builtin_shufflevector( \
-  (__v32qi)_mm256_setzero_si256(),   \
-  (__v32qi)(__m256i)(a), \
-  ((char)(imm)>0x0 ? 16 : 32) - (char)(imm), \
-  ((char)(imm)>0x1 ? 17 : 33) - (char)(imm), \
-  ((char)(imm)>0x2 ? 18 : 34) - (char)(imm), \
-  ((char)(imm)>0x3 ? 19 : 35) - (char)(imm), \
-  ((char)(imm)>0x4 ? 20 : 36) - (char)(imm), \
-  ((char)(imm)>0x5 ? 21 : 37) - (char)(imm), \
-  ((char)(imm)>0x6 ? 22 : 38) - (char)(imm), \
-  ((char)(imm)>0x7 ? 23 : 39) - (char)(imm), \
-  ((char)(imm)>0x8 ? 24 : 40) - (char)(imm), \
-  ((char)(imm)>0x9 ? 25 : 41) - (char)(imm), \
-  ((char)(imm)>0xA ? 26 : 42) - (char)(imm), \
-  ((char)(imm)>0xB ? 27 : 43) - (char)(imm), \
-  ((char)(imm)>0xC ? 28 : 44) - (char)(imm), \
-  ((char)(imm)>0xD ? 29 : 45) - (char)(imm), \
-  ((char)(imm)>0xE ? 30 : 46) - (char)(imm), \
-  ((char)(imm)>0xF ? 31 : 47) - (char)(imm), \
-  ((char)(imm)>0x0 ? 32 : 48) - (char)(imm), \
-  ((char)(imm)>0x1 ? 33 : 49) - (char)(imm), \
-  ((char)(imm)>0x2 ? 34 : 50) - (char)(imm), \
-  ((char)(imm)>0x3 ? 35 : 51) - (char)(imm), \
-  ((char)(imm)>0x4 ? 36 : 52) - (char)(imm), \
-  ((char)(imm)>0x5 ? 37 : 53) - (char)(imm), \
-  ((char)(imm)>0x6 ? 38 : 54) - (char)(imm), \
-  ((char)(imm)>0x7 ? 39 : 55) - (char)(imm), \
-  ((char)(imm)>0x8 ? 40 : 56) - (char)(imm), \
-  ((char)(imm)>0x9 ? 41 : 57) - (char)(imm), \
-  ((char)(imm)>0xA ? 42 : 58) - (char)(imm), \
-  ((char)(imm)>0xB ? 43 : 59) - (char)(imm), \
-  ((char)(imm)>0xC ? 44 : 60) - (char)(imm), \
-  ((char)(imm)>0xD ? 45 : 61) - (char)(imm), \
-  ((char)(imm)>0xE ? 46 : 62) - (char)(imm), \
-  ((char)(imm)>0xF ? 47 : 63) - (char)(imm)); 
})
+  (__m256i)__builtin_shufflevector(  \
+(__v32qi)_mm256_setzero_si256(), \
+(__v32qi)(__m256i)(a),   \
+((char)(imm)&0xF0) ?  0 : ((char)(imm)>0x0 ? 16 : 32) - (char)(imm), \
+((char)(imm)&0xF0) ?  1 : ((char)(imm)>0x1 ? 17 : 33) - (char)(imm), \
+((char)(imm)&0xF0) ?  2 : ((char)(imm)>0x2 ? 18 : 34) - (char)(imm), \
+((char)(imm)&0xF0) ?  3 : ((char)(imm)>0x3 ? 19 : 35) - (char)(imm), \
+((char)(imm)&0xF0) ?  4 : ((char)(imm)>0x4 ? 20 : 36) - (char)(imm), \
+((char)(imm)&0xF0) ?  5 : ((char)(imm)>0x5 ? 21 : 37) - (char)(imm), \
+((char)(imm)&0xF0) ?  6 : ((char)(imm)>0x6 ? 22 : 38) - (char)(imm), \
+((char)(imm)&0xF0) ?  7 : ((char)(imm)>0x7 ? 23 : 39) - (char)(imm), \
+((char)(imm)&0xF0) ?  8 : ((char)(imm)>0x8 ? 24 : 40) - (char)(imm), \
+((char)(imm)&0xF0) ?  9 : ((char)(imm)>0x9 ? 25 : 41) - (char)(imm), \
+((char)(imm)&0xF0) ? 10 : ((char)(imm)>0xA ? 26 : 42) - (char)(imm), \
+((char)(imm)&0xF0) ? 11 : ((char)(imm)>0xB ? 27 : 43) - (char)(imm), \
+

[PATCH] D21724: [RFC] Enhance synchscope representation (clang)

2016-06-25 Thread Konstantin Zhuravlyov via cfe-commits
kzhuravl created this revision.
kzhuravl added reviewers: tstellarAMD, arsenm, rampitec.
kzhuravl added subscribers: cfe-commits, llvm-commits, resistor.

As described in this proposal: 
https://groups.google.com/forum/#!topic/llvm-dev/GtWfCc5j-4U

http://reviews.llvm.org/D21724

Files:
  lib/CodeGen/CGBuiltin.cpp
  lib/CodeGen/CodeGenModule.cpp
  lib/CodeGen/CodeGenModule.h
  test/CodeGen/synchscopes.cpp

Index: test/CodeGen/synchscopes.cpp
===
--- test/CodeGen/synchscopes.cpp
+++ test/CodeGen/synchscopes.cpp
@@ -0,0 +1,17 @@
+// RUN: %clang -emit-llvm -S -std=c++11 %s -o - | FileCheck %s
+
+// CHECK: !synchscopes = !{!0, !1}
+// CHECK: !0 = !{i32 0, !"System"}
+// CHECK: !1 = !{i32 -1, !"SingleThread"}
+
+#include 
+
+void synchscopes_acquire() {
+  atomic_thread_fence(std::memory_order_acquire);
+  atomic_signal_fence(std::memory_order_acquire);
+}
+
+void synchscopes_release() {
+  atomic_thread_fence(std::memory_order_release);
+  atomic_signal_fence(std::memory_order_release);
+}
Index: lib/CodeGen/CodeGenModule.h
===
--- lib/CodeGen/CodeGenModule.h
+++ lib/CodeGen/CodeGenModule.h
@@ -374,6 +374,9 @@
   llvm::DenseMap AtomicSetterHelperFnMap;
   llvm::DenseMap AtomicGetterHelperFnMap;
 
+  /// \brief Mapping from synchronization scope to it's string representation.
+  std::map SynchScopeMap;
+
   /// Map used to get unique type descriptor constants for sanitizers.
   llvm::DenseMap TypeDescriptorMap;
 
@@ -582,6 +585,8 @@
 AtomicGetterHelperFnMap[Ty] = Fn;
   }
 
+  void setSynchScopeMap(unsigned SynchScope, const std::string );
+
   llvm::Constant *getTypeDescriptorFromMap(QualType Ty) {
 return TypeDescriptorMap[Ty];
   }
@@ -1233,6 +1238,9 @@
 
   void EmitDeclMetadata();
 
+  /// \brief Emit synchronization scope metadata.
+  void EmitSynchScopeMetadata();
+
   /// \brief Emit the Clang version as llvm.ident metadata.
   void EmitVersionIdentMetadata();
 
Index: lib/CodeGen/CodeGenModule.cpp
===
--- lib/CodeGen/CodeGenModule.cpp
+++ lib/CodeGen/CodeGenModule.cpp
@@ -495,6 +495,8 @@
   if (DebugInfo)
 DebugInfo->finalize();
 
+  EmitSynchScopeMetadata();
+
   EmitVersionIdentMetadata();
 
   EmitTargetMetadata();
@@ -4049,6 +4051,15 @@
   return true;
 }
 
+void CodeGenModule::setSynchScopeMap(unsigned SynchScope,
+ const std::string ) {
+  auto Res = SynchScopeMap.find(SynchScope);
+  if (Res == SynchScopeMap.end())
+SynchScopeMap.insert(std::make_pair(SynchScope, SynchScopeName));
+  else
+assert(Res->second == SynchScopeName);
+}
+
 /// Emits metadata nodes associating all the global values in the
 /// current module with the Decls they came from.  This is useful for
 /// projects using IR gen as a subroutine.
@@ -4095,6 +4106,22 @@
   }
 }
 
+void CodeGenModule::EmitSynchScopeMetadata() {
+  if (!SynchScopeMap.size())
+return;
+
+  llvm::LLVMContext  = TheModule.getContext();
+  llvm::NamedMDNode *SynchScopeMetadata =
+TheModule.getOrInsertNamedMetadata("synchscopes");
+  for (auto  : SynchScopeMap) {
+llvm::Metadata *SynchScopeNode[2] = {
+  llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(Int32Ty, I.first)),
+  llvm::MDString::get(Ctx, I.second)
+};
+SynchScopeMetadata->addOperand(llvm::MDNode::get(Ctx, SynchScopeNode));
+  }
+}
+
 void CodeGenModule::EmitVersionIdentMetadata() {
   llvm::NamedMDNode *IdentMetadata =
 TheModule.getOrInsertNamedMetadata("llvm.ident");
Index: lib/CodeGen/CGBuiltin.cpp
===
--- lib/CodeGen/CGBuiltin.cpp
+++ lib/CodeGen/CGBuiltin.cpp
@@ -1474,12 +1474,17 @@
   case Builtin::BI__atomic_signal_fence:
   case Builtin::BI__c11_atomic_thread_fence:
   case Builtin::BI__c11_atomic_signal_fence: {
-llvm::SynchronizationScope Scope;
+unsigned Scope;
+std::string ScopeName;
 if (BuiltinID == Builtin::BI__atomic_signal_fence ||
-BuiltinID == Builtin::BI__c11_atomic_signal_fence)
-  Scope = llvm::SingleThread;
-else
-  Scope = llvm::CrossThread;
+BuiltinID == Builtin::BI__c11_atomic_signal_fence) {
+  Scope = llvm::SynchScopeSingleThread;
+  ScopeName = "SingleThread";
+} else {
+  Scope = llvm::SynchScopeSystem;
+  ScopeName = "System";
+}
+CGM.setSynchScopeMap(Scope, ScopeName);
 Value *Order = EmitScalarExpr(E->getArg(0));
 if (isa(Order)) {
   int ord = cast(Order)->getZExtValue();
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits