llvm-project/llvm/lib/IR
Daniel Neilson 1e68724d24 Remove alignment argument from memcpy/memmove/memset in favour of alignment attributes (Step 1)
Summary:
 This is a resurrection of work first proposed and discussed in Aug 2015:
   http://lists.llvm.org/pipermail/llvm-dev/2015-August/089384.html
and initially landed (but then backed out) in Nov 2015:
   http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20151109/312083.html

 The @llvm.memcpy/memmove/memset intrinsics currently have an explicit argument
which is required to be a constant integer. It represents the alignment of the
dest (and source), and so must be the minimum of the actual alignment of the
two.

 This change is the first in a series that allows source and dest to each
have their own alignments by using the alignment attribute on their arguments.

 In this change we:
1) Remove the alignment argument.
2) Add alignment attributes to the source & dest arguments. We, temporarily,
   require that the alignments for source & dest be equal.

 For example, code which used to read:
  call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 100, i32 4, i1 false)
will now read
  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %dest, i8* align 4 %src, i32 100, i1 false)

 Downstream users may have to update their lit tests that check for
@llvm.memcpy/memmove/memset call/declaration patterns. The following extended sed script
may help with updating the majority of your tests, but it does not catch all possible
patterns so some manual checking and updating will be required.

s~declare void @llvm\.mem(set|cpy|move)\.p([^(]*)\((.*), i32, i1\)~declare void @llvm.mem\1.p\2(\3, i1)~g
s~call void @llvm\.memset\.p([^(]*)i8\(i8([^*]*)\* (.*), i8 (.*), i8 (.*), i32 [01], i1 ([^)]*)\)~call void @llvm.memset.p\1i8(i8\2* \3, i8 \4, i8 \5, i1 \6)~g
s~call void @llvm\.memset\.p([^(]*)i16\(i8([^*]*)\* (.*), i8 (.*), i16 (.*), i32 [01], i1 ([^)]*)\)~call void @llvm.memset.p\1i16(i8\2* \3, i8 \4, i16 \5, i1 \6)~g
s~call void @llvm\.memset\.p([^(]*)i32\(i8([^*]*)\* (.*), i8 (.*), i32 (.*), i32 [01], i1 ([^)]*)\)~call void @llvm.memset.p\1i32(i8\2* \3, i8 \4, i32 \5, i1 \6)~g
s~call void @llvm\.memset\.p([^(]*)i64\(i8([^*]*)\* (.*), i8 (.*), i64 (.*), i32 [01], i1 ([^)]*)\)~call void @llvm.memset.p\1i64(i8\2* \3, i8 \4, i64 \5, i1 \6)~g
s~call void @llvm\.memset\.p([^(]*)i128\(i8([^*]*)\* (.*), i8 (.*), i128 (.*), i32 [01], i1 ([^)]*)\)~call void @llvm.memset.p\1i128(i8\2* \3, i8 \4, i128 \5, i1 \6)~g
s~call void @llvm\.memset\.p([^(]*)i8\(i8([^*]*)\* (.*), i8 (.*), i8 (.*), i32 ([0-9]*), i1 ([^)]*)\)~call void @llvm.memset.p\1i8(i8\2* align \6 \3, i8 \4, i8 \5, i1 \7)~g
s~call void @llvm\.memset\.p([^(]*)i16\(i8([^*]*)\* (.*), i8 (.*), i16 (.*), i32 ([0-9]*), i1 ([^)]*)\)~call void @llvm.memset.p\1i16(i8\2* align \6 \3, i8 \4, i16 \5, i1 \7)~g
s~call void @llvm\.memset\.p([^(]*)i32\(i8([^*]*)\* (.*), i8 (.*), i32 (.*), i32 ([0-9]*), i1 ([^)]*)\)~call void @llvm.memset.p\1i32(i8\2* align \6 \3, i8 \4, i32 \5, i1 \7)~g
s~call void @llvm\.memset\.p([^(]*)i64\(i8([^*]*)\* (.*), i8 (.*), i64 (.*), i32 ([0-9]*), i1 ([^)]*)\)~call void @llvm.memset.p\1i64(i8\2* align \6 \3, i8 \4, i64 \5, i1 \7)~g
s~call void @llvm\.memset\.p([^(]*)i128\(i8([^*]*)\* (.*), i8 (.*), i128 (.*), i32 ([0-9]*), i1 ([^)]*)\)~call void @llvm.memset.p\1i128(i8\2* align \6 \3, i8 \4, i128 \5, i1 \7)~g
s~call void @llvm\.mem(cpy|move)\.p([^(]*)i8\(i8([^*]*)\* (.*), i8([^*]*)\* (.*), i8 (.*), i32 [01], i1 ([^)]*)\)~call void @llvm.mem\1.p\2i8(i8\3* \4, i8\5* \6, i8 \7, i1 \8)~g
s~call void @llvm\.mem(cpy|move)\.p([^(]*)i16\(i8([^*]*)\* (.*), i8([^*]*)\* (.*), i16 (.*), i32 [01], i1 ([^)]*)\)~call void @llvm.mem\1.p\2i16(i8\3* \4, i8\5* \6, i16 \7, i1 \8)~g
s~call void @llvm\.mem(cpy|move)\.p([^(]*)i32\(i8([^*]*)\* (.*), i8([^*]*)\* (.*), i32 (.*), i32 [01], i1 ([^)]*)\)~call void @llvm.mem\1.p\2i32(i8\3* \4, i8\5* \6, i32 \7, i1 \8)~g
s~call void @llvm\.mem(cpy|move)\.p([^(]*)i64\(i8([^*]*)\* (.*), i8([^*]*)\* (.*), i64 (.*), i32 [01], i1 ([^)]*)\)~call void @llvm.mem\1.p\2i64(i8\3* \4, i8\5* \6, i64 \7, i1 \8)~g
s~call void @llvm\.mem(cpy|move)\.p([^(]*)i128\(i8([^*]*)\* (.*), i8([^*]*)\* (.*), i128 (.*), i32 [01], i1 ([^)]*)\)~call void @llvm.mem\1.p\2i128(i8\3* \4, i8\5* \6, i128 \7, i1 \8)~g
s~call void @llvm\.mem(cpy|move)\.p([^(]*)i8\(i8([^*]*)\* (.*), i8([^*]*)\* (.*), i8 (.*), i32 ([0-9]*), i1 ([^)]*)\)~call void @llvm.mem\1.p\2i8(i8\3* align \8 \4, i8\5* align \8 \6, i8 \7, i1 \9)~g
s~call void @llvm\.mem(cpy|move)\.p([^(]*)i16\(i8([^*]*)\* (.*), i8([^*]*)\* (.*), i16 (.*), i32 ([0-9]*), i1 ([^)]*)\)~call void @llvm.mem\1.p\2i16(i8\3* align \8 \4, i8\5* align \8 \6, i16 \7, i1 \9)~g
s~call void @llvm\.mem(cpy|move)\.p([^(]*)i32\(i8([^*]*)\* (.*), i8([^*]*)\* (.*), i32 (.*), i32 ([0-9]*), i1 ([^)]*)\)~call void @llvm.mem\1.p\2i32(i8\3* align \8 \4, i8\5* align \8 \6, i32 \7, i1 \9)~g
s~call void @llvm\.mem(cpy|move)\.p([^(]*)i64\(i8([^*]*)\* (.*), i8([^*]*)\* (.*), i64 (.*), i32 ([0-9]*), i1 ([^)]*)\)~call void @llvm.mem\1.p\2i64(i8\3* align \8 \4, i8\5* align \8 \6, i64 \7, i1 \9)~g
s~call void @llvm\.mem(cpy|move)\.p([^(]*)i128\(i8([^*]*)\* (.*), i8([^*]*)\* (.*), i128 (.*), i32 ([0-9]*), i1 ([^)]*)\)~call void @llvm.mem\1.p\2i128(i8\3* align \8 \4, i8\5* align \8 \6, i128 \7, i1 \9)~g

 The remaining changes in the series will:
Step 2) Expand the IRBuilder API to allow creation of memcpy/memmove with differing
   source and dest alignments.
