[PATCH] D150461: [OpenMP] Naturally align internal global variables in the OpenMPIRBuilder

2023-05-12 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

In D150461#4338499 , @jhuber6 wrote:

> In D150461#4338498 , @gchatelet 
> wrote:
>
>> quick question, did you try to build the openmp runtime as well to check if 
>> the tests still pass?
>
> I'm an OpenMP developer so I always have it built : ). Yes they still pass.




Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D150461

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


[PATCH] D150461: [OpenMP] Naturally align internal global variables in the OpenMPIRBuilder

2023-05-12 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

quick question, did you try to build the openmp runtime as well to check if the 
tests still pass?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D150461

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


[PATCH] D150461: [OpenMP] Naturally align internal global variables in the OpenMPIRBuilder

2023-05-12 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet accepted this revision.
gchatelet added a comment.

You beat me to it :)
Thx for the fix.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D150461

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


[PATCH] D143386: Add function pointer alignment to DataLayout

2023-02-07 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.
Herald added a subscriber: jobnoorman.

In D143386#4107144 , @efriedma wrote:

> Almost all the specifications you're specifying are wrong.  Very few targets 
> should be using "i".  Off the top of my head, 32-bit ARM, MIPS targets with 
> MicroMIPS, and certain PowerPC targets should, but most common targets 
> shouldn't.  ("i" means that either the target mangles the bottom bits of 
> function pointers, or function pointers don't point directly at code.)

Ok so I misunderstood the meaning of "i" then.

> And the x86 doesn't specify 4-byte alignment.

I thought that specifying it in the `DataLayout` would help getting rid of the 
special handling in ConstantFold 
.
 I'm confused now.

> For each target, we should try to handle the LLVM backend at the same time...

I'm not familiar with this part of the codebase as you can tell. Would you have 
any pointers to the backend part that needs to be updated?
Shall we try to do one target at a time then?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D143386

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


[PATCH] D143386: Add function pointer alignment to DataLayout

2023-02-06 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet created this revision.
gchatelet added a reviewer: efriedma.
Herald added subscribers: luke, kosarev, mattd, gchakrabarti, pmatos, asb, 
asavonic, frasercrmck, kerbowa, luismarques, apazos, sameer.abuasal, s.egerton, 
Jim, jocewei, PkmX, the_o, brucehoult, MartinMosbeck, rogfer01, atanasyan, 
edward-jones, zzheng, jrtc27, niosHD, sabuasal, simoncook, johnrusso, rbar, 
fedor.sergeev, kbarton, jgravelle-google, sbc100, jvesely, nemanjai, sdardis, 
dylanmckay, jyknight, dschuff.
Herald added a project: All.
gchatelet requested review of this revision.
Herald added subscribers: cfe-commits, pcwang-thead, MaskRay, aheejin, 
jholewinski.
Herald added a project: clang.

This is to follow up on https://reviews.llvm.org/D57335.
The patch should not be submitted as-is, the tests are completely broken, but 
before having a look at them I want to make sure this patch makes sense.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D143386

Files:
  clang/lib/Basic/Targets/AArch64.cpp
  clang/lib/Basic/Targets/AMDGPU.cpp
  clang/lib/Basic/Targets/ARC.h
  clang/lib/Basic/Targets/AVR.h
  clang/lib/Basic/Targets/BPF.h
  clang/lib/Basic/Targets/CSKY.h
  clang/lib/Basic/Targets/DirectX.h
  clang/lib/Basic/Targets/Hexagon.h
  clang/lib/Basic/Targets/Lanai.h
  clang/lib/Basic/Targets/Le64.h
  clang/lib/Basic/Targets/LoongArch.h
  clang/lib/Basic/Targets/M68k.cpp
  clang/lib/Basic/Targets/MSP430.h
  clang/lib/Basic/Targets/Mips.h
  clang/lib/Basic/Targets/NVPTX.cpp
  clang/lib/Basic/Targets/OSTargets.h
  clang/lib/Basic/Targets/PPC.h
  clang/lib/Basic/Targets/RISCV.h
  clang/lib/Basic/Targets/SPIR.h
  clang/lib/Basic/Targets/Sparc.h
  clang/lib/Basic/Targets/SystemZ.h
  clang/lib/Basic/Targets/TCE.h
  clang/lib/Basic/Targets/VE.h
  clang/lib/Basic/Targets/WebAssembly.h
  clang/lib/Basic/Targets/X86.h
  clang/lib/Basic/Targets/XCore.h

Index: clang/lib/Basic/Targets/XCore.h
===
--- clang/lib/Basic/Targets/XCore.h
+++ clang/lib/Basic/Targets/XCore.h
@@ -36,7 +36,7 @@
 WCharType = UnsignedChar;
 WIntType = UnsignedInt;
 UseZeroLengthBitfieldAlignment = true;
-resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
+resetDataLayout("e-m:e-Fi32-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
 "-f64:32-a:0:32-n32");
   }
 
Index: clang/lib/Basic/Targets/X86.h
===
--- clang/lib/Basic/Targets/X86.h
+++ clang/lib/Basic/Targets/X86.h
@@ -536,8 +536,10 @@
   UseSignedCharForObjCBool = false;
 SizeType = UnsignedLong;
 IntPtrType = SignedLong;
-resetDataLayout("e-m:o-p:32:32-p270:32:32-p271:32:32-p272:64:64-f64:32:64-"
-"f80:128-n8:16:32-S128", "_");
+resetDataLayout(
+"e-m:o-p:32:32-Fn32-p270:32:32-p271:32:32-p272:64:64-f64:32:64-"
+"f80:128-n8:16:32-S128",
+"_");
 HasAlignMac68kSupport = true;
   }
 
@@ -564,7 +566,7 @@
 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
 bool IsMSVC = getTriple().isWindowsMSVCEnvironment();
 std::string Layout = IsWinCOFF ? "e-m:x" : "e-m:e";
-Layout += "-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-";
+Layout += "-p:32:32-Fn32-p270:32:32-p271:32:32-p272:64:64-i64:64-";
 Layout += IsMSVC ? "f80:128" : "f80:32";
 Layout += "-n8:16:32-a:0:32-S32";
 resetDataLayout(Layout, IsWinCOFF ? "_" : "");
@@ -615,9 +617,10 @@
   : X86_32TargetInfo(Triple, Opts) {
 this->WCharType = TargetInfo::UnsignedShort;
 DoubleAlign = LongLongAlign = 64;
-resetDataLayout("e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:"
-"32-n8:16:32-a:0:32-S32",
-"_");
+resetDataLayout(
+"e-m:x-p:32:32-Fn32-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:"
+"32-n8:16:32-a:0:32-S32",
+"_");
   }
 
   void getTargetDefines(const LangOptions ,
@@ -654,8 +657,9 @@
   : X86_32TargetInfo(Triple, Opts) {
 LongDoubleWidth = 64;
 LongDoubleFormat = ::APFloat::IEEEdouble();
-resetDataLayout("e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:32-f64:"
-"32-f128:32-n8:16:32-a:0:32-S32");
+resetDataLayout(
+"e-m:e-p:32:32-Fn32-p270:32:32-p271:32:32-p272:64:64-i64:32-f64:"
+"32-f128:32-n8:16:32-a:0:32-S32");
 WIntType = UnsignedInt;
   }
 
@@ -714,12 +718,13 @@
 RegParmMax = 6;
 
 // Pointers are 32-bit in x32.
-resetDataLayout(IsX32 ? "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-"
-"i64:64-f80:128-n8:16:32:64-S128"
-  : IsWinCOFF ? "e-m:w-p270:32:32-p271:32:32-p272:64:"
-"64-i64:64-f80:128-n8:16:32:64-S128"
-  : "e-m:e-p270:32:32-p271:32:32-p272:64:"
-"64-i64:64-f80:128-n8:16:32:64-S128");
+resetDataLayout(IsX32
+   

[PATCH] D142459: [clang] Deprecate uses of GlobalObject::getAlignment

2023-01-26 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

Thx @efriedma for reminding me of this.
I'll update the documentation and try to give a shot at removing `MaybeAlign` 
from `GlobalObject`.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D142459

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


[PATCH] D142459: [clang] Deprecate uses of GlobalObject::getAlignment

2023-01-25 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added inline comments.



Comment at: clang/lib/CodeGen/CGCUDANV.cpp:491
   new llvm::LoadInst(Var->getType(), ManagedVar, "ld.managed", false,
- llvm::Align(Var->getAlignment()), I);
+ Var->getAlign().valueOrOne(), I);
   WorkItem.pop_back();

barannikov88 wrote:
> barannikov88 wrote:
> > tra wrote:
> > > gchatelet wrote:
> > > > tra wrote:
> > > > > This appears to be a change in behavior. AFAICT, previously used 
> > > > > Var->getAlignment() could return alignment value or 0. Now it's value 
> > > > > or 1.
> > > > > 
> > > > > Is it intentional?
> > > > The previous statement was constructing an `llvm::Align` from a value, 
> > > > and `llvm::Align` [asserts when the provided value is 
> > > > 0](https://github.com/llvm/llvm-project/blob/4ab2246d486ba30c4b2d654323a0c0b97565c0f1/llvm/include/llvm/Support/Alignment.h#L76-L81).
> > > >  This means that it is undefined to pass the value `0`.
> > > > 
> > > > As far as `LoadInst` is concerned it can only accept valid alignments 
> > > > (i.e., powers of two => non zero).
> > > > 
> > > > So you're right that it is not strictly NFC and that 
> > > > `*Var->getAlign()`would be a more rigorous transformation but I 
> > > > //think// that converting the `0` value to `1` moves us from UB to 
> > > > semantically valid code.
> > > > 
> > > > I don't feel strongly about it though and I'm fine changing this to 
> > > > `*Var->getAlign()` to keep this patch NFC. WDYT?
> > > Enforcing alignment of 1 would potentially force us to generate overly 
> > > conservative one byte at a time loads/stores.
> > > I agree that passing 0 is a wrong choice here, but 1 does not seem to be 
> > > correct, either.
> > > Unfortunately LoadInst does not have overloads accepting MaybeAlign so we 
> > > need to use different `LoadInst` overload depending on whether alignment 
> > > is specified.
> > > 
> > > ```
> > > NewV =  Var->getAlign().isAligned() 
> > >   ? llvm::LoadInst(Var->getType(), ManagedVar, "ld.managed", false,  
> > > Var->getAlign().value(), I)
> > >   : llvm::LoadInst(Var->getType(), ManagedVar, "ld.managed", false,  I);
> > > ```
> > > 
> > > @yaxunl -- Sam, does it make sense? This seems to be largely HIP-specific.
> > I think it should be just `Var->getAlign()` to allow propagating absent 
> > alignment.
> > Curiously, the old code didn't assert because `GlobalVariable` seem to 
> > always(?) have non-empty alignment if the global had an associated 
> > `VarDecl` (set [[ 
> > https://github.com/llvm/llvm-project/blob/6ad0788c332bb2043142954d300c49ac3e537f34/clang/lib/CodeGen/CodeGenModule.cpp#L4442
> >  | here ]], changed(?) by [[ 
> > https://github.com/llvm/llvm-project/commit/c79099e0f44d0f85515fd30c83923d9d9dc1679b
> >  | this patch ]]).
> > 
> > Unfortunately LoadInst does not have overloads accepting MaybeAlign so we 
> > need to use different `LoadInst` overload depending on whether alignment is 
> > specified.
> 
> That's interesting, because `SelectionDAG::getLoad` has many variants with 
> `MaybeAlign`, but only one with `Align`.
> 
[The documentation](https://llvm.org/docs/LangRef.html#load-instruction) says 
that `LoadInst` alignment is optional so indeed it should accept a `MaybeAlign` 
instead of an `Align`.
I'll send a patch to fix this.

Then we can indeed simply use `Var->getAlign()`.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D142459

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


[PATCH] D142459: [clang] Deprecate uses of GlobalObject::getAlignment

2023-01-24 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added inline comments.



Comment at: clang/lib/CodeGen/CGCUDANV.cpp:491
   new llvm::LoadInst(Var->getType(), ManagedVar, "ld.managed", false,
- llvm::Align(Var->getAlignment()), I);
+ Var->getAlign().valueOrOne(), I);
   WorkItem.pop_back();

tra wrote:
> This appears to be a change in behavior. AFAICT, previously used 
> Var->getAlignment() could return alignment value or 0. Now it's value or 1.
> 
> Is it intentional?
The previous statement was constructing an `llvm::Align` from a value, and 
`llvm::Align` [asserts when the provided value is 
0](https://github.com/llvm/llvm-project/blob/4ab2246d486ba30c4b2d654323a0c0b97565c0f1/llvm/include/llvm/Support/Alignment.h#L76-L81).
 This means that it is undefined to pass the value `0`.

As far as `LoadInst` is concerned it can only accept valid alignments (i.e., 
powers of two => non zero).

So you're right that it is not strictly NFC and that `*Var->getAlign()`would be 
a more rigorous transformation but I //think// that converting the `0` value to 
`1` moves us from UB to semantically valid code.

I don't feel strongly about it though and I'm fine changing this to 
`*Var->getAlign()` to keep this patch NFC. WDYT?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D142459

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


[PATCH] D142459: [clang] Deprecate uses of GlobalObject::getAlignment

2023-01-24 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet created this revision.
gchatelet added a reviewer: courbet.
Herald added a project: All.
gchatelet requested review of this revision.
Herald added projects: clang, LLVM.
Herald added subscribers: llvm-commits, cfe-commits.

This remove the last uses of GlobalObject::getAlignment and marks it as 
deprecated.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D142459

Files:
  clang/include/clang/AST/CharUnits.h
  clang/lib/CodeGen/CGCUDANV.cpp
  clang/lib/CodeGen/CGDecl.cpp
  clang/lib/CodeGen/CGObjCMac.cpp
  clang/lib/CodeGen/CodeGenModule.cpp
  llvm/include/llvm/IR/GlobalObject.h

Index: llvm/include/llvm/IR/GlobalObject.h
===
--- llvm/include/llvm/IR/GlobalObject.h
+++ llvm/include/llvm/IR/GlobalObject.h
@@ -67,6 +67,7 @@
   GlobalObject(const GlobalObject &) = delete;
 
   /// FIXME: Remove this function once transition to Align is over.
+  LLVM_DEPRECATED("Use getAlign() instead", "getAlign")
   uint64_t getAlignment() const {
 MaybeAlign Align = getAlign();
 return Align ? Align->value() : 0;
Index: clang/lib/CodeGen/CodeGenModule.cpp
===
--- clang/lib/CodeGen/CodeGenModule.cpp
+++ clang/lib/CodeGen/CodeGenModule.cpp
@@ -2132,7 +2132,7 @@
   // functions. If the current target's C++ ABI requires this and this is a
   // member function, set its alignment accordingly.
   if (getTarget().getCXXABI().areMemberFunctionsAligned()) {
-if (F->getAlignment() < 2 && isa(D))
+if (F->getAlign() < 2 && isa(D))
   F->setAlignment(llvm::Align(2));
   }
 
@@ -5611,8 +5611,8 @@
StringLength);
 
   if (auto *C = Entry.second)
-return ConstantAddress(
-C, C->getValueType(), CharUnits::fromQuantity(C->getAlignment()));
+return ConstantAddress(C, C->getValueType(),
+   CharUnits::fromQuantity(C->getAlign()));
 
   llvm::Constant *Zero = llvm::Constant::getNullValue(Int32Ty);
   llvm::Constant *Zeros[] = { Zero, Zero };
@@ -5909,7 +5909,7 @@
   if (!LangOpts.WritableStrings) {
 Entry = [C];
 if (auto GV = *Entry) {
-  if (uint64_t(Alignment.getQuantity()) > GV->getAlignment())
+  if (GV->getAlign() < uint64_t(Alignment.getQuantity()))
 GV->setAlignment(Alignment.getAsAlign());
   return ConstantAddress(castStringLiteralToDefaultAddressSpace(*this, GV),
  GV->getValueType(), Alignment);
@@ -5976,7 +5976,7 @@
   if (!LangOpts.WritableStrings) {
 Entry = [C];
 if (auto GV = *Entry) {
-  if (uint64_t(Alignment.getQuantity()) > GV->getAlignment())
+  if (GV->getAlign() < uint64_t(Alignment.getQuantity()))
 GV->setAlignment(Alignment.getAsAlign());
   return ConstantAddress(castStringLiteralToDefaultAddressSpace(*this, GV),
  GV->getValueType(), Alignment);
Index: clang/lib/CodeGen/CGObjCMac.cpp
===
--- clang/lib/CodeGen/CGObjCMac.cpp
+++ clang/lib/CodeGen/CGObjCMac.cpp
@@ -1987,8 +1987,8 @@
 GetConstantStringEntry(NSConstantStringMap, Literal, StringLength);
 
   if (auto *C = Entry.second)
-return ConstantAddress(
-C, C->getValueType(), CharUnits::fromQuantity(C->getAlignment()));
+return ConstantAddress(C, C->getValueType(),
+   CharUnits::fromQuantity(C->getAlign()));
 
   // If we don't already have it, get _NSConstantStringClassReference.
   llvm::Constant *Class = getNSConstantStringClassRef();
Index: clang/lib/CodeGen/CGDecl.cpp
===
--- clang/lib/CodeGen/CGDecl.cpp
+++ clang/lib/CodeGen/CGDecl.cpp
@@ -1157,7 +1157,7 @@
 GV->setAlignment(Align.getAsAlign());
 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
 CacheEntry = GV;
-  } else if (CacheEntry->getAlignment() < uint64_t(Align.getQuantity())) {
+  } else if (CacheEntry->getAlign() < uint64_t(Align.getQuantity())) {
 CacheEntry->setAlignment(Align.getAsAlign());
   }
 
Index: clang/lib/CodeGen/CGCUDANV.cpp
===
--- clang/lib/CodeGen/CGCUDANV.cpp
+++ clang/lib/CodeGen/CGCUDANV.cpp
@@ -488,7 +488,7 @@
   llvm::Value *OldV = Var;
   llvm::Instruction *NewV =
   new llvm::LoadInst(Var->getType(), ManagedVar, "ld.managed", false,
- llvm::Align(Var->getAlignment()), I);
+ Var->getAlign().valueOrOne(), I);
   WorkItem.pop_back();
   // Replace constant expressions directly or indirectly using the managed
   // variable with instructions.
@@ -631,7 +631,7 @@
 Builder.CreateBitCast(Var, VoidPtrTy),
 VarName,
 llvm::ConstantInt::get(VarSizeTy, VarSize),
-llvm::ConstantInt::get(IntTy, Var->getAlignment())};
+

[PATCH] D141134: [NFC] Only expose getXXXSize functions in TypeSize

2023-01-12 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet closed this revision.
gchatelet added a comment.

So i've submitted the following patches which remove the usage of 
`TypeSize::getFixedSize()` and `TypeSize::getKnownMinSize()`

- rG6916ebd02650 
: 
[clang][NFC] Use the TypeSize::getXXXValue() instead of 
TypeSize::getXXXSize).Wed, Jan 11, 5:08 PM
- rGca8485578652 
: 
[mlir][NFC] Use TypeSize::getFixedValue() instead of 
TypeSize::getFixedSize().Wed, Jan 11, 5:22 PM
- rGfbd207fd6f6b 
: [NFC] 
Use TypeSize::getKnownMinValue() instead of TypeSize::getKnownMinSize().Wed, 
Jan 11, 5:29 PM
- rG48f5d77eeed4 
: [NFC] 
Use TypeSize::getKnownMinValue() instead of TypeSize::getKnownMinSize().Wed, 
Jan 11, 5:37 PM
- rG8fd5558b2976 
: [NFC] 
Use TypeSize::geFixedValue() instead of TypeSize::getFixedSize().Wed, Jan 11, 
5:49 PM

I've also marked the functions deprecated so downstream users can fix their 
codebase.

- rG1dcaa2bdf230 
: Marking 
TypeSize getFixedSize() and getKnownMinSize() deprecated.

I'm marking this patch as closed.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D141134

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


[PATCH] D141134: [NFC] Only expose getXXXSize functions in TypeSize

2023-01-09 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

I've created https://reviews.llvm.org/D141267 to get a feel of what it looks 
like to only keep the Size version.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D141134

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


[PATCH] D141134: [NFC] Only expose getXXXSize functions in TypeSize

2023-01-09 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 487339.
gchatelet added a comment.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

- Fix missing clang change


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D141134

Files:
  clang/lib/CodeGen/CGDecl.cpp
  llvm/include/llvm/Support/TypeSize.h
  llvm/lib/Analysis/ConstantFolding.cpp
  llvm/lib/Analysis/Loads.cpp
  llvm/lib/CodeGen/Analysis.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  llvm/lib/CodeGen/StackProtector.cpp
  llvm/lib/IR/DataLayout.cpp
  llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
  llvm/lib/Target/AArch64/AArch64ISelLowering.h
  llvm/lib/Target/AMDGPU/AMDGPULowerModuleLDSPass.cpp
  llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp
  llvm/lib/Target/RISCV/RISCVISelLowering.cpp
  llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
  llvm/lib/Transforms/IPO/ArgumentPromotion.cpp
  llvm/utils/TableGen/CodeGenDAGPatterns.cpp

Index: llvm/utils/TableGen/CodeGenDAGPatterns.cpp
===
--- llvm/utils/TableGen/CodeGenDAGPatterns.cpp
+++ llvm/utils/TableGen/CodeGenDAGPatterns.cpp
@@ -764,8 +764,8 @@
 namespace {
 struct TypeSizeComparator {
   bool operator()(const TypeSize , const TypeSize ) const {
-return std::make_tuple(LHS.isScalable(), LHS.getKnownMinValue()) <
-   std::make_tuple(RHS.isScalable(), RHS.getKnownMinValue());
+return std::make_tuple(LHS.isScalable(), LHS.getKnownMinSize()) <
+   std::make_tuple(RHS.isScalable(), RHS.getKnownMinSize());
   }
 };
 } // end anonymous namespace
Index: llvm/lib/Transforms/IPO/ArgumentPromotion.cpp
===
--- llvm/lib/Transforms/IPO/ArgumentPromotion.cpp
+++ llvm/lib/Transforms/IPO/ArgumentPromotion.cpp
@@ -543,7 +543,7 @@
   if (!isAligned(I->getAlign(), Off))
 return false;
 
-  NeededDerefBytes = std::max(NeededDerefBytes, Off + Size.getFixedValue());
+  NeededDerefBytes = std::max(NeededDerefBytes, Off + Size.getFixedSize());
   NeededAlign = std::max(NeededAlign, I->getAlign());
 }
 
Index: llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
===
--- llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
+++ llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
@@ -990,7 +990,7 @@
 unsigned RISCVTTIImpl::getEstimatedVLFor(VectorType *Ty) {
   if (isa(Ty)) {
 const unsigned EltSize = DL.getTypeSizeInBits(Ty->getElementType());
-const unsigned MinSize = DL.getTypeSizeInBits(Ty).getKnownMinValue();
+const unsigned MinSize = DL.getTypeSizeInBits(Ty).getKnownMinSize();
 const unsigned VectorBits = *getVScaleForTuning() * RISCV::RVVBitsPerBlock;
 return RISCVTargetLowering::computeVLMAX(VectorBits, EltSize, MinSize);
   }
@@ -1455,7 +1455,7 @@
   TypeSize Size = DL.getTypeSizeInBits(Ty);
   if (Ty->isVectorTy()) {
 if (Size.isScalable() && ST->hasVInstructions())
-  return divideCeil(Size.getKnownMinValue(), RISCV::RVVBitsPerBlock);
+  return divideCeil(Size.getKnownMinSize(), RISCV::RVVBitsPerBlock);
 
 if (ST->useRVVForFixedLengthVectors())
   return divideCeil(Size, ST->getRealMinVLen());
Index: llvm/lib/Target/RISCV/RISCVISelLowering.cpp
===
--- llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -138,7 +138,7 @@
   if (VT.getVectorMinNumElements() < MinElts)
 return;
 
-  unsigned Size = VT.getSizeInBits().getKnownMinValue();
+  unsigned Size = VT.getSizeInBits().getKnownMinSize();
   const TargetRegisterClass *RC;
   if (Size <= RISCV::RVVBitsPerBlock)
 RC = ::VRRegClass;
@@ -1589,7 +1589,7 @@
 
 RISCVII::VLMUL RISCVTargetLowering::getLMUL(MVT VT) {
   assert(VT.isScalableVector() && "Expecting a scalable vector type");
-  unsigned KnownSize = VT.getSizeInBits().getKnownMinValue();
+  unsigned KnownSize = VT.getSizeInBits().getKnownMinSize();
   if (VT.getVectorElementType() == MVT::i1)
 KnownSize *= 8;
 
@@ -5443,7 +5443,7 @@
 // Optimize for constant AVL
 if (isa(AVL)) {
   unsigned EltSize = VT.getScalarSizeInBits();
-  unsigned MinSize = VT.getSizeInBits().getKnownMinValue();
+  unsigned MinSize = VT.getSizeInBits().getKnownMinSize();
 
   unsigned VectorBitsMax = Subtarget.getRealMaxVLen();
   unsigned MaxVLMAX =
@@ -6419,7 +6419,7 @@
 return DAG.getNode(ISD::TRUNCATE, DL, VecVT, Op2);
   }
   unsigned EltSize = VecVT.getScalarSizeInBits();
-  unsigned MinSize = VecVT.getSizeInBits().getKnownMinValue();
+  unsigned MinSize = VecVT.getSizeInBits().getKnownMinSize();
   unsigned VectorBitsMax = Subtarget.getRealMaxVLen();
   unsigned MaxVLMAX =
 RISCVTargetLowering::computeVLMAX(VectorBitsMax, EltSize, MinSize);
Index: 

[PATCH] D126903: [clang] Add support for __builtin_memset_inline

2022-10-26 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

In D126903#3885269 , @aganea wrote:

> In D126903#3885114 , @gchatelet 
> wrote:
>
>> It should be fixed now @aganea . Can you check?
>
> Works now, thanks again for the quick response. Should D136752 
>  be cherry-picked into the 15.0 branch?

Yes done here : https://github.com/llvm/llvm-project/issues/58627


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D126903

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


[PATCH] D126903: [clang] Add support for __builtin_memset_inline

2022-10-26 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

It should be fixed now @aganea . Can you check?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D126903

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


[PATCH] D126903: [clang] Add support for __builtin_memset_inline

2022-10-26 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

In D126903#3884873 , @courbet wrote:

> I think there's a bug in the code though:
>
>   // If this is memset, we just need to see if the offset is valid in the size
> // of the memset..
> if (MI->getIntrinsicID() == Intrinsic::memset)
>
> should really be:
>
>   // If this is memset, we just need to see if the offset is valid in the size
> // of the memset..
> if (isa(MI))

Yes this seems a likely culprit 
.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D126903

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


[PATCH] D132316: [CMake] Avoid `LLVM_BINARY_DIR` when other more specific variable are better-suited

2022-08-25 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

It also broke `llvm-exegesis` for 32 bits targets, see 
https://github.com/llvm/llvm-project/issues/57348
Reverting changes for the files in `tools/llvm-exegesis/` solves the 
compilation issue.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D132316

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


[PATCH] D126903: [clang] Add support for __builtin_memset_inline

2022-06-10 Thread Guillaume Chatelet 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 rG38637ee47754: [clang] Add support for 
__builtin_memset_inline (authored by gchatelet).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D126903

Files:
  clang/docs/LanguageExtensions.rst
  clang/include/clang/Basic/Builtins.def
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/Sema/SemaChecking.cpp
  clang/test/CodeGen/builtins-memset-inline.c
  clang/test/Sema/builtins-memset-inline.cpp
  llvm/docs/LangRef.rst
  llvm/include/llvm/CodeGen/SelectionDAG.h
  llvm/include/llvm/CodeGen/SelectionDAGTargetInfo.h
  llvm/include/llvm/CodeGen/TargetLowering.h
  llvm/include/llvm/IR/IRBuilder.h
  llvm/include/llvm/IR/IntrinsicInst.h
  llvm/include/llvm/IR/Intrinsics.td
  llvm/lib/Analysis/Lint.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
  llvm/lib/IR/IRBuilder.cpp
  llvm/lib/IR/Verifier.cpp
  llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp
  llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.h
  llvm/lib/Target/ARM/ARMSelectionDAGInfo.cpp
  llvm/lib/Target/ARM/ARMSelectionDAGInfo.h
  llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
  llvm/lib/Target/SystemZ/SystemZSelectionDAGInfo.cpp
  llvm/lib/Target/SystemZ/SystemZSelectionDAGInfo.h
  llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp
  llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.h
  llvm/lib/Target/X86/X86SelectionDAGInfo.cpp
  llvm/lib/Target/X86/X86SelectionDAGInfo.h
  llvm/test/CodeGen/AArch64/memset-inline.ll
  llvm/test/CodeGen/AArch64/memset-vs-memset-inline.ll
  llvm/test/CodeGen/X86/memset-inline.ll
  llvm/test/CodeGen/X86/memset-vs-memset-inline.ll
  llvm/test/Other/lint.ll
  llvm/test/Verifier/intrinsic-immarg.ll
  llvm/test/Verifier/memset-inline.ll

Index: llvm/test/Verifier/memset-inline.ll
===
--- /dev/null
+++ llvm/test/Verifier/memset-inline.ll
@@ -0,0 +1,9 @@
+; RUN: not opt -verify < %s 2>&1 | FileCheck %s
+
+; CHECK: alignment is not a power of two 
+
+define void @foo(i8* %P, i8 %value) {
+  call void @llvm.memset.inline.p0i8.i32(i8* align 3 %P, i8 %value, i32 4, i1 false)
+  ret void
+}
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1) nounwind
Index: llvm/test/Verifier/intrinsic-immarg.ll
===
--- llvm/test/Verifier/intrinsic-immarg.ll
+++ llvm/test/Verifier/intrinsic-immarg.ll
@@ -62,6 +62,23 @@
   ret void
 }
 
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1)
+define void @memset_inline_is_volatile(i8* %dest, i8 %value, i1 %is.volatile) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i1 %is.volatile
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  ret void
+}
+
+define void @memset_inline_variable_size(i8* %dest, i8 %value, i32 %size) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i32 %size
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  ret void
+}
+
 
 declare i64 @llvm.objectsize.i64.p0i8(i8*, i1, i1, i1)
 define void @objectsize(i8* %ptr, i1 %a, i1 %b, i1 %c) {
Index: llvm/test/Other/lint.ll
===
--- llvm/test/Other/lint.ll
+++ llvm/test/Other/lint.ll
@@ -6,6 +6,8 @@
 declare void @llvm.stackrestore(i8*)
 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
 declare void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
+declare void @llvm.memset.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
+declare void @llvm.memset.inline.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
 declare void @has_sret(i8* sret(i8) %p)
 declare void @has_noaliases(i32* noalias %p, i32* %q)
 declare void @one_arg(i32)
@@ -87,6 +89,11 @@
 ; CHECK: Unusual: noalias argument aliases another argument
 call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast (i32* @CG to i8*), i8* bitcast (i32* @CG to i8*), i64 1, i1 0)
 
+; CHECK: Write to read-only memory
+call void @llvm.memset.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+; CHECK: Write to read-only memory
+call void @llvm.memset.inline.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+
 ; CHECK: Undefined behavior: Buffer overflow
   %wider = bitcast i8* %buf to i16*
   store i16 0, i16* %wider
Index: llvm/test/CodeGen/X86/memset-vs-memset-inline.ll

[PATCH] D126903: [clang] Add support for __builtin_memset_inline

2022-06-10 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 435893.
gchatelet added a comment.

rebase


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D126903

Files:
  clang/docs/LanguageExtensions.rst
  clang/include/clang/Basic/Builtins.def
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/Sema/SemaChecking.cpp
  clang/test/CodeGen/builtins-memset-inline.c
  clang/test/Sema/builtins-memset-inline.cpp
  llvm/docs/LangRef.rst
  llvm/include/llvm/CodeGen/SelectionDAG.h
  llvm/include/llvm/CodeGen/SelectionDAGTargetInfo.h
  llvm/include/llvm/CodeGen/TargetLowering.h
  llvm/include/llvm/IR/IRBuilder.h
  llvm/include/llvm/IR/IntrinsicInst.h
  llvm/include/llvm/IR/Intrinsics.td
  llvm/lib/Analysis/Lint.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
  llvm/lib/IR/IRBuilder.cpp
  llvm/lib/IR/Verifier.cpp
  llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp
  llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.h
  llvm/lib/Target/ARM/ARMSelectionDAGInfo.cpp
  llvm/lib/Target/ARM/ARMSelectionDAGInfo.h
  llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
  llvm/lib/Target/SystemZ/SystemZSelectionDAGInfo.cpp
  llvm/lib/Target/SystemZ/SystemZSelectionDAGInfo.h
  llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp
  llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.h
  llvm/lib/Target/X86/X86SelectionDAGInfo.cpp
  llvm/lib/Target/X86/X86SelectionDAGInfo.h
  llvm/test/CodeGen/AArch64/memset-inline.ll
  llvm/test/CodeGen/AArch64/memset-vs-memset-inline.ll
  llvm/test/CodeGen/X86/memset-inline.ll
  llvm/test/CodeGen/X86/memset-vs-memset-inline.ll
  llvm/test/Other/lint.ll
  llvm/test/Verifier/intrinsic-immarg.ll
  llvm/test/Verifier/memset-inline.ll