Step 3) Update Clang to use the new IRBuilder API.
Step 4) Update Polly to use the new IRBuilder API.
Step 5) Update LLVM passes that create memcpy/memmove calls to use the new IRBuilder API,
        and those that use use MemIntrinsicInst::[get|set]Alignment() to use
        getDestAlignment() and getSourceAlignment() instead.
Step 6) Remove the single-alignment IRBuilder API for memcpy/memmove, and the
        MemIntrinsicInst::[get|set]Alignment() methods.

Reviewers: pete, hfinkel, lhames, reames, bollu

Reviewed By: reames

Subscribers: niosHD, reames, jholewinski, qcolombet, jfb, sanjoy, arsenm, dschuff, dylanmckay, mehdi_amini, sdardis, nemanjai, david2050, nhaehnle, javed.absar, sbc100, jgravelle-google, eraman, aheejin, kbarton, JDevlieghere, asb, rbar, johnrusso, simoncook, jordy.potman.lists, apazos, sabuasal, llvm-commits

Differential Revision: https://reviews.llvm.org/D41675

llvm-svn: 322965
2018-01-19 17:13:12 +00:00
..
AsmWriter.cpp Make GlobalValues with non-default visibilility dso_local. 2018-01-18 02:08:23 +00:00
AttributeImpl.h [IR] Fix some Clang-tidy modernize-use-using warnings; other minor fixes (NFC). 2017-06-19 22:05:08 +00:00
Attributes.cpp [Attributes] Fix crash when attempting to remove alignment from an attribute list/set 2018-01-17 19:15:21 +00:00
AttributesCompatFunc.td
AutoUpgrade.cpp Remove alignment argument from memcpy/memmove/memset in favour of alignment attributes (Step 1) 2018-01-19 17:13:12 +00:00
BasicBlock.cpp IR: Fix BasicBlock::phis for empty blocks 2017-12-29 19:25:53 +00:00
CMakeLists.txt GCOV: Move GCOV from IR & Support into ProfileData to fix layering 2017-11-03 20:57:10 +00:00
Comdat.cpp Sort the remaining #include lines in include/... and lib/.... 2017-06-06 11:49:48 +00:00
ConstantFold.cpp Silence a bunch of implicit fallthrough warnings 2017-12-19 22:05:25 +00:00
ConstantFold.h
ConstantRange.cpp [ConstantRange] Support for ashr in ConstantRange computation 2017-12-18 13:01:32 +00:00
Constants.cpp Remove redundant includes from lib/IR. 2017-12-13 21:30:52 +00:00
ConstantsContext.h [IR] Stop deleting other signatures of User::operator new when we override one signature in a class derived from User 2017-06-12 23:25:15 +00:00
Core.cpp [LLVM-C] Publicly expose getters of MetadataType, TokenType 2017-10-27 11:51:40 +00:00
DIBuilder.cpp Mark all library options as hidden. 2017-12-01 00:53:10 +00:00
DataLayout.cpp Support, IR, ADT: Check nullptr after allocation with malloc/realloc or calloc 2017-07-20 01:30:39 +00:00
DebugInfo.cpp Remove redundant includes from lib/IR. 2017-12-13 21:30:52 +00:00
DebugInfoMetadata.cpp Generalize llvm::replaceDbgDeclare and actually support the use-case that 2017-12-08 21:58:18 +00:00
DebugLoc.cpp Remove redundant includes from lib/IR. 2017-12-13 21:30:52 +00:00
DiagnosticHandler.cpp Allow ORE.emit to take a closure to delay building the remark object 2017-09-19 23:00:55 +00:00
DiagnosticInfo.cpp Test commit 2018-01-09 17:52:00 +00:00
DiagnosticPrinter.cpp Sort the remaining #include lines in include/... and lib/.... 2017-06-06 11:49:48 +00:00
Dominators.cpp [JumpThreading] Preservation of DT and LVI across the pass 2018-01-12 21:06:48 +00:00
Function.cpp Add a ProfileCount class to represent entry counts. 2018-01-17 22:24:23 +00:00
GVMaterializer.cpp
Globals.cpp Represent runtime preemption in the IR. 2017-10-26 15:00:26 +00:00
IRBuilder.cpp Remove alignment argument from memcpy/memmove/memset in favour of alignment attributes (Step 1) 2018-01-19 17:13:12 +00:00
IRPrintingPasses.cpp [IR] Avoid dangling else warning. NFC. 2017-12-01 18:39:58 +00:00
InlineAsm.cpp [inlineasm] Fix crash when number of matched input constraint operands overflows signed char 2017-10-25 12:51:32 +00:00
Instruction.cpp [IPSCCP] Remove calls without side effects 2018-01-09 21:58:46 +00:00
Instructions.cpp Fix invalid ptrtoint in InstCombine 2017-10-22 20:28:17 +00:00
IntrinsicInst.cpp Add ‘llvm.experimental.constrained.fma‘ Intrinsic. 2017-08-24 04:18:24 +00:00
LLVMBuild.txt Move Object format code to lib/BinaryFormat. 2017-06-07 03:48:56 +00:00
LLVMContext.cpp Irreducible loop metadata for more accurate block frequency under PGO. 2017-11-02 22:26:51 +00:00
LLVMContextImpl.cpp This patch fixes https://bugs.llvm.org/show_bug.cgi?id=32352 2017-09-15 20:10:09 +00:00
LLVMContextImpl.h This patch fixes https://bugs.llvm.org/show_bug.cgi?id=32352 2017-09-15 20:10:09 +00:00
LegacyPassManager.cpp IR printing improvement for function passes - introducing -print-module-scope 2017-12-01 17:42:46 +00:00
MDBuilder.cpp [Transforms] Support making mutable versions of new-format TBAA access tags 2018-01-17 13:29:54 +00:00
Mangler.cpp Move llvm::emitLinkerFlagsForGlobalCOFF() to Mangler. 2017-03-31 04:46:50 +00:00
Metadata.cpp Move the stripping of invalid debug info from the Verifier to AutoUpgrade. 2017-10-02 18:31:29 +00:00
MetadataImpl.h
Module.cpp Normalize constructor call syntax, NFCI. 2017-07-18 08:36:22 +00:00
ModuleSummaryIndex.cpp [cfi] CFI-ICall for ThinLTO. 2017-06-16 00:18:29 +00:00
Operator.cpp [IR] Remove some unneeded includes from Operator.h and fix cpp files that were transitively depending on it. NFC 2017-03-20 05:08:41 +00:00
OptBisect.cpp [IR] Missing changes for r312289 (NFC). 2017-08-31 22:06:09 +00:00
Pass.cpp Reverting r315590; it did not include changes for llvm-tblgen, which is causing link errors for several people. 2017-10-15 14:32:27 +00:00
PassManager.cpp [PM] Introduce an analysis set used to preserve all analyses over 2017-01-15 06:32:49 +00:00
PassRegistry.cpp [Pass] Fix some Clang-tidy modernize and Include What You Use warnings; other minor fixes (NFC). 2017-09-06 23:05:38 +00:00
ProfileSummary.cpp
SafepointIRVerifier.cpp [SafepointIRVerifier] Allow non-dereferencing uses of unrelocated or poisoned PHI nodes 2017-12-25 09:35:10 +00:00
Statepoint.cpp [Statepoint] Add helper functions for GCRelocate and GCResult 2017-06-20 20:54:57 +00:00
SymbolTableListTraitsImpl.h
Type.cpp [IR] Add Type::isIntOrIntVectorTy(unsigned) similar to the existing isIntegerTy(unsigned), but also works for vectors. 2017-07-09 07:04:03 +00:00
TypeFinder.cpp Sort the remaining #include lines in include/... and lib/.... 2017-06-06 11:49:48 +00:00
Use.cpp
User.cpp Remove redundant includes from lib/IR. 2017-12-13 21:30:52 +00:00
Value.cpp Limit size of non-GlobalValue name 2018-01-05 19:41:19 +00:00
ValueSymbolTable.cpp [NVPTX] Assign valid global names 2017-12-04 14:19:33 +00:00
ValueTypes.cpp Test commit access 2018-01-10 19:27:20 +00:00
Verifier.cpp Remove alignment argument from memcpy/memmove/memset in favour of alignment attributes (Step 1) 2018-01-19 17:13:12 +00:00