Index: llvm/test/Verifier/memset-inline.ll
===
--- /dev/null
+++ llvm/test/Verifier/memset-inline.ll
@@ -0,0 +1,9 @@
+; RUN: not opt -verify < %s 2>&1 | FileCheck %s
+
+; CHECK: alignment is not a power of two 
+
+define void @foo(i8* %P, i8 %value) {
+  call void @llvm.memset.inline.p0i8.i32(i8* align 3 %P, i8 %value, i32 4, i1 false)
+  ret void
+}
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1) nounwind
Index: llvm/test/Verifier/intrinsic-immarg.ll
===
--- llvm/test/Verifier/intrinsic-immarg.ll
+++ llvm/test/Verifier/intrinsic-immarg.ll
@@ -62,6 +62,23 @@
   ret void
 }
 
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1)
+define void @memset_inline_is_volatile(i8* %dest, i8 %value, i1 %is.volatile) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i1 %is.volatile
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  ret void
+}
+
+define void @memset_inline_variable_size(i8* %dest, i8 %value, i32 %size) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i32 %size
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  ret void
+}
+
 
 declare i64 @llvm.objectsize.i64.p0i8(i8*, i1, i1, i1)
 define void @objectsize(i8* %ptr, i1 %a, i1 %b, i1 %c) {
Index: llvm/test/Other/lint.ll
===
--- llvm/test/Other/lint.ll
+++ llvm/test/Other/lint.ll
@@ -6,6 +6,8 @@
 declare void @llvm.stackrestore(i8*)
 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
 declare void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
+declare void @llvm.memset.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
+declare void @llvm.memset.inline.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
 declare void @has_sret(i8* sret(i8) %p)
 declare void @has_noaliases(i32* noalias %p, i32* %q)
 declare void @one_arg(i32)
@@ -87,6 +89,11 @@
 ; CHECK: Unusual: noalias argument aliases another argument
 call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast (i32* @CG to i8*), i8* bitcast (i32* @CG to i8*), i64 1, i1 0)
 
+; CHECK: Write to read-only memory
+call void @llvm.memset.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+; CHECK: Write to read-only memory
+call void @llvm.memset.inline.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+
 ; CHECK: Undefined behavior: Buffer overflow
   %wider = bitcast i8* %buf to i16*
   store i16 0, i16* %wider
Index: llvm/test/CodeGen/X86/memset-vs-memset-inline.ll
===
--- /dev/null
+++ llvm/test/CodeGen/X86/memset-vs-memset-inline.ll
@@ -0,0 +1,40 @@
+; NOTE: Assertions 

[PATCH] D126903: [clang] Add support for __builtin_memset_inline

2022-06-10 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 435890.
gchatelet added a comment.

- Update assert message


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D126903

Files:
  clang/docs/LanguageExtensions.rst
  clang/include/clang/Basic/Builtins.def
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/Sema/SemaChecking.cpp
  clang/test/CodeGen/builtins-memset-inline.c
  clang/test/Sema/builtins-memset-inline.cpp
  llvm/docs/LangRef.rst
  llvm/include/llvm/CodeGen/SelectionDAG.h
  llvm/include/llvm/CodeGen/SelectionDAGTargetInfo.h
  llvm/include/llvm/CodeGen/TargetLowering.h
  llvm/include/llvm/IR/IRBuilder.h
  llvm/include/llvm/IR/IntrinsicInst.h
  llvm/include/llvm/IR/Intrinsics.td
  llvm/lib/Analysis/Lint.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
  llvm/lib/IR/IRBuilder.cpp
  llvm/lib/IR/Verifier.cpp
  llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp
  llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.h
  llvm/lib/Target/ARM/ARMSelectionDAGInfo.cpp
  llvm/lib/Target/ARM/ARMSelectionDAGInfo.h
  llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
  llvm/lib/Target/SystemZ/SystemZSelectionDAGInfo.cpp
  llvm/lib/Target/SystemZ/SystemZSelectionDAGInfo.h
  llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp
  llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.h
  llvm/lib/Target/X86/X86SelectionDAGInfo.cpp
  llvm/lib/Target/X86/X86SelectionDAGInfo.h
  llvm/test/CodeGen/AArch64/memset-inline.ll
  llvm/test/CodeGen/AArch64/memset-vs-memset-inline.ll
  llvm/test/CodeGen/X86/memset-inline.ll
  llvm/test/CodeGen/X86/memset-vs-memset-inline.ll
  llvm/test/Other/lint.ll
  llvm/test/Verifier/intrinsic-immarg.ll
  llvm/test/Verifier/memset-inline.ll

Index: llvm/test/Verifier/memset-inline.ll
===
--- /dev/null
+++ llvm/test/Verifier/memset-inline.ll
@@ -0,0 +1,9 @@
+; RUN: not opt -verify < %s 2>&1 | FileCheck %s
+
+; CHECK: alignment is not a power of two 
+
+define void @foo(i8* %P, i8 %value) {
+  call void @llvm.memset.inline.p0i8.i32(i8* align 3 %P, i8 %value, i32 4, i1 false)
+  ret void
+}
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1) nounwind
Index: llvm/test/Verifier/intrinsic-immarg.ll
===
--- llvm/test/Verifier/intrinsic-immarg.ll
+++ llvm/test/Verifier/intrinsic-immarg.ll
@@ -62,6 +62,23 @@
   ret void
 }
 
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1)
+define void @memset_inline_is_volatile(i8* %dest, i8 %value, i1 %is.volatile) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i1 %is.volatile
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  ret void
+}
+
+define void @memset_inline_variable_size(i8* %dest, i8 %value, i32 %size) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i32 %size
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  ret void
+}
+
 
 declare i64 @llvm.objectsize.i64.p0i8(i8*, i1, i1, i1)
 define void @objectsize(i8* %ptr, i1 %a, i1 %b, i1 %c) {
Index: llvm/test/Other/lint.ll
===
--- llvm/test/Other/lint.ll
+++ llvm/test/Other/lint.ll
@@ -6,6 +6,8 @@
 declare void @llvm.stackrestore(i8*)
 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
 declare void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
+declare void @llvm.memset.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
+declare void @llvm.memset.inline.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
 declare void @has_sret(i8* sret(i8) %p)
 declare void @has_noaliases(i32* noalias %p, i32* %q)
 declare void @one_arg(i32)
@@ -87,6 +89,11 @@
 ; CHECK: Unusual: noalias argument aliases another argument
 call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast (i32* @CG to i8*), i8* bitcast (i32* @CG to i8*), i64 1, i1 0)
 
+; CHECK: Write to read-only memory
+call void @llvm.memset.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+; CHECK: Write to read-only memory
+call void @llvm.memset.inline.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+
 ; CHECK: Undefined behavior: Buffer overflow
   %wider = bitcast i8* %buf to i16*
   store i16 0, i16* %wider
Index: llvm/test/CodeGen/X86/memset-vs-memset-inline.ll
===
--- /dev/null
+++ llvm/test/CodeGen/X86/memset-vs-memset-inline.ll
@@ -0,0 +1,40 @@
+; 

[PATCH] D126903: [clang] Add support for __builtin_memset_inline

2022-06-10 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 435883.
gchatelet added a comment.

- Address comments


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D126903

Files:
  clang/docs/LanguageExtensions.rst
  clang/include/clang/Basic/Builtins.def
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/Sema/SemaChecking.cpp
  clang/test/CodeGen/builtins-memset-inline.c
  clang/test/Sema/builtins-memset-inline.cpp
  llvm/docs/LangRef.rst
  llvm/include/llvm/CodeGen/SelectionDAG.h
  llvm/include/llvm/CodeGen/SelectionDAGTargetInfo.h
  llvm/include/llvm/CodeGen/TargetLowering.h
  llvm/include/llvm/IR/IRBuilder.h
  llvm/include/llvm/IR/IntrinsicInst.h
  llvm/include/llvm/IR/Intrinsics.td
  llvm/lib/Analysis/Lint.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
  llvm/lib/IR/IRBuilder.cpp
  llvm/lib/IR/Verifier.cpp
  llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp
  llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.h
  llvm/lib/Target/ARM/ARMSelectionDAGInfo.cpp
  llvm/lib/Target/ARM/ARMSelectionDAGInfo.h
  llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
  llvm/lib/Target/SystemZ/SystemZSelectionDAGInfo.cpp
  llvm/lib/Target/SystemZ/SystemZSelectionDAGInfo.h
  llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp
  llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.h
  llvm/lib/Target/X86/X86SelectionDAGInfo.cpp
  llvm/lib/Target/X86/X86SelectionDAGInfo.h
  llvm/test/CodeGen/AArch64/memset-inline.ll
  llvm/test/CodeGen/AArch64/memset-vs-memset-inline.ll
  llvm/test/CodeGen/X86/memset-inline.ll
  llvm/test/CodeGen/X86/memset-vs-memset-inline.ll
  llvm/test/Other/lint.ll
  llvm/test/Verifier/intrinsic-immarg.ll
  llvm/test/Verifier/memset-inline.ll

Index: llvm/test/Verifier/memset-inline.ll
===
--- /dev/null
+++ llvm/test/Verifier/memset-inline.ll
@@ -0,0 +1,9 @@
+; RUN: not opt -verify < %s 2>&1 | FileCheck %s
+
+; CHECK: alignment is not a power of two 
+
+define void @foo(i8* %P, i8 %value) {
+  call void @llvm.memset.inline.p0i8.i32(i8* align 3 %P, i8 %value, i32 4, i1 false)
+  ret void
+}
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1) nounwind
Index: llvm/test/Verifier/intrinsic-immarg.ll
===
--- llvm/test/Verifier/intrinsic-immarg.ll
+++ llvm/test/Verifier/intrinsic-immarg.ll
@@ -62,6 +62,23 @@
   ret void
 }
 
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1)
+define void @memset_inline_is_volatile(i8* %dest, i8 %value, i1 %is.volatile) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i1 %is.volatile
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  ret void
+}
+
+define void @memset_inline_variable_size(i8* %dest, i8 %value, i32 %size) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i32 %size
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  ret void
+}
+
 
 declare i64 @llvm.objectsize.i64.p0i8(i8*, i1, i1, i1)
 define void @objectsize(i8* %ptr, i1 %a, i1 %b, i1 %c) {
Index: llvm/test/Other/lint.ll
===
--- llvm/test/Other/lint.ll
+++ llvm/test/Other/lint.ll
@@ -6,6 +6,8 @@
 declare void @llvm.stackrestore(i8*)
 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
 declare void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
+declare void @llvm.memset.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
+declare void @llvm.memset.inline.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
 declare void @has_sret(i8* sret(i8) %p)
 declare void @has_noaliases(i32* noalias %p, i32* %q)
 declare void @one_arg(i32)
@@ -87,6 +89,11 @@
 ; CHECK: Unusual: noalias argument aliases another argument
 call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast (i32* @CG to i8*), i8* bitcast (i32* @CG to i8*), i64 1, i1 0)
 
+; CHECK: Write to read-only memory
+call void @llvm.memset.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+; CHECK: Write to read-only memory
+call void @llvm.memset.inline.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+
 ; CHECK: Undefined behavior: Buffer overflow
   %wider = bitcast i8* %buf to i16*
   store i16 0, i16* %wider
Index: llvm/test/CodeGen/X86/memset-vs-memset-inline.ll
===
--- /dev/null
+++ llvm/test/CodeGen/X86/memset-vs-memset-inline.ll
@@ -0,0 +1,40 @@
+; NOTE: 

[PATCH] D126903: [clang] Add support for __builtin_memset_inline

2022-06-10 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added inline comments.



Comment at: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:7334
   if (TSI) {
 SDValue Result = TSI->EmitTargetCodeForMemset(
 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, DstPtrInfo);

courbet wrote:
> There is nothing preveting a target from emitting a call to `memset` here 
> when `AlwaysInline` is `true`. Actually, `X86SelectionDAGInfo` does just that 
> (this very patch is adding `/* AlwaysInline */ false,` to the `getMemset` 
> call that handles the trailing bytes). It happens that because trailing bytes 
> are typically small and therefore inline. it happens to work, but this should 
> be verified somehow (or, maybe easier,  `AlwaysInline` should be passed to 
> `EmitTargetCodeForMemset` so it can do the right thing).
I think this  is OK now, I had to tweak the ARM selection dag as well.



Comment at: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:7344
+assert(ConstantSize && "AlwaysInline requires a constant size!");
+return getMemsetStores(*this, dl, Chain, Dst, Src,
+   ConstantSize->getZExtValue(), Alignment, isVol, 
true,

courbet wrote:
> Not that this is not strictly required to return a valid `SDValue`: Even with 
> an "infinite" `Limit` in `TLI.findOptimalMemOpLowering`, a target that 
> overrides this function could decide to just return false. I'm not sure what 
> we want to do in this case. 
> So I think we should document `findOptimalMemOpLowering` to mention that the 
> default implementation always returns a valid memop lowering if `Limit` is 
> `UINT_MAX` and that target that decide to not provide a memop lowering *must* 
> emit a valid one in `EmitTargetCodeForMemset`. Another option would be to 
> call the generic `TargetLowering::findOptimalMemOpLowering` when the target 
> declines to generate eithe ra memop lowering or target-specific code.
This one is more tricky. I've added a comment on the function and bypassed 
problematic cases but this is far from ideal.
The greedy nature of the algorithm makes it hard to understand the appropriate 
behavior.

I think this is worth stepping back and redesigning the abstraction in a 
subsequent patch.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D126903

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


[PATCH] D126903: [clang] Add support for __builtin_memset_inline

2022-06-10 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 435877.
gchatelet marked an inline comment as done.
gchatelet added a comment.

- Address comments


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D126903

Files:
  clang/docs/LanguageExtensions.rst
  clang/include/clang/Basic/Builtins.def
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/Sema/SemaChecking.cpp
  clang/test/CodeGen/builtins-memset-inline.c
  clang/test/Sema/builtins-memset-inline.cpp
  llvm/docs/LangRef.rst
  llvm/include/llvm/CodeGen/SelectionDAG.h
  llvm/include/llvm/CodeGen/SelectionDAGTargetInfo.h
  llvm/include/llvm/CodeGen/TargetLowering.h
  llvm/include/llvm/IR/IRBuilder.h
  llvm/include/llvm/IR/IntrinsicInst.h
  llvm/include/llvm/IR/Intrinsics.td
  llvm/lib/Analysis/Lint.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
  llvm/lib/IR/IRBuilder.cpp
  llvm/lib/IR/Verifier.cpp
  llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp
  llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.h
  llvm/lib/Target/ARM/ARMSelectionDAGInfo.cpp
  llvm/lib/Target/ARM/ARMSelectionDAGInfo.h
  llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
  llvm/lib/Target/SystemZ/SystemZSelectionDAGInfo.cpp
  llvm/lib/Target/SystemZ/SystemZSelectionDAGInfo.h
  llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp
  llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.h
  llvm/lib/Target/X86/X86SelectionDAGInfo.cpp
  llvm/lib/Target/X86/X86SelectionDAGInfo.h
  llvm/test/CodeGen/AArch64/memset-inline.ll
  llvm/test/CodeGen/AArch64/memset-vs-memset-inline.ll
  llvm/test/CodeGen/X86/memset-inline.ll
  llvm/test/CodeGen/X86/memset-vs-memset-inline.ll
  llvm/test/Other/lint.ll
  llvm/test/Verifier/intrinsic-immarg.ll
  llvm/test/Verifier/memset-inline.ll

Index: llvm/test/Verifier/memset-inline.ll
===
--- /dev/null
+++ llvm/test/Verifier/memset-inline.ll
@@ -0,0 +1,9 @@
+; RUN: not opt -verify < %s 2>&1 | FileCheck %s
+
+; CHECK: alignment is not a power of two 
+
+define void @foo(i8* %P, i8 %value) {
+  call void @llvm.memset.inline.p0i8.i32(i8* align 3 %P, i8 %value, i32 4, i1 false)
+  ret void
+}
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1) nounwind
Index: llvm/test/Verifier/intrinsic-immarg.ll
===
--- llvm/test/Verifier/intrinsic-immarg.ll
+++ llvm/test/Verifier/intrinsic-immarg.ll
@@ -62,6 +62,23 @@
   ret void
 }
 
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1)
+define void @memset_inline_is_volatile(i8* %dest, i8 %value, i1 %is.volatile) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i1 %is.volatile
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  ret void
+}
+
+define void @memset_inline_variable_size(i8* %dest, i8 %value, i32 %size) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i32 %size
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  ret void
+}
+
 
 declare i64 @llvm.objectsize.i64.p0i8(i8*, i1, i1, i1)
 define void @objectsize(i8* %ptr, i1 %a, i1 %b, i1 %c) {
Index: llvm/test/Other/lint.ll
===
--- llvm/test/Other/lint.ll
+++ llvm/test/Other/lint.ll
@@ -6,6 +6,8 @@
 declare void @llvm.stackrestore(i8*)
 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
 declare void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
+declare void @llvm.memset.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
+declare void @llvm.memset.inline.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
 declare void @has_sret(i8* sret(i8) %p)
 declare void @has_noaliases(i32* noalias %p, i32* %q)
 declare void @one_arg(i32)
@@ -87,6 +89,11 @@
 ; CHECK: Unusual: noalias argument aliases another argument
 call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast (i32* @CG to i8*), i8* bitcast (i32* @CG to i8*), i64 1, i1 0)
 
+; CHECK: Write to read-only memory
+call void @llvm.memset.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+; CHECK: Write to read-only memory
+call void @llvm.memset.inline.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+
 ; CHECK: Undefined behavior: Buffer overflow
   %wider = bitcast i8* %buf to i16*
   store i16 0, i16* %wider
Index: llvm/test/CodeGen/X86/memset-vs-memset-inline.ll
===
--- /dev/null
+++ 

[PATCH] D126903: [clang] Add support for __builtin_memset_inline

2022-06-08 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

Pending D127279  before making sure that all 
`EmitTargetCodeForMemset` implementations are enforcing `AlwaysInline`.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D126903

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


[PATCH] D126903: [clang] Add support for __builtin_memset_inline

2022-06-07 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 434793.
gchatelet marked 8 inline comments as done.
gchatelet added a comment.
Herald added subscribers: pmatos, asb, aheejin, jgravelle-google, sbc100, 
dschuff.

- Address comments, add more codegen tests, rebase


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D126903

Files:
  clang/docs/LanguageExtensions.rst
  clang/include/clang/Basic/Builtins.def
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/Sema/SemaChecking.cpp
  clang/test/CodeGen/builtins-memset-inline.c
  clang/test/Sema/builtins-memset-inline.cpp
  llvm/docs/LangRef.rst
  llvm/include/llvm/CodeGen/SelectionDAG.h
  llvm/include/llvm/CodeGen/SelectionDAGTargetInfo.h
  llvm/include/llvm/IR/IRBuilder.h
  llvm/include/llvm/IR/IntrinsicInst.h
  llvm/include/llvm/IR/Intrinsics.td
  llvm/lib/Analysis/Lint.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  llvm/lib/IR/IRBuilder.cpp
  llvm/lib/IR/Verifier.cpp
  llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp
  llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.h
  llvm/lib/Target/ARM/ARMSelectionDAGInfo.cpp
  llvm/lib/Target/ARM/ARMSelectionDAGInfo.h
  llvm/lib/Target/SystemZ/SystemZSelectionDAGInfo.cpp
  llvm/lib/Target/SystemZ/SystemZSelectionDAGInfo.h
  llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp
  llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.h
  llvm/lib/Target/X86/X86SelectionDAGInfo.cpp
  llvm/lib/Target/X86/X86SelectionDAGInfo.h
  llvm/test/CodeGen/AArch64/memset-inline.ll
  llvm/test/CodeGen/AArch64/memset-vs-memset-inline.ll
  llvm/test/CodeGen/X86/memset-inline.ll
  llvm/test/CodeGen/X86/memset-vs-memset-inline.ll
  llvm/test/Other/lint.ll
  llvm/test/Verifier/intrinsic-immarg.ll
  llvm/test/Verifier/memset-inline.ll

Index: llvm/test/Verifier/memset-inline.ll
===
--- /dev/null
+++ llvm/test/Verifier/memset-inline.ll
@@ -0,0 +1,9 @@
+; RUN: not opt -verify < %s 2>&1 | FileCheck %s
+
+; CHECK: alignment is not a power of two 
+
+define void @foo(i8* %P, i8 %value) {
+  call void @llvm.memset.inline.p0i8.i32(i8* align 3 %P, i8 %value, i32 4, i1 false)
+  ret void
+}
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1) nounwind
Index: llvm/test/Verifier/intrinsic-immarg.ll
===
--- llvm/test/Verifier/intrinsic-immarg.ll
+++ llvm/test/Verifier/intrinsic-immarg.ll
@@ -62,6 +62,23 @@
   ret void
 }
 
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1)
+define void @memset_inline_is_volatile(i8* %dest, i8 %value, i1 %is.volatile) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i1 %is.volatile
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  ret void
+}
+
+define void @memset_inline_variable_size(i8* %dest, i8 %value, i32 %size) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i32 %size
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  ret void
+}
+
 
 declare i64 @llvm.objectsize.i64.p0i8(i8*, i1, i1, i1)
 define void @objectsize(i8* %ptr, i1 %a, i1 %b, i1 %c) {
Index: llvm/test/Other/lint.ll
===
--- llvm/test/Other/lint.ll
+++ llvm/test/Other/lint.ll
@@ -6,6 +6,8 @@
 declare void @llvm.stackrestore(i8*)
 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
 declare void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
+declare void @llvm.memset.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
+declare void @llvm.memset.inline.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
 declare void @has_sret(i8* sret(i8) %p)
 declare void @has_noaliases(i32* noalias %p, i32* %q)
 declare void @one_arg(i32)
@@ -87,6 +89,11 @@
 ; CHECK: Unusual: noalias argument aliases another argument
 call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast (i32* @CG to i8*), i8* bitcast (i32* @CG to i8*), i64 1, i1 0)
 
+; CHECK: Write to read-only memory
+call void @llvm.memset.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+; CHECK: Write to read-only memory
+call void @llvm.memset.inline.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+
 ; CHECK: Undefined behavior: Buffer overflow
   %wider = bitcast i8* %buf to i16*
   store i16 0, i16* %wider
Index: llvm/test/CodeGen/X86/memset-vs-memset-inline.ll
===
--- /dev/null
+++ llvm/test/CodeGen/X86/memset-vs-memset-inline.ll
@@ -0,0 +1,40 

[PATCH] D126903: [clang] Add support for __builtin_memset_inline

2022-06-07 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added inline comments.



Comment at: clang/test/Sema/builtins-memcpy-inline.cpp:11
+void test_memcpy_inline_invalid_arg_types() {
+  __builtin_memcpy_inline(1, 2, 3); // expected-error {{cannot initialize a 
parameter of type 'void *' with an rvalue of type 'int'}}
+}

courbet wrote:
> can you split this off (and the corresponding code) to a separate patch ?
Done in 
https://github.com/llvm/llvm-project/commit/d8b540cd312cf924b1904047b56cf8a1cea333f9


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D126903

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


[PATCH] D126903: [clang] Add support for __builtin_memset_inline

2022-06-07 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 434750.
gchatelet marked 2 inline comments as done.
gchatelet added a comment.

- rebase


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D126903

Files:
  clang/docs/LanguageExtensions.rst
  clang/include/clang/Basic/Builtins.def
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/Sema/SemaChecking.cpp
  clang/test/CodeGen/builtins-memset-inline.c
  clang/test/Sema/builtins-memset-inline.cpp
  llvm/docs/LangRef.rst
  llvm/include/llvm/CodeGen/SelectionDAG.h
  llvm/include/llvm/IR/IRBuilder.h
  llvm/include/llvm/IR/IntrinsicInst.h
  llvm/include/llvm/IR/Intrinsics.td
  llvm/lib/Analysis/Lint.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  llvm/lib/IR/IRBuilder.cpp
  llvm/lib/IR/Verifier.cpp
  llvm/lib/Target/X86/X86SelectionDAGInfo.cpp
  llvm/test/CodeGen/X86/memset-inline.ll
  llvm/test/Other/lint.ll
  llvm/test/Verifier/intrinsic-immarg.ll
  llvm/test/Verifier/memset-inline.ll

Index: llvm/test/Verifier/memset-inline.ll
===
--- /dev/null
+++ llvm/test/Verifier/memset-inline.ll
@@ -0,0 +1,9 @@
+; RUN: not opt -verify < %s 2>&1 | FileCheck %s
+
+; CHECK: alignment is not a power of two 
+
+define void @foo(i8* %P, i8 %value) {
+  call void @llvm.memset.inline.p0i8.i32(i8* align 3 %P, i8 %value, i32 4, i1 false)
+  ret void
+}
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1) nounwind
Index: llvm/test/Verifier/intrinsic-immarg.ll
===
--- llvm/test/Verifier/intrinsic-immarg.ll
+++ llvm/test/Verifier/intrinsic-immarg.ll
@@ -62,6 +62,23 @@
   ret void
 }
 
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1)
+define void @memset_inline_is_volatile(i8* %dest, i8 %value, i1 %is.volatile) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i1 %is.volatile
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  ret void
+}
+
+define void @memset_inline_variable_size(i8* %dest, i8 %value, i32 %size) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i32 %size
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  ret void
+}
+
 
 declare i64 @llvm.objectsize.i64.p0i8(i8*, i1, i1, i1)
 define void @objectsize(i8* %ptr, i1 %a, i1 %b, i1 %c) {
Index: llvm/test/Other/lint.ll
===
--- llvm/test/Other/lint.ll
+++ llvm/test/Other/lint.ll
@@ -6,6 +6,8 @@
 declare void @llvm.stackrestore(i8*)
 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
 declare void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
+declare void @llvm.memset.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
+declare void @llvm.memset.inline.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
 declare void @has_sret(i8* sret(i8) %p)
 declare void @has_noaliases(i32* noalias %p, i32* %q)
 declare void @one_arg(i32)
@@ -87,6 +89,11 @@
 ; CHECK: Unusual: noalias argument aliases another argument
 call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast (i32* @CG to i8*), i8* bitcast (i32* @CG to i8*), i64 1, i1 0)
 
+; CHECK: Write to read-only memory
+call void @llvm.memset.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+; CHECK: Write to read-only memory
+call void @llvm.memset.inline.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+
 ; CHECK: Undefined behavior: Buffer overflow
   %wider = bitcast i8* %buf to i16*
   store i16 0, i16* %wider
Index: llvm/test/CodeGen/X86/memset-inline.ll
===
--- /dev/null
+++ llvm/test/CodeGen/X86/memset-inline.ll
@@ -0,0 +1,56 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=core2 | FileCheck %s
+
+declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind
+declare void @llvm.memset.inline.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind
+
+define void @test1(i8* %a, i8 %value) nounwind {
+; CHECK-LABEL: test1:
+; CHECK:   # %bb.0:
+; CHECK-NEXT:# kill: def $esi killed $esi def $rsi
+; CHECK-NEXT:movzbl %sil, %eax
+; CHECK-NEXT:movabsq $72340172838076673, %rcx # imm = 0x101010101010101
+; CHECK-NEXT:imulq %rax, %rcx
+; CHECK-NEXT:movq %rcx, (%rdi)
+; CHECK-NEXT:retq
+  tail call void @llvm.memset.inline.p0i8.i64(i8* %a, i8 %value, i64 8, i1 0)
+  ret void
+}
+
+define void 

[PATCH] D126903: [clang] Add support for __builtin_memset_inline

2022-06-03 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet marked 2 inline comments as done.
gchatelet added inline comments.



Comment at: clang/lib/Sema/SemaChecking.cpp:2293-2315
+  case Builtin::BI__builtin_memset_inline: {
+if (checkArgCount(*this, TheCall, 3))
+  return ExprError();
+auto ArgArrayConversionFailed = [&](unsigned Arg) {
+  ExprResult ArgExpr =
+  DefaultFunctionArrayLvalueConversion(TheCall->getArg(Arg));
+  if (ArgExpr.isInvalid())

rsmith wrote:
> This custom checking seems unnecessary and also insufficient: you're not 
> enforcing that the arguments have the right types. We should convert the 
> arguments to this builtin in the same way we'd convert arguments for a 
> normally-declared function, which you can achieve by removing the "t" flag 
> from the builtin definition and removing all of this logic (except for the 
> nonnull checking, which I don't think we have a way to model in Builtins.def 
> yet).
> 
> Please do the same to `__builtin_memcpy_inline`, which is wrong in the same 
> way. (For example, `__builtin_memcpy_inline(1, 2, 3)` crashes in code 
> generation because it fails to perform proper conversions and type-checking 
> on its arguments.)
Thx!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D126903

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


[PATCH] D126903: [clang] Add support for __builtin_memset_inline

2022-06-03 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 433982.
gchatelet added a comment.

- Fix sema checking


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D126903

Files:
  clang/docs/LanguageExtensions.rst
  clang/include/clang/Basic/Builtins.def
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/Sema/SemaChecking.cpp
  clang/test/CodeGen/builtins-memset-inline.c
  clang/test/Sema/builtins-memcpy-inline.cpp
  clang/test/Sema/builtins-memset-inline.cpp
  llvm/docs/LangRef.rst
  llvm/include/llvm/CodeGen/SelectionDAG.h
  llvm/include/llvm/IR/IRBuilder.h
  llvm/include/llvm/IR/IntrinsicInst.h
  llvm/include/llvm/IR/Intrinsics.td
  llvm/lib/Analysis/Lint.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  llvm/lib/IR/IRBuilder.cpp
  llvm/lib/IR/Verifier.cpp
  llvm/lib/Target/X86/X86SelectionDAGInfo.cpp
  llvm/test/CodeGen/X86/memset-inline.ll
  llvm/test/Other/lint.ll
  llvm/test/Verifier/intrinsic-immarg.ll
  llvm/test/Verifier/memset-inline.ll

Index: llvm/test/Verifier/memset-inline.ll
===
--- /dev/null
+++ llvm/test/Verifier/memset-inline.ll
@@ -0,0 +1,9 @@
+; RUN: not opt -verify < %s 2>&1 | FileCheck %s
+
+; CHECK: alignment is not a power of two 
+
+define void @foo(i8* %P, i8 %value) {
+  call void @llvm.memset.inline.p0i8.i32(i8* align 3 %P, i8 %value, i32 4, i1 false)
+  ret void
+}
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1) nounwind
Index: llvm/test/Verifier/intrinsic-immarg.ll
===
--- llvm/test/Verifier/intrinsic-immarg.ll
+++ llvm/test/Verifier/intrinsic-immarg.ll
@@ -62,6 +62,23 @@
   ret void
 }
 
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1)
+define void @memset_inline_is_volatile(i8* %dest, i8 %value, i1 %is.volatile) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i1 %is.volatile
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  ret void
+}
+
+define void @memset_inline_variable_size(i8* %dest, i8 %value, i32 %size) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i32 %size
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  ret void
+}
+
 
 declare i64 @llvm.objectsize.i64.p0i8(i8*, i1, i1, i1)
 define void @objectsize(i8* %ptr, i1 %a, i1 %b, i1 %c) {
Index: llvm/test/Other/lint.ll
===
--- llvm/test/Other/lint.ll
+++ llvm/test/Other/lint.ll
@@ -6,6 +6,8 @@
 declare void @llvm.stackrestore(i8*)
 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
 declare void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
+declare void @llvm.memset.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
+declare void @llvm.memset.inline.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
 declare void @has_sret(i8* sret(i8) %p)
 declare void @has_noaliases(i32* noalias %p, i32* %q)
 declare void @one_arg(i32)
@@ -87,6 +89,11 @@
 ; CHECK: Unusual: noalias argument aliases another argument
 call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast (i32* @CG to i8*), i8* bitcast (i32* @CG to i8*), i64 1, i1 0)
 
+; CHECK: Write to read-only memory
+call void @llvm.memset.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+; CHECK: Write to read-only memory
+call void @llvm.memset.inline.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+
 ; CHECK: Undefined behavior: Buffer overflow
   %wider = bitcast i8* %buf to i16*
   store i16 0, i16* %wider
Index: llvm/test/CodeGen/X86/memset-inline.ll
===
--- /dev/null
+++ llvm/test/CodeGen/X86/memset-inline.ll
@@ -0,0 +1,56 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=core2 | FileCheck %s
+
+declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind
+declare void @llvm.memset.inline.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind
+
+define void @test1(i8* %a, i8 %value) nounwind {
+; CHECK-LABEL: test1:
+; CHECK:   # %bb.0:
+; CHECK-NEXT:# kill: def $esi killed $esi def $rsi
+; CHECK-NEXT:movzbl %sil, %eax
+; CHECK-NEXT:movabsq $72340172838076673, %rcx # imm = 0x101010101010101
+; CHECK-NEXT:imulq %rax, %rcx
+; CHECK-NEXT:movq %rcx, (%rdi)
+; CHECK-NEXT:retq
+  tail call void @llvm.memset.inline.p0i8.i64(i8* %a, i8 %value, i64 8, i1 0)
+  ret void
+}
+
+define void 

[PATCH] D126903: [clang] Add support for __builtin_memset_inline

2022-06-03 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 433978.
gchatelet added a comment.

- Rebase over formatted CGBuilder.h


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D126903

Files:
  clang/docs/LanguageExtensions.rst
  clang/include/clang/Basic/Builtins.def
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/Sema/SemaChecking.cpp
  clang/test/CodeGen/builtins-memset-inline.c
  clang/test/Sema/builtins-memset-inline.cpp
  llvm/docs/LangRef.rst
  llvm/include/llvm/CodeGen/SelectionDAG.h
  llvm/include/llvm/IR/IRBuilder.h
  llvm/include/llvm/IR/IntrinsicInst.h
  llvm/include/llvm/IR/Intrinsics.td
  llvm/lib/Analysis/Lint.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  llvm/lib/IR/IRBuilder.cpp
  llvm/lib/IR/Verifier.cpp
  llvm/lib/Target/X86/X86SelectionDAGInfo.cpp
  llvm/test/CodeGen/X86/memset-inline.ll
  llvm/test/Other/lint.ll
  llvm/test/Verifier/intrinsic-immarg.ll
  llvm/test/Verifier/memset-inline.ll

Index: llvm/test/Verifier/memset-inline.ll
===
--- /dev/null
+++ llvm/test/Verifier/memset-inline.ll
@@ -0,0 +1,9 @@
+; RUN: not opt -verify < %s 2>&1 | FileCheck %s
+
+; CHECK: alignment is not a power of two 
+
+define void @foo(i8* %P, i8 %value) {
+  call void @llvm.memset.inline.p0i8.i32(i8* align 3 %P, i8 %value, i32 4, i1 false)
+  ret void
+}
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1) nounwind
Index: llvm/test/Verifier/intrinsic-immarg.ll
===
--- llvm/test/Verifier/intrinsic-immarg.ll
+++ llvm/test/Verifier/intrinsic-immarg.ll
@@ -62,6 +62,23 @@
   ret void
 }
 
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1)
+define void @memset_inline_is_volatile(i8* %dest, i8 %value, i1 %is.volatile) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i1 %is.volatile
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  ret void
+}
+
+define void @memset_inline_variable_size(i8* %dest, i8 %value, i32 %size) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i32 %size
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  ret void
+}
+
 
 declare i64 @llvm.objectsize.i64.p0i8(i8*, i1, i1, i1)
 define void @objectsize(i8* %ptr, i1 %a, i1 %b, i1 %c) {
Index: llvm/test/Other/lint.ll
===
--- llvm/test/Other/lint.ll
+++ llvm/test/Other/lint.ll
@@ -6,6 +6,8 @@
 declare void @llvm.stackrestore(i8*)
 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
 declare void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
+declare void @llvm.memset.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
+declare void @llvm.memset.inline.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
 declare void @has_sret(i8* sret(i8) %p)
 declare void @has_noaliases(i32* noalias %p, i32* %q)
 declare void @one_arg(i32)
@@ -87,6 +89,11 @@
 ; CHECK: Unusual: noalias argument aliases another argument
 call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast (i32* @CG to i8*), i8* bitcast (i32* @CG to i8*), i64 1, i1 0)
 
+; CHECK: Write to read-only memory
+call void @llvm.memset.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+; CHECK: Write to read-only memory
+call void @llvm.memset.inline.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+
 ; CHECK: Undefined behavior: Buffer overflow
   %wider = bitcast i8* %buf to i16*
   store i16 0, i16* %wider
Index: llvm/test/CodeGen/X86/memset-inline.ll
===
--- /dev/null
+++ llvm/test/CodeGen/X86/memset-inline.ll
@@ -0,0 +1,56 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=core2 | FileCheck %s
+
+declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind
+declare void @llvm.memset.inline.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind
+
+define void @test1(i8* %a, i8 %value) nounwind {
+; CHECK-LABEL: test1:
+; CHECK:   # %bb.0:
+; CHECK-NEXT:# kill: def $esi killed $esi def $rsi
+; CHECK-NEXT:movzbl %sil, %eax
+; CHECK-NEXT:movabsq $72340172838076673, %rcx # imm = 0x101010101010101
+; CHECK-NEXT:imulq %rax, %rcx
+; CHECK-NEXT:movq %rcx, (%rdi)
+; CHECK-NEXT:retq
+  tail call void @llvm.memset.inline.p0i8.i64(i8* %a, i8 %value, i64 8, i1 0)
+  ret void
+}
+
+define void @regular_memset_calls_external_function(i8* %a, 

[PATCH] D126903: [clang] Add support for __builtin_memset_inline

2022-06-02 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 433858.
gchatelet added a comment.

- remove unused variable and rebase


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D126903

Files:
  clang/docs/LanguageExtensions.rst
  clang/include/clang/Basic/Builtins.def
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/Sema/SemaChecking.cpp
  clang/test/CodeGen/builtins-memset-inline.c
  clang/test/Sema/builtins-memset-inline.cpp
  llvm/docs/LangRef.rst
  llvm/include/llvm/CodeGen/SelectionDAG.h
  llvm/include/llvm/IR/IRBuilder.h
  llvm/include/llvm/IR/IntrinsicInst.h
  llvm/include/llvm/IR/Intrinsics.td
  llvm/lib/Analysis/Lint.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  llvm/lib/IR/IRBuilder.cpp
  llvm/lib/IR/Verifier.cpp
  llvm/lib/Target/X86/X86SelectionDAGInfo.cpp
  llvm/test/CodeGen/X86/memset-inline.ll
  llvm/test/Other/lint.ll
  llvm/test/Verifier/intrinsic-immarg.ll
  llvm/test/Verifier/memset-inline.ll

Index: llvm/test/Verifier/memset-inline.ll
===
--- /dev/null
+++ llvm/test/Verifier/memset-inline.ll
@@ -0,0 +1,9 @@
+; RUN: not opt -verify < %s 2>&1 | FileCheck %s
+
+; CHECK: alignment is not a power of two 
+
+define void @foo(i8* %P, i8 %value) {
+  call void @llvm.memset.inline.p0i8.i32(i8* align 3 %P, i8 %value, i32 4, i1 false)
+  ret void
+}
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1) nounwind
Index: llvm/test/Verifier/intrinsic-immarg.ll
===
--- llvm/test/Verifier/intrinsic-immarg.ll
+++ llvm/test/Verifier/intrinsic-immarg.ll
@@ -62,6 +62,23 @@
   ret void
 }
 
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1)
+define void @memset_inline_is_volatile(i8* %dest, i8 %value, i1 %is.volatile) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i1 %is.volatile
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  ret void
+}
+
+define void @memset_inline_variable_size(i8* %dest, i8 %value, i32 %size) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i32 %size
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  ret void
+}
+
 
 declare i64 @llvm.objectsize.i64.p0i8(i8*, i1, i1, i1)
 define void @objectsize(i8* %ptr, i1 %a, i1 %b, i1 %c) {
Index: llvm/test/Other/lint.ll
===
--- llvm/test/Other/lint.ll
+++ llvm/test/Other/lint.ll
@@ -6,6 +6,8 @@
 declare void @llvm.stackrestore(i8*)
 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
 declare void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
+declare void @llvm.memset.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
+declare void @llvm.memset.inline.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
 declare void @has_sret(i8* sret(i8) %p)
 declare void @has_noaliases(i32* noalias %p, i32* %q)
 declare void @one_arg(i32)
@@ -87,6 +89,11 @@
 ; CHECK: Unusual: noalias argument aliases another argument
 call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast (i32* @CG to i8*), i8* bitcast (i32* @CG to i8*), i64 1, i1 0)
 
+; CHECK: Write to read-only memory
+call void @llvm.memset.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+; CHECK: Write to read-only memory
+call void @llvm.memset.inline.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+
 ; CHECK: Undefined behavior: Buffer overflow
   %wider = bitcast i8* %buf to i16*
   store i16 0, i16* %wider
Index: llvm/test/CodeGen/X86/memset-inline.ll
===
--- /dev/null
+++ llvm/test/CodeGen/X86/memset-inline.ll
@@ -0,0 +1,56 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=core2 | FileCheck %s
+
+declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind
+declare void @llvm.memset.inline.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind
+
+define void @test1(i8* %a, i8 %value) nounwind {
+; CHECK-LABEL: test1:
+; CHECK:   # %bb.0:
+; CHECK-NEXT:# kill: def $esi killed $esi def $rsi
+; CHECK-NEXT:movzbl %sil, %eax
+; CHECK-NEXT:movabsq $72340172838076673, %rcx # imm = 0x101010101010101
+; CHECK-NEXT:imulq %rax, %rcx
+; CHECK-NEXT:movq %rcx, (%rdi)
+; CHECK-NEXT:retq
+  tail call void @llvm.memset.inline.p0i8.i64(i8* %a, i8 %value, i64 8, i1 0)
+  ret void
+}
+
+define void @regular_memset_calls_external_function(i8* %a, 

[PATCH] D126903: [clang] Add support for __builtin_memset_inline

2022-06-02 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet created this revision.
gchatelet added reviewers: courbet, efriedma, t.p.northover, jdoerfert.
Herald added subscribers: jsji, pengfei, hiraditya.
Herald added a project: All.
gchatelet requested review of this revision.
Herald added projects: clang, LLVM.
Herald added subscribers: llvm-commits, cfe-commits.

In the same spirit as D73543  and in reply to 
https://reviews.llvm.org/D126768#3549920 this patch is adding support for 
`__builtin_memset_inline`.

The idea is to get support from the compiler to easily write efficient memory 
function implementations.

This patch could be split in two:

- one for the LLVM part adding the `llvm.memset.inline.*` intrinsics.
- and another one for the Clang part providing the instrinsic as a builtin.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D126903

Files:
  clang/docs/LanguageExtensions.rst
  clang/include/clang/Basic/Builtins.def
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/Sema/SemaChecking.cpp
  clang/test/CodeGen/builtins-memset-inline.c
  clang/test/Sema/builtins-memset-inline.cpp
  llvm/docs/LangRef.rst
  llvm/include/llvm/CodeGen/SelectionDAG.h
  llvm/include/llvm/IR/IRBuilder.h
  llvm/include/llvm/IR/IntrinsicInst.h
  llvm/include/llvm/IR/Intrinsics.td
  llvm/lib/Analysis/Lint.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  llvm/lib/IR/IRBuilder.cpp
  llvm/lib/IR/Verifier.cpp
  llvm/lib/Target/X86/X86SelectionDAGInfo.cpp
  llvm/test/CodeGen/X86/memset-inline.ll
  llvm/test/Other/lint.ll
  llvm/test/Verifier/intrinsic-immarg.ll
  llvm/test/Verifier/memset-inline.ll

Index: llvm/test/Verifier/memset-inline.ll
===
--- /dev/null
+++ llvm/test/Verifier/memset-inline.ll
@@ -0,0 +1,9 @@
+; RUN: not opt -verify < %s 2>&1 | FileCheck %s
+
+; CHECK: alignment is not a power of two 
+
+define void @foo(i8* %P, i8 %value) {
+  call void @llvm.memset.inline.p0i8.i32(i8* align 3 %P, i8 %value, i32 4, i1 false)
+  ret void
+}
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1) nounwind
Index: llvm/test/Verifier/intrinsic-immarg.ll
===
--- llvm/test/Verifier/intrinsic-immarg.ll
+++ llvm/test/Verifier/intrinsic-immarg.ll
@@ -62,6 +62,23 @@
   ret void
 }
 
+declare void @llvm.memset.inline.p0i8.i32(i8* nocapture, i8, i32, i1)
+define void @memset_inline_is_volatile(i8* %dest, i8 %value, i1 %is.volatile) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i1 %is.volatile
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 8, i1 %is.volatile)
+  ret void
+}
+
+define void @memset_inline_variable_size(i8* %dest, i8 %value, i32 %size) {
+  ; CHECK: immarg operand has non-immediate parameter
+  ; CHECK-NEXT: i32 %size
+  ; CHECK-NEXT: call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  call void @llvm.memset.inline.p0i8.i32(i8* %dest, i8 %value, i32 %size, i1 true)
+  ret void
+}
+
 
 declare i64 @llvm.objectsize.i64.p0i8(i8*, i1, i1, i1)
 define void @objectsize(i8* %ptr, i1 %a, i1 %b, i1 %c) {
Index: llvm/test/Other/lint.ll
===
--- llvm/test/Other/lint.ll
+++ llvm/test/Other/lint.ll
@@ -6,6 +6,8 @@
 declare void @llvm.stackrestore(i8*)
 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
 declare void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
+declare void @llvm.memset.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
+declare void @llvm.memset.inline.p0i8.i8.i64(i8* nocapture, i8, i64, i1) nounwind
 declare void @has_sret(i8* sret(i8) %p)
 declare void @has_noaliases(i32* noalias %p, i32* %q)
 declare void @one_arg(i32)
@@ -87,6 +89,11 @@
 ; CHECK: Unusual: noalias argument aliases another argument
 call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast (i32* @CG to i8*), i8* bitcast (i32* @CG to i8*), i64 1, i1 0)
 
+; CHECK: Write to read-only memory
+call void @llvm.memset.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+; CHECK: Write to read-only memory
+call void @llvm.memset.inline.p0i8.i8.i64(i8* bitcast (i32* @CG to i8*), i8 1, i64 1, i1 0)
+
 ; CHECK: Undefined behavior: Buffer overflow
   %wider = bitcast i8* %buf to i16*
   store i16 0, i16* %wider
Index: llvm/test/CodeGen/X86/memset-inline.ll
===
--- /dev/null
+++ llvm/test/CodeGen/X86/memset-inline.ll
@@ -0,0 +1,56 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=core2 | FileCheck %s
+
+declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, 

[PATCH] D121965: Add validation for number of arguments of __builtin_memcpy_inline

2022-03-18 Thread Guillaume Chatelet 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 rG4b3a27e2e026: Add validation for number of arguments of 
__builtin_memcpy_inline (authored by royjacobson, committed by gchatelet).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D121965

Files:
  clang/lib/Sema/SemaChecking.cpp
  clang/test/Sema/builtins-memcpy-inline.cpp


Index: clang/test/Sema/builtins-memcpy-inline.cpp
===
--- clang/test/Sema/builtins-memcpy-inline.cpp
+++ clang/test/Sema/builtins-memcpy-inline.cpp
@@ -42,3 +42,8 @@
   __builtin_memcpy_inline(ptr, a, 5);
   __builtin_memcpy_inline(a, ptr, 5);
 }
+
+void test_memcpy_inline_num_args(void *dst, void *src) {
+ __builtin_memcpy_inline(); // expected-error {{too few arguments to function 
call}}
+ __builtin_memcpy_inline(dst, src, 4, NULL); // expected-error {{too many 
arguments to function call}}
+}
Index: clang/lib/Sema/SemaChecking.cpp
===
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -1679,7 +1679,10 @@
 if ((ICEArguments & (1 << ArgNo)) == 0) continue;
 
 llvm::APSInt Result;
-if (SemaBuiltinConstantArg(TheCall, ArgNo, Result))
+// If we don't have enough arguments, continue so we can issue better
+// diagnostic in checkArgCount(...)
+if (ArgNo < TheCall->getNumArgs() &&
+SemaBuiltinConstantArg(TheCall, ArgNo, Result))
   return true;
 ICEArguments &= ~(1 << ArgNo);
   }
@@ -1943,6 +1946,8 @@
   case Builtin::BI__builtin_nontemporal_store:
 return SemaBuiltinNontemporalOverloaded(TheCallResult);
   case Builtin::BI__builtin_memcpy_inline: {
+if (checkArgCount(*this, TheCall, 3))
+  return ExprError();
 auto ArgArrayConversionFailed = [&](unsigned Arg) {
   ExprResult ArgExpr =
   DefaultFunctionArrayLvalueConversion(TheCall->getArg(Arg));


Index: clang/test/Sema/builtins-memcpy-inline.cpp
===
--- clang/test/Sema/builtins-memcpy-inline.cpp
+++ clang/test/Sema/builtins-memcpy-inline.cpp
@@ -42,3 +42,8 @@
   __builtin_memcpy_inline(ptr, a, 5);
   __builtin_memcpy_inline(a, ptr, 5);
 }
+
+void test_memcpy_inline_num_args(void *dst, void *src) {
+ __builtin_memcpy_inline(); // expected-error {{too few arguments to function call}}
+ __builtin_memcpy_inline(dst, src, 4, NULL); // expected-error {{too many arguments to function call}}
+}
Index: clang/lib/Sema/SemaChecking.cpp
===
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -1679,7 +1679,10 @@
 if ((ICEArguments & (1 << ArgNo)) == 0) continue;
 
 llvm::APSInt Result;
-if (SemaBuiltinConstantArg(TheCall, ArgNo, Result))
+// If we don't have enough arguments, continue so we can issue better
+// diagnostic in checkArgCount(...)
+if (ArgNo < TheCall->getNumArgs() &&
+SemaBuiltinConstantArg(TheCall, ArgNo, Result))
   return true;
 ICEArguments &= ~(1 << ArgNo);
   }
@@ -1943,6 +1946,8 @@
   case Builtin::BI__builtin_nontemporal_store:
 return SemaBuiltinNontemporalOverloaded(TheCallResult);
   case Builtin::BI__builtin_memcpy_inline: {
+if (checkArgCount(*this, TheCall, 3))
+  return ExprError();
 auto ArgArrayConversionFailed = [&](unsigned Arg) {
   ExprResult ArgExpr =
   DefaultFunctionArrayLvalueConversion(TheCall->getArg(Arg));
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D121965: Add validation for number of arguments of __builtin_memcpy_inline

2022-03-18 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet accepted this revision.
gchatelet added a comment.
This revision is now accepted and ready to land.

Thx!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D121965

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


[PATCH] D121475: [Clang][Sema] Avoid crashing for `__builtin_memcpy_inline` with an array argument

2022-03-14 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet accepted this revision.
gchatelet added a comment.

Much better, thank you.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D121475

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


[PATCH] D121475: [Clang][Sema] Avoid crashing for `__builtin_memcpy_inline` with an array argument

2022-03-14 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet accepted this revision.
gchatelet added a comment.
This revision is now accepted and ready to land.

Thx for the patch, please address the comment before submitting.




Comment at: clang/lib/Sema/SemaChecking.cpp:1946-1953
+auto ArgArrayConversion = [&](unsigned Arg) {
+  ExprResult ArgExpr =
+  DefaultFunctionArrayLvalueConversion(TheCall->getArg(Arg));
+  if (ArgExpr.isInvalid())
+return true;
+  TheCall->setArg(Arg, ArgExpr.get());
+  return false;

[nit] It's unclear looking at the function name that it's failing when 
returning `true` - one has to read the code to understand. It may be fine now 
but could become messy with time and refactoring.
Either change the lambda's name `FailArgArrayConversion` or negate everything.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D121475

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


[PATCH] D112881: [clang-tidy] Allow disabling integer to floating-point narrowing conversions for cppcoreguidelines-narrowing-conversions

2021-11-26 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

LGTM once tests are passing. Maybe wait a bit for a comment from @aaron.ballman 
.


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

https://reviews.llvm.org/D112881

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


[PATCH] D104018: [clang-tidy] Allow disabling integer narrowing conversions for cppcoreguidelines-narrowing-conversions

2021-06-10 Thread Guillaume Chatelet via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rG89c41c335dac: [clang-tidy] Allow disabling integer narrowing 
conversions for… (authored by gchatelet).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D104018

Files:
  clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp
  clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.h
  
clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines-narrowing-conversions.rst
  
clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-narrowing-conversions-narrowinginteger-option.cpp

Index: clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-narrowing-conversions-narrowinginteger-option.cpp
===
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-narrowing-conversions-narrowinginteger-option.cpp
@@ -0,0 +1,23 @@
+// RUN: %check_clang_tidy -check-suffix=DEFAULT %s \
+// RUN: cppcoreguidelines-narrowing-conversions %t -- \
+// RUN: -config='{CheckOptions: [{key: cppcoreguidelines-narrowing-conversions.WarnOnIntegerNarrowingConversion, value: true}]}'
+
+// RUN: %check_clang_tidy -check-suffix=DISABLED %s \
+// RUN: cppcoreguidelines-narrowing-conversions %t -- \
+// RUN: -config='{CheckOptions: [{key: cppcoreguidelines-narrowing-conversions.WarnOnIntegerNarrowingConversion, value: false}]}'
+
+void foo(unsigned long long value) {
+  int a = value;
+  // CHECK-MESSAGES-DEFAULT: :[[@LINE-1]]:11: warning: narrowing conversion from 'unsigned long long' to signed type 'int' is implementation-defined [cppcoreguidelines-narrowing-conversions]
+  // DISABLED: No warning for integer narrowing conversions when WarnOnIntegerNarrowingConversion = false.
+  long long b = value;
+  // CHECK-MESSAGES-DEFAULT: :[[@LINE-1]]:17: warning: narrowing conversion from 'unsigned long long' to signed type 'long long' is implementation-defined [cppcoreguidelines-narrowing-conversions]
+  // DISABLED: No warning for integer narrowing conversions when WarnOnIntegerNarrowingConversion = false.
+}
+
+void casting_float_to_bool_is_still_operational_when_integer_narrowing_is_disabled(float f) {
+  if (f) {
+// CHECK-MESSAGES-DEFAULT: :[[@LINE-1]]:7: warning: narrowing conversion from 'float' to 'bool' [cppcoreguidelines-narrowing-conversions]
+// CHECK-MESSAGES-DISABLED: :[[@LINE-2]]:7: warning: narrowing conversion from 'float' to 'bool' [cppcoreguidelines-narrowing-conversions]
+  }
+}
Index: clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines-narrowing-conversions.rst
===
--- clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines-narrowing-conversions.rst
+++ clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines-narrowing-conversions.rst
@@ -13,7 +13,8 @@
 https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#es46-avoid-lossy-narrowing-truncating-arithmetic-conversions.
 
 We enforce only part of the guideline, more specifically, we flag narrowing conversions from:
- - an integer to a narrower integer (e.g. ``char`` to ``unsigned char``),
+ - an integer to a narrower integer (e.g. ``char`` to ``unsigned char``)
+   if WarnOnIntegerNarrowingConversion Option is set,
  - an integer to a narrower floating-point (e.g. ``uint64_t`` to ``float``),
  - a floating-point to an integer (e.g. ``double`` to ``int``),
  - a floating-point to a narrower floating-point (e.g. ``double`` to ``float``)
@@ -30,6 +31,11 @@
 Options
 ---
 
+.. option:: WarnOnIntegerNarrowingConversion
+
+When `true`, the check will warn on narrowing integer conversion
+(e.g. ``int`` to ``size_t``). `true` by default.
+
 .. option:: WarnOnFloatingPointNarrowingConversion
 
 When `true`, the check will warn on narrowing floating point conversion
Index: clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.h
===
--- clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.h
+++ clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.h
@@ -93,6 +93,7 @@
   void handleBinaryOperator(const ASTContext ,
 const BinaryOperator );
 
+  const bool WarnOnIntegerNarrowingConversion;
   const bool WarnOnFloatingPointNarrowingConversion;
   const bool WarnWithinTemplateInstantiation;
   const bool WarnOnEquivalentBitWidth;
Index: clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp
===
--- clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp
+++ clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp
@@ -35,6 +35,8 @@
 NarrowingConversionsCheck::NarrowingConversionsCheck(StringRef 

[PATCH] D104018: [clang-tidy] Allow disabling integer narrowing conversions for cppcoreguidelines-narrowing-conversions

2021-06-10 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet created this revision.
gchatelet added a reviewer: courbet.
Herald added subscribers: shchenz, kbarton, xazax.hun, nemanjai.
gchatelet requested review of this revision.
Herald added a project: clang-tools-extra.
Herald added a subscriber: cfe-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D104018

Files:
  clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp
  clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.h
  
clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines-narrowing-conversions.rst
  
clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-narrowing-conversions-narrowinginteger-option.cpp

Index: clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-narrowing-conversions-narrowinginteger-option.cpp
===
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-narrowing-conversions-narrowinginteger-option.cpp
@@ -0,0 +1,23 @@
+// RUN: %check_clang_tidy -check-suffix=DEFAULT %s \
+// RUN: cppcoreguidelines-narrowing-conversions %t -- \
+// RUN: -config='{CheckOptions: [{key: cppcoreguidelines-narrowing-conversions.WarnOnIntegerNarrowingConversion, value: true}]}'
+
+// RUN: %check_clang_tidy -check-suffix=DISABLED %s \
+// RUN: cppcoreguidelines-narrowing-conversions %t -- \
+// RUN: -config='{CheckOptions: [{key: cppcoreguidelines-narrowing-conversions.WarnOnIntegerNarrowingConversion, value: false}]}'
+
+void foo(unsigned long long value) {
+  int a = value;
+  // CHECK-MESSAGES-DEFAULT: :[[@LINE-1]]:11: warning: narrowing conversion from 'unsigned long long' to signed type 'int' is implementation-defined [cppcoreguidelines-narrowing-conversions]
+  // DISABLED: No warning for integer narrowing conversions when WarnOnIntegerNarrowingConversion = false.
+  long long b = value;
+  // CHECK-MESSAGES-DEFAULT: :[[@LINE-1]]:17: warning: narrowing conversion from 'unsigned long long' to signed type 'long long' is implementation-defined [cppcoreguidelines-narrowing-conversions]
+  // DISABLED: No warning for integer narrowing conversions when WarnOnIntegerNarrowingConversion = false.
+}
+
+void casting_float_to_bool_is_still_operational_when_integer_narrowing_is_disabled(float f) {
+  if (f) {
+// CHECK-MESSAGES-DEFAULT: :[[@LINE-1]]:7: warning: narrowing conversion from 'float' to 'bool' [cppcoreguidelines-narrowing-conversions]
+// CHECK-MESSAGES-DISABLED: :[[@LINE-2]]:7: warning: narrowing conversion from 'float' to 'bool' [cppcoreguidelines-narrowing-conversions]
+  }
+}
Index: clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines-narrowing-conversions.rst
===
--- clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines-narrowing-conversions.rst
+++ clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines-narrowing-conversions.rst
@@ -13,7 +13,8 @@
 https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#es46-avoid-lossy-narrowing-truncating-arithmetic-conversions.
 
 We enforce only part of the guideline, more specifically, we flag narrowing conversions from:
- - an integer to a narrower integer (e.g. ``char`` to ``unsigned char``),
+ - an integer to a narrower integer (e.g. ``char`` to ``unsigned char``)
+   if WarnOnIntegerNarrowingConversion Option is set,
  - an integer to a narrower floating-point (e.g. ``uint64_t`` to ``float``),
  - a floating-point to an integer (e.g. ``double`` to ``int``),
  - a floating-point to a narrower floating-point (e.g. ``double`` to ``float``)
@@ -30,6 +31,11 @@
 Options
 ---
 
+.. option:: WarnOnIntegerNarrowingConversion
+
+When `true`, the check will warn on narrowing integer conversion
+(e.g. ``int`` to ``size_t``). `true` by default.
+
 .. option:: WarnOnFloatingPointNarrowingConversion
 
 When `true`, the check will warn on narrowing floating point conversion
Index: clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.h
===
--- clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.h
+++ clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.h
@@ -93,6 +93,7 @@
   void handleBinaryOperator(const ASTContext ,
 const BinaryOperator );
 
+  const bool WarnOnIntegerNarrowingConversion;
   const bool WarnOnFloatingPointNarrowingConversion;
   const bool WarnWithinTemplateInstantiation;
   const bool WarnOnEquivalentBitWidth;
Index: clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp
===
--- clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp
+++ clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp
@@ -35,6 +35,8 @@
 NarrowingConversionsCheck::NarrowingConversionsCheck(StringRef 

[PATCH] D102760: [llvm] Let SmallVector construct from any Iterable

2021-06-07 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet abandoned this revision.
gchatelet added a comment.

In D102760#2802520 , @Quuxplusone 
wrote:

> @gchatelet: Thanks for the link to D102679  
> — that seems like very relevant background info I didn't have!  Having looked 
> through D102679 , though, I don't see how 
> it would benefit from D102760  — in fact, 
> D102679  updates some tests to wisely 
> //stop// depending on the ability to construct `SmallVector` from a range 
> (and goes to using begin/end pairs instead — good!).

Yes these (recent) changes are based on your comments : )

> So I think D102679  is a good idea (modulo 
> the review comments I just left), and I continue to think that this D102760 
>  is a bad idea that should be abandoned.

This is my plan indeed. Thx for your insights. I really appreciate it.
I wanted to see the impact of removing the constructor first, it's very minor 
so I'll go ahead and abandon this change.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D102760

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


[PATCH] D102760: [llvm] Let SmallVector construct from any Iterable

2021-06-07 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

@Quuxplusone thx a lot for the comment. It is very relevant and I agree that 
this addition may be dangerous.
The intend was to prevent adding more constructors (and dependencies) to 
SmallVector in D102679 .
I can try to see what it takes to call `begin` and `end` explicitly.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D102760

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


[PATCH] D102760: [llvm] Let SmallVector construct from any Iterable

2021-05-27 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 348228.
gchatelet added a comment.

- Rebase


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D102760

Files:
  clang/include/clang/Basic/Module.h
  llvm/include/llvm/ADT/IterableTraits.h
  llvm/include/llvm/ADT/SmallVector.h
  llvm/tools/llvm-xray/xray-converter.cpp
  llvm/unittests/ADT/CMakeLists.txt
  llvm/unittests/ADT/IterableTraitsTest.cpp
  llvm/unittests/ADT/SmallVectorTest.cpp

Index: llvm/unittests/ADT/SmallVectorTest.cpp
===
--- llvm/unittests/ADT/SmallVectorTest.cpp
+++ llvm/unittests/ADT/SmallVectorTest.cpp
@@ -226,6 +226,22 @@
   this->assertValuesInOrder(this->theVector, 3u, 1, 2, 3);
 }
 
+// Constructor test.
+TYPED_TEST(SmallVectorTest, ConstructorIterableCArrayTest) {
+  SCOPED_TRACE("ConstructorTest");
+  int arr[] = {1, 2, 3};
+  this->theVector = SmallVector(arr);
+  this->assertValuesInOrder(this->theVector, 3u, 1, 2, 3);
+}
+
+// Constructor test.
+TYPED_TEST(SmallVectorTest, ConstructorIterableVectorTest) {
+  SCOPED_TRACE("ConstructorTest");
+  std::vector vec = {1, 2, 3};
+  this->theVector = SmallVector(vec);
+  this->assertValuesInOrder(this->theVector, 3u, 1, 2, 3);
+}
+
 // New vector test.
 TYPED_TEST(SmallVectorTest, EmptyVectorTest) {
   SCOPED_TRACE("EmptyVectorTest");
Index: llvm/unittests/ADT/IterableTraitsTest.cpp
===
--- /dev/null
+++ llvm/unittests/ADT/IterableTraitsTest.cpp
@@ -0,0 +1,62 @@
+//===- IterableTraitsTest.cpp - Unit tests for is_range_iterable --===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+#include "llvm/ADT/IterableTraits.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/iterator_range.h"
+#include "gtest/gtest.h"
+#include 
+#include 
+#include 
+
+namespace llvm {
+
+class ForwardDeclared;
+
+TEST(IteratorRangeTest, IsForwardIterator) {
+  EXPECT_FALSE(is_forward_iterator::value);
+  EXPECT_TRUE(is_forward_iterator::value);
+  EXPECT_TRUE(is_forward_iterator::value);
+  EXPECT_TRUE(is_forward_iterator::value);
+  using ForwardList = std::forward_list;
+  EXPECT_TRUE(is_forward_iterator::value);
+  EXPECT_TRUE(is_forward_iterator::value);
+}
+
+TEST(IteratorRangeTest, IsIterableCArray) {
+  int Data[4];
+  EXPECT_TRUE(
+  is_range_iterable>::value);
+}
+
+TEST(IteratorRangeTest, IsIterableVector) {
+  using Vector = std::vector;
+  EXPECT_TRUE(is_range_iterable::value);
+}
+
+TEST(IteratorRangeTest, IsIterableArray) {
+  using Array = std::array;
+  EXPECT_TRUE(is_range_iterable::value);
+}
+
+TEST(IteratorRangeTest, IsIterableSmallVector) {
+  using SVector = SmallVector;
+  EXPECT_TRUE(is_range_iterable::value);
+}
+
+TEST(IteratorRangeTest, IsIterableRange) {
+  using Range = iterator_range;
+  EXPECT_TRUE(is_range_iterable::value);
+}
+
+TEST(IteratorRangeTest, NonIterableTypes) {
+  EXPECT_FALSE(is_range_iterable::value);
+  EXPECT_FALSE(is_range_iterable::value);
+}
+
+} // namespace llvm
Index: llvm/unittests/ADT/CMakeLists.txt
===
--- llvm/unittests/ADT/CMakeLists.txt
+++ llvm/unittests/ADT/CMakeLists.txt
@@ -41,6 +41,7 @@
   IntEqClassesTest.cpp
   IntervalMapTest.cpp
   IntrusiveRefCntPtrTest.cpp
+  IterableTraitsTest.cpp
   IteratorTest.cpp
   MappedIteratorTest.cpp
   MapVectorTest.cpp
Index: llvm/tools/llvm-xray/xray-converter.cpp
===
--- llvm/tools/llvm-xray/xray-converter.cpp
+++ llvm/tools/llvm-xray/xray-converter.cpp
@@ -158,6 +158,8 @@
 // A structure that allows building a dictionary of stack ids for the Chrome
 // trace event format.
 struct StackIdData {
+  StackIdData(const StackIdData &) = default;
+
   // Each Stack of function calls has a unique ID.
   unsigned id;
 
Index: llvm/include/llvm/ADT/SmallVector.h
===
--- llvm/include/llvm/ADT/SmallVector.h
+++ llvm/include/llvm/ADT/SmallVector.h
@@ -13,7 +13,7 @@
 #ifndef LLVM_ADT_SMALLVECTOR_H
 #define LLVM_ADT_SMALLVECTOR_H
 
-#include "llvm/ADT/iterator_range.h"
+#include "llvm/ADT/IterableTraits.h"
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/MathExtras.h"
@@ -1188,10 +1188,13 @@
 this->append(S, E);
   }
 
-  template 
-  explicit SmallVector(const iterator_range )
+  template 
+  explicit SmallVector(
+  Iterable &,
+  std::enable_if_t::value, bool> = true)
   : SmallVectorImpl(N) {
-this->append(R.begin(), R.end());
+this->append(std::begin(std::forward(Range)),
+ 

[PATCH] D102760: [llvm] Let SmallVector construct from any Iterable

2021-05-20 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added inline comments.



Comment at: clang/include/clang/Basic/Module.h:98
 public:
+  Module(const Module &) = default;
+

fhahn wrote:
> how is this related?
> how is this related?

I'm glad you ask! I'm still investigating the errors that led to this addition 
(and the one in `llvm/tools/llvm-xray/xray-converter.cpp`) but I suspect this 
is due to the recursive nature of these classes.
Both `Module` and `StackIdData` contains self-referencing `SmallVector`. It is 
unclear to me why the compiler is trying to instantiate the newly added 
`SmallVector` constructor //during// type declaration.

I'll post the compiler errors below the additions.



Comment at: clang/include/clang/Basic/Module.h:98
 public:
+  Module(const Module &) = default;
+

gchatelet wrote:
> fhahn wrote:
> > how is this related?
> > how is this related?
> 
> I'm glad you ask! I'm still investigating the errors that led to this 
> addition (and the one in `llvm/tools/llvm-xray/xray-converter.cpp`) but I 
> suspect this is due to the recursive nature of these classes.
> Both `Module` and `StackIdData` contains self-referencing `SmallVector`. It 
> is unclear to me why the compiler is trying to instantiate the newly added 
> `SmallVector` constructor //during// type declaration.
> 
> I'll post the compiler errors below the additions.
```
FAILED: tools/clang/lib/Lex/CMakeFiles/obj.clangLex.dir/HeaderSearch.cpp.o 
/redacted/build-llvm/download/clang/bin/clang++ 
--sysroot=/redacted/build-llvm/download/sysroot -DGTEST_HAS_RTTI=0 
-D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS 
-D__STDC_LIMIT_MACROS -Itools/clang/lib/Lex 
-I/redacted/git/llvm-project/clang/lib/Lex 
-I/redacted/git/llvm-project/clang/include -Itools/clang/include -Iinclude 
-I/redacted/git/llvm-project/llvm/include -fPIC -fvisibility-inlines-hidden 
-Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra 
-Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers 
-pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough 
-Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor 
-Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion 
-Wmisleading-indentation -fdiagnostics-color -ffunction-sections 
-fdata-sections -fno-common -Woverloaded-virtual -Wno-nested-anon-types -O3 
-DNDEBUG  -fno-exceptions -fno-rtti -std=c++14 -MD -MT 
tools/clang/lib/Lex/CMakeFiles/obj.clangLex.dir/HeaderSearch.cpp.o -MF 
tools/clang/lib/Lex/CMakeFiles/obj.clangLex.dir/HeaderSearch.cpp.o.d -o 
tools/clang/lib/Lex/CMakeFiles/obj.clangLex.dir/HeaderSearch.cpp.o -c 
/redacted/git/llvm-project/clang/lib/Lex/HeaderSearch.cpp
In file included from 
/redacted/git/llvm-project/clang/lib/Lex/HeaderSearch.cpp:13:
In file included from 
/redacted/git/llvm-project/clang/include/clang/Lex/HeaderSearch.h:16:
In file included from 
/redacted/git/llvm-project/clang/include/clang/Basic/SourceLocation.h:19:
/redacted/git/llvm-project/llvm/include/llvm/Support/PointerLikeTypeTraits.h:61:28:
 error: invalid application of 'alignof' to an incomplete type 'clang::Module'
  detail::ConstantLog2::value;
   ^~
/redacted/git/llvm-project/llvm/include/llvm/ADT/IterableTraits.h:23:33: note: 
in instantiation of template class 'llvm::PointerLikeTypeTraits' requested here
std::next(std::declval()),
^
/redacted/git/llvm-project/llvm/include/llvm/ADT/IterableTraits.h:36:39: note: 
while substituting explicitly-specified template arguments into function 
template 'is_forward_iterator' 
struct is_forward_iterator : decltype(detail::is_forward_iterator(0)) {};
  ^
/redacted/git/llvm-project/llvm/include/llvm/ADT/IterableTraits.h:46:42: note: 
in instantiation of template class 'llvm::is_forward_iterator *>' requested here
 llvm::is_forward_iterator{});
 ^
/redacted/git/llvm-project/llvm/include/llvm/ADT/IterableTraits.h:51:37: note: 
while substituting deduced template arguments into function template 
'is_range_iterable' [with T = const 
llvm::SmallVector, 2> &, I = (no 
value)]
struct is_range_iterable : decltype(detail::is_range_iterable(0)) {};
^
/redacted/git/llvm-project/llvm/include/llvm/ADT/SmallVector.h:1194:30: note: 
in instantiation of template class 'llvm::is_range_iterable, 2> &>' 
requested here
  std::enable_if_t::value, bool> = true)
 ^
/redacted/git/llvm-project/llvm/include/llvm/ADT/SmallVector.h:1168:22: note: 
while substituting deduced template arguments into function template 
'SmallVector' [with Iterable = const 
llvm::SmallVector, 2> &]
class LLVM_GSL_OWNER SmallVector : public SmallVectorImpl,
 ^
/redacted/git/llvm-project/clang/include/clang/Basic/Module.h:96:7: note: while 
declaring 

[PATCH] D102760: [llvm] Let SmallVector construct from any Iterable

2021-05-20 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 346669.
gchatelet added a comment.

- Forward argument


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D102760

Files:
  clang/include/clang/Basic/Module.h
  llvm/include/llvm/ADT/IterableTraits.h
  llvm/include/llvm/ADT/SmallVector.h
  llvm/tools/llvm-xray/xray-converter.cpp
  llvm/unittests/ADT/CMakeLists.txt
  llvm/unittests/ADT/IterableTraitsTest.cpp
  llvm/unittests/ADT/SmallVectorTest.cpp

Index: llvm/unittests/ADT/SmallVectorTest.cpp
===
--- llvm/unittests/ADT/SmallVectorTest.cpp
+++ llvm/unittests/ADT/SmallVectorTest.cpp
@@ -226,6 +226,22 @@
   this->assertValuesInOrder(this->theVector, 3u, 1, 2, 3);
 }
 
+// Constructor test.
+TYPED_TEST(SmallVectorTest, ConstructorIterableCArrayTest) {
+  SCOPED_TRACE("ConstructorTest");
+  int arr[] = {1, 2, 3};
+  this->theVector = SmallVector(arr);
+  this->assertValuesInOrder(this->theVector, 3u, 1, 2, 3);
+}
+
+// Constructor test.
+TYPED_TEST(SmallVectorTest, ConstructorIterableVectorTest) {
+  SCOPED_TRACE("ConstructorTest");
+  std::vector vec = {1, 2, 3};
+  this->theVector = SmallVector(vec);
+  this->assertValuesInOrder(this->theVector, 3u, 1, 2, 3);
+}
+
 // New vector test.
 TYPED_TEST(SmallVectorTest, EmptyVectorTest) {
   SCOPED_TRACE("EmptyVectorTest");
Index: llvm/unittests/ADT/IterableTraitsTest.cpp
===
--- /dev/null
+++ llvm/unittests/ADT/IterableTraitsTest.cpp
@@ -0,0 +1,62 @@
+//===- IterableTraitsTest.cpp - Unit tests for is_range_iterable --===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+#include "llvm/ADT/IterableTraits.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/iterator_range.h"
+#include "gtest/gtest.h"
+#include 
+#include 
+#include 
+
+namespace llvm {
+
+class ForwardDeclared;
+
+TEST(IteratorRangeTest, IsForwardIterator) {
+  EXPECT_FALSE(is_forward_iterator::value);
+  EXPECT_TRUE(is_forward_iterator::value);
+  EXPECT_TRUE(is_forward_iterator::value);
+  EXPECT_TRUE(is_forward_iterator::value);
+  using ForwardList = std::forward_list;
+  EXPECT_TRUE(is_forward_iterator::value);
+  EXPECT_TRUE(is_forward_iterator::value);
+}
+
+TEST(IteratorRangeTest, IsIterableCArray) {
+  int Data[4];
+  EXPECT_TRUE(
+  is_range_iterable>::value);
+}
+
+TEST(IteratorRangeTest, IsIterableVector) {
+  using Vector = std::vector;
+  EXPECT_TRUE(is_range_iterable::value);
+}
+
+TEST(IteratorRangeTest, IsIterableArray) {
+  using Array = std::array;
+  EXPECT_TRUE(is_range_iterable::value);
+}
+
+TEST(IteratorRangeTest, IsIterableSmallVector) {
+  using SVector = SmallVector;
+  EXPECT_TRUE(is_range_iterable::value);
+}
+
+TEST(IteratorRangeTest, IsIterableRange) {
+  using Range = iterator_range;
+  EXPECT_TRUE(is_range_iterable::value);
+}
+
+TEST(IteratorRangeTest, NonIterableTypes) {
+  EXPECT_FALSE(is_range_iterable::value);
+  EXPECT_FALSE(is_range_iterable::value);
+}
+
+} // namespace llvm
Index: llvm/unittests/ADT/CMakeLists.txt
===
--- llvm/unittests/ADT/CMakeLists.txt
+++ llvm/unittests/ADT/CMakeLists.txt
@@ -41,6 +41,7 @@
   IntEqClassesTest.cpp
   IntervalMapTest.cpp
   IntrusiveRefCntPtrTest.cpp
+  IterableTraitsTest.cpp
   IteratorTest.cpp
   MappedIteratorTest.cpp
   MapVectorTest.cpp
Index: llvm/tools/llvm-xray/xray-converter.cpp
===
--- llvm/tools/llvm-xray/xray-converter.cpp
+++ llvm/tools/llvm-xray/xray-converter.cpp
@@ -158,6 +158,8 @@
 // A structure that allows building a dictionary of stack ids for the Chrome
 // trace event format.
 struct StackIdData {
+  StackIdData(const StackIdData &) = default;
+
   // Each Stack of function calls has a unique ID.
   unsigned id;
 
Index: llvm/include/llvm/ADT/SmallVector.h
===
--- llvm/include/llvm/ADT/SmallVector.h
+++ llvm/include/llvm/ADT/SmallVector.h
@@ -13,7 +13,7 @@
 #ifndef LLVM_ADT_SMALLVECTOR_H
 #define LLVM_ADT_SMALLVECTOR_H
 
-#include "llvm/ADT/iterator_range.h"
+#include "llvm/ADT/IterableTraits.h"
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/MathExtras.h"
@@ -1188,10 +1188,13 @@
 this->append(S, E);
   }
 
-  template 
-  explicit SmallVector(const iterator_range )
+  template 
+  explicit SmallVector(
+  Iterable &,
+  std::enable_if_t::value, bool> = true)
   : SmallVectorImpl(N) {
-this->append(R.begin(), R.end());
+this->append(std::begin(std::forward(Range)),
+   

[PATCH] D102760: [llvm] Let SmallVector construct from any Iterable

2021-05-20 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 346657.
gchatelet added a comment.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

- Remove dependency on iterable_range header
- Simplified implementation, added tests


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D102760

Files:
  clang/include/clang/Basic/Module.h
  llvm/include/llvm/ADT/IterableTraits.h
  llvm/include/llvm/ADT/SmallVector.h
  llvm/tools/llvm-xray/xray-converter.cpp
  llvm/unittests/ADT/CMakeLists.txt
  llvm/unittests/ADT/IterableTraitsTest.cpp
  llvm/unittests/ADT/SmallVectorTest.cpp

Index: llvm/unittests/ADT/SmallVectorTest.cpp
===
--- llvm/unittests/ADT/SmallVectorTest.cpp
+++ llvm/unittests/ADT/SmallVectorTest.cpp
@@ -226,6 +226,22 @@
   this->assertValuesInOrder(this->theVector, 3u, 1, 2, 3);
 }
 
+// Constructor test.
+TYPED_TEST(SmallVectorTest, ConstructorIterableCArrayTest) {
+  SCOPED_TRACE("ConstructorTest");
+  int arr[] = {1, 2, 3};
+  this->theVector = SmallVector(arr);
+  this->assertValuesInOrder(this->theVector, 3u, 1, 2, 3);
+}
+
+// Constructor test.
+TYPED_TEST(SmallVectorTest, ConstructorIterableVectorTest) {
+  SCOPED_TRACE("ConstructorTest");
+  std::vector vec = {1, 2, 3};
+  this->theVector = SmallVector(vec);
+  this->assertValuesInOrder(this->theVector, 3u, 1, 2, 3);
+}
+
 // New vector test.
 TYPED_TEST(SmallVectorTest, EmptyVectorTest) {
   SCOPED_TRACE("EmptyVectorTest");
Index: llvm/unittests/ADT/IterableTraitsTest.cpp
===
--- /dev/null
+++ llvm/unittests/ADT/IterableTraitsTest.cpp
@@ -0,0 +1,62 @@
+//===- IterableTraitsTest.cpp - Unit tests for is_range_iterable --===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+#include "llvm/ADT/IterableTraits.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/iterator_range.h"
+#include "gtest/gtest.h"
+#include 
+#include 
+#include 
+
+namespace llvm {
+
+class ForwardDeclared;
+
+TEST(IteratorRangeTest, IsForwardIterator) {
+  EXPECT_FALSE(is_forward_iterator::value);
+  EXPECT_TRUE(is_forward_iterator::value);
+  EXPECT_TRUE(is_forward_iterator::value);
+  EXPECT_TRUE(is_forward_iterator::value);
+  using ForwardList = std::forward_list;
+  EXPECT_TRUE(is_forward_iterator::value);
+  EXPECT_TRUE(is_forward_iterator::value);
+}
+
+TEST(IteratorRangeTest, IsIterableCArray) {
+  int Data[4];
+  EXPECT_TRUE(
+  is_range_iterable>::value);
+}
+
+TEST(IteratorRangeTest, IsIterableVector) {
+  using Vector = std::vector;
+  EXPECT_TRUE(is_range_iterable::value);
+}
+
+TEST(IteratorRangeTest, IsIterableArray) {
+  using Array = std::array;
+  EXPECT_TRUE(is_range_iterable::value);
+}
+
+TEST(IteratorRangeTest, IsIterableSmallVector) {
+  using SVector = SmallVector;
+  EXPECT_TRUE(is_range_iterable::value);
+}
+
+TEST(IteratorRangeTest, IsIterableRange) {
+  using Range = iterator_range;
+  EXPECT_TRUE(is_range_iterable::value);
+}
+
+TEST(IteratorRangeTest, NonIterableTypes) {
+  EXPECT_FALSE(is_range_iterable::value);
+  EXPECT_FALSE(is_range_iterable::value);
+}
+
+} // namespace llvm
Index: llvm/unittests/ADT/CMakeLists.txt
===
--- llvm/unittests/ADT/CMakeLists.txt
+++ llvm/unittests/ADT/CMakeLists.txt
@@ -41,6 +41,7 @@
   IntEqClassesTest.cpp
   IntervalMapTest.cpp
   IntrusiveRefCntPtrTest.cpp
+  IterableTraitsTest.cpp
   IteratorTest.cpp
   MappedIteratorTest.cpp
   MapVectorTest.cpp
Index: llvm/tools/llvm-xray/xray-converter.cpp
===
--- llvm/tools/llvm-xray/xray-converter.cpp
+++ llvm/tools/llvm-xray/xray-converter.cpp
@@ -158,6 +158,8 @@
 // A structure that allows building a dictionary of stack ids for the Chrome
 // trace event format.
 struct StackIdData {
+  StackIdData(const StackIdData &) = default;
+
   // Each Stack of function calls has a unique ID.
   unsigned id;
 
Index: llvm/include/llvm/ADT/SmallVector.h
===
--- llvm/include/llvm/ADT/SmallVector.h
+++ llvm/include/llvm/ADT/SmallVector.h
@@ -13,7 +13,7 @@
 #ifndef LLVM_ADT_SMALLVECTOR_H
 #define LLVM_ADT_SMALLVECTOR_H
 
-#include "llvm/ADT/iterator_range.h"
+#include "llvm/ADT/IterableTraits.h"
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/MathExtras.h"
@@ -1188,10 +1188,12 @@
 this->append(S, E);
   }
 
-  template 
-  explicit SmallVector(const iterator_range )
+  template 
+  explicit SmallVector(
+  Iterable &,
+  std::enable_if_t::value, bool> = 

[PATCH] D97223: Add Alignment argument to IRBuilder CreateAtomicRMW and CreateAtomicCmpXchg.

2021-02-24 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet accepted this revision.
gchatelet added a comment.

LGTM as well


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D97223

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


[PATCH] D97223: Add Alignment argument to IRBuilder CreateAtomicRMW and CreateAtomicCmpXchg.

2021-02-23 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

In D97223#2581587 , @jyknight wrote:

> In D97223#2581126 , @rjmccall wrote:
>
>> Looks like you didn't update the .bc reader/writer and the .ll 
>> printer/parser.
>
> The instructions already had alignment support added to the type constructor 
> and IR/BC in prior changes by gchatelet -- this is just updating the 
> IRBuilder constructor.

For the record the previous patches introducing the alignment were D87443 
 and D83465 .


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D97223

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


[PATCH] D97223: Add Alignment argument to IRBuilder CreateAtomicRMW and CreateAtomicCmpXchg.

2021-02-23 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added inline comments.



Comment at: llvm/lib/CodeGen/AtomicExpandPass.cpp:1037
 
+  assert(AddrAlign >= ResultTy->getPrimitiveSizeInBits() / 8);
+

Add an error message?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D97223

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


[PATCH] D91975: clang-tidy: detect narrowing conversions involving typedefs

2020-11-23 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet accepted this revision.
gchatelet added a comment.
This revision is now accepted and ready to land.

Thx for the patch!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D91975

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


[PATCH] D87458: [Clang] Clarify __builtin_memcpy_inline documentation

2020-09-11 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet marked an inline comment as done.
gchatelet added inline comments.



Comment at: clang/docs/LanguageExtensions.rst:2439
+guarantees not to call any external functions. See LLVM IR `llvm.memcpy.inline
+`_ Intrinsic 
+for more information.

gchatelet wrote:
> courbet wrote:
> > why capitalize ?
> I somewhat missed this comment, I'll fix this as a separate commit.
Done in rGb8ea47a 


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D87458

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


[PATCH] D87458: [Clang] Clarify __builtin_memcpy_inline documentation

2020-09-11 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet marked an inline comment as done.
gchatelet added inline comments.



Comment at: clang/docs/LanguageExtensions.rst:2439
+guarantees not to call any external functions. See LLVM IR `llvm.memcpy.inline
+`_ Intrinsic 
+for more information.

courbet wrote:
> why capitalize ?
I somewhat missed this comment, I'll fix this as a separate commit.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D87458

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


[PATCH] D87458: [Clang] Clarify __builtin_memcpy_inline documentation

2020-09-11 Thread Guillaume Chatelet via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rGe38be7091ee3: [Clang] Clarify __builtin_memcpy_inline 
documentation (authored by gchatelet).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D87458

Files:
  clang/docs/LanguageExtensions.rst


Index: clang/docs/LanguageExtensions.rst
===
--- clang/docs/LanguageExtensions.rst
+++ clang/docs/LanguageExtensions.rst
@@ -2408,20 +2408,6 @@
 Memory builtins
 ---
 
- * ``__builtin_memcpy_inline``
-
-.. code-block:: c
-
-  void __builtin_memcpy_inline(void *dst, const void *src, size_t size);
-
-``__builtin_memcpy_inline(dst, src, size)`` is identical to
-``__builtin_memcpy(dst, src, size)`` except that the generated code is
-guaranteed not to call any external functions. See LLVM IR `llvm.memcpy.inline
-`_ Intrinsic 
-for more information.
-
-Note that the `size` argument must be a compile time constant.
-
 Clang provides constant expression evaluation support for builtin forms of the
 following functions from the C standard library headers
  and :
@@ -2439,7 +2425,27 @@
 given size is an exact multiple of the element size that is no greater than
 the number of elements accessible through the source and destination operands.
 
-Constant evaluation support is not yet provided for 
``__builtin_memcpy_inline``.
+Guaranteed inlined copy
+^^^
+
+.. code-block:: c
+
+  void __builtin_memcpy_inline(void *dst, const void *src, size_t size);
+
+
+``__builtin_memcpy_inline`` has been designed as a building block for efficient
+``memcpy`` implementations. It is identical to ``__builtin_memcpy`` but also
+guarantees not to call any external functions. See LLVM IR `llvm.memcpy.inline
+`_ Intrinsic 
+for more information.
+
+This is useful to implement a custom version of ``memcpy``, implemement a
+``libc`` memcpy or work around the absence of a ``libc``.
+
+Note that the `size` argument must be a compile time constant.
+
+Note that this intrinsic cannot yet be called in a ``constexpr`` context.
+
 
 Atomic Min/Max builtins with memory ordering
 


Index: clang/docs/LanguageExtensions.rst
===
--- clang/docs/LanguageExtensions.rst
+++ clang/docs/LanguageExtensions.rst
@@ -2408,20 +2408,6 @@
 Memory builtins
 ---
 
- * ``__builtin_memcpy_inline``
-
-.. code-block:: c
-
-  void __builtin_memcpy_inline(void *dst, const void *src, size_t size);
-
-``__builtin_memcpy_inline(dst, src, size)`` is identical to
-``__builtin_memcpy(dst, src, size)`` except that the generated code is
-guaranteed not to call any external functions. See LLVM IR `llvm.memcpy.inline
-`_ Intrinsic 
-for more information.
-
-Note that the `size` argument must be a compile time constant.
-
 Clang provides constant expression evaluation support for builtin forms of the
 following functions from the C standard library headers
  and :
@@ -2439,7 +2425,27 @@
 given size is an exact multiple of the element size that is no greater than
 the number of elements accessible through the source and destination operands.
 
-Constant evaluation support is not yet provided for ``__builtin_memcpy_inline``.
+Guaranteed inlined copy
+^^^
+
+.. code-block:: c
+
+  void __builtin_memcpy_inline(void *dst, const void *src, size_t size);
+
+
+``__builtin_memcpy_inline`` has been designed as a building block for efficient
+``memcpy`` implementations. It is identical to ``__builtin_memcpy`` but also
+guarantees not to call any external functions. See LLVM IR `llvm.memcpy.inline
+`_ Intrinsic 
+for more information.
+
+This is useful to implement a custom version of ``memcpy``, implemement a
+``libc`` memcpy or work around the absence of a ``libc``.
+
+Note that the `size` argument must be a compile time constant.
+
+Note that this intrinsic cannot yet be called in a ``constexpr`` context.
+
 
 Atomic Min/Max builtins with memory ordering
 
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D87458: [Clang] Clarify __builtin_memcpy_inline documentation

2020-09-10 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet created this revision.
gchatelet added a reviewer: courbet.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
gchatelet requested review of this revision.

This patch updates the documentation about `__builtin_memcpy_inline` and 
reorders the sections so it is more consitent and understandable.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D87458

Files:
  clang/docs/LanguageExtensions.rst


Index: clang/docs/LanguageExtensions.rst
===
--- clang/docs/LanguageExtensions.rst
+++ clang/docs/LanguageExtensions.rst
@@ -2408,20 +2408,6 @@
 Memory builtins
 ---
 
- * ``__builtin_memcpy_inline``
-
-.. code-block:: c
-
-  void __builtin_memcpy_inline(void *dst, const void *src, size_t size);
-
-``__builtin_memcpy_inline(dst, src, size)`` is identical to
-``__builtin_memcpy(dst, src, size)`` except that the generated code is
-guaranteed not to call any external functions. See LLVM IR `llvm.memcpy.inline
-`_ Intrinsic 
-for more information.
-
-Note that the `size` argument must be a compile time constant.
-
 Clang provides constant expression evaluation support for builtin forms of the
 following functions from the C standard library headers
  and :
@@ -2439,7 +2425,27 @@
 given size is an exact multiple of the element size that is no greater than
 the number of elements accessible through the source and destination operands.
 
-Constant evaluation support is not yet provided for 
``__builtin_memcpy_inline``.
+Guaranteed inlined copy
+^^^
+
+.. code-block:: c
+
+  void __builtin_memcpy_inline(void *dst, const void *src, size_t size);
+
+
+``__builtin_memcpy_inline`` has been designed as a building block for efficient
+``memcpy`` implementations. It is identical to ``__builtin_memcpy`` but also
+guarantees not to call any external functions. See LLVM IR `llvm.memcpy.inline
+`_ Intrinsic 
+for more information.
+
+This is useful to implement a custom version of ``memcpy``, implemement a
+``libc`` memcpy or work around the absence of a ``libc``.
+
+Note that the `size` argument must be a compile time constant.
+
+Note that this intrinsic cannot yet be called in a ``constexpr`` context.
+
 
 Atomic Min/Max builtins with memory ordering
 


Index: clang/docs/LanguageExtensions.rst
===
--- clang/docs/LanguageExtensions.rst
+++ clang/docs/LanguageExtensions.rst
@@ -2408,20 +2408,6 @@
 Memory builtins
 ---
 
- * ``__builtin_memcpy_inline``
-
-.. code-block:: c
-
-  void __builtin_memcpy_inline(void *dst, const void *src, size_t size);
-
-``__builtin_memcpy_inline(dst, src, size)`` is identical to
-``__builtin_memcpy(dst, src, size)`` except that the generated code is
-guaranteed not to call any external functions. See LLVM IR `llvm.memcpy.inline
-`_ Intrinsic 
-for more information.
-
-Note that the `size` argument must be a compile time constant.
-
 Clang provides constant expression evaluation support for builtin forms of the
 following functions from the C standard library headers
  and :
@@ -2439,7 +2425,27 @@
 given size is an exact multiple of the element size that is no greater than
 the number of elements accessible through the source and destination operands.
 
-Constant evaluation support is not yet provided for ``__builtin_memcpy_inline``.
+Guaranteed inlined copy
+^^^
+
+.. code-block:: c
+
+  void __builtin_memcpy_inline(void *dst, const void *src, size_t size);
+
+
+``__builtin_memcpy_inline`` has been designed as a building block for efficient
+``memcpy`` implementations. It is identical to ``__builtin_memcpy`` but also
+guarantees not to call any external functions. See LLVM IR `llvm.memcpy.inline
+`_ Intrinsic 
+for more information.
+
+This is useful to implement a custom version of ``memcpy``, implemement a
+``libc`` memcpy or work around the absence of a ``libc``.
+
+Note that the `size` argument must be a compile time constant.
+
+Note that this intrinsic cannot yet be called in a ``constexpr`` context.
+
 
 Atomic Min/Max builtins with memory ordering
 
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D79279: Add overloaded versions of builtin mem* functions

2020-07-03 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added inline comments.



Comment at: clang/include/clang/Basic/Builtins.def:489
 BUILTIN(__builtin_memcpy_inline, "vv*vC*Iz", "nt")
+BUILTIN(__builtin_overloaded_memcpy, "v*v*vC*z", "nt")
 BUILTIN(__builtin_memmove, "v*v*vC*z", "nF")

jfb wrote:
> gchatelet wrote:
> > `overloaded` doesn't bring much semantic (says the one who added 
> > `__builtin_memcpy_inline`...). Can you come up with something that 
> > describes more precisely what the intends are?
> > 
> > Also `memset`, `memcmp`, `memcpy`, `memmove` will have their `inline` and 
> > `overloaded` versions. This is becoming a crowded space. It may be 
> > confusing in the long run. If we want to go in that direction maybe we 
> > should come up with a consistent pattern: `__builtin__`. 
> > WDYT?
> Flipping it around is fine with me, see update (done with `sed`).
> 
> What's your approach on choosing what gets an `inline` variant and what 
> doesn't? `memcmp` is easy to add, but I wonder how far it's useful to go... I 
> can just wait for requests as well (as I imagine you're doing?).
I don't see `memmove_inline` being useful but memset and memcmp would make 
sense to add as building blocks for C++ implementations (e.g. [[ 
https://github.com/llvm/llvm-project/blob/master/libc/src/string/memcpy.cpp | 
libc memcpy ]])

As for this new addition, how about `__builtin_memcpy_honor_qualifiers`?
I fear that `__builtin_memcpy_overloaded` is too ambiguous.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D79279



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


[PATCH] D79279: Add overloaded versions of builtin mem* functions

2020-07-02 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added inline comments.



Comment at: clang/include/clang/Basic/Builtins.def:489
 BUILTIN(__builtin_memcpy_inline, "vv*vC*Iz", "nt")
+BUILTIN(__builtin_overloaded_memcpy, "v*v*vC*z", "nt")
 BUILTIN(__builtin_memmove, "v*v*vC*z", "nF")

`overloaded` doesn't bring much semantic (says the one who added 
`__builtin_memcpy_inline`...). Can you come up with something that describes 
more precisely what the intends are?

Also `memset`, `memcmp`, `memcpy`, `memmove` will have their `inline` and 
`overloaded` versions. This is becoming a crowded space. It may be confusing in 
the long run. If we want to go in that direction maybe we should come up with a 
consistent pattern: `__builtin__`. WDYT?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D79279



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


[PATCH] D73543: [clang] Add support for __builtin_memcpy_inline

2020-06-18 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet marked 3 inline comments as done.
gchatelet added inline comments.



Comment at: clang/test/Sema/builtins-memcpy-inline.c:7
+#warning defined as expected
+// expected-warning@-1 {{defined as expected}}
+#endif

efriedma wrote:
> melver wrote:
> > It appears that the expected-warning check here is guarded by the #if as 
> > well. Moving it after the #endif results in a failing test.
> > 
> > I noticed this as I was trying to use 
> > __has_feature(__builtin_memcpy_inline), but it somehow does not work, even 
> > though the compiler clearly supports __builtin_memcpy_inline.
> > 
> > Any idea what's wrong with the __has_feature test?
> > 
> > Thanks!
> Should be `__has_builtin`, I think?  __has_feature only applies to features 
> defined in clang/include/clang/Basic/Features.def.
Thx for noticing. I'll send a patch to update the test.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73543



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


[PATCH] D73543: [clang] Add support for __builtin_memcpy_inline

2020-06-18 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet marked 2 inline comments as done.
gchatelet added inline comments.



Comment at: clang/test/Sema/builtins-memcpy-inline.c:7
+#warning defined as expected
+// expected-warning@-1 {{defined as expected}}
+#endif

gchatelet wrote:
> efriedma wrote:
> > melver wrote:
> > > It appears that the expected-warning check here is guarded by the #if as 
> > > well. Moving it after the #endif results in a failing test.
> > > 
> > > I noticed this as I was trying to use 
> > > __has_feature(__builtin_memcpy_inline), but it somehow does not work, 
> > > even though the compiler clearly supports __builtin_memcpy_inline.
> > > 
> > > Any idea what's wrong with the __has_feature test?
> > > 
> > > Thanks!
> > Should be `__has_builtin`, I think?  __has_feature only applies to features 
> > defined in clang/include/clang/Basic/Features.def.
> Thx for noticing. I'll send a patch to update the test.
Submitted as rG12c8e3632edda3bc640867ba326b52b5b2220a57


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73543



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


[PATCH] D76283: [IRBuilder] Use preferred target type for len argument of memory intrinsic functions

2020-06-10 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

I would harden the verifier and declare the i64 versions of mem intrinsics 
illegal on 32 bits architectures.
Also the intrinsic sections of LangRef should be updated accordingly.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D76283



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


[PATCH] D78443: [Local] Update getOrEnforceKnownAlignment/getKnownAlignment to use Align/MaybeAlign.

2020-05-12 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

Thx @craig.topper ! I'm happy to see this effort percolate :)


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D78443



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


[PATCH] D76551: [Alignment][NFC] Use TargetFrameLowering::getStackAlign()

2020-03-23 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 251971.
gchatelet added a comment.
Herald added a reviewer: jdoerfert.

rebase


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D76551

Files:
  llvm/lib/CodeGen/MachineFunction.cpp
  llvm/lib/CodeGen/PrologEpilogInserter.cpp
  llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  llvm/lib/Target/AVR/AVRFrameLowering.cpp
  llvm/lib/Target/MSP430/MSP430FrameLowering.cpp
  llvm/lib/Target/Mips/MipsCallLowering.cpp
  llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
  llvm/lib/Target/RISCV/RISCVFrameLowering.cpp
  llvm/lib/Target/X86/X86CallFrameOptimization.cpp
  llvm/lib/Target/X86/X86FastISel.cpp
  llvm/lib/Target/X86/X86FrameLowering.cpp
  llvm/lib/Target/X86/X86ISelLowering.cpp
  llvm/lib/Target/X86/X86InstrInfo.cpp
  llvm/lib/Target/X86/X86InstrInfo.h

Index: llvm/lib/Target/X86/X86InstrInfo.h
===
--- llvm/lib/Target/X86/X86InstrInfo.h
+++ llvm/lib/Target/X86/X86InstrInfo.h
@@ -474,7 +474,7 @@
   unsigned OpNum,
   ArrayRef MOs,
   MachineBasicBlock::iterator InsertPt,
-  unsigned Size, unsigned Alignment,
+  unsigned Size, Align Alignment,
   bool AllowCommute) const;
 
   bool isHighLatencyDef(int opc) const override;
@@ -594,7 +594,7 @@
 unsigned OpNum,
 ArrayRef MOs,
 MachineBasicBlock::iterator InsertPt,
-unsigned Size, unsigned Align) const;
+unsigned Size, Align Alignment) const;
 
   /// isFrameOperand - Return true and the FrameIndex if the specified
   /// operand and follow operands form a reference to the stack frame.
Index: llvm/lib/Target/X86/X86InstrInfo.cpp
===
--- llvm/lib/Target/X86/X86InstrInfo.cpp
+++ llvm/lib/Target/X86/X86InstrInfo.cpp
@@ -625,8 +625,7 @@
   const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
 
   if (isFrameInstr(MI)) {
-unsigned StackAlign = TFI->getStackAlignment();
-int SPAdj = alignTo(getFrameSize(MI), StackAlign);
+int SPAdj = alignTo(getFrameSize(MI), TFI->getStackAlign());
 SPAdj -= getFrameAdjustment(MI);
 if (!isFrameSetup(MI))
   SPAdj = -SPAdj;
@@ -3737,7 +3736,7 @@
  "Stack slot too small for store");
   unsigned Alignment = std::max(TRI->getSpillSize(*RC), 16);
   bool isAligned =
-  (Subtarget.getFrameLowering()->getStackAlignment() >= Alignment) ||
+  (Subtarget.getFrameLowering()->getStackAlign() >= Alignment) ||
   RI.canRealignStack(MF);
   unsigned Opc = getStoreRegOpcode(SrcReg, RC, isAligned, Subtarget);
   addFrameReference(BuildMI(MBB, MI, DebugLoc(), get(Opc)), FrameIdx)
@@ -3752,7 +3751,7 @@
   const MachineFunction  = *MBB.getParent();
   unsigned Alignment = std::max(TRI->getSpillSize(*RC), 16);
   bool isAligned =
-  (Subtarget.getFrameLowering()->getStackAlignment() >= Alignment) ||
+  (Subtarget.getFrameLowering()->getStackAlign() >= Alignment) ||
   RI.canRealignStack(MF);
   unsigned Opc = getLoadRegOpcode(DestReg, RC, isAligned, Subtarget);
   addFrameReference(BuildMI(MBB, MI, DebugLoc(), get(Opc), DestReg), FrameIdx);
@@ -5211,7 +5210,7 @@
 MachineInstr *X86InstrInfo::foldMemoryOperandCustom(
 MachineFunction , MachineInstr , unsigned OpNum,
 ArrayRef MOs, MachineBasicBlock::iterator InsertPt,
-unsigned Size, unsigned Align) const {
+unsigned Size, Align Alignment) const {
   switch (MI.getOpcode()) {
   case X86::INSERTPSrr:
   case X86::VINSERTPSrr:
@@ -5227,7 +5226,7 @@
   const TargetRegisterInfo  = *MF.getSubtarget().getRegisterInfo();
   const TargetRegisterClass *RC = getRegClass(MI.getDesc(), OpNum, , MF);
   unsigned RCSize = TRI.getRegSizeInBits(*RC) / 8;
-  if ((Size == 0 || Size >= 16) && RCSize >= 16 && 4 <= Align) {
+  if ((Size == 0 || Size >= 16) && RCSize >= 16 && Alignment >= Align(4)) {
 int PtrOffset = SrcIdx * 4;
 unsigned NewImm = (DstIdx << 4) | ZMask;
 unsigned NewOpCode =
@@ -5251,7 +5250,7 @@
   const TargetRegisterInfo  = *MF.getSubtarget().getRegisterInfo();
   const TargetRegisterClass *RC = getRegClass(MI.getDesc(), OpNum, , MF);
   unsigned RCSize = TRI.getRegSizeInBits(*RC) / 8;
-  if ((Size == 0 || Size >= 16) && RCSize >= 16 && 8 <= Align) {
+  if ((Size == 0 || Size >= 16) && RCSize >= 16 && Alignment >= Align(8)) {
 unsigned NewOpCode =
 (MI.getOpcode() == X86::VMOVHLPSZrr) ? X86::VMOVLPSZ128rm :
 

[PATCH] D76551: [Alignment][NFC] Use TargetFrameLowering::getStackAlign()

2020-03-23 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 251969.
gchatelet marked 3 inline comments as done.
gchatelet added a comment.
Herald added subscribers: libc-commits, openmp-commits, libcxx-commits, 
cfe-commits, Joonsoo, kerbowa, liufengdb, aartbik, lucyrfox, mgester, 
arpith-jacob, csigg, nicolasvasilache, antiagainst, shauheen, burmako, 
jpienaar, rriddle, mehdi_amini, dmgreen, rupprecht, arphaman, dexonsmith, 
steven_wu, mgorny, nhaehnle, jvesely, emaste, jholewinski.
Herald added a reviewer: bollu.
Herald added a reviewer: espindola.
Herald added a reviewer: alexshap.
Herald added a reviewer: jhenderson.
Herald added a reviewer: nicolasvasilache.
Herald added a reviewer: herhut.
Herald added a reviewer: rriddle.
Herald added a reviewer: aartbik.
Herald added projects: clang, libc++, OpenMP, libc-project.
Herald added a reviewer: libc++.

- inline variable
- Address comments


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D76551

Files:
  clang-tools-extra/docs/clang-rename.rst
  clang/docs/LibASTImporter.rst
  clang/docs/ReleaseNotes.rst
  clang/docs/analyzer/checkers.rst
  clang/include/clang/AST/OpenMPClause.h
  clang/include/clang/Driver/ToolChain.h
  clang/lib/CodeGen/EHScopeStack.h
  clang/lib/Driver/ToolChain.cpp
  clang/lib/Driver/ToolChains/Cuda.cpp
  clang/lib/Driver/ToolChains/Darwin.cpp
  clang/lib/Driver/ToolChains/HIP.cpp
  libc/CMakeLists.txt
  libc/config/linux/api.td
  libc/lib/CMakeLists.txt
  libc/spec/stdc.td
  libc/src/signal/linux/CMakeLists.txt
  libc/src/signal/linux/signal.cpp
  libc/src/signal/signal.h
  libc/test/src/signal/CMakeLists.txt
  libc/test/src/signal/signal_test.cpp
  libc/utils/UnitTest/Test.cpp
  libc/utils/UnitTest/Test.h
  libcxx/docs/TestingLibcxx.rst
  libcxx/docs/UsingLibcxx.rst
  libcxx/docs/index.rst
  libunwind/docs/BuildingLibunwind.rst
  libunwind/docs/index.rst
  lld/docs/AtomLLD.rst
  lld/docs/NewLLD.rst
  lld/docs/design.rst
  lld/docs/development.rst
  lld/docs/getting_started.rst
  lld/docs/index.rst
  llvm/docs/AMDGPUUsage.rst
  llvm/docs/AliasAnalysis.rst
  llvm/docs/CMake.rst
  llvm/docs/CommandGuide/llvm-lipo.rst
  llvm/docs/CommandGuide/llvm-objcopy.rst
  llvm/docs/CommandGuide/llvm-objdump.rst
  llvm/docs/CommandGuide/llvm-size.rst
  llvm/docs/CommandGuide/llvm-strings.rst
  llvm/docs/CommandGuide/llvm-strip.rst
  llvm/docs/CompileCudaWithLLVM.rst
  llvm/docs/Docker.rst
  llvm/docs/FAQ.rst
  llvm/docs/Frontend/PerformanceTips.rst
  llvm/docs/GettingStarted.rst
  llvm/docs/GettingStartedVS.rst
  llvm/docs/GlobalISel/GMIR.rst
  llvm/docs/GlobalISel/IRTranslator.rst
  llvm/docs/GlobalISel/KnownBits.rst
  llvm/docs/HistoricalNotes/2007-OriginalClangReadme.txt
  llvm/docs/HowToCrossCompileLLVM.rst
  llvm/docs/HowToSetUpLLVMStyleRTTI.rst
  llvm/docs/HowToSubmitABug.rst
  llvm/docs/LLVMBuild.txt
  llvm/docs/LangRef.rst
  llvm/docs/Lexicon.rst
  llvm/docs/LibFuzzer.rst
  llvm/docs/LoopTerminology.rst
  llvm/docs/MarkdownQuickstartTemplate.md
  llvm/docs/MergeFunctions.rst
  llvm/docs/Packaging.rst
  llvm/docs/ProgrammersManual.rst
  llvm/docs/Proposals/GitHubMove.rst
  llvm/docs/README.txt
  llvm/docs/Reference.rst
  llvm/docs/ReleaseProcess.rst
  llvm/docs/SphinxQuickstartTemplate.rst
  llvm/docs/TableGen/index.rst
  llvm/docs/TestSuiteGuide.md
  llvm/docs/TestingGuide.rst
  llvm/docs/TypeMetadata.rst
  llvm/docs/UserGuides.rst
  llvm/docs/Vectorizers.rst
  llvm/docs/WritingAnLLVMPass.rst
  llvm/docs/index.rst
  llvm/docs/tutorial/BuildingAJIT1.rst
  llvm/docs/tutorial/MyFirstLanguageFrontend/LangImpl02.rst
  llvm/docs/tutorial/MyFirstLanguageFrontend/LangImpl03.rst
  llvm/docs/tutorial/MyFirstLanguageFrontend/LangImpl04.rst
  llvm/docs/tutorial/MyFirstLanguageFrontend/LangImpl05.rst
  llvm/docs/tutorial/MyFirstLanguageFrontend/LangImpl08.rst
  llvm/docs/tutorial/MyFirstLanguageFrontend/LangImpl09.rst
  llvm/docs/tutorial/OCamlLangImpl3.rst
  llvm/docs/tutorial/OCamlLangImpl5.rst
  llvm/docs/tutorial/index.rst
  llvm/include/llvm/ADT/Triple.h
  llvm/include/llvm/ExecutionEngine/Orc/Core.h
  llvm/include/llvm/ExecutionEngine/Orc/DebugUtils.h
  llvm/include/llvm/ExecutionEngine/Orc/Speculation.h
  llvm/include/llvm/MC/MCObjectFileInfo.h
  llvm/include/llvm/Target/TargetLoweringObjectFile.h
  llvm/include/llvm/TextAPI/MachO/InterfaceFile.h
  llvm/include/llvm/Transforms/IPO/PassManagerBuilder.h
  llvm/include/llvm/Transforms/InstCombine/InstCombine.h
  llvm/include/llvm/Transforms/Utils/LowerMemIntrinsics.h
  llvm/lib/Analysis/LazyValueInfo.cpp
  llvm/lib/Analysis/TargetLibraryInfo.cpp
  llvm/lib/Analysis/ValueTracking.cpp
  llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
  llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
  llvm/lib/CodeGen/MachineFunction.cpp
  llvm/lib/CodeGen/PrologEpilogInserter.cpp
  llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
  llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
  

[PATCH] D76504: [clang] Fix crash during template sema checking

2020-03-21 Thread Guillaume Chatelet via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rGd260a10d98df: [clang] Fix crash during template sema 
checking (authored by gchatelet).

Changed prior to commit:
  https://reviews.llvm.org/D76504?vs=251780=251837#toc

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D76504

Files:
  clang/lib/Sema/SemaChecking.cpp
  clang/test/Sema/builtins-memcpy-inline.c
  clang/test/Sema/builtins-memcpy-inline.cpp


Index: clang/test/Sema/builtins-memcpy-inline.cpp
===
--- clang/test/Sema/builtins-memcpy-inline.cpp
+++ clang/test/Sema/builtins-memcpy-inline.cpp
@@ -30,3 +30,9 @@
 void test_memcpy_inline_non_constant_size(void *dst, const void *src, unsigned 
size) {
   __builtin_memcpy_inline(dst, src, size); // expected-error {{argument to 
'__builtin_memcpy_inline' must be a constant integer}}
 }
+
+template 
+void test_memcpy_inline_template(void *dst, const void *src) {
+  // we do not try to evaluate size in non intantiated templates.
+  __builtin_memcpy_inline(dst, src, size);
+}
Index: clang/lib/Sema/SemaChecking.cpp
===
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -1649,11 +1649,16 @@
   case Builtin::BI__builtin_nontemporal_store:
 return SemaBuiltinNontemporalOverloaded(TheCallResult);
   case Builtin::BI__builtin_memcpy_inline: {
-// __builtin_memcpy_inline size argument is a constant by definition.
-if (TheCall->getArg(2)->EvaluateKnownConstInt(Context).isNullValue())
+clang::Expr *SizeOp = TheCall->getArg(2);
+// We warn about copying to or from `nullptr` pointers when `size` is
+// greater than 0. When `size` is value dependent we cannot evaluate its
+// value so we bail out.
+if (SizeOp->isValueDependent())
   break;
-CheckNonNullArgument(*this, TheCall->getArg(0), TheCall->getExprLoc());
-CheckNonNullArgument(*this, TheCall->getArg(1), TheCall->getExprLoc());
+if (!SizeOp->EvaluateKnownConstInt(Context).isNullValue()) {
+  CheckNonNullArgument(*this, TheCall->getArg(0), TheCall->getExprLoc());
+  CheckNonNullArgument(*this, TheCall->getArg(1), TheCall->getExprLoc());
+}
 break;
   }
 #define BUILTIN(ID, TYPE, ATTRS)


Index: clang/test/Sema/builtins-memcpy-inline.cpp
===
--- clang/test/Sema/builtins-memcpy-inline.cpp
+++ clang/test/Sema/builtins-memcpy-inline.cpp
@@ -30,3 +30,9 @@
 void test_memcpy_inline_non_constant_size(void *dst, const void *src, unsigned size) {
   __builtin_memcpy_inline(dst, src, size); // expected-error {{argument to '__builtin_memcpy_inline' must be a constant integer}}
 }
+
+template 
+void test_memcpy_inline_template(void *dst, const void *src) {
+  // we do not try to evaluate size in non intantiated templates.
+  __builtin_memcpy_inline(dst, src, size);
+}
Index: clang/lib/Sema/SemaChecking.cpp
===
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -1649,11 +1649,16 @@
   case Builtin::BI__builtin_nontemporal_store:
 return SemaBuiltinNontemporalOverloaded(TheCallResult);
   case Builtin::BI__builtin_memcpy_inline: {
-// __builtin_memcpy_inline size argument is a constant by definition.
-if (TheCall->getArg(2)->EvaluateKnownConstInt(Context).isNullValue())
+clang::Expr *SizeOp = TheCall->getArg(2);
+// We warn about copying to or from `nullptr` pointers when `size` is
+// greater than 0. When `size` is value dependent we cannot evaluate its
+// value so we bail out.
+if (SizeOp->isValueDependent())
   break;
-CheckNonNullArgument(*this, TheCall->getArg(0), TheCall->getExprLoc());
-CheckNonNullArgument(*this, TheCall->getArg(1), TheCall->getExprLoc());
+if (!SizeOp->EvaluateKnownConstInt(Context).isNullValue()) {
+  CheckNonNullArgument(*this, TheCall->getArg(0), TheCall->getExprLoc());
+  CheckNonNullArgument(*this, TheCall->getArg(1), TheCall->getExprLoc());
+}
 break;
   }
 #define BUILTIN(ID, TYPE, ATTRS)
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D76504: [clang] Fix crash during template sema checking

2020-03-20 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 251780.
gchatelet added a comment.

Address comments


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D76504

Files:
  clang/lib/Sema/SemaChecking.cpp
  clang/test/Sema/builtins-memcpy-inline.c
  clang/test/Sema/builtins-memcpy-inline.cpp


Index: clang/test/Sema/builtins-memcpy-inline.cpp
===
--- clang/test/Sema/builtins-memcpy-inline.cpp
+++ clang/test/Sema/builtins-memcpy-inline.cpp
@@ -30,3 +30,9 @@
 void test_memcpy_inline_non_constant_size(void *dst, const void *src, unsigned 
size) {
   __builtin_memcpy_inline(dst, src, size); // expected-error {{argument to 
'__builtin_memcpy_inline' must be a constant integer}}
 }
+
+template 
+void test_memcpy_inline_template(void *dst, const void *src) {
+  // we do not try to evaluate size in non intantiated templates.
+  __builtin_memcpy_inline(dst, src, size);
+}
Index: clang/lib/Sema/SemaChecking.cpp
===
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -1649,11 +1649,16 @@
   case Builtin::BI__builtin_nontemporal_store:
 return SemaBuiltinNontemporalOverloaded(TheCallResult);
   case Builtin::BI__builtin_memcpy_inline: {
-// __builtin_memcpy_inline size argument is a constant by definition.
-if (TheCall->getArg(2)->EvaluateKnownConstInt(Context).isNullValue())
+clang::Expr *SizeOp = TheCall->getArg(2);
+// We warn about copying to or from `nullptr` pointers when `size` is
+// greater than 0. When `size` is value dependent we cannot evaluate its
+// value so we bail<< out.
+if (SizeOp->isValueDependent())
   break;
-CheckNonNullArgument(*this, TheCall->getArg(0), TheCall->getExprLoc());
-CheckNonNullArgument(*this, TheCall->getArg(1), TheCall->getExprLoc());
+if (!SizeOp->EvaluateKnownConstInt(Context).isNullValue()) {
+  CheckNonNullArgument(*this, TheCall->getArg(0), TheCall->getExprLoc());
+  CheckNonNullArgument(*this, TheCall->getArg(1), TheCall->getExprLoc());
+}
 break;
   }
 #define BUILTIN(ID, TYPE, ATTRS)


Index: clang/test/Sema/builtins-memcpy-inline.cpp
===
--- clang/test/Sema/builtins-memcpy-inline.cpp
+++ clang/test/Sema/builtins-memcpy-inline.cpp
@@ -30,3 +30,9 @@
 void test_memcpy_inline_non_constant_size(void *dst, const void *src, unsigned size) {
   __builtin_memcpy_inline(dst, src, size); // expected-error {{argument to '__builtin_memcpy_inline' must be a constant integer}}
 }
+
+template 
+void test_memcpy_inline_template(void *dst, const void *src) {
+  // we do not try to evaluate size in non intantiated templates.
+  __builtin_memcpy_inline(dst, src, size);
+}
Index: clang/lib/Sema/SemaChecking.cpp
===
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -1649,11 +1649,16 @@
   case Builtin::BI__builtin_nontemporal_store:
 return SemaBuiltinNontemporalOverloaded(TheCallResult);
   case Builtin::BI__builtin_memcpy_inline: {
-// __builtin_memcpy_inline size argument is a constant by definition.
-if (TheCall->getArg(2)->EvaluateKnownConstInt(Context).isNullValue())
+clang::Expr *SizeOp = TheCall->getArg(2);
+// We warn about copying to or from `nullptr` pointers when `size` is
+// greater than 0. When `size` is value dependent we cannot evaluate its
+// value so we bail<< out.
+if (SizeOp->isValueDependent())
   break;
-CheckNonNullArgument(*this, TheCall->getArg(0), TheCall->getExprLoc());
-CheckNonNullArgument(*this, TheCall->getArg(1), TheCall->getExprLoc());
+if (!SizeOp->EvaluateKnownConstInt(Context).isNullValue()) {
+  CheckNonNullArgument(*this, TheCall->getArg(0), TheCall->getExprLoc());
+  CheckNonNullArgument(*this, TheCall->getArg(1), TheCall->getExprLoc());
+}
 break;
   }
 #define BUILTIN(ID, TYPE, ATTRS)
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D76504: [clang] Fix crash during template sema checking

2020-03-20 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 251671.
gchatelet marked an inline comment as done.
gchatelet added a comment.

Address comments


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D76504

Files:
  clang/lib/Sema/SemaChecking.cpp


Index: clang/lib/Sema/SemaChecking.cpp
===
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -1649,18 +1649,16 @@
   case Builtin::BI__builtin_nontemporal_store:
 return SemaBuiltinNontemporalOverloaded(TheCallResult);
   case Builtin::BI__builtin_memcpy_inline: {
-clang::Expr *DstOp = TheCall->getArg(0);
-clang::Expr *SrcOp = TheCall->getArg(1);
 clang::Expr *SizeOp = TheCall->getArg(2);
-// If any arg is instantiation dependent we bail out.
-if (DstOp->isInstantiationDependent() ||
-SrcOp->isInstantiationDependent() || 
SizeOp->isInstantiationDependent())
+// We warn about copying to or from `nullptr` pointers when size is greater
+// than 0. When `size` is instantiation dependent we cannot evaluate its
+// value so we bail out.
+if (SizeOp->isInstantiationDependent())
   break;
-// __builtin_memcpy_inline size argument is a constant by definition.
-if (SizeOp->EvaluateKnownConstInt(Context).isNullValue())
-  break;
-CheckNonNullArgument(*this, DstOp, TheCall->getExprLoc());
-CheckNonNullArgument(*this, SrcOp, TheCall->getExprLoc());
+if (!SizeOp->EvaluateKnownConstInt(Context).isNullValue()) {
+  CheckNonNullArgument(*this, TheCall->getArg(0), TheCall->getExprLoc());
+  CheckNonNullArgument(*this, TheCall->getArg(1), TheCall->getExprLoc());
+}
 break;
   }
 #define BUILTIN(ID, TYPE, ATTRS)


Index: clang/lib/Sema/SemaChecking.cpp
===
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -1649,18 +1649,16 @@
   case Builtin::BI__builtin_nontemporal_store:
 return SemaBuiltinNontemporalOverloaded(TheCallResult);
   case Builtin::BI__builtin_memcpy_inline: {
-clang::Expr *DstOp = TheCall->getArg(0);
-clang::Expr *SrcOp = TheCall->getArg(1);
 clang::Expr *SizeOp = TheCall->getArg(2);
-// If any arg is instantiation dependent we bail out.
-if (DstOp->isInstantiationDependent() ||
-SrcOp->isInstantiationDependent() || SizeOp->isInstantiationDependent())
+// We warn about copying to or from `nullptr` pointers when size is greater
+// than 0. When `size` is instantiation dependent we cannot evaluate its
+// value so we bail out.
+if (SizeOp->isInstantiationDependent())
   break;
-// __builtin_memcpy_inline size argument is a constant by definition.
-if (SizeOp->EvaluateKnownConstInt(Context).isNullValue())
-  break;
-CheckNonNullArgument(*this, DstOp, TheCall->getExprLoc());
-CheckNonNullArgument(*this, SrcOp, TheCall->getExprLoc());
+if (!SizeOp->EvaluateKnownConstInt(Context).isNullValue()) {
+  CheckNonNullArgument(*this, TheCall->getArg(0), TheCall->getExprLoc());
+  CheckNonNullArgument(*this, TheCall->getArg(1), TheCall->getExprLoc());
+}
 break;
   }
 #define BUILTIN(ID, TYPE, ATTRS)
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D76504: [clang] Fix crash during template sema checking

2020-03-20 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added inline comments.



Comment at: clang/lib/Sema/SemaChecking.cpp:1655
+clang::Expr *SizeOp = TheCall->getArg(2);
+// If any arg is instantiation dependent we bail out.
+if (DstOp->isInstantiationDependent() ||

courbet wrote:
> Are the first two necessary ? IIRC only `EvaluateKnownConstInt()` does not 
> like template-dependent stuff. 
That's right I don't think it's realistic to pass the pointers as template 
parameters so whatever `CheckNonNullArgument` is doing it will probably never 
end up crashing in the same way.

I'll limit the fix to `SizeOp` then.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D76504



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


[PATCH] D76504: [clang] Fix crash during template sema checking

2020-03-20 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet created this revision.
gchatelet added reviewers: efriedma, courbet.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
gchatelet added a subscriber: abrachet.
gchatelet added a comment.

Buggy trace here 



If the size parameter of `__builtin_memcpy_inline` comes from an 
un-instantiated template parameter current code would crash.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D76504

Files:
  clang/lib/Sema/SemaChecking.cpp
  clang/test/Sema/builtins-memcpy-inline.c
  clang/test/Sema/builtins-memcpy-inline.cpp


Index: clang/test/Sema/builtins-memcpy-inline.cpp
===
--- clang/test/Sema/builtins-memcpy-inline.cpp
+++ clang/test/Sema/builtins-memcpy-inline.cpp
@@ -30,3 +30,9 @@
 void test_memcpy_inline_non_constant_size(void *dst, const void *src, unsigned 
size) {
   __builtin_memcpy_inline(dst, src, size); // expected-error {{argument to 
'__builtin_memcpy_inline' must be a constant integer}}
 }
+
+template 
+void test_memcpy_inline_template(void *dst, const void *src) {
+  // we do not try to evaluate size in non intantiated templates.
+  __builtin_memcpy_inline(dst, src, size);
+}
Index: clang/lib/Sema/SemaChecking.cpp
===
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -1649,11 +1649,18 @@
   case Builtin::BI__builtin_nontemporal_store:
 return SemaBuiltinNontemporalOverloaded(TheCallResult);
   case Builtin::BI__builtin_memcpy_inline: {
+clang::Expr *DstOp = TheCall->getArg(0);
+clang::Expr *SrcOp = TheCall->getArg(1);
+clang::Expr *SizeOp = TheCall->getArg(2);
+// If any arg is instantiation dependent we bail out.
+if (DstOp->isInstantiationDependent() ||
+SrcOp->isInstantiationDependent() || 
SizeOp->isInstantiationDependent())
+  break;
 // __builtin_memcpy_inline size argument is a constant by definition.
-if (TheCall->getArg(2)->EvaluateKnownConstInt(Context).isNullValue())
+if (SizeOp->EvaluateKnownConstInt(Context).isNullValue())
   break;
-CheckNonNullArgument(*this, TheCall->getArg(0), TheCall->getExprLoc());
-CheckNonNullArgument(*this, TheCall->getArg(1), TheCall->getExprLoc());
+CheckNonNullArgument(*this, DstOp, TheCall->getExprLoc());
+CheckNonNullArgument(*this, SrcOp, TheCall->getExprLoc());
 break;
   }
 #define BUILTIN(ID, TYPE, ATTRS)


Index: clang/test/Sema/builtins-memcpy-inline.cpp
===
--- clang/test/Sema/builtins-memcpy-inline.cpp
+++ clang/test/Sema/builtins-memcpy-inline.cpp
@@ -30,3 +30,9 @@
 void test_memcpy_inline_non_constant_size(void *dst, const void *src, unsigned size) {
   __builtin_memcpy_inline(dst, src, size); // expected-error {{argument to '__builtin_memcpy_inline' must be a constant integer}}
 }
+
+template 
+void test_memcpy_inline_template(void *dst, const void *src) {
+  // we do not try to evaluate size in non intantiated templates.
+  __builtin_memcpy_inline(dst, src, size);
+}
Index: clang/lib/Sema/SemaChecking.cpp
===
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -1649,11 +1649,18 @@
   case Builtin::BI__builtin_nontemporal_store:
 return SemaBuiltinNontemporalOverloaded(TheCallResult);
   case Builtin::BI__builtin_memcpy_inline: {
+clang::Expr *DstOp = TheCall->getArg(0);
+clang::Expr *SrcOp = TheCall->getArg(1);
+clang::Expr *SizeOp = TheCall->getArg(2);
+// If any arg is instantiation dependent we bail out.
+if (DstOp->isInstantiationDependent() ||
+SrcOp->isInstantiationDependent() || SizeOp->isInstantiationDependent())
+  break;
 // __builtin_memcpy_inline size argument is a constant by definition.
-if (TheCall->getArg(2)->EvaluateKnownConstInt(Context).isNullValue())
+if (SizeOp->EvaluateKnownConstInt(Context).isNullValue())
   break;
-CheckNonNullArgument(*this, TheCall->getArg(0), TheCall->getExprLoc());
-CheckNonNullArgument(*this, TheCall->getArg(1), TheCall->getExprLoc());
+CheckNonNullArgument(*this, DstOp, TheCall->getExprLoc());
+CheckNonNullArgument(*this, SrcOp, TheCall->getExprLoc());
 break;
   }
 #define BUILTIN(ID, TYPE, ATTRS)
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D76504: [clang] Fix crash during template sema checking

2020-03-20 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

Buggy trace here 



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D76504



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


[PATCH] D61634: [clang/llvm] Allow efficient implementation of libc's memory functions in C/C++

2020-02-10 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet abandoned this revision.
gchatelet added a comment.

This has been implemented in the following patches:

- https://reviews.llvm.org/D67923
- https://reviews.llvm.org/D74162
- https://reviews.llvm.org/D73543
- https://reviews.llvm.org/D71710


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D61634



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


[PATCH] D73543: [clang] Add support for __builtin_memcpy_inline

2020-02-07 Thread Guillaume Chatelet via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rGd65bbf81f8be: [clang] Add support for 
__builtin_memcpy_inline (authored by gchatelet).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73543

Files:
  clang/docs/LanguageExtensions.rst
  clang/include/clang/Basic/Builtins.def
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/Sema/SemaChecking.cpp
  clang/test/CodeGen/builtins-memcpy-inline.c
  clang/test/Sema/builtins-memcpy-inline.c
  llvm/include/llvm/IR/IRBuilder.h
  llvm/lib/IR/IRBuilder.cpp

Index: llvm/lib/IR/IRBuilder.cpp
===
--- llvm/lib/IR/IRBuilder.cpp
+++ llvm/lib/IR/IRBuilder.cpp
@@ -200,6 +200,30 @@
   return CI;
 }
 
+CallInst *IRBuilderBase::CreateMemCpyInline(Value *Dst, MaybeAlign DstAlign,
+Value *Src, MaybeAlign SrcAlign,
+Value *Size) {
+  Dst = getCastedInt8PtrValue(Dst);
+  Src = getCastedInt8PtrValue(Src);
+  Value *IsVolatile = getInt1(false);
+
+  Value *Ops[] = {Dst, Src, Size, IsVolatile};
+  Type *Tys[] = {Dst->getType(), Src->getType(), Size->getType()};
+  Function *F = BB->getParent();
+  Module *M = F->getParent();
+  Function *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memcpy_inline, Tys);
+
+  CallInst *CI = createCallHelper(TheFn, Ops, this);
+
+  auto *MCI = cast(CI);
+  if (DstAlign)
+MCI->setDestAlignment(*DstAlign);
+  if (SrcAlign)
+MCI->setSourceAlignment(*SrcAlign);
+
+  return CI;
+}
+
 CallInst *IRBuilderBase::CreateElementUnorderedAtomicMemCpy(
 Value *Dst, Align DstAlign, Value *Src, Align SrcAlign, Value *Size,
 uint32_t ElementSize, MDNode *TBAATag, MDNode *TBAAStructTag,
Index: llvm/include/llvm/IR/IRBuilder.h
===
--- llvm/include/llvm/IR/IRBuilder.h
+++ llvm/include/llvm/IR/IRBuilder.h
@@ -560,6 +560,9 @@
  MDNode *ScopeTag = nullptr,
  MDNode *NoAliasTag = nullptr);
 
+  CallInst *CreateMemCpyInline(Value *Dst, MaybeAlign DstAlign, Value *Src,
+   MaybeAlign SrcAlign, Value *Size);
+
   /// Create and insert an element unordered-atomic memcpy between the
   /// specified pointers.
   ///
Index: clang/test/Sema/builtins-memcpy-inline.c
===
--- /dev/null
+++ clang/test/Sema/builtins-memcpy-inline.c
@@ -0,0 +1,32 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+#define NULL ((char *)0)
+
+#if __has_feature(__builtin_memcpy_inline)
+#warning defined as expected
+// expected-warning@-1 {{defined as expected}}
+#endif
+
+void test_memcpy_inline_null_src(void *ptr) {
+  __builtin_memcpy_inline(ptr, NULL, 4); // expected-warning {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_dst(void *ptr) {
+  __builtin_memcpy_inline(NULL, ptr, 4); // expected-warning {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_buffers() {
+  __builtin_memcpy_inline(NULL, NULL, 4);
+  // expected-warning@-1 {{null passed to a callee that requires a non-null argument}}
+  // expected-warning@-2 {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_buffer_is_ok_if_size_is_zero(void *ptr) {
+  __builtin_memcpy_inline(ptr, NULL, /*size */ 0);
+  __builtin_memcpy_inline(NULL, ptr, /*size */ 0);
+  __builtin_memcpy_inline(NULL, NULL, /*size */ 0);
+}
+
+void test_memcpy_inline_non_constant_size(void *dst, const void *src, unsigned size) {
+  __builtin_memcpy_inline(dst, src, size); // expected-error {{argument to '__builtin_memcpy_inline' must be a constant integer}}
+}
Index: clang/test/CodeGen/builtins-memcpy-inline.c
===
--- /dev/null
+++ clang/test/CodeGen/builtins-memcpy-inline.c
@@ -0,0 +1,26 @@
+// REQUIRES: x86-registered-target
+// RUN: %clang_cc1 -triple x86_64-unknown-linux -emit-llvm %s -o - | FileCheck %s
+
+// CHECK-LABEL: define void @test_memcpy_inline_0(i8* %dst, i8* %src)
+void test_memcpy_inline_0(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 %1, i64 0, i1 false)
+  __builtin_memcpy_inline(dst, src, 0);
+}
+
+// CHECK-LABEL: define void @test_memcpy_inline_1(i8* %dst, i8* %src)
+void test_memcpy_inline_1(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 %1, i64 1, i1 false)
+  __builtin_memcpy_inline(dst, src, 1);
+}
+
+// CHECK-LABEL: define void @test_memcpy_inline_4(i8* %dst, i8* %src)
+void test_memcpy_inline_4(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, 

[PATCH] D73543: [clang] Add support for __builtin_memcpy_inline

2020-02-07 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

Thx a lot !


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73543



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


[PATCH] D73543: [clang] Add support for __builtin_memcpy_inline

2020-02-07 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 243289.
gchatelet marked 3 inline comments as done.
gchatelet added a comment.

- Remove unrelated memcpy in documentation


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73543

Files:
  clang/docs/LanguageExtensions.rst
  clang/include/clang/Basic/Builtins.def
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/Sema/SemaChecking.cpp
  clang/test/CodeGen/builtins-memcpy-inline.c
  clang/test/Sema/builtins-memcpy-inline.c
  llvm/include/llvm/IR/IRBuilder.h
  llvm/lib/IR/IRBuilder.cpp

Index: llvm/lib/IR/IRBuilder.cpp
===
--- llvm/lib/IR/IRBuilder.cpp
+++ llvm/lib/IR/IRBuilder.cpp
@@ -200,6 +200,30 @@
   return CI;
 }
 
+CallInst *IRBuilderBase::CreateMemCpyInline(Value *Dst, MaybeAlign DstAlign,
+Value *Src, MaybeAlign SrcAlign,
+Value *Size) {
+  Dst = getCastedInt8PtrValue(Dst);
+  Src = getCastedInt8PtrValue(Src);
+  Value *IsVolatile = getInt1(false);
+
+  Value *Ops[] = {Dst, Src, Size, IsVolatile};
+  Type *Tys[] = {Dst->getType(), Src->getType(), Size->getType()};
+  Function *F = BB->getParent();
+  Module *M = F->getParent();
+  Function *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memcpy_inline, Tys);
+
+  CallInst *CI = createCallHelper(TheFn, Ops, this);
+
+  auto *MCI = cast(CI);
+  if (DstAlign)
+MCI->setDestAlignment(*DstAlign);
+  if (SrcAlign)
+MCI->setSourceAlignment(*SrcAlign);
+
+  return CI;
+}
+
 CallInst *IRBuilderBase::CreateElementUnorderedAtomicMemCpy(
 Value *Dst, Align DstAlign, Value *Src, Align SrcAlign, Value *Size,
 uint32_t ElementSize, MDNode *TBAATag, MDNode *TBAAStructTag,
Index: llvm/include/llvm/IR/IRBuilder.h
===
--- llvm/include/llvm/IR/IRBuilder.h
+++ llvm/include/llvm/IR/IRBuilder.h
@@ -560,6 +560,9 @@
  MDNode *ScopeTag = nullptr,
  MDNode *NoAliasTag = nullptr);
 
+  CallInst *CreateMemCpyInline(Value *Dst, MaybeAlign DstAlign, Value *Src,
+   MaybeAlign SrcAlign, Value *Size);
+
   /// Create and insert an element unordered-atomic memcpy between the
   /// specified pointers.
   ///
Index: clang/test/Sema/builtins-memcpy-inline.c
===
--- /dev/null
+++ clang/test/Sema/builtins-memcpy-inline.c
@@ -0,0 +1,32 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+#define NULL ((char *)0)
+
+#if __has_feature(__builtin_memcpy_inline)
+#warning defined as expected
+// expected-warning@-1 {{defined as expected}}
+#endif
+
+void test_memcpy_inline_null_src(void *ptr) {
+  __builtin_memcpy_inline(ptr, NULL, 4); // expected-warning {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_dst(void *ptr) {
+  __builtin_memcpy_inline(NULL, ptr, 4); // expected-warning {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_buffers() {
+  __builtin_memcpy_inline(NULL, NULL, 4);
+  // expected-warning@-1 {{null passed to a callee that requires a non-null argument}}
+  // expected-warning@-2 {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_buffer_is_ok_if_size_is_zero(void *ptr) {
+  __builtin_memcpy_inline(ptr, NULL, /*size */ 0);
+  __builtin_memcpy_inline(NULL, ptr, /*size */ 0);
+  __builtin_memcpy_inline(NULL, NULL, /*size */ 0);
+}
+
+void test_memcpy_inline_non_constant_size(void *dst, const void *src, unsigned size) {
+  __builtin_memcpy_inline(dst, src, size); // expected-error {{argument to '__builtin_memcpy_inline' must be a constant integer}}
+}
Index: clang/test/CodeGen/builtins-memcpy-inline.c
===
--- /dev/null
+++ clang/test/CodeGen/builtins-memcpy-inline.c
@@ -0,0 +1,26 @@
+// REQUIRES: x86-registered-target
+// RUN: %clang_cc1 -triple x86_64-unknown-linux -emit-llvm %s -o - | FileCheck %s
+
+// CHECK-LABEL: define void @test_memcpy_inline_0(i8* %dst, i8* %src)
+void test_memcpy_inline_0(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 %1, i64 0, i1 false)
+  __builtin_memcpy_inline(dst, src, 0);
+}
+
+// CHECK-LABEL: define void @test_memcpy_inline_1(i8* %dst, i8* %src)
+void test_memcpy_inline_1(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 %1, i64 1, i1 false)
+  __builtin_memcpy_inline(dst, src, 1);
+}
+
+// CHECK-LABEL: define void @test_memcpy_inline_4(i8* %dst, i8* %src)
+void test_memcpy_inline_4(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 %1, 

[PATCH] D73543: [clang] Add support for __builtin_memcpy_inline

2020-02-07 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added inline comments.



Comment at: clang/docs/LanguageExtensions.rst:2229
 
+* ``memcpy``
 * ``memchr``

efriedma wrote:
> Not sure putting "memcpy" in this list makes sense.  We did add support for 
> constant-evaluating memcpy, but it was separately from the others, so the 
> description of the feature detection is wrong.
Actually this is unrelated to this patch. The documentation is missing `memcpy` 
as a string builtin. It should go in a separate patch though.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73543



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


[PATCH] D73543: [clang] Add support for __builtin_memcpy_inline

2020-02-07 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

Anything else @efriedma ?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73543



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


[PATCH] D73543: [clang] Add support for __builtin_memcpy_inline

2020-02-03 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added inline comments.



Comment at: clang/docs/LanguageExtensions.rst:2252
+
+ * ``__builtin_memcpy_inline``
+

efriedma wrote:
> This is in the wrong section of the documentation.  We could 
> constant-evaluate __builtin_memcpy_inline, I guess, but that isn't the 
> primary purpose, and your patch doesn't implement constant evaluation anyway.
> 
> Might make sense to add a new section, if no existing section makes sense.
I added a new `memory builtins` section. Let me know what you think.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73543



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


[PATCH] D73543: [clang] Add support for __builtin_memcpy_inline

2020-02-03 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 241988.
gchatelet marked 3 inline comments as done.
gchatelet added a comment.

- Address comments


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73543

Files:
  clang/docs/LanguageExtensions.rst
  clang/include/clang/Basic/Builtins.def
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/Sema/SemaChecking.cpp
  clang/test/CodeGen/builtins-memcpy-inline.c
  clang/test/Sema/builtins-memcpy-inline.c
  llvm/include/llvm/IR/IRBuilder.h
  llvm/lib/IR/IRBuilder.cpp

Index: llvm/lib/IR/IRBuilder.cpp
===
--- llvm/lib/IR/IRBuilder.cpp
+++ llvm/lib/IR/IRBuilder.cpp
@@ -200,6 +200,30 @@
   return CI;
 }
 
+CallInst *IRBuilderBase::CreateMemCpyInline(Value *Dst, MaybeAlign DstAlign,
+Value *Src, MaybeAlign SrcAlign,
+Value *Size) {
+  Dst = getCastedInt8PtrValue(Dst);
+  Src = getCastedInt8PtrValue(Src);
+  Value *IsVolatile = getInt1(false);
+
+  Value *Ops[] = {Dst, Src, Size, IsVolatile};
+  Type *Tys[] = {Dst->getType(), Src->getType(), Size->getType()};
+  Function *F = BB->getParent();
+  Module *M = F->getParent();
+  Function *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memcpy_inline, Tys);
+
+  CallInst *CI = createCallHelper(TheFn, Ops, this);
+
+  auto *MCI = cast(CI);
+  if (DstAlign)
+MCI->setDestAlignment(*DstAlign);
+  if (SrcAlign)
+MCI->setSourceAlignment(*SrcAlign);
+
+  return CI;
+}
+
 CallInst *IRBuilderBase::CreateElementUnorderedAtomicMemCpy(
 Value *Dst, Align DstAlign, Value *Src, Align SrcAlign, Value *Size,
 uint32_t ElementSize, MDNode *TBAATag, MDNode *TBAAStructTag,
Index: llvm/include/llvm/IR/IRBuilder.h
===
--- llvm/include/llvm/IR/IRBuilder.h
+++ llvm/include/llvm/IR/IRBuilder.h
@@ -560,6 +560,9 @@
  MDNode *ScopeTag = nullptr,
  MDNode *NoAliasTag = nullptr);
 
+  CallInst *CreateMemCpyInline(Value *Dst, MaybeAlign DstAlign, Value *Src,
+   MaybeAlign SrcAlign, Value *Size);
+
   /// Create and insert an element unordered-atomic memcpy between the
   /// specified pointers.
   ///
Index: clang/test/Sema/builtins-memcpy-inline.c
===
--- /dev/null
+++ clang/test/Sema/builtins-memcpy-inline.c
@@ -0,0 +1,32 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+#define NULL ((char *)0)
+
+#if __has_feature(__builtin_memcpy_inline)
+#warning defined as expected
+// expected-warning@-1 {{defined as expected}}
+#endif
+
+void test_memcpy_inline_null_src(void *ptr) {
+  __builtin_memcpy_inline(ptr, NULL, 4); // expected-warning {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_dst(void *ptr) {
+  __builtin_memcpy_inline(NULL, ptr, 4); // expected-warning {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_buffers() {
+  __builtin_memcpy_inline(NULL, NULL, 4);
+  // expected-warning@-1 {{null passed to a callee that requires a non-null argument}}
+  // expected-warning@-2 {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_buffer_is_ok_if_size_is_zero(void *ptr) {
+  __builtin_memcpy_inline(ptr, NULL, /*size */ 0);
+  __builtin_memcpy_inline(NULL, ptr, /*size */ 0);
+  __builtin_memcpy_inline(NULL, NULL, /*size */ 0);
+}
+
+void test_memcpy_inline_non_constant_size(void *dst, const void *src, unsigned size) {
+  __builtin_memcpy_inline(dst, src, size); // expected-error {{argument to '__builtin_memcpy_inline' must be a constant integer}}
+}
Index: clang/test/CodeGen/builtins-memcpy-inline.c
===
--- /dev/null
+++ clang/test/CodeGen/builtins-memcpy-inline.c
@@ -0,0 +1,26 @@
+// REQUIRES: x86-registered-target
+// RUN: %clang_cc1 -triple x86_64-unknown-linux -emit-llvm %s -o - | FileCheck %s
+
+// CHECK-LABEL: define void @test_memcpy_inline_0(i8* %dst, i8* %src)
+void test_memcpy_inline_0(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 %1, i64 0, i1 false)
+  __builtin_memcpy_inline(dst, src, 0);
+}
+
+// CHECK-LABEL: define void @test_memcpy_inline_1(i8* %dst, i8* %src)
+void test_memcpy_inline_1(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 %1, i64 1, i1 false)
+  __builtin_memcpy_inline(dst, src, 1);
+}
+
+// CHECK-LABEL: define void @test_memcpy_inline_4(i8* %dst, i8* %src)
+void test_memcpy_inline_4(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 %1, i64 4, i1 false)
+  

[PATCH] D73543: [clang] Add support for __builtin_memcpy_inline

2020-01-31 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 241649.
gchatelet marked an inline comment as done.
gchatelet added a comment.

- Address comments


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73543

Files:
  clang/docs/LanguageExtensions.rst
  clang/include/clang/Basic/Builtins.def
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/Sema/SemaChecking.cpp
  clang/test/CodeGen/builtins-memcpy-inline.c
  clang/test/Sema/builtins-memcpy-inline.c
  llvm/include/llvm/IR/IRBuilder.h
  llvm/lib/IR/IRBuilder.cpp

Index: llvm/lib/IR/IRBuilder.cpp
===
--- llvm/lib/IR/IRBuilder.cpp
+++ llvm/lib/IR/IRBuilder.cpp
@@ -200,6 +200,30 @@
   return CI;
 }
 
+CallInst *IRBuilderBase::CreateMemCpyInline(Value *Dst, MaybeAlign DstAlign,
+Value *Src, MaybeAlign SrcAlign,
+Value *Size) {
+  Dst = getCastedInt8PtrValue(Dst);
+  Src = getCastedInt8PtrValue(Src);
+  Value *IsVolatile = getInt1(false);
+
+  Value *Ops[] = {Dst, Src, Size, IsVolatile};
+  Type *Tys[] = {Dst->getType(), Src->getType(), Size->getType()};
+  Function *F = BB->getParent();
+  Module *M = F->getParent();
+  Function *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memcpy_inline, Tys);
+
+  CallInst *CI = createCallHelper(TheFn, Ops, this);
+
+  auto *MCI = cast(CI);
+  if (DstAlign)
+MCI->setDestAlignment(*DstAlign);
+  if (SrcAlign)
+MCI->setSourceAlignment(*SrcAlign);
+
+  return CI;
+}
+
 CallInst *IRBuilderBase::CreateElementUnorderedAtomicMemCpy(
 Value *Dst, Align DstAlign, Value *Src, Align SrcAlign, Value *Size,
 uint32_t ElementSize, MDNode *TBAATag, MDNode *TBAAStructTag,
Index: llvm/include/llvm/IR/IRBuilder.h
===
--- llvm/include/llvm/IR/IRBuilder.h
+++ llvm/include/llvm/IR/IRBuilder.h
@@ -560,6 +560,9 @@
  MDNode *ScopeTag = nullptr,
  MDNode *NoAliasTag = nullptr);
 
+  CallInst *CreateMemCpyInline(Value *Dst, MaybeAlign DstAlign, Value *Src,
+   MaybeAlign SrcAlign, Value *Size);
+
   /// Create and insert an element unordered-atomic memcpy between the
   /// specified pointers.
   ///
Index: clang/test/Sema/builtins-memcpy-inline.c
===
--- /dev/null
+++ clang/test/Sema/builtins-memcpy-inline.c
@@ -0,0 +1,32 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+#define NULL ((char *)0)
+
+#if __has_feature(__builtin_memcpy_inline)
+#warning defined as expected
+// expected-warning@-1 {{defined as expected}}
+#endif
+
+void test_memcpy_inline_null_src(void *ptr) {
+  __builtin_memcpy_inline(ptr, NULL, 4); // expected-warning {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_dst(void *ptr) {
+  __builtin_memcpy_inline(NULL, ptr, 4); // expected-warning {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_buffers() {
+  __builtin_memcpy_inline(NULL, NULL, 4);
+  // expected-warning@-1 {{null passed to a callee that requires a non-null argument}}
+  // expected-warning@-2 {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_buffer_is_ok_if_size_is_zero(void *ptr) {
+  __builtin_memcpy_inline(ptr, NULL, /*size */ 0);
+  __builtin_memcpy_inline(NULL, ptr, /*size */ 0);
+  __builtin_memcpy_inline(NULL, NULL, /*size */ 0);
+}
+
+void test_memcpy_inline_non_constant_size(void *dst, const void *src, unsigned size) {
+  __builtin_memcpy_inline(dst, src, size); // expected-error {{argument to '__builtin_memcpy_inline' must be a constant integer}}
+}
Index: clang/test/CodeGen/builtins-memcpy-inline.c
===
--- /dev/null
+++ clang/test/CodeGen/builtins-memcpy-inline.c
@@ -0,0 +1,26 @@
+// REQUIRES: x86-registered-target
+// RUN: %clang_cc1 -triple x86_64-unknown-linux -emit-llvm %s -o - | FileCheck %s
+
+// CHECK-LABEL: define void @test_memcpy_inline_0(i8* %dst, i8* %src)
+void test_memcpy_inline_0(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 %1, i64 0, i1 false)
+  __builtin_memcpy_inline(dst, src, 0);
+}
+
+// CHECK-LABEL: define void @test_memcpy_inline_1(i8* %dst, i8* %src)
+void test_memcpy_inline_1(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 %1, i64 1, i1 false)
+  __builtin_memcpy_inline(dst, src, 1);
+}
+
+// CHECK-LABEL: define void @test_memcpy_inline_4(i8* %dst, i8* %src)
+void test_memcpy_inline_4(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 %1, i64 4, i1 false)
+  

[PATCH] D73543: [clang] Add support for __builtin_memcpy_inline

2020-01-31 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

Thx!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73543



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


[PATCH] D73543: [clang] Add support for __builtin_memcpy_inline

2020-01-30 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

@efriedma would you mind having a look?
It should be my last patch on that matter :)


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73543



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


[PATCH] D73543: [clang] Add support for __builtin_memcpy_inline

2020-01-30 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 241356.
gchatelet added a comment.

rebasing


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73543

Files:
  clang/docs/LanguageExtensions.rst
  clang/include/clang/Basic/Builtins.def
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/Sema/SemaChecking.cpp
  clang/test/CodeGen/builtins-memcpy-inline.c
  clang/test/Sema/builtins-memcpy-inline.c
  llvm/include/llvm/IR/IRBuilder.h
  llvm/lib/IR/IRBuilder.cpp

Index: llvm/lib/IR/IRBuilder.cpp
===
--- llvm/lib/IR/IRBuilder.cpp
+++ llvm/lib/IR/IRBuilder.cpp
@@ -200,6 +200,30 @@
   return CI;
 }
 
+CallInst *IRBuilderBase::CreateMemCpyInline(Value *Dst, MaybeAlign DstAlign,
+Value *Src, MaybeAlign SrcAlign,
+Value *Size) {
+  Dst = getCastedInt8PtrValue(Dst);
+  Src = getCastedInt8PtrValue(Src);
+  Value *IsVolatile = getInt1(false);
+
+  Value *Ops[] = {Dst, Src, Size, IsVolatile};
+  Type *Tys[] = {Dst->getType(), Src->getType(), Size->getType()};
+  Function *F = BB->getParent();
+  Module *M = F->getParent();
+  Function *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memcpy_inline, Tys);
+
+  CallInst *CI = createCallHelper(TheFn, Ops, this);
+
+  auto *MCI = cast(CI);
+  if (DstAlign)
+MCI->setDestAlignment(*DstAlign);
+  if (SrcAlign)
+MCI->setSourceAlignment(*SrcAlign);
+
+  return CI;
+}
+
 CallInst *IRBuilderBase::CreateElementUnorderedAtomicMemCpy(
 Value *Dst, Align DstAlign, Value *Src, Align SrcAlign, Value *Size,
 uint32_t ElementSize, MDNode *TBAATag, MDNode *TBAAStructTag,
Index: llvm/include/llvm/IR/IRBuilder.h
===
--- llvm/include/llvm/IR/IRBuilder.h
+++ llvm/include/llvm/IR/IRBuilder.h
@@ -560,6 +560,9 @@
  MDNode *ScopeTag = nullptr,
  MDNode *NoAliasTag = nullptr);
 
+  CallInst *CreateMemCpyInline(Value *Dst, MaybeAlign DstAlign, Value *Src,
+   MaybeAlign SrcAlign, Value *Size);
+
   /// Create and insert an element unordered-atomic memcpy between the
   /// specified pointers.
   ///
Index: clang/test/Sema/builtins-memcpy-inline.c
===
--- /dev/null
+++ clang/test/Sema/builtins-memcpy-inline.c
@@ -0,0 +1,32 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+#define NULL ((char *)0)
+
+#if __has_feature(__builtin_memcpy_inline)
+#warning defined as expected
+// expected-warning@-1 {{defined as expected}}
+#endif
+
+void test_memcpy_inline_null_src(void *ptr) {
+  __builtin_memcpy_inline(ptr, NULL, 4); // expected-warning {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_dst(void *ptr) {
+  __builtin_memcpy_inline(NULL, ptr, 4); // expected-warning {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_buffers() {
+  __builtin_memcpy_inline(NULL, NULL, 4);
+  // expected-warning@-1 {{null passed to a callee that requires a non-null argument}}
+  // expected-warning@-2 {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_buffer_is_ok_if_size_is_zero(void *ptr) {
+  __builtin_memcpy_inline(ptr, NULL, /*size */ 0);
+  __builtin_memcpy_inline(NULL, ptr, /*size */ 0);
+  __builtin_memcpy_inline(NULL, NULL, /*size */ 0);
+}
+
+void test_memcpy_inline_non_constant_size(void *dst, const void *src, unsigned size) {
+  __builtin_memcpy_inline(dst, src, size); // expected-error {{expression is not an integer constant expression}}
+}
Index: clang/test/CodeGen/builtins-memcpy-inline.c
===
--- /dev/null
+++ clang/test/CodeGen/builtins-memcpy-inline.c
@@ -0,0 +1,26 @@
+// REQUIRES: x86-registered-target
+// RUN: %clang_cc1 -triple x86_64-unknown-linux -emit-llvm %s -o - | FileCheck %s
+
+// CHECK-LABEL: define void @test_memcpy_inline_0(i8* %dst, i8* %src)
+void test_memcpy_inline_0(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 %1, i64 0, i1 false)
+  __builtin_memcpy_inline(dst, src, 0);
+}
+
+// CHECK-LABEL: define void @test_memcpy_inline_1(i8* %dst, i8* %src)
+void test_memcpy_inline_1(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 %1, i64 1, i1 false)
+  __builtin_memcpy_inline(dst, src, 1);
+}
+
+// CHECK-LABEL: define void @test_memcpy_inline_4(i8* %dst, i8* %src)
+void test_memcpy_inline_4(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 %1, i64 4, i1 false)
+  __builtin_memcpy_inline(dst, src, 4);
+}
+
+// CHECK-LABEL: define void 

[PATCH] D73543: [clang] Add support for __builtin_memcpy_inline

2020-01-29 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added inline comments.



Comment at: clang/docs/LanguageExtensions.rst:2259
+``__builtin_memcpy_inline(dst, src, size)`` is identical to
+``__builtin_memcpy(dst, src, size)`` expect that the generated code is
+guaranteed not to call any external functions. See [LLVM IR 
‘llvm.memcpy.inline’

arichardson wrote:
> Typo: except
Thx :)



Comment at: clang/test/Sema/builtins-memcpy-inline.c:23
+}
+
+void test_memcpy_inline_null_buffer_is_ok_if_size_is_zero(void *ptr) {

arichardson wrote:
> Size can only be a constant right? Should there be a test for the error 
> reported in that case?
Thx it caught a bug indeed :)


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73543



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


[PATCH] D73543: [clang] Add support for __builtin_memcpy_inline

2020-01-29 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 241158.
gchatelet marked 4 inline comments as done.
gchatelet added a comment.

- Address comments


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73543

Files:
  clang/docs/LanguageExtensions.rst
  clang/include/clang/Basic/Builtins.def
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/Sema/SemaChecking.cpp
  clang/test/CodeGen/builtins-memcpy-inline.c
  clang/test/Sema/builtins-memcpy-inline.c
  llvm/include/llvm/IR/IRBuilder.h
  llvm/lib/IR/IRBuilder.cpp

Index: llvm/lib/IR/IRBuilder.cpp
===
--- llvm/lib/IR/IRBuilder.cpp
+++ llvm/lib/IR/IRBuilder.cpp
@@ -200,6 +200,30 @@
   return CI;
 }
 
+CallInst *IRBuilderBase::CreateMemCpyInline(Value *Dst, MaybeAlign DstAlign,
+Value *Src, MaybeAlign SrcAlign,
+Value *Size) {
+  Dst = getCastedInt8PtrValue(Dst);
+  Src = getCastedInt8PtrValue(Src);
+  Value *IsVolatile = getInt1(false);
+
+  Value *Ops[] = {Dst, Src, Size, IsVolatile};
+  Type *Tys[] = {Dst->getType(), Src->getType(), Size->getType()};
+  Function *F = BB->getParent();
+  Module *M = F->getParent();
+  Function *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memcpy_inline, Tys);
+
+  CallInst *CI = createCallHelper(TheFn, Ops, this);
+
+  auto *MCI = cast(CI);
+  if (DstAlign)
+MCI->setDestAlignment(*DstAlign);
+  if (SrcAlign)
+MCI->setSourceAlignment(*SrcAlign);
+
+  return CI;
+}
+
 CallInst *IRBuilderBase::CreateElementUnorderedAtomicMemCpy(
 Value *Dst, Align DstAlign, Value *Src, Align SrcAlign, Value *Size,
 uint32_t ElementSize, MDNode *TBAATag, MDNode *TBAAStructTag,
Index: llvm/include/llvm/IR/IRBuilder.h
===
--- llvm/include/llvm/IR/IRBuilder.h
+++ llvm/include/llvm/IR/IRBuilder.h
@@ -560,6 +560,9 @@
  MDNode *ScopeTag = nullptr,
  MDNode *NoAliasTag = nullptr);
 
+  CallInst *CreateMemCpyInline(Value *Dst, MaybeAlign DstAlign, Value *Src,
+   MaybeAlign SrcAlign, Value *Size);
+
   /// Create and insert an element unordered-atomic memcpy between the
   /// specified pointers.
   ///
Index: clang/test/Sema/builtins-memcpy-inline.c
===
--- /dev/null
+++ clang/test/Sema/builtins-memcpy-inline.c
@@ -0,0 +1,32 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+#define NULL ((char *)0)
+
+#if __has_feature(__builtin_memcpy_inline)
+#warning defined as expected
+// expected-warning@-1 {{defined as expected}}
+#endif
+
+void test_memcpy_inline_null_src(void *ptr) {
+  __builtin_memcpy_inline(ptr, NULL, 4); // expected-warning {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_dst(void *ptr) {
+  __builtin_memcpy_inline(NULL, ptr, 4); // expected-warning {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_buffers() {
+  __builtin_memcpy_inline(NULL, NULL, 4);
+  // expected-warning@-1 {{null passed to a callee that requires a non-null argument}}
+  // expected-warning@-2 {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_buffer_is_ok_if_size_is_zero(void *ptr) {
+  __builtin_memcpy_inline(ptr, NULL, /*size */ 0);
+  __builtin_memcpy_inline(NULL, ptr, /*size */ 0);
+  __builtin_memcpy_inline(NULL, NULL, /*size */ 0);
+}
+
+void test_memcpy_inline_non_constant_size(void *dst, const void *src, unsigned size) {
+  __builtin_memcpy_inline(dst, src, size); // expected-error {{expression is not an integer constant expression}}
+}
Index: clang/test/CodeGen/builtins-memcpy-inline.c
===
--- /dev/null
+++ clang/test/CodeGen/builtins-memcpy-inline.c
@@ -0,0 +1,26 @@
+// REQUIRES: x86-registered-target
+// RUN: %clang_cc1 -triple x86_64-unknown-linux -emit-llvm %s -o - | FileCheck %s
+
+// CHECK-LABEL: define void @test_memcpy_inline_0(i8* %dst, i8* %src)
+void test_memcpy_inline_0(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 %1, i64 0, i1 false)
+  __builtin_memcpy_inline(dst, src, 0);
+}
+
+// CHECK-LABEL: define void @test_memcpy_inline_1(i8* %dst, i8* %src)
+void test_memcpy_inline_1(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 %1, i64 1, i1 false)
+  __builtin_memcpy_inline(dst, src, 1);
+}
+
+// CHECK-LABEL: define void @test_memcpy_inline_4(i8* %dst, i8* %src)
+void test_memcpy_inline_4(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 %1, i64 4, i1 false)
+  

[PATCH] D73495: [CodeGen] Attach no-builtin attributes to function definitions with no Decl

2020-01-28 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

Thx for the fix @thegameg




Comment at: clang/lib/CodeGen/CGCall.cpp:1845
+
+  // First, handle the language options passed through -fno-builtin[-]
+  if (LangOpts.NoBuiltin) {

Can you remove the trailing `[-]`?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73495



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


[PATCH] D73543: [clang] Add support for __builtin_memcpy_inline

2020-01-28 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet created this revision.
gchatelet added reviewers: efriedma, courbet, tejohnson.
Herald added subscribers: llvm-commits, cfe-commits, hiraditya.
Herald added projects: clang, LLVM.

This is a follow up on D61634  and the last 
step to implement 
http://lists.llvm.org/pipermail/llvm-dev/2019-April/131973.html


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D73543

Files:
  clang/docs/LanguageExtensions.rst
  clang/include/clang/Basic/Builtins.def
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/Sema/SemaChecking.cpp
  clang/test/CodeGen/builtins-memcpy-inline.c
  clang/test/Sema/builtins-memcpy-inline.c
  llvm/include/llvm/IR/IRBuilder.h
  llvm/lib/IR/IRBuilder.cpp

Index: llvm/lib/IR/IRBuilder.cpp
===
--- llvm/lib/IR/IRBuilder.cpp
+++ llvm/lib/IR/IRBuilder.cpp
@@ -200,6 +200,30 @@
   return CI;
 }
 
+CallInst *IRBuilderBase::CreateMemCpyInline(Value *Dst, MaybeAlign DstAlign,
+Value *Src, MaybeAlign SrcAlign,
+Value *Size) {
+  Dst = getCastedInt8PtrValue(Dst);
+  Src = getCastedInt8PtrValue(Src);
+  Value *IsVolatile = getInt1(false);
+
+  Value *Ops[] = {Dst, Src, Size, IsVolatile};
+  Type *Tys[] = {Dst->getType(), Src->getType(), Size->getType()};
+  Function *F = BB->getParent();
+  Module *M = F->getParent();
+  Function *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memcpy_inline, Tys);
+
+  CallInst *CI = createCallHelper(TheFn, Ops, this);
+
+  auto *MCI = cast(CI);
+  if (DstAlign)
+MCI->setDestAlignment(*DstAlign);
+  if (SrcAlign)
+MCI->setSourceAlignment(*SrcAlign);
+
+  return CI;
+}
+
 CallInst *IRBuilderBase::CreateElementUnorderedAtomicMemCpy(
 Value *Dst, Align DstAlign, Value *Src, Align SrcAlign, Value *Size,
 uint32_t ElementSize, MDNode *TBAATag, MDNode *TBAAStructTag,
Index: llvm/include/llvm/IR/IRBuilder.h
===
--- llvm/include/llvm/IR/IRBuilder.h
+++ llvm/include/llvm/IR/IRBuilder.h
@@ -560,6 +560,9 @@
  MDNode *ScopeTag = nullptr,
  MDNode *NoAliasTag = nullptr);
 
+  CallInst *CreateMemCpyInline(Value *Dst, MaybeAlign DstAlign, Value *Src,
+   MaybeAlign SrcAlign, Value *Size);
+
   /// Create and insert an element unordered-atomic memcpy between the
   /// specified pointers.
   ///
Index: clang/test/Sema/builtins-memcpy-inline.c
===
--- /dev/null
+++ clang/test/Sema/builtins-memcpy-inline.c
@@ -0,0 +1,28 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+#define NULL ((char *)0)
+
+#if __has_feature(__builtin_memcpy_inline)
+#warning defined as expected
+// expected-warning@-1 {{defined as expected}}
+#endif
+
+void test_memcpy_inline_null_src(void *ptr) {
+  __builtin_memcpy_inline(ptr, NULL, 4); // expected-warning {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_dst(void *ptr) {
+  __builtin_memcpy_inline(NULL, ptr, 4); // expected-warning {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_buffers() {
+  __builtin_memcpy_inline(NULL, NULL, 4);
+  // expected-warning@-1 {{null passed to a callee that requires a non-null argument}}
+  // expected-warning@-2 {{null passed to a callee that requires a non-null argument}}
+}
+
+void test_memcpy_inline_null_buffer_is_ok_if_size_is_zero(void *ptr) {
+  __builtin_memcpy_inline(ptr, NULL, /*size */ 0);
+  __builtin_memcpy_inline(NULL, ptr, /*size */ 0);
+  __builtin_memcpy_inline(NULL, NULL, /*size */ 0);
+}
Index: clang/test/CodeGen/builtins-memcpy-inline.c
===
--- /dev/null
+++ clang/test/CodeGen/builtins-memcpy-inline.c
@@ -0,0 +1,26 @@
+// REQUIRES: x86-registered-target
+// RUN: %clang_cc1 -triple x86_64-unknown-linux -emit-llvm %s -o - | FileCheck %s
+
+// CHECK-LABEL: define void @test_memcpy_inline_0(i8* %dst, i8* %src)
+void test_memcpy_inline_0(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 %1, i64 0, i1 false)
+  __builtin_memcpy_inline(dst, src, 0);
+}
+
+// CHECK-LABEL: define void @test_memcpy_inline_1(i8* %dst, i8* %src)
+void test_memcpy_inline_1(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 %1, i64 1, i1 false)
+  __builtin_memcpy_inline(dst, src, 1);
+}
+
+// CHECK-LABEL: define void @test_memcpy_inline_4(i8* %dst, i8* %src)
+void test_memcpy_inline_4(void *dst, const void *src) {
+  // CHECK:   call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 %1, i64 4, i1 false)
+  __builtin_memcpy_inline(dst, src, 4);
+}
+
+// CHECK-LABEL: define void 

[PATCH] D73449: [Alignment][NFC] Use Align with CreateAlignedLoad

2020-01-27 Thread Guillaume Chatelet via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rG07c9d5326648: [Alignment][NFC] Use Align with 
CreateAlignedLoad (authored by gchatelet).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73449

Files:
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGCXX.cpp
  clang/lib/CodeGen/CodeGenFunction.h
  llvm/include/llvm/IR/IRBuilder.h
  llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
  polly/lib/CodeGen/BlockGenerators.cpp

Index: polly/lib/CodeGen/BlockGenerators.cpp
===
--- polly/lib/CodeGen/BlockGenerators.cpp
+++ polly/lib/CodeGen/BlockGenerators.cpp
@@ -316,8 +316,8 @@
 
   Value *NewPointer =
   generateLocationAccessed(Stmt, Load, BBMap, LTS, NewAccesses);
-  Value *ScalarLoad = Builder.CreateAlignedLoad(
-  NewPointer, Load->getAlignment(), Load->getName() + "_p_scalar_");
+  Value *ScalarLoad = Builder.CreateAlignedLoad(NewPointer, Load->getAlign(),
+Load->getName() + "_p_scalar_");
 
   if (PollyDebugPrinting)
 RuntimeDebugBuilder::createCPUPrinter(Builder, "Load from ", NewPointer,
Index: llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
===
--- llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
+++ llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
@@ -517,8 +517,8 @@
 
   LoadInst *createColumnLoad(Value *ColumnPtr, Type *EltType,
  IRBuilder<> Builder) {
-unsigned Align = DL.getABITypeAlignment(EltType);
-return Builder.CreateAlignedLoad(ColumnPtr, Align, "col.load");
+return Builder.CreateAlignedLoad(
+ColumnPtr, Align(DL.getABITypeAlignment(EltType)), "col.load");
   }
 
   StoreInst *createColumnStore(Value *ColumnValue, Value *ColumnPtr,
Index: llvm/include/llvm/IR/IRBuilder.h
===
--- llvm/include/llvm/IR/IRBuilder.h
+++ llvm/include/llvm/IR/IRBuilder.h
@@ -1819,19 +1819,27 @@
   }
 
   // Deprecated [opaque pointer types]
-  LoadInst *CreateAlignedLoad(Value *Ptr, unsigned Align, const char *Name) {
+  LLVM_ATTRIBUTE_DEPRECATED(LoadInst *CreateAlignedLoad(Value *Ptr,
+unsigned Align,
+const char *Name),
+"Use the version that takes MaybeAlign instead") {
 return CreateAlignedLoad(Ptr->getType()->getPointerElementType(), Ptr,
  MaybeAlign(Align), Name);
   }
   // Deprecated [opaque pointer types]
-  LoadInst *CreateAlignedLoad(Value *Ptr, unsigned Align,
-  const Twine  = "") {
+  LLVM_ATTRIBUTE_DEPRECATED(LoadInst *CreateAlignedLoad(Value *Ptr,
+unsigned Align,
+const Twine  = ""),
+"Use the version that takes MaybeAlign instead") {
 return CreateAlignedLoad(Ptr->getType()->getPointerElementType(), Ptr,
  MaybeAlign(Align), Name);
   }
   // Deprecated [opaque pointer types]
-  LoadInst *CreateAlignedLoad(Value *Ptr, unsigned Align, bool isVolatile,
-  const Twine  = "") {
+  LLVM_ATTRIBUTE_DEPRECATED(LoadInst *CreateAlignedLoad(Value *Ptr,
+unsigned Align,
+bool isVolatile,
+const Twine  = ""),
+"Use the version that takes MaybeAlign instead") {
 return CreateAlignedLoad(Ptr->getType()->getPointerElementType(), Ptr,
  MaybeAlign(Align), isVolatile, Name);
   }
Index: clang/lib/CodeGen/CodeGenFunction.h
===
--- clang/lib/CodeGen/CodeGenFunction.h
+++ clang/lib/CodeGen/CodeGenFunction.h
@@ -4414,7 +4414,7 @@
 
   // Otherwise, it should be an alloca instruction, as set up in save().
   auto alloca = cast(value.getPointer());
-  return CGF.Builder.CreateAlignedLoad(alloca, alloca->getAlignment());
+  return CGF.Builder.CreateAlignedLoad(alloca, alloca->getAlign());
 }
 
 }  // end namespace CodeGen
Index: clang/lib/CodeGen/CGCXX.cpp
===
--- clang/lib/CodeGen/CGCXX.cpp
+++ clang/lib/CodeGen/CGCXX.cpp
@@ -263,8 +263,8 @@
  AddressPoint.AddressPointIndex;
   llvm::Value *VFuncPtr =
 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfnkxt");
-  llvm::Value *VFunc =
-CGF.Builder.CreateAlignedLoad(VFuncPtr, CGF.PointerAlignInBytes);
+  llvm::Value *VFunc = CGF.Builder.CreateAlignedLoad(

[PATCH] D73449: [Alignment][NFC] Use Align with CreateAlignedLoad

2020-01-27 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet created this revision.
gchatelet added a reviewer: courbet.
Herald added a reviewer: bollu.
Herald added subscribers: llvm-commits, cfe-commits, hiraditya.
Herald added projects: clang, LLVM.

This is patch is part of a series to introduce an Alignment type.
See this thread for context: 
http://lists.llvm.org/pipermail/llvm-dev/2019-July/133851.html
See this patch for the introduction of the type: https://reviews.llvm.org/D64790


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D73449

Files:
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGCXX.cpp
  clang/lib/CodeGen/CodeGenFunction.h
  llvm/include/llvm/IR/IRBuilder.h
  llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
  polly/lib/CodeGen/BlockGenerators.cpp

Index: polly/lib/CodeGen/BlockGenerators.cpp
===
--- polly/lib/CodeGen/BlockGenerators.cpp
+++ polly/lib/CodeGen/BlockGenerators.cpp
@@ -316,8 +316,8 @@
 
   Value *NewPointer =
   generateLocationAccessed(Stmt, Load, BBMap, LTS, NewAccesses);
-  Value *ScalarLoad = Builder.CreateAlignedLoad(
-  NewPointer, Load->getAlignment(), Load->getName() + "_p_scalar_");
+  Value *ScalarLoad = Builder.CreateAlignedLoad(NewPointer, Load->getAlign(),
+Load->getName() + "_p_scalar_");
 
   if (PollyDebugPrinting)
 RuntimeDebugBuilder::createCPUPrinter(Builder, "Load from ", NewPointer,
Index: llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
===
--- llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
+++ llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
@@ -517,8 +517,8 @@
 
   LoadInst *createColumnLoad(Value *ColumnPtr, Type *EltType,
  IRBuilder<> Builder) {
-unsigned Align = DL.getABITypeAlignment(EltType);
-return Builder.CreateAlignedLoad(ColumnPtr, Align, "col.load");
+return Builder.CreateAlignedLoad(
+ColumnPtr, Align(DL.getABITypeAlignment(EltType)), "col.load");
   }
 
   StoreInst *createColumnStore(Value *ColumnValue, Value *ColumnPtr,
Index: llvm/include/llvm/IR/IRBuilder.h
===
--- llvm/include/llvm/IR/IRBuilder.h
+++ llvm/include/llvm/IR/IRBuilder.h
@@ -1819,19 +1819,27 @@
   }
 
   // Deprecated [opaque pointer types]
-  LoadInst *CreateAlignedLoad(Value *Ptr, unsigned Align, const char *Name) {
+  LLVM_ATTRIBUTE_DEPRECATED(LoadInst *CreateAlignedLoad(Value *Ptr,
+unsigned Align,
+const char *Name),
+"Use the version that takes MaybeAlign instead") {
 return CreateAlignedLoad(Ptr->getType()->getPointerElementType(), Ptr,
  MaybeAlign(Align), Name);
   }
   // Deprecated [opaque pointer types]
-  LoadInst *CreateAlignedLoad(Value *Ptr, unsigned Align,
-  const Twine  = "") {
+  LLVM_ATTRIBUTE_DEPRECATED(LoadInst *CreateAlignedLoad(Value *Ptr,
+unsigned Align,
+const Twine  = ""),
+"Use the version that takes MaybeAlign instead") {
 return CreateAlignedLoad(Ptr->getType()->getPointerElementType(), Ptr,
  MaybeAlign(Align), Name);
   }
   // Deprecated [opaque pointer types]
-  LoadInst *CreateAlignedLoad(Value *Ptr, unsigned Align, bool isVolatile,
-  const Twine  = "") {
+  LLVM_ATTRIBUTE_DEPRECATED(LoadInst *CreateAlignedLoad(Value *Ptr,
+unsigned Align,
+bool isVolatile,
+const Twine  = ""),
+"Use the version that takes MaybeAlign instead") {
 return CreateAlignedLoad(Ptr->getType()->getPointerElementType(), Ptr,
  MaybeAlign(Align), isVolatile, Name);
   }
Index: clang/lib/CodeGen/CodeGenFunction.h
===
--- clang/lib/CodeGen/CodeGenFunction.h
+++ clang/lib/CodeGen/CodeGenFunction.h
@@ -4414,7 +4414,7 @@
 
   // Otherwise, it should be an alloca instruction, as set up in save().
   auto alloca = cast(value.getPointer());
-  return CGF.Builder.CreateAlignedLoad(alloca, alloca->getAlignment());
+  return CGF.Builder.CreateAlignedLoad(alloca, alloca->getAlign());
 }
 
 }  // end namespace CodeGen
Index: clang/lib/CodeGen/CGCXX.cpp
===
--- clang/lib/CodeGen/CGCXX.cpp
+++ clang/lib/CodeGen/CGCXX.cpp
@@ -263,8 +263,8 @@
  AddressPoint.AddressPointIndex;
   llvm::Value *VFuncPtr =
 

[PATCH] D72998: [IR] Attribute/AttrBuilder: use Value::MaximumAlignment magic constant

2020-01-24 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

In D72998#1838834 , @lebedev.ri wrote:

> Is that still an issue after a8c3608a27a82cf1c66f33b96a06423fe0e708fc 
>  ?
>  http://lab.llvm.org:8011/builders/clang-armv7-linux-build-cache gone back to 
> green after that.


Not an issue anymore! Thx for the fix :)


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D72998



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


[PATCH] D72998: [IR] Attribute/AttrBuilder: use Value::MaximumAlignment magic constant

2020-01-24 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

Actually there's an issue with the code. It doesn't compile in shared_library 
mode.

  ld.lld: error: undefined symbol: clang::Sema::MaximumAlignment
  >>> referenced by SemaChecking.cpp:5397 
(/redacted/llvm-project/clang/lib/Sema/SemaChecking.cpp:5397)
  >>>   
tools/clang/lib/Sema/CMakeFiles/obj.clangSema.dir/SemaChecking.cpp.o:(clang::Sema::SemaBuiltinAssumeAligned(clang::CallExpr*))
  >>> referenced by SemaChecking.cpp:3670 
(/redacted/llvm-project/clang/lib/Sema/SemaChecking.cpp:3670)
  >>>   
tools/clang/lib/Sema/CMakeFiles/obj.clangSema.dir/SemaChecking.cpp.o:(clang::Sema::checkCall(clang::NamedDecl*,
 clang::FunctionProtoType const*, clang::Expr const*, 
llvm::ArrayRef, bool, clang::SourceLocation, 
clang::SourceRange, clang::Sema::VariadicCallType))
  >>> referenced by SemaDeclAttr.cpp:1631 
(/redacted/llvm-project/clang/lib/Sema/SemaDeclAttr.cpp:1631)
  >>>   
tools/clang/lib/Sema/CMakeFiles/obj.clangSema.dir/SemaDeclAttr.cpp.o:(clang::Sema::AddAssumeAlignedAttr(clang::Decl*,
 clang::AttributeCommonInfo const&, clang::Expr*, clang::Expr*))

It comes from the fact that `Diag::operator<<` takes arguments by `const&`.

You'd need to anchor the value in `Sema.cpp` but then the compiler doesn't see 
the value anymore, another option would be to use inlined variables 
 (but this is C++17) or use 
an anonymous enum value.

  enum {
MaxAlignmentExponent = 29;
MaximumAlignment = 1u << MaxAlignmentExponent;
  };


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D72998



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


[PATCH] D73099: [Alignment][NFC] Deprecate Align::None()

2020-01-24 Thread Guillaume Chatelet via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rG805c157e8aee: [Alignment][NFC] Deprecate Align::None() 
(authored by gchatelet).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73099

Files:
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/CodeGen/CGObjCMac.cpp
  llvm/include/llvm/CodeGen/AsmPrinter.h
  llvm/include/llvm/CodeGen/TargetFrameLowering.h
  llvm/include/llvm/CodeGen/TargetLowering.h
  llvm/include/llvm/Support/Alignment.h
  llvm/lib/Analysis/Loads.cpp
  llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
  llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
  llvm/lib/CodeGen/MIRPrinter.cpp
  llvm/lib/CodeGen/MachineBasicBlock.cpp
  llvm/lib/CodeGen/MachineFrameInfo.cpp
  llvm/lib/CodeGen/MachineOperand.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  llvm/lib/ExecutionEngine/Orc/Speculation.cpp
  llvm/lib/IR/AutoUpgrade.cpp
  llvm/lib/IR/DataLayout.cpp
  llvm/lib/IR/IRBuilder.cpp
  llvm/lib/Target/AArch64/AArch64CompressJumpTables.cpp
  llvm/lib/Target/AMDGPU/AMDGPUFrameLowering.h
  llvm/lib/Target/AMDGPU/AMDGPUSubtarget.cpp
  llvm/lib/Target/AMDGPU/R600FrameLowering.h
  llvm/lib/Target/AMDGPU/SIFrameLowering.h
  llvm/lib/Target/ARM/ARMBasicBlockInfo.cpp
  llvm/lib/Target/ARM/ARMBasicBlockInfo.h
  llvm/lib/Target/ARM/ARMConstantIslandPass.cpp
  llvm/lib/Target/AVR/AVRFrameLowering.cpp
  llvm/lib/Target/Hexagon/HexagonBranchRelaxation.cpp
  llvm/lib/Target/Hexagon/HexagonFixupHwLoops.cpp
  llvm/lib/Target/Hexagon/HexagonFrameLowering.h
  llvm/lib/Target/Hexagon/HexagonTargetTransformInfo.cpp
  llvm/lib/Target/Mips/MipsCallLowering.cpp
  llvm/lib/Target/Mips/MipsConstantIslandPass.cpp
  llvm/lib/Target/PowerPC/PPCBranchSelector.cpp
  llvm/lib/Target/PowerPC/PPCISelLowering.cpp
  llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
  llvm/lib/Target/X86/X86ISelLowering.cpp
  llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
  llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
  llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp
  llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp
  llvm/lib/Transforms/Instrumentation/Instrumentation.cpp
  llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
  llvm/lib/Transforms/Utils/InlineFunction.cpp
  llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
  llvm/unittests/Support/AlignmentTest.cpp
  polly/lib/CodeGen/LoopGeneratorsKMP.cpp

Index: polly/lib/CodeGen/LoopGeneratorsKMP.cpp
===
--- polly/lib/CodeGen/LoopGeneratorsKMP.cpp
+++ polly/lib/CodeGen/LoopGeneratorsKMP.cpp
@@ -468,7 +468,7 @@
 // Global Variable Definitions
 GlobalVariable *StrVar = new GlobalVariable(
 *M, ArrayType, true, GlobalValue::PrivateLinkage, 0, ".str.ident");
-StrVar->setAlignment(llvm::Align::None());
+StrVar->setAlignment(llvm::Align(1));
 
 SourceLocDummy = new GlobalVariable(
 *M, IdentTy, true, GlobalValue::PrivateLinkage, nullptr, LocName);
Index: llvm/unittests/Support/AlignmentTest.cpp
===
--- llvm/unittests/Support/AlignmentTest.cpp
+++ llvm/unittests/Support/AlignmentTest.cpp
@@ -52,7 +52,6 @@
 
 TEST(AlignmentTest, AlignDefaultCTor) {
   EXPECT_EQ(Align().value(), 1ULL);
-  EXPECT_EQ(Align::None().value(), 1ULL);
 }
 
 TEST(AlignmentTest, MaybeAlignDefaultCTor) {
Index: llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
===
--- llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
+++ llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
@@ -177,8 +177,7 @@
   if (!isOnlyUsedInComparisonWithZero(CI))
 return false;
 
-  if (!isDereferenceableAndAlignedPointer(Str, Align::None(), APInt(64, Len),
-  DL))
+  if (!isDereferenceableAndAlignedPointer(Str, Align(1), APInt(64, Len), DL))
 return false;
 
   if (CI->getFunction()->hasFnAttribute(Attribute::SanitizeMemory))
@@ -289,7 +288,7 @@
   // We have enough information to now generate the memcpy call to do the
   // concatenation for us.  Make a memcpy to copy the nul byte with align = 1.
   B.CreateMemCpy(
-  CpyDst, Align::None(), Src, Align::None(),
+  CpyDst, Align(1), Src, Align(1),
   ConstantInt::get(DL.getIntPtrType(Src->getContext()), Len + 1));
   return Dst;
 }
@@ -562,7 +561,7 @@
   // We have enough information to now generate the memcpy call to do the
   // copy for us.  Make a memcpy to copy the nul byte with align = 1.
   CallInst *NewCI =
-  B.CreateMemCpy(Dst, Align::None(), Src, Align::None(),
+  B.CreateMemCpy(Dst, Align(1), Src, Align(1),
  ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len));
   NewCI->setAttributes(CI->getAttributes());
   return Dst;
@@ -590,8 +589,7 @@
 
   // We have enough information to now generate the memcpy call to do the
   // copy for us. 

[PATCH] D73099: [Alignment][NFC] Deprecate Align::None()

2020-01-24 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 240148.
gchatelet added a comment.

- rebasing


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73099

Files:
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/CodeGen/CGObjCMac.cpp
  llvm/include/llvm/CodeGen/AsmPrinter.h
  llvm/include/llvm/CodeGen/TargetFrameLowering.h
  llvm/include/llvm/CodeGen/TargetLowering.h
  llvm/include/llvm/Support/Alignment.h
  llvm/lib/Analysis/Loads.cpp
  llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
  llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
  llvm/lib/CodeGen/MIRPrinter.cpp
  llvm/lib/CodeGen/MachineBasicBlock.cpp
  llvm/lib/CodeGen/MachineFrameInfo.cpp
  llvm/lib/CodeGen/MachineOperand.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  llvm/lib/ExecutionEngine/Orc/Speculation.cpp
  llvm/lib/IR/AutoUpgrade.cpp
  llvm/lib/IR/DataLayout.cpp
  llvm/lib/IR/IRBuilder.cpp
  llvm/lib/Target/AArch64/AArch64CompressJumpTables.cpp
  llvm/lib/Target/AMDGPU/AMDGPUFrameLowering.h
  llvm/lib/Target/AMDGPU/AMDGPUSubtarget.cpp
  llvm/lib/Target/AMDGPU/R600FrameLowering.h
  llvm/lib/Target/AMDGPU/SIFrameLowering.h
  llvm/lib/Target/ARM/ARMBasicBlockInfo.cpp
  llvm/lib/Target/ARM/ARMBasicBlockInfo.h
  llvm/lib/Target/ARM/ARMConstantIslandPass.cpp
  llvm/lib/Target/AVR/AVRFrameLowering.cpp
  llvm/lib/Target/Hexagon/HexagonBranchRelaxation.cpp
  llvm/lib/Target/Hexagon/HexagonFixupHwLoops.cpp
  llvm/lib/Target/Hexagon/HexagonFrameLowering.h
  llvm/lib/Target/Hexagon/HexagonTargetTransformInfo.cpp
  llvm/lib/Target/Mips/MipsCallLowering.cpp
  llvm/lib/Target/Mips/MipsConstantIslandPass.cpp
  llvm/lib/Target/PowerPC/PPCBranchSelector.cpp
  llvm/lib/Target/PowerPC/PPCISelLowering.cpp
  llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
  llvm/lib/Target/X86/X86ISelLowering.cpp
  llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
  llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
  llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp
  llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp
  llvm/lib/Transforms/Instrumentation/Instrumentation.cpp
  llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
  llvm/lib/Transforms/Utils/InlineFunction.cpp
  llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
  llvm/unittests/Support/AlignmentTest.cpp
  polly/lib/CodeGen/LoopGeneratorsKMP.cpp

Index: polly/lib/CodeGen/LoopGeneratorsKMP.cpp
===
--- polly/lib/CodeGen/LoopGeneratorsKMP.cpp
+++ polly/lib/CodeGen/LoopGeneratorsKMP.cpp
@@ -468,7 +468,7 @@
 // Global Variable Definitions
 GlobalVariable *StrVar = new GlobalVariable(
 *M, ArrayType, true, GlobalValue::PrivateLinkage, 0, ".str.ident");
-StrVar->setAlignment(llvm::Align::None());
+StrVar->setAlignment(llvm::Align(1));
 
 SourceLocDummy = new GlobalVariable(
 *M, IdentTy, true, GlobalValue::PrivateLinkage, nullptr, LocName);
Index: llvm/unittests/Support/AlignmentTest.cpp
===
--- llvm/unittests/Support/AlignmentTest.cpp
+++ llvm/unittests/Support/AlignmentTest.cpp
@@ -52,7 +52,6 @@
 
 TEST(AlignmentTest, AlignDefaultCTor) {
   EXPECT_EQ(Align().value(), 1ULL);
-  EXPECT_EQ(Align::None().value(), 1ULL);
 }
 
 TEST(AlignmentTest, MaybeAlignDefaultCTor) {
Index: llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
===
--- llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
+++ llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
@@ -177,8 +177,7 @@
   if (!isOnlyUsedInComparisonWithZero(CI))
 return false;
 
-  if (!isDereferenceableAndAlignedPointer(Str, Align::None(), APInt(64, Len),
-  DL))
+  if (!isDereferenceableAndAlignedPointer(Str, Align(1), APInt(64, Len), DL))
 return false;
 
   if (CI->getFunction()->hasFnAttribute(Attribute::SanitizeMemory))
@@ -289,7 +288,7 @@
   // We have enough information to now generate the memcpy call to do the
   // concatenation for us.  Make a memcpy to copy the nul byte with align = 1.
   B.CreateMemCpy(
-  CpyDst, Align::None(), Src, Align::None(),
+  CpyDst, Align(1), Src, Align(1),
   ConstantInt::get(DL.getIntPtrType(Src->getContext()), Len + 1));
   return Dst;
 }
@@ -562,7 +561,7 @@
   // We have enough information to now generate the memcpy call to do the
   // copy for us.  Make a memcpy to copy the nul byte with align = 1.
   CallInst *NewCI =
-  B.CreateMemCpy(Dst, Align::None(), Src, Align::None(),
+  B.CreateMemCpy(Dst, Align(1), Src, Align(1),
  ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len));
   NewCI->setAttributes(CI->getAttributes());
   return Dst;
@@ -590,8 +589,7 @@
 
   // We have enough information to now generate the memcpy call to do the
   // copy for us.  Make a memcpy to copy the nul byte with align = 1.
-  CallInst *NewCI =
-  

[PATCH] D73274: [Alignment][NFC] Use Align with CreateAlignedStore

2020-01-23 Thread Guillaume Chatelet via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rG59f95222d4c5: [Alignment][NFC] Use Align with 
CreateAlignedStore (authored by gchatelet).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73274

Files:
  clang/lib/CodeGen/CGBlocks.cpp
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/CodeGen/CGGPUBuiltin.cpp
  clang/lib/CodeGen/CGObjCGNU.cpp
  clang/lib/CodeGen/TargetInfo.cpp
  llvm/include/llvm/IR/DataLayout.h
  llvm/include/llvm/IR/GlobalObject.h
  llvm/include/llvm/IR/IRBuilder.h
  llvm/lib/CodeGen/CodeGenPrepare.cpp
  llvm/lib/CodeGen/ScalarizeMaskedMemIntrin.cpp
  llvm/lib/IR/AutoUpgrade.cpp
  llvm/lib/IR/DataLayout.cpp
  llvm/lib/Target/AMDGPU/AMDGPURewriteOutArguments.cpp
  llvm/lib/Target/X86/X86InterleavedAccess.cpp
  llvm/lib/Transforms/IPO/LowerTypeTests.cpp
  llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
  llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
  llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
  llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
  llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
  llvm/lib/Transforms/Scalar/SROA.cpp
  llvm/lib/Transforms/Scalar/Scalarizer.cpp
  llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
  llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
  polly/lib/CodeGen/BlockGenerators.cpp
  polly/lib/CodeGen/LoopGeneratorsKMP.cpp
  polly/lib/CodeGen/RuntimeDebugBuilder.cpp

Index: polly/lib/CodeGen/RuntimeDebugBuilder.cpp
===
--- polly/lib/CodeGen/RuntimeDebugBuilder.cpp
+++ polly/lib/CodeGen/RuntimeDebugBuilder.cpp
@@ -221,7 +221,7 @@
 
 Ty = Val->getType();
 Ptr = Builder.CreatePointerBitCastOrAddrSpaceCast(Ptr, Ty->getPointerTo(5));
-Builder.CreateAlignedStore(Val, Ptr, 4);
+Builder.CreateAlignedStore(Val, Ptr, Align(4));
 
 if (Ty->isFloatingPointTy())
   str += "%f";
Index: polly/lib/CodeGen/LoopGeneratorsKMP.cpp
===
--- polly/lib/CodeGen/LoopGeneratorsKMP.cpp
+++ polly/lib/CodeGen/LoopGeneratorsKMP.cpp
@@ -176,7 +176,7 @@
   extractValuesFromStruct(Data, StructData->getAllocatedType(), UserContext,
   Map);
 
-  const int Alignment = (is64BitArch()) ? 8 : 4;
+  const auto Alignment = llvm::Align(is64BitArch() ? 8 : 4);
   Value *ID =
   Builder.CreateAlignedLoad(IDPtr, Alignment, "polly.par.global_tid");
 
Index: polly/lib/CodeGen/BlockGenerators.cpp
===
--- polly/lib/CodeGen/BlockGenerators.cpp
+++ polly/lib/CodeGen/BlockGenerators.cpp
@@ -343,7 +343,7 @@
   RuntimeDebugBuilder::createCPUPrinter(Builder, "Store to  ", NewPointer,
 ": ", ValueOperand, "\n");
 
-Builder.CreateAlignedStore(ValueOperand, NewPointer, Store->getAlignment());
+Builder.CreateAlignedStore(ValueOperand, NewPointer, Store->getAlign());
   });
 }
 
Index: llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
===
--- llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -2346,8 +2346,8 @@
   IVec, AddrParts[Part], Group->getAlign(), ShuffledMask);
 }
 else
-  NewStoreInstr = Builder.CreateAlignedStore(IVec, AddrParts[Part],
- Group->getAlignment());
+  NewStoreInstr =
+  Builder.CreateAlignedStore(IVec, AddrParts[Part], Group->getAlign());
 
 Group->addMetadata(NewStoreInstr);
   }
@@ -2452,8 +2452,7 @@
   NewSI = Builder.CreateMaskedStore(StoredVal, VecPtr, Alignment,
 BlockInMaskParts[Part]);
 else
-  NewSI =
-  Builder.CreateAlignedStore(StoredVal, VecPtr, Alignment.value());
+  NewSI = Builder.CreateAlignedStore(StoredVal, VecPtr, Alignment);
   }
   addMetadata(NewSI, SI);
 }
Index: llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
===
--- llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
+++ llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
@@ -129,20 +129,19 @@
 private:
   unsigned getPointerAddressSpace(Value *I);
 
-  unsigned getAlignment(LoadInst *LI) const {
-unsigned Align = LI->getAlignment();
-if (Align != 0)
-  return Align;
+  /// TODO: Remove this function once transition to Align is over.
+  unsigned getAlignment(LoadInst *LI) const { return getAlign(LI).value(); }
 
-return DL.getABITypeAlignment(LI->getType());
+  Align getAlign(LoadInst *LI) const {
+return DL.getValueOrABITypeAlignment(LI->getAlign(), LI->getType());
   }
 
-  unsigned getAlignment(StoreInst *SI) const {
-

[PATCH] D73274: [Alignment][NFC] Use Align with CreateAlignedStore

2020-01-23 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 239906.
gchatelet marked 5 inline comments as done.
gchatelet added a comment.

- Address comments


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73274

Files:
  clang/lib/CodeGen/CGBlocks.cpp
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/CodeGen/CGGPUBuiltin.cpp
  clang/lib/CodeGen/CGObjCGNU.cpp
  clang/lib/CodeGen/TargetInfo.cpp
  llvm/include/llvm/IR/DataLayout.h
  llvm/include/llvm/IR/GlobalObject.h
  llvm/include/llvm/IR/IRBuilder.h
  llvm/lib/CodeGen/CodeGenPrepare.cpp
  llvm/lib/CodeGen/ScalarizeMaskedMemIntrin.cpp
  llvm/lib/IR/AutoUpgrade.cpp
  llvm/lib/IR/DataLayout.cpp
  llvm/lib/Target/AMDGPU/AMDGPURewriteOutArguments.cpp
  llvm/lib/Target/X86/X86InterleavedAccess.cpp
  llvm/lib/Transforms/IPO/LowerTypeTests.cpp
  llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
  llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
  llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
  llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
  llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
  llvm/lib/Transforms/Scalar/SROA.cpp
  llvm/lib/Transforms/Scalar/Scalarizer.cpp
  llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
  llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
  polly/lib/CodeGen/BlockGenerators.cpp
  polly/lib/CodeGen/LoopGeneratorsKMP.cpp
  polly/lib/CodeGen/RuntimeDebugBuilder.cpp

Index: polly/lib/CodeGen/RuntimeDebugBuilder.cpp
===
--- polly/lib/CodeGen/RuntimeDebugBuilder.cpp
+++ polly/lib/CodeGen/RuntimeDebugBuilder.cpp
@@ -221,7 +221,7 @@
 
 Ty = Val->getType();
 Ptr = Builder.CreatePointerBitCastOrAddrSpaceCast(Ptr, Ty->getPointerTo(5));
-Builder.CreateAlignedStore(Val, Ptr, 4);
+Builder.CreateAlignedStore(Val, Ptr, Align(4));
 
 if (Ty->isFloatingPointTy())
   str += "%f";
Index: polly/lib/CodeGen/LoopGeneratorsKMP.cpp
===
--- polly/lib/CodeGen/LoopGeneratorsKMP.cpp
+++ polly/lib/CodeGen/LoopGeneratorsKMP.cpp
@@ -176,7 +176,7 @@
   extractValuesFromStruct(Data, StructData->getAllocatedType(), UserContext,
   Map);
 
-  const int Alignment = (is64BitArch()) ? 8 : 4;
+  const auto Alignment = llvm::Align(is64BitArch() ? 8 : 4);
   Value *ID =
   Builder.CreateAlignedLoad(IDPtr, Alignment, "polly.par.global_tid");
 
Index: polly/lib/CodeGen/BlockGenerators.cpp
===
--- polly/lib/CodeGen/BlockGenerators.cpp
+++ polly/lib/CodeGen/BlockGenerators.cpp
@@ -343,7 +343,7 @@
   RuntimeDebugBuilder::createCPUPrinter(Builder, "Store to  ", NewPointer,
 ": ", ValueOperand, "\n");
 
-Builder.CreateAlignedStore(ValueOperand, NewPointer, Store->getAlignment());
+Builder.CreateAlignedStore(ValueOperand, NewPointer, Store->getAlign());
   });
 }
 
Index: llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
===
--- llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -2346,8 +2346,8 @@
   IVec, AddrParts[Part], Group->getAlign(), ShuffledMask);
 }
 else
-  NewStoreInstr = Builder.CreateAlignedStore(IVec, AddrParts[Part],
- Group->getAlignment());
+  NewStoreInstr =
+  Builder.CreateAlignedStore(IVec, AddrParts[Part], Group->getAlign());
 
 Group->addMetadata(NewStoreInstr);
   }
@@ -2452,8 +2452,7 @@
   NewSI = Builder.CreateMaskedStore(StoredVal, VecPtr, Alignment,
 BlockInMaskParts[Part]);
 else
-  NewSI =
-  Builder.CreateAlignedStore(StoredVal, VecPtr, Alignment.value());
+  NewSI = Builder.CreateAlignedStore(StoredVal, VecPtr, Alignment);
   }
   addMetadata(NewSI, SI);
 }
Index: llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
===
--- llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
+++ llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
@@ -129,20 +129,19 @@
 private:
   unsigned getPointerAddressSpace(Value *I);
 
-  unsigned getAlignment(LoadInst *LI) const {
-unsigned Align = LI->getAlignment();
-if (Align != 0)
-  return Align;
+  /// TODO: Remove this function once transition to Align is over.
+  unsigned getAlignment(LoadInst *LI) const { return getAlign(LI).value(); }
 
-return DL.getABITypeAlignment(LI->getType());
+  Align getAlign(LoadInst *LI) const {
+return DL.getValueOrABITypeAlignment(LI->getAlign(), LI->getType());
   }
 
-  unsigned getAlignment(StoreInst *SI) const {
-unsigned Align = SI->getAlignment();
-if 

[PATCH] D73274: [Alignment][NFC] Use Align with CreateAlignedStore

2020-01-23 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 239903.
gchatelet added a comment.

- Improving DataLayout


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73274

Files:
  clang/lib/CodeGen/CGBlocks.cpp
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/CodeGen/CGGPUBuiltin.cpp
  clang/lib/CodeGen/CGObjCGNU.cpp
  clang/lib/CodeGen/TargetInfo.cpp
  llvm/include/llvm/IR/DataLayout.h
  llvm/include/llvm/IR/GlobalObject.h
  llvm/include/llvm/IR/IRBuilder.h
  llvm/lib/CodeGen/CodeGenPrepare.cpp
  llvm/lib/CodeGen/ScalarizeMaskedMemIntrin.cpp
  llvm/lib/IR/AutoUpgrade.cpp
  llvm/lib/IR/DataLayout.cpp
  llvm/lib/Target/AMDGPU/AMDGPURewriteOutArguments.cpp
  llvm/lib/Target/X86/X86InterleavedAccess.cpp
  llvm/lib/Transforms/IPO/LowerTypeTests.cpp
  llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
  llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
  llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
  llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
  llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
  llvm/lib/Transforms/Scalar/SROA.cpp
  llvm/lib/Transforms/Scalar/Scalarizer.cpp
  llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
  llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
  polly/lib/CodeGen/BlockGenerators.cpp
  polly/lib/CodeGen/LoopGeneratorsKMP.cpp
  polly/lib/CodeGen/RuntimeDebugBuilder.cpp

Index: polly/lib/CodeGen/RuntimeDebugBuilder.cpp
===
--- polly/lib/CodeGen/RuntimeDebugBuilder.cpp
+++ polly/lib/CodeGen/RuntimeDebugBuilder.cpp
@@ -221,7 +221,7 @@
 
 Ty = Val->getType();
 Ptr = Builder.CreatePointerBitCastOrAddrSpaceCast(Ptr, Ty->getPointerTo(5));
-Builder.CreateAlignedStore(Val, Ptr, 4);
+Builder.CreateAlignedStore(Val, Ptr, Align(4));
 
 if (Ty->isFloatingPointTy())
   str += "%f";
Index: polly/lib/CodeGen/LoopGeneratorsKMP.cpp
===
--- polly/lib/CodeGen/LoopGeneratorsKMP.cpp
+++ polly/lib/CodeGen/LoopGeneratorsKMP.cpp
@@ -176,7 +176,7 @@
   extractValuesFromStruct(Data, StructData->getAllocatedType(), UserContext,
   Map);
 
-  const int Alignment = (is64BitArch()) ? 8 : 4;
+  const auto Alignment = llvm::Align(is64BitArch() ? 8 : 4);
   Value *ID =
   Builder.CreateAlignedLoad(IDPtr, Alignment, "polly.par.global_tid");
 
Index: polly/lib/CodeGen/BlockGenerators.cpp
===
--- polly/lib/CodeGen/BlockGenerators.cpp
+++ polly/lib/CodeGen/BlockGenerators.cpp
@@ -343,7 +343,7 @@
   RuntimeDebugBuilder::createCPUPrinter(Builder, "Store to  ", NewPointer,
 ": ", ValueOperand, "\n");
 
-Builder.CreateAlignedStore(ValueOperand, NewPointer, Store->getAlignment());
+Builder.CreateAlignedStore(ValueOperand, NewPointer, Store->getAlign());
   });
 }
 
Index: llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
===
--- llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -2346,8 +2346,8 @@
   IVec, AddrParts[Part], Group->getAlign(), ShuffledMask);
 }
 else
-  NewStoreInstr = Builder.CreateAlignedStore(IVec, AddrParts[Part],
- Group->getAlignment());
+  NewStoreInstr =
+  Builder.CreateAlignedStore(IVec, AddrParts[Part], Group->getAlign());
 
 Group->addMetadata(NewStoreInstr);
   }
@@ -2452,8 +2452,7 @@
   NewSI = Builder.CreateMaskedStore(StoredVal, VecPtr, Alignment,
 BlockInMaskParts[Part]);
 else
-  NewSI =
-  Builder.CreateAlignedStore(StoredVal, VecPtr, Alignment.value());
+  NewSI = Builder.CreateAlignedStore(StoredVal, VecPtr, Alignment);
   }
   addMetadata(NewSI, SI);
 }
Index: llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
===
--- llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
+++ llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
@@ -129,20 +129,19 @@
 private:
   unsigned getPointerAddressSpace(Value *I);
 
-  unsigned getAlignment(LoadInst *LI) const {
-unsigned Align = LI->getAlignment();
-if (Align != 0)
-  return Align;
+  /// TODO: Remove this function once transition to Align is over.
+  unsigned getAlignment(LoadInst *LI) const { return getAlign(LI).value(); }
 
-return DL.getABITypeAlignment(LI->getType());
+  Align getAlign(LoadInst *LI) const {
+return DL.getValueOrABITypeAlignment(LI->getAlign(), LI->getType());
   }
 
-  unsigned getAlignment(StoreInst *SI) const {
-unsigned Align = SI->getAlignment();
-if (Align != 0)
-  return Align;
+  /// 

[PATCH] D73274: [Alignment][NFC] Use Align with CreateAlignedStore

2020-01-23 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet created this revision.
gchatelet added a reviewer: courbet.
Herald added subscribers: llvm-commits, cfe-commits, kerbowa, hiraditya, 
nhaehnle, jvesely, arsenm.
Herald added a reviewer: bollu.
Herald added projects: clang, LLVM.

This is patch is part of a series to introduce an Alignment type.
See this thread for context: 
http://lists.llvm.org/pipermail/llvm-dev/2019-July/133851.html
See this patch for the introduction of the type: https://reviews.llvm.org/D64790


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D73274

Files:
  clang/lib/CodeGen/CGBlocks.cpp
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/CodeGen/CGGPUBuiltin.cpp
  clang/lib/CodeGen/CGObjCGNU.cpp
  clang/lib/CodeGen/TargetInfo.cpp
  llvm/include/llvm/IR/DataLayout.h
  llvm/include/llvm/IR/GlobalObject.h
  llvm/include/llvm/IR/IRBuilder.h
  llvm/lib/CodeGen/CodeGenPrepare.cpp
  llvm/lib/CodeGen/ScalarizeMaskedMemIntrin.cpp
  llvm/lib/IR/AutoUpgrade.cpp
  llvm/lib/IR/DataLayout.cpp
  llvm/lib/Target/AMDGPU/AMDGPURewriteOutArguments.cpp
  llvm/lib/Target/X86/X86InterleavedAccess.cpp
  llvm/lib/Transforms/IPO/LowerTypeTests.cpp
  llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
  llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
  llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
  llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
  llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
  llvm/lib/Transforms/Scalar/SROA.cpp
  llvm/lib/Transforms/Scalar/Scalarizer.cpp
  llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
  llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
  polly/lib/CodeGen/BlockGenerators.cpp
  polly/lib/CodeGen/LoopGeneratorsKMP.cpp
  polly/lib/CodeGen/RuntimeDebugBuilder.cpp

Index: polly/lib/CodeGen/RuntimeDebugBuilder.cpp
===
--- polly/lib/CodeGen/RuntimeDebugBuilder.cpp
+++ polly/lib/CodeGen/RuntimeDebugBuilder.cpp
@@ -221,7 +221,7 @@
 
 Ty = Val->getType();
 Ptr = Builder.CreatePointerBitCastOrAddrSpaceCast(Ptr, Ty->getPointerTo(5));
-Builder.CreateAlignedStore(Val, Ptr, 4);
+Builder.CreateAlignedStore(Val, Ptr, Align(4));
 
 if (Ty->isFloatingPointTy())
   str += "%f";
Index: polly/lib/CodeGen/LoopGeneratorsKMP.cpp
===
--- polly/lib/CodeGen/LoopGeneratorsKMP.cpp
+++ polly/lib/CodeGen/LoopGeneratorsKMP.cpp
@@ -176,7 +176,7 @@
   extractValuesFromStruct(Data, StructData->getAllocatedType(), UserContext,
   Map);
 
-  const int Alignment = (is64BitArch()) ? 8 : 4;
+  const auto Alignment = llvm::Align(is64BitArch() ? 8 : 4);
   Value *ID =
   Builder.CreateAlignedLoad(IDPtr, Alignment, "polly.par.global_tid");
 
Index: polly/lib/CodeGen/BlockGenerators.cpp
===
--- polly/lib/CodeGen/BlockGenerators.cpp
+++ polly/lib/CodeGen/BlockGenerators.cpp
@@ -343,7 +343,7 @@
   RuntimeDebugBuilder::createCPUPrinter(Builder, "Store to  ", NewPointer,
 ": ", ValueOperand, "\n");
 
-Builder.CreateAlignedStore(ValueOperand, NewPointer, Store->getAlignment());
+Builder.CreateAlignedStore(ValueOperand, NewPointer, Store->getAlign());
   });
 }
 
Index: llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
===
--- llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -2346,8 +2346,8 @@
   IVec, AddrParts[Part], Group->getAlign(), ShuffledMask);
 }
 else
-  NewStoreInstr = Builder.CreateAlignedStore(IVec, AddrParts[Part],
- Group->getAlignment());
+  NewStoreInstr =
+  Builder.CreateAlignedStore(IVec, AddrParts[Part], Group->getAlign());
 
 Group->addMetadata(NewStoreInstr);
   }
@@ -2452,8 +2452,7 @@
   NewSI = Builder.CreateMaskedStore(StoredVal, VecPtr, Alignment,
 BlockInMaskParts[Part]);
 else
-  NewSI =
-  Builder.CreateAlignedStore(StoredVal, VecPtr, Alignment.value());
+  NewSI = Builder.CreateAlignedStore(StoredVal, VecPtr, Alignment);
   }
   addMetadata(NewSI, SI);
 }
Index: llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
===
--- llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
+++ llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
@@ -129,20 +129,18 @@
 private:
   unsigned getPointerAddressSpace(Value *I);
 
-  unsigned getAlignment(LoadInst *LI) const {
-unsigned Align = LI->getAlignment();
-if (Align != 0)
-  return Align;
+  /// TODO: Remove this function once transition to Align is over.
+  unsigned getAlignment(LoadInst *LI) const { return getAlign(LI).value(); }
 

[PATCH] D73099: [Alignment][NFC] Deprecate Align::None()

2020-01-23 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 239801.
gchatelet added a comment.

- Rebasing


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73099

Files:
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/CodeGen/CGObjCMac.cpp
  llvm/include/llvm/CodeGen/AsmPrinter.h
  llvm/include/llvm/CodeGen/TargetFrameLowering.h
  llvm/include/llvm/CodeGen/TargetLowering.h
  llvm/include/llvm/Support/Alignment.h
  llvm/lib/Analysis/Loads.cpp
  llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
  llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
  llvm/lib/CodeGen/MIRPrinter.cpp
  llvm/lib/CodeGen/MachineBasicBlock.cpp
  llvm/lib/CodeGen/MachineFrameInfo.cpp
  llvm/lib/CodeGen/MachineOperand.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  llvm/lib/ExecutionEngine/Orc/Speculation.cpp
  llvm/lib/IR/AutoUpgrade.cpp
  llvm/lib/IR/DataLayout.cpp
  llvm/lib/IR/IRBuilder.cpp
  llvm/lib/Target/AArch64/AArch64CompressJumpTables.cpp
  llvm/lib/Target/AMDGPU/AMDGPUFrameLowering.h
  llvm/lib/Target/AMDGPU/AMDGPUSubtarget.cpp
  llvm/lib/Target/AMDGPU/R600FrameLowering.h
  llvm/lib/Target/AMDGPU/SIFrameLowering.h
  llvm/lib/Target/ARM/ARMBasicBlockInfo.cpp
  llvm/lib/Target/ARM/ARMBasicBlockInfo.h
  llvm/lib/Target/ARM/ARMConstantIslandPass.cpp
  llvm/lib/Target/AVR/AVRFrameLowering.cpp
  llvm/lib/Target/Hexagon/HexagonBranchRelaxation.cpp
  llvm/lib/Target/Hexagon/HexagonFixupHwLoops.cpp
  llvm/lib/Target/Hexagon/HexagonFrameLowering.h
  llvm/lib/Target/Hexagon/HexagonTargetTransformInfo.cpp
  llvm/lib/Target/Mips/MipsCallLowering.cpp
  llvm/lib/Target/Mips/MipsConstantIslandPass.cpp
  llvm/lib/Target/PowerPC/PPCBranchSelector.cpp
  llvm/lib/Target/PowerPC/PPCISelLowering.cpp
  llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
  llvm/lib/Target/X86/X86ISelLowering.cpp
  llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
  llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
  llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp
  llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp
  llvm/lib/Transforms/Instrumentation/Instrumentation.cpp
  llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
  llvm/lib/Transforms/Utils/InlineFunction.cpp
  llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
  llvm/unittests/Support/AlignmentTest.cpp
  polly/lib/CodeGen/LoopGeneratorsKMP.cpp

Index: polly/lib/CodeGen/LoopGeneratorsKMP.cpp
===
--- polly/lib/CodeGen/LoopGeneratorsKMP.cpp
+++ polly/lib/CodeGen/LoopGeneratorsKMP.cpp
@@ -468,7 +468,7 @@
 // Global Variable Definitions
 GlobalVariable *StrVar = new GlobalVariable(
 *M, ArrayType, true, GlobalValue::PrivateLinkage, 0, ".str.ident");
-StrVar->setAlignment(llvm::Align::None());
+StrVar->setAlignment(llvm::Align(1));
 
 SourceLocDummy = new GlobalVariable(
 *M, IdentTy, true, GlobalValue::PrivateLinkage, nullptr, LocName);
Index: llvm/unittests/Support/AlignmentTest.cpp
===
--- llvm/unittests/Support/AlignmentTest.cpp
+++ llvm/unittests/Support/AlignmentTest.cpp
@@ -52,7 +52,6 @@
 
 TEST(AlignmentTest, AlignDefaultCTor) {
   EXPECT_EQ(Align().value(), 1ULL);
-  EXPECT_EQ(Align::None().value(), 1ULL);
 }
 
 TEST(AlignmentTest, MaybeAlignDefaultCTor) {
Index: llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
===
--- llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
+++ llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
@@ -177,8 +177,7 @@
   if (!isOnlyUsedInComparisonWithZero(CI))
 return false;
 
-  if (!isDereferenceableAndAlignedPointer(Str, Align::None(), APInt(64, Len),
-  DL))
+  if (!isDereferenceableAndAlignedPointer(Str, Align(1), APInt(64, Len), DL))
 return false;
 
   if (CI->getFunction()->hasFnAttribute(Attribute::SanitizeMemory))
@@ -289,7 +288,7 @@
   // We have enough information to now generate the memcpy call to do the
   // concatenation for us.  Make a memcpy to copy the nul byte with align = 1.
   B.CreateMemCpy(
-  CpyDst, Align::None(), Src, Align::None(),
+  CpyDst, Align(1), Src, Align(1),
   ConstantInt::get(DL.getIntPtrType(Src->getContext()), Len + 1));
   return Dst;
 }
@@ -562,7 +561,7 @@
   // We have enough information to now generate the memcpy call to do the
   // copy for us.  Make a memcpy to copy the nul byte with align = 1.
   CallInst *NewCI =
-  B.CreateMemCpy(Dst, Align::None(), Src, Align::None(),
+  B.CreateMemCpy(Dst, Align(1), Src, Align(1),
  ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len));
   NewCI->setAttributes(CI->getAttributes());
   return Dst;
@@ -590,8 +589,7 @@
 
   // We have enough information to now generate the memcpy call to do the
   // copy for us.  Make a memcpy to copy the nul byte with align = 1.
-  CallInst *NewCI =
-  

[PATCH] D73106: [Alignment][NFC] Use Align with CreateMaskedStore

2020-01-22 Thread Guillaume Chatelet via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rG0957233320eb: [Alignment][NFC] Use Align with 
CreateMaskedStore (authored by gchatelet).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73106

Files:
  clang/lib/CodeGen/CGBuiltin.cpp
  llvm/include/llvm/IR/Constants.h
  llvm/include/llvm/IR/IRBuilder.h
  llvm/lib/CodeGen/ScalarizeMaskedMemIntrin.cpp
  llvm/lib/IR/AutoUpgrade.cpp
  llvm/lib/IR/IRBuilder.cpp
  llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
  llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
  llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Index: llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
===
--- llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -2343,7 +2343,7 @@
   Value *ShuffledMask = Builder.CreateShuffleVector(
   BlockInMaskPart, Undefs, RepMask, "interleaved.mask");
   NewStoreInstr = Builder.CreateMaskedStore(
-  IVec, AddrParts[Part], Group->getAlignment(), ShuffledMask);
+  IVec, AddrParts[Part], Group->getAlign(), ShuffledMask);
 }
 else
   NewStoreInstr = Builder.CreateAlignedStore(IVec, AddrParts[Part],
@@ -2449,8 +2449,8 @@
 }
 auto *VecPtr = CreateVecPtr(Part, State.get(Addr, {0, 0}));
 if (isMaskRequired)
-  NewSI = Builder.CreateMaskedStore(
-  StoredVal, VecPtr, Alignment.value(), BlockInMaskParts[Part]);
+  NewSI = Builder.CreateMaskedStore(StoredVal, VecPtr, Alignment,
+BlockInMaskParts[Part]);
 else
   NewSI =
   Builder.CreateAlignedStore(StoredVal, VecPtr, Alignment.value());
Index: llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
===
--- llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
+++ llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
@@ -2904,7 +2904,7 @@
 IRBuilder<> IRB();
 Value *V = I.getArgOperand(0);
 Value *Addr = I.getArgOperand(1);
-const MaybeAlign Alignment(
+const Align Alignment(
 cast(I.getArgOperand(2))->getZExtValue());
 Value *Mask = I.getArgOperand(3);
 Value *Shadow = getShadow(V);
@@ -2921,21 +2921,20 @@
   insertShadowCheck(Mask, );
 }
 
-IRB.CreateMaskedStore(Shadow, ShadowPtr, Alignment ? Alignment->value() : 0,
-  Mask);
+IRB.CreateMaskedStore(Shadow, ShadowPtr, Alignment, Mask);
 
 if (MS.TrackOrigins) {
   auto  = F.getParent()->getDataLayout();
   paintOrigin(IRB, getOrigin(V), OriginPtr,
   DL.getTypeStoreSize(Shadow->getType()),
-  llvm::max(Alignment, kMinOriginAlignment));
+  std::max(Alignment, kMinOriginAlignment));
 }
   }
 
   bool handleMaskedLoad(IntrinsicInst ) {
 IRBuilder<> IRB();
 Value *Addr = I.getArgOperand(0);
-const MaybeAlign Alignment(
+const Align Alignment(
 cast(I.getArgOperand(1))->getZExtValue());
 Value *Mask = I.getArgOperand(2);
 Value *PassThru = I.getArgOperand(3);
@@ -2945,7 +2944,7 @@
 if (PropagateShadow) {
   std::tie(ShadowPtr, OriginPtr) =
   getShadowOriginPtr(Addr, IRB, ShadowTy, Alignment, /*isStore*/ false);
-  setShadow(, IRB.CreateMaskedLoad(ShadowPtr, *Alignment, Mask,
+  setShadow(, IRB.CreateMaskedLoad(ShadowPtr, Alignment, Mask,
  getShadow(PassThru), "_msmaskedld"));
 } else {
   setShadow(, getCleanShadow());
Index: llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
===
--- llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -1372,7 +1372,7 @@
   // on each element's most significant bit (the sign bit).
   Constant *BoolMask = getNegativeIsTrueBoolVec(ConstMask);
 
-  IC.Builder.CreateMaskedStore(Vec, PtrCast, 1, BoolMask);
+  IC.Builder.CreateMaskedStore(Vec, PtrCast, Align::None(), BoolMask);
 
   // 'Replace uses' doesn't work for stores. Erase the original masked store.
   IC.eraseInstFromFunction(II);
Index: llvm/lib/IR/IRBuilder.cpp
===
--- llvm/lib/IR/IRBuilder.cpp
+++ llvm/lib/IR/IRBuilder.cpp
@@ -487,19 +487,19 @@
 }
 
 /// Create a call to a Masked Store intrinsic.
-/// \p Val   - data to be stored,
-/// \p Ptr   - base pointer for the store
-/// \p Align - alignment of the destination location
-/// \p Mask  - vector of booleans which indicates what vector lanes should
-///be accessed in memory
+/// \p Val   - data to be stored,
+/// \p Ptr   - base pointer for the store
+/// \p Alignment - alignment of the destination 

[PATCH] D73106: [Alignment][NFC] Use Align with CreateMaskedStore

2020-01-22 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet marked an inline comment as done.
gchatelet added inline comments.



Comment at: llvm/docs/LangRef.rst:14945
 
-The first operand is the base pointer for the load. The second operand is the 
alignment of the source location. It must be a constant integer value. The 
third operand, mask, is a vector of boolean values with the same number of 
elements as the return type. The fourth is a pass-through value that is used to 
fill the masked-off lanes of the result. The return type, underlying type of 
the base pointer and the type of the '``passthru``' operand are the same vector 
types.
-
+The first operand is the base pointer for the load. The second operand is the 
alignment of the source location. It must be a power of two constant integer 
value. The third operand, mask, is a vector of boolean values with the same 
number of elements as the return type. The fourth is a pass-through value that 
is used to fill the masked-off lanes of the result. The return type, underlying 
type of the base pointer and the type of the '``passthru``' operand are the 
same vector types.
 

courbet wrote:
> Let's commit this as a base change, as this is just documenting what the 
> verifier is already checking.
Done as rG1d549e68d4ac58e5fcdc1c9c6d2d09334fab4fbf


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73106



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


[PATCH] D73106: [Alignment][NFC] Use Align with CreateMaskedStore

2020-01-22 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 239513.
gchatelet marked an inline comment as done.
gchatelet added a comment.

- Reverting LangRef


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73106

Files:
  clang/lib/CodeGen/CGBuiltin.cpp
  llvm/include/llvm/IR/Constants.h
  llvm/include/llvm/IR/IRBuilder.h
  llvm/lib/CodeGen/ScalarizeMaskedMemIntrin.cpp
  llvm/lib/IR/AutoUpgrade.cpp
  llvm/lib/IR/IRBuilder.cpp
  llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
  llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
  llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Index: llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
===
--- llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -2343,7 +2343,7 @@
   Value *ShuffledMask = Builder.CreateShuffleVector(
   BlockInMaskPart, Undefs, RepMask, "interleaved.mask");
   NewStoreInstr = Builder.CreateMaskedStore(
-  IVec, AddrParts[Part], Group->getAlignment(), ShuffledMask);
+  IVec, AddrParts[Part], Group->getAlign(), ShuffledMask);
 }
 else
   NewStoreInstr = Builder.CreateAlignedStore(IVec, AddrParts[Part],
@@ -2449,8 +2449,8 @@
 }
 auto *VecPtr = CreateVecPtr(Part, State.get(Addr, {0, 0}));
 if (isMaskRequired)
-  NewSI = Builder.CreateMaskedStore(
-  StoredVal, VecPtr, Alignment.value(), BlockInMaskParts[Part]);
+  NewSI = Builder.CreateMaskedStore(StoredVal, VecPtr, Alignment,
+BlockInMaskParts[Part]);
 else
   NewSI =
   Builder.CreateAlignedStore(StoredVal, VecPtr, Alignment.value());
Index: llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
===
--- llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
+++ llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
@@ -2904,7 +2904,7 @@
 IRBuilder<> IRB();
 Value *V = I.getArgOperand(0);
 Value *Addr = I.getArgOperand(1);
-const MaybeAlign Alignment(
+const Align Alignment(
 cast(I.getArgOperand(2))->getZExtValue());
 Value *Mask = I.getArgOperand(3);
 Value *Shadow = getShadow(V);
@@ -2921,21 +2921,20 @@
   insertShadowCheck(Mask, );
 }
 
-IRB.CreateMaskedStore(Shadow, ShadowPtr, Alignment ? Alignment->value() : 0,
-  Mask);
+IRB.CreateMaskedStore(Shadow, ShadowPtr, Alignment, Mask);
 
 if (MS.TrackOrigins) {
   auto  = F.getParent()->getDataLayout();
   paintOrigin(IRB, getOrigin(V), OriginPtr,
   DL.getTypeStoreSize(Shadow->getType()),
-  llvm::max(Alignment, kMinOriginAlignment));
+  std::max(Alignment, kMinOriginAlignment));
 }
   }
 
   bool handleMaskedLoad(IntrinsicInst ) {
 IRBuilder<> IRB();
 Value *Addr = I.getArgOperand(0);
-const MaybeAlign Alignment(
+const Align Alignment(
 cast(I.getArgOperand(1))->getZExtValue());
 Value *Mask = I.getArgOperand(2);
 Value *PassThru = I.getArgOperand(3);
@@ -2945,7 +2944,7 @@
 if (PropagateShadow) {
   std::tie(ShadowPtr, OriginPtr) =
   getShadowOriginPtr(Addr, IRB, ShadowTy, Alignment, /*isStore*/ false);
-  setShadow(, IRB.CreateMaskedLoad(ShadowPtr, *Alignment, Mask,
+  setShadow(, IRB.CreateMaskedLoad(ShadowPtr, Alignment, Mask,
  getShadow(PassThru), "_msmaskedld"));
 } else {
   setShadow(, getCleanShadow());
Index: llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
===
--- llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -1372,7 +1372,7 @@
   // on each element's most significant bit (the sign bit).
   Constant *BoolMask = getNegativeIsTrueBoolVec(ConstMask);
 
-  IC.Builder.CreateMaskedStore(Vec, PtrCast, 1, BoolMask);
+  IC.Builder.CreateMaskedStore(Vec, PtrCast, Align::None(), BoolMask);
 
   // 'Replace uses' doesn't work for stores. Erase the original masked store.
   IC.eraseInstFromFunction(II);
Index: llvm/lib/IR/IRBuilder.cpp
===
--- llvm/lib/IR/IRBuilder.cpp
+++ llvm/lib/IR/IRBuilder.cpp
@@ -487,19 +487,19 @@
 }
 
 /// Create a call to a Masked Store intrinsic.
-/// \p Val   - data to be stored,
-/// \p Ptr   - base pointer for the store
-/// \p Align - alignment of the destination location
-/// \p Mask  - vector of booleans which indicates what vector lanes should
-///be accessed in memory
+/// \p Val   - data to be stored,
+/// \p Ptr   - base pointer for the store
+/// \p Alignment - alignment of the destination location
+/// \p Mask  - vector of booleans 

[PATCH] D73106: [Alignment][NFC] Use Align with CreateMaskedStore

2020-01-22 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet marked 2 inline comments as done.
gchatelet added inline comments.



Comment at: llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp:2907
 Value *Addr = I.getArgOperand(1);
-const MaybeAlign Alignment(
+const Align Alignment(
 cast(I.getArgOperand(2))->getZExtValue());

courbet wrote:
> I think it's actually OK for this one to be a `MaybeAlign`, e.g. in 
> `ARMTTIImpl::isLegalMaskedLoad`.
As discussed offline 
[Verifier.cpp](https://github.com/llvm-mirror/llvm/blob/2c4ca6832fa6b306ee6a7010bfb80a3f2596f824/lib/IR/Verifier.cpp#L4613)
 requires the alignment to be set for both `masked_load` and `masked_store` 
intrinsics. I've updated the documentation.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73106



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


[PATCH] D73106: [Alignment][NFC] Use Align with CreateMaskedStore

2020-01-22 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 239501.
gchatelet marked an inline comment as done.
gchatelet added a comment.

- Address comments


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73106

Files:
  clang/lib/CodeGen/CGBuiltin.cpp
  llvm/docs/LangRef.rst
  llvm/include/llvm/IR/Constants.h
  llvm/include/llvm/IR/IRBuilder.h
  llvm/lib/CodeGen/ScalarizeMaskedMemIntrin.cpp
  llvm/lib/IR/AutoUpgrade.cpp
  llvm/lib/IR/IRBuilder.cpp
  llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
  llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
  llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Index: llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
===
--- llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -2343,7 +2343,7 @@
   Value *ShuffledMask = Builder.CreateShuffleVector(
   BlockInMaskPart, Undefs, RepMask, "interleaved.mask");
   NewStoreInstr = Builder.CreateMaskedStore(
-  IVec, AddrParts[Part], Group->getAlignment(), ShuffledMask);
+  IVec, AddrParts[Part], Group->getAlign(), ShuffledMask);
 }
 else
   NewStoreInstr = Builder.CreateAlignedStore(IVec, AddrParts[Part],
@@ -2449,8 +2449,8 @@
 }
 auto *VecPtr = CreateVecPtr(Part, State.get(Addr, {0, 0}));
 if (isMaskRequired)
-  NewSI = Builder.CreateMaskedStore(
-  StoredVal, VecPtr, Alignment.value(), BlockInMaskParts[Part]);
+  NewSI = Builder.CreateMaskedStore(StoredVal, VecPtr, Alignment,
+BlockInMaskParts[Part]);
 else
   NewSI =
   Builder.CreateAlignedStore(StoredVal, VecPtr, Alignment.value());
Index: llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
===
--- llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
+++ llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
@@ -2904,7 +2904,7 @@
 IRBuilder<> IRB();
 Value *V = I.getArgOperand(0);
 Value *Addr = I.getArgOperand(1);
-const MaybeAlign Alignment(
+const Align Alignment(
 cast(I.getArgOperand(2))->getZExtValue());
 Value *Mask = I.getArgOperand(3);
 Value *Shadow = getShadow(V);
@@ -2921,21 +2921,20 @@
   insertShadowCheck(Mask, );
 }
 
-IRB.CreateMaskedStore(Shadow, ShadowPtr, Alignment ? Alignment->value() : 0,
-  Mask);
+IRB.CreateMaskedStore(Shadow, ShadowPtr, Alignment, Mask);
 
 if (MS.TrackOrigins) {
   auto  = F.getParent()->getDataLayout();
   paintOrigin(IRB, getOrigin(V), OriginPtr,
   DL.getTypeStoreSize(Shadow->getType()),
-  llvm::max(Alignment, kMinOriginAlignment));
+  std::max(Alignment, kMinOriginAlignment));
 }
   }
 
   bool handleMaskedLoad(IntrinsicInst ) {
 IRBuilder<> IRB();
 Value *Addr = I.getArgOperand(0);
-const MaybeAlign Alignment(
+const Align Alignment(
 cast(I.getArgOperand(1))->getZExtValue());
 Value *Mask = I.getArgOperand(2);
 Value *PassThru = I.getArgOperand(3);
@@ -2945,7 +2944,7 @@
 if (PropagateShadow) {
   std::tie(ShadowPtr, OriginPtr) =
   getShadowOriginPtr(Addr, IRB, ShadowTy, Alignment, /*isStore*/ false);
-  setShadow(, IRB.CreateMaskedLoad(ShadowPtr, *Alignment, Mask,
+  setShadow(, IRB.CreateMaskedLoad(ShadowPtr, Alignment, Mask,
  getShadow(PassThru), "_msmaskedld"));
 } else {
   setShadow(, getCleanShadow());
Index: llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
===
--- llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -1372,7 +1372,7 @@
   // on each element's most significant bit (the sign bit).
   Constant *BoolMask = getNegativeIsTrueBoolVec(ConstMask);
 
-  IC.Builder.CreateMaskedStore(Vec, PtrCast, 1, BoolMask);
+  IC.Builder.CreateMaskedStore(Vec, PtrCast, Align::None(), BoolMask);
 
   // 'Replace uses' doesn't work for stores. Erase the original masked store.
   IC.eraseInstFromFunction(II);
Index: llvm/lib/IR/IRBuilder.cpp
===
--- llvm/lib/IR/IRBuilder.cpp
+++ llvm/lib/IR/IRBuilder.cpp
@@ -487,19 +487,19 @@
 }
 
 /// Create a call to a Masked Store intrinsic.
-/// \p Val   - data to be stored,
-/// \p Ptr   - base pointer for the store
-/// \p Align - alignment of the destination location
-/// \p Mask  - vector of booleans which indicates what vector lanes should
-///be accessed in memory
+/// \p Val   - data to be stored,
+/// \p Ptr   - base pointer for the store
+/// \p Alignment - alignment of the destination location
+/// \p Mask

[PATCH] D72998: [IR] Attribute/AttrBuilder: use Value::MaximumAlignment magic constant

2020-01-22 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet added a comment.

LGTM


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D72998



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


[PATCH] D73106: [Alignment][NFC] Use Align with CreateMaskedStore

2020-01-21 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet created this revision.
gchatelet added a reviewer: courbet.
Herald added subscribers: llvm-commits, cfe-commits, hiraditya.
Herald added projects: clang, LLVM.

This is patch is part of a series to introduce an Alignment type.
See this thread for context: 
http://lists.llvm.org/pipermail/llvm-dev/2019-July/133851.html
See this patch for the introduction of the type: https://reviews.llvm.org/D64790


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D73106

Files:
  clang/lib/CodeGen/CGBuiltin.cpp
  llvm/include/llvm/IR/IRBuilder.h
  llvm/lib/IR/AutoUpgrade.cpp
  llvm/lib/IR/IRBuilder.cpp
  llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
  llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
  llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Index: llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
===
--- llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -2343,7 +2343,7 @@
   Value *ShuffledMask = Builder.CreateShuffleVector(
   BlockInMaskPart, Undefs, RepMask, "interleaved.mask");
   NewStoreInstr = Builder.CreateMaskedStore(
-  IVec, AddrParts[Part], Group->getAlignment(), ShuffledMask);
+  IVec, AddrParts[Part], Group->getAlign(), ShuffledMask);
 }
 else
   NewStoreInstr = Builder.CreateAlignedStore(IVec, AddrParts[Part],
@@ -2449,8 +2449,8 @@
 }
 auto *VecPtr = CreateVecPtr(Part, State.get(Addr, {0, 0}));
 if (isMaskRequired)
-  NewSI = Builder.CreateMaskedStore(
-  StoredVal, VecPtr, Alignment.value(), BlockInMaskParts[Part]);
+  NewSI = Builder.CreateMaskedStore(StoredVal, VecPtr, Alignment,
+BlockInMaskParts[Part]);
 else
   NewSI =
   Builder.CreateAlignedStore(StoredVal, VecPtr, Alignment.value());
Index: llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
===
--- llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
+++ llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
@@ -2904,7 +2904,7 @@
 IRBuilder<> IRB();
 Value *V = I.getArgOperand(0);
 Value *Addr = I.getArgOperand(1);
-const MaybeAlign Alignment(
+const Align Alignment(
 cast(I.getArgOperand(2))->getZExtValue());
 Value *Mask = I.getArgOperand(3);
 Value *Shadow = getShadow(V);
@@ -2921,21 +2921,20 @@
   insertShadowCheck(Mask, );
 }
 
-IRB.CreateMaskedStore(Shadow, ShadowPtr, Alignment ? Alignment->value() : 0,
-  Mask);
+IRB.CreateMaskedStore(Shadow, ShadowPtr, Alignment, Mask);
 
 if (MS.TrackOrigins) {
   auto  = F.getParent()->getDataLayout();
   paintOrigin(IRB, getOrigin(V), OriginPtr,
   DL.getTypeStoreSize(Shadow->getType()),
-  llvm::max(Alignment, kMinOriginAlignment));
+  std::max(Alignment, kMinOriginAlignment));
 }
   }
 
   bool handleMaskedLoad(IntrinsicInst ) {
 IRBuilder<> IRB();
 Value *Addr = I.getArgOperand(0);
-const MaybeAlign Alignment(
+const Align Alignment(
 cast(I.getArgOperand(1))->getZExtValue());
 Value *Mask = I.getArgOperand(2);
 Value *PassThru = I.getArgOperand(3);
@@ -2945,7 +2944,7 @@
 if (PropagateShadow) {
   std::tie(ShadowPtr, OriginPtr) =
   getShadowOriginPtr(Addr, IRB, ShadowTy, Alignment, /*isStore*/ false);
-  setShadow(, IRB.CreateMaskedLoad(ShadowPtr, *Alignment, Mask,
+  setShadow(, IRB.CreateMaskedLoad(ShadowPtr, Alignment, Mask,
  getShadow(PassThru), "_msmaskedld"));
 } else {
   setShadow(, getCleanShadow());
Index: llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
===
--- llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -1372,7 +1372,7 @@
   // on each element's most significant bit (the sign bit).
   Constant *BoolMask = getNegativeIsTrueBoolVec(ConstMask);
 
-  IC.Builder.CreateMaskedStore(Vec, PtrCast, 1, BoolMask);
+  IC.Builder.CreateMaskedStore(Vec, PtrCast, Align::None(), BoolMask);
 
   // 'Replace uses' doesn't work for stores. Erase the original masked store.
   IC.eraseInstFromFunction(II);
Index: llvm/lib/IR/IRBuilder.cpp
===
--- llvm/lib/IR/IRBuilder.cpp
+++ llvm/lib/IR/IRBuilder.cpp
@@ -487,19 +487,19 @@
 }
 
 /// Create a call to a Masked Store intrinsic.
-/// \p Val   - data to be stored,
-/// \p Ptr   - base pointer for the store
-/// \p Align - alignment of the destination location
-/// \p Mask  - vector of booleans which indicates what vector lanes should
-///be accessed in memory
+/// \p Val   - data to be stored,
+/// \p Ptr   - 

  1   2   3   >