<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Thanks for letting me know.  I’ve reverted the LLVM and clang changes in r253541-3.<div class=""><br class=""></div><div class="">Seems to be breaking stage 2 on a number of bots, but unfortunately none of them are the green dragon ones which were able to pass without any issues.</div><div class=""><br class=""></div><div class="">My guess right now is that the green dragon bots, being Mac OS based, are using a different stdlib from the linux bots and so some different code sequences are reaching the backend.  No idea if this is exposing a bug in my code, a bug in the backends (unlikely given it fails on x86 and ppc), or a bug in the stdlib itself to do with alignment (perhaps unlikely if UB was able to catch this before now).</div><div class=""><br class=""></div><div class="">I don’t have access to an environment on which this crashes right now.  If you or anyone else has time to help me track this down i’d really appreciate it.  Otherwise I might have to wait a little while until I can get something set up which can report it.</div><div class=""><br class=""></div><div class="">Thanks,</div><div class="">Pete</div><div class=""><div><blockquote type="cite" class=""><div class="">On Nov 18, 2015, at 9:25 PM, NAKAMURA Takumi <<a href="mailto:geek4civic@gmail.com" class="">geek4civic@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Seems it causes crash. See;<div class=""><a href="http://lab.llvm.org:8011/builders/clang-ppc64-elf-linux2/builds/20202" class="">http://lab.llvm.org:8011/builders/clang-ppc64-elf-linux2/builds/20202</a><br class=""></div><div class=""><a href="http://bb.pgr.jp/builders/clang-3stage-i686-linux/builds/3787" class="">http://bb.pgr.jp/builders/clang-3stage-i686-linux/builds/3787</a><br class=""></div><div class=""><br class=""></div><div class="">I can reproduce crash with selfhosting on x86-64.</div></div><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Thu, Nov 19, 2015 at 7:20 AM Pete Cooper via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: pete<br class="">
Date: Wed Nov 18 16:17:24 2015<br class="">
New Revision: 253511<br class="">
<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=253511&view=rev" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=253511&view=rev</a><br class="">
Log:<br class="">
Change memcpy/memset/memmove to have dest and source alignments.<br class="">
<br class="">
Note, this was reviewed (and more details are in) <a href="http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20151109/312083.html" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20151109/312083.html</a><br class="">
<br class="">
These intrinsics currently have an explicit alignment argument which is<br class="">
required to be a constant integer.  It represents the alignment of the<br class="">
source and dest, and so must be the minimum of those.<br class="">
<br class="">
This change allows source and dest to each have their own alignments<br class="">
by using the alignment attribute on their arguments.  The alignment<br class="">
argument itself is removed.<br class="">
<br class="">
There are a few places in the code for which the code needs to be<br class="">
checked by an expert as to whether using only src/dest alignment is<br class="">
safe.  For those places, they currently take the minimum of src/dest<br class="">
alignments which matches the current behaviour.<br class="">
<br class="">
For example, code which used to read:<br class="">
  call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 500, i32 8, i1 false)<br class="">
will now read:<br class="">
  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %dest, i8* align 8 %src, i32 500, i1 false)<br class="">
<br class="">
For out of tree owners, I was able to strip alignment from calls using sed by replacing:<br class="">
  (call.*llvm\.memset.*)i32\ [0-9]*\,\ i1 false\)<br class="">
with:<br class="">
  $1i1 false)<br class="">
<br class="">
and similarly for memmove and memcpy.<br class="">
<br class="">
I then added back in alignment to test cases which needed it.<br class="">
<br class="">
A similar commit will be made to clang which actually has many differences in alignment as now<br class="">
IRBuilder can generate different source/dest alignments on calls.<br class="">
<br class="">
In IRBuilder itself, a new argument was added.  Instead of calling:<br class="">
  CreateMemCpy(Dst, Src, getInt64(Size), DstAlign, /* isVolatile */ false)<br class="">
you now call<br class="">
  CreateMemCpy(Dst, Src, getInt64(Size), DstAlign, SrcAlign, /* isVolatile */ false)<br class="">
<br class="">
There is a temporary class (IntegerAlignment) which takes the source alignment and rejects<br class="">
implicit conversion from bool.  This is to prevent isVolatile here from passing its default<br class="">
parameter to the source alignment.<br class="">
<br class="">
Note, changes in future can now be made to codegen.  I didn't change anything here, but this<br class="">
change should enable better memcpy code sequences.<br class="">
<br class="">
Reviewed by Hal Finkel.<br class="">
<br class="">
Added:<br class="">
    llvm/trunk/test/Bitcode/memintrinsics.3.7.ll<br class="">
    llvm/trunk/test/Bitcode/memintrinsics.3.7.ll.bc<br class="">
Removed:<br class="">
    llvm/trunk/test/Verifier/2008-08-22-MemCpyAlignment.ll<br class="">
Modified:<br class="">
    llvm/trunk/include/llvm/IR/IRBuilder.h<br class="">
    llvm/trunk/include/llvm/IR/Instructions.h<br class="">
    llvm/trunk/include/llvm/IR/IntrinsicInst.h<br class="">
    llvm/trunk/include/llvm/IR/Intrinsics.td<br class="">
    llvm/trunk/lib/Analysis/Lint.cpp<br class="">
    llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp<br class="">
    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp<br class="">
    llvm/trunk/lib/IR/Attributes.cpp<br class="">
    llvm/trunk/lib/IR/AutoUpgrade.cpp<br class="">
    llvm/trunk/lib/IR/IRBuilder.cpp<br class="">
    llvm/trunk/lib/IR/Verifier.cpp<br class="">
    llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp<br class="">
    llvm/trunk/lib/Target/AMDGPU/AMDGPUPromoteAlloca.cpp<br class="">
    llvm/trunk/lib/Target/ARM/ARMFastISel.cpp<br class="">
    llvm/trunk/lib/Target/Mips/MipsFastISel.cpp<br class="">
    llvm/trunk/lib/Target/X86/X86FastISel.cpp<br class="">
    llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp<br class="">
    llvm/trunk/lib/Transforms/InstCombine/InstCombineInternal.h<br class="">
    llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp<br class="">
    llvm/trunk/lib/Transforms/Instrumentation/MemorySanitizer.cpp<br class="">
    llvm/trunk/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp<br class="">
    llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp<br class="">
    llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp<br class="">
    llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp<br class="">
    llvm/trunk/lib/Transforms/Scalar/SROA.cpp<br class="">
    llvm/trunk/lib/Transforms/Scalar/ScalarReplAggregates.cpp<br class="">
    llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp<br class="">
    llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp<br class="">
    llvm/trunk/test/Analysis/BasicAA/assume.ll<br class="">
    llvm/trunk/test/Analysis/BasicAA/cs-cs.ll<br class="">
    llvm/trunk/test/Analysis/BasicAA/getmodrefinfo-cs-cs.ll<br class="">
    llvm/trunk/test/Analysis/BasicAA/modref.ll<br class="">
    llvm/trunk/test/Analysis/CallGraph/no-intrinsics.ll<br class="">
    llvm/trunk/test/Analysis/DependenceAnalysis/Preliminary.ll<br class="">
    llvm/trunk/test/Analysis/GlobalsModRef/pr12351.ll<br class="">
    llvm/trunk/test/Analysis/GlobalsModRef/volatile-instrs.ll<br class="">
    llvm/trunk/test/Analysis/ScalarEvolution/avoid-smax-1.ll<br class="">
    llvm/trunk/test/Analysis/ScalarEvolution/trip-count.ll<br class="">
    llvm/trunk/test/Analysis/ScalarEvolution/trip-count3.ll<br class="">
    llvm/trunk/test/Analysis/TypeBasedAliasAnalysis/functionattrs.ll<br class="">
    llvm/trunk/test/Analysis/TypeBasedAliasAnalysis/memcpyopt.ll<br class="">
    llvm/trunk/test/Bitcode/standardCIntrinsic.3.2.ll<br class="">
    llvm/trunk/test/CodeGen/AArch64/PBQP-csr.ll<br class="">
    llvm/trunk/test/CodeGen/AArch64/aarch64-deferred-spilling.ll<br class="">
    llvm/trunk/test/CodeGen/AArch64/arm64-2012-05-07-MemcpyAlignBug.ll<br class="">
    llvm/trunk/test/CodeGen/AArch64/arm64-abi-varargs.ll<br class="">
    llvm/trunk/test/CodeGen/AArch64/arm64-abi_align.ll<br class="">
    llvm/trunk/test/CodeGen/AArch64/arm64-fast-isel-intrinsic.ll<br class="">
    llvm/trunk/test/CodeGen/AArch64/arm64-memcpy-inline.ll<br class="">
    llvm/trunk/test/CodeGen/AArch64/arm64-memset-inline.ll<br class="">
    llvm/trunk/test/CodeGen/AArch64/arm64-memset-to-bzero.ll<br class="">
    llvm/trunk/test/CodeGen/AArch64/arm64-misaligned-memcpy-inline.ll<br class="">
    llvm/trunk/test/CodeGen/AArch64/arm64-misched-basic-A53.ll<br class="">
    llvm/trunk/test/CodeGen/AArch64/arm64-misched-basic-A57.ll<br class="">
    llvm/trunk/test/CodeGen/AArch64/arm64-stur.ll<br class="">
    llvm/trunk/test/CodeGen/AArch64/arm64-virtual_base.ll<br class="">
    llvm/trunk/test/CodeGen/AArch64/fast-isel-memcpy.ll<br class="">
    llvm/trunk/test/CodeGen/AArch64/func-argpassing.ll<br class="">
    llvm/trunk/test/CodeGen/AArch64/memcpy-f128.ll<br class="">
    llvm/trunk/test/CodeGen/AArch64/tailcall-mem-intrinsics.ll<br class="">
    llvm/trunk/test/CodeGen/AMDGPU/llvm.memcpy.ll<br class="">
    llvm/trunk/test/CodeGen/ARM/2009-03-07-SpillerBug.ll<br class="">
    llvm/trunk/test/CodeGen/ARM/2011-03-10-DAGCombineCrash.ll<br class="">
    llvm/trunk/test/CodeGen/ARM/2011-10-26-memset-inline.ll<br class="">
    llvm/trunk/test/CodeGen/ARM/2011-10-26-memset-with-neon.ll<br class="">
    llvm/trunk/test/CodeGen/ARM/2012-04-24-SplitEHCriticalEdge.ll<br class="">
    llvm/trunk/test/CodeGen/ARM/Windows/memset.ll<br class="">
    llvm/trunk/test/CodeGen/ARM/Windows/no-aeabi.ll<br class="">
    llvm/trunk/test/CodeGen/ARM/crash-O0.ll<br class="">
    llvm/trunk/test/CodeGen/ARM/debug-info-blocks.ll<br class="">
    llvm/trunk/test/CodeGen/ARM/dyn-stackalloc.ll<br class="">
    llvm/trunk/test/CodeGen/ARM/fast-isel-intrinsic.ll<br class="">
    llvm/trunk/test/CodeGen/ARM/machine-cse-cmp.ll<br class="">
    llvm/trunk/test/CodeGen/ARM/memcpy-inline.ll<br class="">
    llvm/trunk/test/CodeGen/ARM/memfunc.ll<br class="">
    llvm/trunk/test/CodeGen/ARM/memset-inline.ll<br class="">
    llvm/trunk/test/CodeGen/ARM/stack-protector-bmovpcb_call.ll<br class="">
    llvm/trunk/test/CodeGen/ARM/struct-byval-frame-index.ll<br class="">
    llvm/trunk/test/CodeGen/BPF/byval.ll<br class="">
    llvm/trunk/test/CodeGen/BPF/ex1.ll<br class="">
    llvm/trunk/test/CodeGen/BPF/sanity.ll<br class="">
    llvm/trunk/test/CodeGen/Generic/ForceStackAlign.ll<br class="">
    llvm/trunk/test/CodeGen/Generic/invalid-memcpy.ll<br class="">
    llvm/trunk/test/CodeGen/Hexagon/mem-fi-add.ll<br class="">
    llvm/trunk/test/CodeGen/Hexagon/tail-call-mem-intrinsics.ll<br class="">
    llvm/trunk/test/CodeGen/MSP430/memset.ll<br class="">
    llvm/trunk/test/CodeGen/Mips/2012-12-12-ExpandMemcpy.ll<br class="">
    llvm/trunk/test/CodeGen/Mips/Fast-ISel/memtest1.ll<br class="">
    llvm/trunk/test/CodeGen/Mips/biggot.ll<br class="">
    llvm/trunk/test/CodeGen/Mips/cconv/arguments-small-structures-bigger-than-32bits.ll<br class="">
    llvm/trunk/test/CodeGen/Mips/cconv/arguments-varargs-small-structs-byte.ll<br class="">
    llvm/trunk/test/CodeGen/Mips/cconv/arguments-varargs-small-structs-combinations.ll<br class="">
    llvm/trunk/test/CodeGen/Mips/cconv/return-struct.ll<br class="">
    llvm/trunk/test/CodeGen/Mips/largeimmprinting.ll<br class="">
    llvm/trunk/test/CodeGen/Mips/memcpy.ll<br class="">
    llvm/trunk/test/CodeGen/Mips/tailcall.ll<br class="">
    llvm/trunk/test/CodeGen/NVPTX/lower-aggr-copies.ll<br class="">
    llvm/trunk/test/CodeGen/PowerPC/2011-12-05-NoSpillDupCR.ll<br class="">
    llvm/trunk/test/CodeGen/PowerPC/2011-12-06-SpillAndRestoreCR.ll<br class="">
    llvm/trunk/test/CodeGen/PowerPC/ctrloop-reg.ll<br class="">
    llvm/trunk/test/CodeGen/PowerPC/emptystruct.ll<br class="">
    llvm/trunk/test/CodeGen/PowerPC/fsl-e500mc.ll<br class="">
    llvm/trunk/test/CodeGen/PowerPC/fsl-e5500.ll<br class="">
    llvm/trunk/test/CodeGen/PowerPC/glob-comp-aa-crash.ll<br class="">
    llvm/trunk/test/CodeGen/PowerPC/isel-rc-nox0.ll<br class="">
    llvm/trunk/test/CodeGen/PowerPC/memcpy-vec.ll<br class="">
    llvm/trunk/test/CodeGen/PowerPC/memset-nc-le.ll<br class="">
    llvm/trunk/test/CodeGen/PowerPC/memset-nc.ll<br class="">
    llvm/trunk/test/CodeGen/PowerPC/ppc-empty-fs.ll<br class="">
    llvm/trunk/test/CodeGen/PowerPC/resolvefi-basereg.ll<br class="">
    llvm/trunk/test/CodeGen/PowerPC/resolvefi-disp.ll<br class="">
    llvm/trunk/test/CodeGen/PowerPC/structsinmem.ll<br class="">
    llvm/trunk/test/CodeGen/PowerPC/structsinregs.ll<br class="">
    llvm/trunk/test/CodeGen/PowerPC/stwu8.ll<br class="">
    llvm/trunk/test/CodeGen/PowerPC/toc-load-sched-bug.ll<br class="">
    llvm/trunk/test/CodeGen/SystemZ/memcpy-01.ll<br class="">
    llvm/trunk/test/CodeGen/SystemZ/memset-01.ll<br class="">
    llvm/trunk/test/CodeGen/SystemZ/memset-02.ll<br class="">
    llvm/trunk/test/CodeGen/SystemZ/memset-03.ll<br class="">
    llvm/trunk/test/CodeGen/SystemZ/memset-04.ll<br class="">
    llvm/trunk/test/CodeGen/SystemZ/tail-call-mem-intrinsics.ll<br class="">
    llvm/trunk/test/CodeGen/Thumb/2011-05-11-DAGLegalizer.ll<br class="">
    llvm/trunk/test/CodeGen/Thumb/dyn-stackalloc.ll<br class="">
    llvm/trunk/test/CodeGen/Thumb/ldm-stm-base-materialization.ll<br class="">
    llvm/trunk/test/CodeGen/Thumb/stack-coloring-without-frame-ptr.ll<br class="">
    llvm/trunk/test/CodeGen/Thumb2/2009-08-04-SubregLoweringBug.ll<br class="">
    llvm/trunk/test/CodeGen/Thumb2/2012-01-13-CBNZBug.ll<br class="">
    llvm/trunk/test/CodeGen/X86/2009-01-25-NoSSE.ll<br class="">
    llvm/trunk/test/CodeGen/X86/2009-11-16-UnfoldMemOpBug.ll<br class="">
    llvm/trunk/test/CodeGen/X86/2010-04-08-CoalescerBug.ll<br class="">
    llvm/trunk/test/CodeGen/X86/2010-04-21-CoalescerBug.ll<br class="">
    llvm/trunk/test/CodeGen/X86/2010-06-25-CoalescerSubRegDefDead.ll<br class="">
    llvm/trunk/test/CodeGen/X86/2010-09-17-SideEffectsInChain.ll<br class="">
    llvm/trunk/test/CodeGen/X86/2012-01-10-UndefExceptionEdge.ll<br class="">
    llvm/trunk/test/CodeGen/X86/alignment-2.ll<br class="">
    llvm/trunk/test/CodeGen/X86/darwin-bzero.ll<br class="">
    llvm/trunk/test/CodeGen/X86/fast-isel-call.ll<br class="">
    llvm/trunk/test/CodeGen/X86/fast-isel-x86-64.ll<br class="">
    llvm/trunk/test/CodeGen/X86/force-align-stack-alloca.ll<br class="">
    llvm/trunk/test/CodeGen/X86/immediate_merging.ll<br class="">
    llvm/trunk/test/CodeGen/X86/load-slice.ll<br class="">
    llvm/trunk/test/CodeGen/X86/lsr-normalization.ll<br class="">
    llvm/trunk/test/CodeGen/X86/mem-intrin-base-reg.ll<br class="">
    llvm/trunk/test/CodeGen/X86/memcpy-2.ll<br class="">
    llvm/trunk/test/CodeGen/X86/memcpy.ll<br class="">
    llvm/trunk/test/CodeGen/X86/memset-2.ll<br class="">
    llvm/trunk/test/CodeGen/X86/memset-3.ll<br class="">
    llvm/trunk/test/CodeGen/X86/memset-sse-stack-realignment.ll<br class="">
    llvm/trunk/test/CodeGen/X86/memset.ll<br class="">
    llvm/trunk/test/CodeGen/X86/memset64-on-x86-32.ll<br class="">
    llvm/trunk/test/CodeGen/X86/misaligned-memset.ll<br class="">
    llvm/trunk/test/CodeGen/X86/misched-new.ll<br class="">
    llvm/trunk/test/CodeGen/X86/optimize-max-0.ll<br class="">
    llvm/trunk/test/CodeGen/X86/pr11985.ll<br class="">
    llvm/trunk/test/CodeGen/X86/pr14333.ll<br class="">
    llvm/trunk/test/CodeGen/X86/ragreedy-hoist-spill.ll<br class="">
    llvm/trunk/test/CodeGen/X86/remat-fold-load.ll<br class="">
    llvm/trunk/test/CodeGen/X86/small-byval-memcpy.ll<br class="">
    llvm/trunk/test/CodeGen/X86/stack-protector.ll<br class="">
    llvm/trunk/test/CodeGen/X86/tailcall-mem-intrinsics.ll<br class="">
    llvm/trunk/test/CodeGen/X86/tlv-1.ll<br class="">
    llvm/trunk/test/CodeGen/X86/unaligned-load.ll<br class="">
    llvm/trunk/test/CodeGen/X86/unwindraise.ll<br class="">
    llvm/trunk/test/CodeGen/X86/variable-sized-darwin-bzero.ll<br class="">
    llvm/trunk/test/CodeGen/X86/x86-64-static-relo-movl.ll<br class="">
    llvm/trunk/test/CodeGen/XCore/memcpy.ll<br class="">
    llvm/trunk/test/DebugInfo/AArch64/frameindices.ll<br class="">
    llvm/trunk/test/DebugInfo/X86/array.ll<br class="">
    llvm/trunk/test/DebugInfo/X86/array2.ll<br class="">
    llvm/trunk/test/DebugInfo/X86/debug-ranges-offset.ll<br class="">
    llvm/trunk/test/DebugInfo/X86/pieces-2.ll<br class="">
    llvm/trunk/test/DebugInfo/X86/pieces-3.ll<br class="">
    llvm/trunk/test/DebugInfo/X86/sroasplit-1.ll<br class="">
    llvm/trunk/test/DebugInfo/X86/sroasplit-2.ll<br class="">
    llvm/trunk/test/DebugInfo/X86/sroasplit-4.ll<br class="">
    llvm/trunk/test/DebugInfo/X86/sroasplit-5.ll<br class="">
    llvm/trunk/test/Instrumentation/AddressSanitizer/basic.ll<br class="">
    llvm/trunk/test/Instrumentation/DataFlowSanitizer/memset.ll<br class="">
    llvm/trunk/test/Instrumentation/MemorySanitizer/byval-alignment.ll<br class="">
    llvm/trunk/test/Instrumentation/MemorySanitizer/check_access_address.ll<br class="">
    llvm/trunk/test/Instrumentation/MemorySanitizer/msan_basic.ll<br class="">
    llvm/trunk/test/Instrumentation/ThreadSanitizer/tsan_basic.ll<br class="">
    llvm/trunk/test/Linker/type-unique-simple2-a.ll<br class="">
    llvm/trunk/test/Linker/type-unique-type-array-a.ll<br class="">
    llvm/trunk/test/Linker/type-unique-type-array-b.ll<br class="">
    llvm/trunk/test/Object/mangle-ir.ll<br class="">
    llvm/trunk/test/Other/lint.ll<br class="">
    llvm/trunk/test/Transforms/AlignmentFromAssumptions/simple.ll<br class="">
    llvm/trunk/test/Transforms/AlignmentFromAssumptions/simple32.ll<br class="">
    llvm/trunk/test/Transforms/BBVectorize/X86/wr-aliases.ll<br class="">
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/memset_chk-simplify-nobuiltin.ll<br class="">
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/non-null.ll<br class="">
    llvm/trunk/test/Transforms/DeadStoreElimination/2011-09-06-MemCpy.ll<br class="">
    llvm/trunk/test/Transforms/DeadStoreElimination/OverwriteStoreEnd.ll<br class="">
    llvm/trunk/test/Transforms/DeadStoreElimination/crash.ll<br class="">
    llvm/trunk/test/Transforms/DeadStoreElimination/cs-cs-aliasing.ll<br class="">
    llvm/trunk/test/Transforms/DeadStoreElimination/lifetime.ll<br class="">
    llvm/trunk/test/Transforms/DeadStoreElimination/memintrinsics.ll<br class="">
    llvm/trunk/test/Transforms/DeadStoreElimination/no-targetdata.ll<br class="">
    llvm/trunk/test/Transforms/DeadStoreElimination/pr11390.ll<br class="">
    llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll<br class="">
    llvm/trunk/test/Transforms/GVN/nonescaping-malloc.ll<br class="">
    llvm/trunk/test/Transforms/GVN/pr17732.ll<br class="">
    llvm/trunk/test/Transforms/GVN/rle.ll<br class="">
    llvm/trunk/test/Transforms/GlobalOpt/crash.ll<br class="">
    llvm/trunk/test/Transforms/GlobalOpt/memcpy.ll<br class="">
    llvm/trunk/test/Transforms/GlobalOpt/memset-null.ll<br class="">
    llvm/trunk/test/Transforms/GlobalOpt/memset.ll<br class="">
    llvm/trunk/test/Transforms/Inline/alloca-dbgdeclare.ll<br class="">
    llvm/trunk/test/Transforms/Inline/inline-invoke-tail.ll<br class="">
    llvm/trunk/test/Transforms/Inline/inline-vla.ll<br class="">
    llvm/trunk/test/Transforms/Inline/noalias-calls.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/2007-10-10-EliminateMemCpy.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/2009-02-20-InstCombine-SROA.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/addrspacecast.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/align-addr.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/alloca.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/call-intrinsics.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/malloc-free-delete.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/memcpy-from-global.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/memcpy-to-load.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/memcpy.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/memcpy_chk-1.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/memmove.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/memmove_chk-1.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/memset.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/memset2.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/memset_chk-1.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/objsize.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/simplify-libcalls.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/sprintf-1.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/stack-overalign.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/stpcpy_chk-1.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/strcpy_chk-1.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/strncpy_chk-1.ll<br class="">
    llvm/trunk/test/Transforms/InstCombine/struct-assign-tbaa.ll<br class="">
    llvm/trunk/test/Transforms/LoopIdiom/basic-address-space.ll<br class="">
    llvm/trunk/test/Transforms/LoopIdiom/basic.ll<br class="">
    llvm/trunk/test/Transforms/MemCpyOpt/2008-02-24-MultipleUseofSRet.ll<br class="">
    llvm/trunk/test/Transforms/MemCpyOpt/2008-03-13-ReturnSlotBitcast.ll<br class="">
    llvm/trunk/test/Transforms/MemCpyOpt/align.ll<br class="">
    llvm/trunk/test/Transforms/MemCpyOpt/atomic.ll<br class="">
    llvm/trunk/test/Transforms/MemCpyOpt/callslot_aa.ll<br class="">
    llvm/trunk/test/Transforms/MemCpyOpt/callslot_deref.ll<br class="">
    llvm/trunk/test/Transforms/MemCpyOpt/capturing-func.ll<br class="">
    llvm/trunk/test/Transforms/MemCpyOpt/form-memset.ll<br class="">
    llvm/trunk/test/Transforms/MemCpyOpt/memcpy-to-memset-with-lifetimes.ll<br class="">
    llvm/trunk/test/Transforms/MemCpyOpt/memcpy-to-memset.ll<br class="">
    llvm/trunk/test/Transforms/MemCpyOpt/memcpy-undef.ll<br class="">
    llvm/trunk/test/Transforms/MemCpyOpt/memcpy.ll<br class="">
    llvm/trunk/test/Transforms/MemCpyOpt/memmove.ll<br class="">
    llvm/trunk/test/Transforms/MemCpyOpt/memset-memcpy-redundant-memset.ll<br class="">
    llvm/trunk/test/Transforms/MemCpyOpt/memset-memcpy-to-2x-memset.ll<br class="">
    llvm/trunk/test/Transforms/MemCpyOpt/smaller.ll<br class="">
    llvm/trunk/test/Transforms/MemCpyOpt/sret.ll<br class="">
    llvm/trunk/test/Transforms/MergeFunc/vector.ll<br class="">
    llvm/trunk/test/Transforms/MetaRenamer/metarenamer.ll<br class="">
    llvm/trunk/test/Transforms/ObjCARC/nested.ll<br class="">
    llvm/trunk/test/Transforms/PlaceSafepoints/memset.ll<br class="">
    llvm/trunk/test/Transforms/SROA/address-spaces.ll<br class="">
    llvm/trunk/test/Transforms/SROA/alignment.ll<br class="">
    llvm/trunk/test/Transforms/SROA/basictest.ll<br class="">
    llvm/trunk/test/Transforms/SROA/big-endian.ll<br class="">
    llvm/trunk/test/Transforms/SROA/slice-order-independence.ll<br class="">
    llvm/trunk/test/Transforms/SROA/slice-width.ll<br class="">
    llvm/trunk/test/Transforms/SROA/vector-promotion.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/2007-05-29-MemcpyPreserve.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/2008-06-22-LargeArray.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/2008-08-22-out-of-range-array-promote.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/2008-09-22-vector-gep.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/2009-03-04-MemCpyAlign.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/2009-12-11-NeonTypes.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/2010-01-18-SelfCopy.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/2011-05-06-CapturedAlloca.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/2011-06-17-VectorPartialMemset.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/2011-10-11-VectorMemset.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/2011-11-11-EmptyStruct.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/address-space.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/badarray.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/copy-aggregate.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/crash.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/inline-vector.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/memcpy-align.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/memset-aggregate-byte-leader.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/memset-aggregate.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/negative-memset.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/only-memcpy-uses.ll<br class="">
    llvm/trunk/test/Transforms/ScalarRepl/vector_memcpy.ll<br class="">
    llvm/trunk/test/Transforms/Util/combine-alias-scope-metadata.ll<br class="">
    llvm/trunk/test/Verifier/2006-12-12-IntrinsicDefine.ll<br class="">
    llvm/trunk/test/Verifier/memcpy.ll<br class="">
<br class="">
Modified: llvm/trunk/include/llvm/IR/IRBuilder.h<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/IRBuilder.h?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/IRBuilder.h?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/include/llvm/IR/IRBuilder.h (original)<br class="">
+++ llvm/trunk/include/llvm/IR/IRBuilder.h Wed Nov 18 16:17:24 2015<br class="">
@@ -362,34 +362,56 @@ public:<br class="">
   /// If the pointer isn't an i8*, it will be converted. If a TBAA tag is<br class="">
   /// specified, it will be added to the instruction. Likewise with alias.scope<br class="">
   /// and noalias tags.<br class="">
-  CallInst *CreateMemSet(Value *Ptr, Value *Val, uint64_t Size, unsigned Align,<br class="">
+  CallInst *CreateMemSet(Value *Ptr, Value *Val, uint64_t Size,<br class="">
+                         unsigned DstAlign,<br class="">
                          bool isVolatile = false, MDNode *TBAATag = nullptr,<br class="">
                          MDNode *ScopeTag = nullptr,<br class="">
                          MDNode *NoAliasTag = nullptr) {<br class="">
-    return CreateMemSet(Ptr, Val, getInt64(Size), Align, isVolatile,<br class="">
+    return CreateMemSet(Ptr, Val, getInt64(Size), DstAlign, isVolatile,<br class="">
                         TBAATag, ScopeTag, NoAliasTag);<br class="">
   }<br class="">
<br class="">
-  CallInst *CreateMemSet(Value *Ptr, Value *Val, Value *Size, unsigned Align,<br class="">
+  CallInst *CreateMemSet(Value *Ptr, Value *Val, Value *Size, unsigned DstAlign,<br class="">
                          bool isVolatile = false, MDNode *TBAATag = nullptr,<br class="">
                          MDNode *ScopeTag = nullptr,<br class="">
                          MDNode *NoAliasTag = nullptr);<br class="">
<br class="">
-  /// \brief Create and insert a memcpy between the specified pointers.<br class="">
+  /// Create and insert a memcpy between the specified pointers.<br class="">
   ///<br class="">
   /// If the pointers aren't i8*, they will be converted.  If a TBAA tag is<br class="">
   /// specified, it will be added to the instruction. Likewise with alias.scope<br class="">
   /// and noalias tags.<br class="">
-  CallInst *CreateMemCpy(Value *Dst, Value *Src, uint64_t Size, unsigned Align,<br class="">
+  ///<br class="">
+  /// Note!  This is very temporary.  It is only intended to catch calls to<br class="">
+  /// CreateMemCpy in out of tree code which would otherwise silently pass the<br class="">
+  /// volatile flag to source alignment.<br class="">
+  class IntegerAlignment {<br class="">
+  private:<br class="">
+    uint64_t Align;<br class="">
+<br class="">
+    IntegerAlignment() = delete;<br class="">
+    IntegerAlignment(bool) = delete;<br class="">
+  public:<br class="">
+    IntegerAlignment(int Align) : Align(Align) { }<br class="">
+    IntegerAlignment(long long Align) : Align(Align) { }<br class="">
+    IntegerAlignment(unsigned Align) : Align(Align) { }<br class="">
+    IntegerAlignment(uint64_t Align) : Align(Align) { }<br class="">
+<br class="">
+    operator unsigned() { return Align; }<br class="">
+  };<br class="">
+  CallInst *CreateMemCpy(Value *Dst, Value *Src, uint64_t Size,<br class="">
+                         unsigned DstAlign, IntegerAlignment SrcAlign,<br class="">
                          bool isVolatile = false, MDNode *TBAATag = nullptr,<br class="">
                          MDNode *TBAAStructTag = nullptr,<br class="">
                          MDNode *ScopeTag = nullptr,<br class="">
                          MDNode *NoAliasTag = nullptr) {<br class="">
-    return CreateMemCpy(Dst, Src, getInt64(Size), Align, isVolatile, TBAATag,<br class="">
+    return CreateMemCpy(Dst, Src, getInt64(Size), DstAlign, SrcAlign,<br class="">
+                        isVolatile, TBAATag,<br class="">
                         TBAAStructTag, ScopeTag, NoAliasTag);<br class="">
   }<br class="">
<br class="">
-  CallInst *CreateMemCpy(Value *Dst, Value *Src, Value *Size, unsigned Align,<br class="">
+  CallInst *CreateMemCpy(Value *Dst, Value *Src, Value *Size,<br class="">
+                         unsigned DstAlign, IntegerAlignment SrcAlign,<br class="">
                          bool isVolatile = false, MDNode *TBAATag = nullptr,<br class="">
                          MDNode *TBAAStructTag = nullptr,<br class="">
                          MDNode *ScopeTag = nullptr,<br class="">
@@ -401,15 +423,18 @@ public:<br class="">
   /// If the pointers aren't i8*, they will be converted.  If a TBAA tag is<br class="">
   /// specified, it will be added to the instruction. Likewise with alias.scope<br class="">
   /// and noalias tags.<br class="">
-  CallInst *CreateMemMove(Value *Dst, Value *Src, uint64_t Size, unsigned Align,<br class="">
+  CallInst *CreateMemMove(Value *Dst, Value *Src, uint64_t Size,<br class="">
+                          unsigned DstAlign, IntegerAlignment SrcAlign,<br class="">
                           bool isVolatile = false, MDNode *TBAATag = nullptr,<br class="">
                           MDNode *ScopeTag = nullptr,<br class="">
                           MDNode *NoAliasTag = nullptr) {<br class="">
-    return CreateMemMove(Dst, Src, getInt64(Size), Align, isVolatile,<br class="">
+    return CreateMemMove(Dst, Src, getInt64(Size), DstAlign, SrcAlign,<br class="">
+                         isVolatile,<br class="">
                          TBAATag, ScopeTag, NoAliasTag);<br class="">
   }<br class="">
<br class="">
-  CallInst *CreateMemMove(Value *Dst, Value *Src, Value *Size, unsigned Align,<br class="">
+  CallInst *CreateMemMove(Value *Dst, Value *Src, Value *Size,<br class="">
+                          unsigned DstAlign, IntegerAlignment SrcAlign,<br class="">
                           bool isVolatile = false, MDNode *TBAATag = nullptr,<br class="">
                           MDNode *ScopeTag = nullptr,<br class="">
                           MDNode *NoAliasTag = nullptr);<br class="">
<br class="">
Modified: llvm/trunk/include/llvm/IR/Instructions.h<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Instructions.h?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Instructions.h?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/include/llvm/IR/Instructions.h (original)<br class="">
+++ llvm/trunk/include/llvm/IR/Instructions.h Wed Nov 18 16:17:24 2015<br class="">
@@ -1638,6 +1638,23 @@ public:<br class="">
     return AttributeList.getParamAlignment(i);<br class="">
   }<br class="">
<br class="">
+  /// Set the alignment for a call or parameter (0=unknown).<br class="">
+  void setParamAlignment(unsigned Index, unsigned Align) {<br class="">
+    // Its not valid to change the parameter alignment.  Instead we have to<br class="">
+    // remove the old one if its there, and add a new one.<br class="">
+    if (AttributeList.hasAttribute(Index, Attribute::Alignment))<br class="">
+      AttributeList = AttributeList.removeAttribute(getContext(),<br class="">
+                                                    Index,<br class="">
+                                                    Attribute::Alignment);<br class="">
+<br class="">
+    // Now add the new alignment.<br class="">
+    llvm::AttrBuilder B;<br class="">
+    B.addAlignmentAttr(Align);<br class="">
+    AttributeList = AttributeList.addAttributes(getContext(), Index,<br class="">
+                                                AttributeSet::get(getContext(),<br class="">
+                                                                  Index, B));<br class="">
+  }<br class="">
+<br class="">
   /// \brief Extract the number of dereferenceable bytes for a call or<br class="">
   /// parameter (0=unknown).<br class="">
   uint64_t getDereferenceableBytes(unsigned i) const {<br class="">
<br class="">
Modified: llvm/trunk/include/llvm/IR/IntrinsicInst.h<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/IntrinsicInst.h?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/IntrinsicInst.h?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/include/llvm/IR/IntrinsicInst.h (original)<br class="">
+++ llvm/trunk/include/llvm/IR/IntrinsicInst.h Wed Nov 18 16:17:24 2015<br class="">
@@ -150,16 +150,13 @@ namespace llvm {<br class="">
     const Use &getLengthUse() const { return getArgOperandUse(2); }<br class="">
     Use &getLengthUse() { return getArgOperandUse(2); }<br class="">
<br class="">
-    ConstantInt *getAlignmentCst() const {<br class="">
-      return cast<ConstantInt>(const_cast<Value*>(getArgOperand(3)));<br class="">
-    }<br class="">
-<br class="">
-    unsigned getAlignment() const {<br class="">
-      return getAlignmentCst()->getZExtValue();<br class="">
+    unsigned getDestAlignment() const {<br class="">
+      // Note, param attributes start at 1, so offset dest index from 0 to 1.<br class="">
+      return getParamAlignment(1);<br class="">
     }<br class="">
<br class="">
     ConstantInt *getVolatileCst() const {<br class="">
-      return cast<ConstantInt>(const_cast<Value*>(getArgOperand(4)));<br class="">
+      return cast<ConstantInt>(const_cast<Value*>(getArgOperand(3)));<br class="">
     }<br class="">
     bool isVolatile() const {<br class="">
       return !getVolatileCst()->isZero();<br class="">
@@ -188,16 +185,13 @@ namespace llvm {<br class="">
       setArgOperand(2, L);<br class="">
     }<br class="">
<br class="">
-    void setAlignment(Constant* A) {<br class="">
-      setArgOperand(3, A);<br class="">
+    void setDestAlignment(unsigned Align) {<br class="">
+      // Note, param attributes start at 1, so offset dest index from 0 to 1.<br class="">
+      setParamAlignment(1, Align);<br class="">
     }<br class="">
<br class="">
     void setVolatile(Constant* V) {<br class="">
-      setArgOperand(4, V);<br class="">
-    }<br class="">
-<br class="">
-    Type *getAlignmentType() const {<br class="">
-      return getArgOperand(3)->getType();<br class="">
+      setArgOperand(3, V);<br class="">
     }<br class="">
<br class="">
     // Methods for support type inquiry through isa, cast, and dyn_cast:<br class="">
@@ -259,12 +253,22 @@ namespace llvm {<br class="">
       return cast<PointerType>(getRawSource()->getType())->getAddressSpace();<br class="">
     }<br class="">
<br class="">
+    unsigned getSrcAlignment() const {<br class="">
+      // Note, param attributes start at 1, so offset src index from 1 to 2.<br class="">
+      return getParamAlignment(2);<br class="">
+    }<br class="">
+<br class="">
     void setSource(Value *Ptr) {<br class="">
       assert(getRawSource()->getType() == Ptr->getType() &&<br class="">
              "setSource called with pointer of wrong type!");<br class="">
       setArgOperand(1, Ptr);<br class="">
     }<br class="">
<br class="">
+    void setSrcAlignment(unsigned Align) {<br class="">
+      // Note, param attributes start at 1, so offset src index from 1 to 2.<br class="">
+      setParamAlignment(2, Align);<br class="">
+    }<br class="">
+<br class="">
     // Methods for support type inquiry through isa, cast, and dyn_cast:<br class="">
     static inline bool classof(const IntrinsicInst *I) {<br class="">
       return I->getIntrinsicID() == Intrinsic::memcpy ||<br class="">
<br class="">
Modified: llvm/trunk/include/llvm/IR/Intrinsics.td<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Intrinsics.td?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Intrinsics.td?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/include/llvm/IR/Intrinsics.td (original)<br class="">
+++ llvm/trunk/include/llvm/IR/Intrinsics.td Wed Nov 18 16:17:24 2015<br class="">
@@ -333,17 +333,17 @@ def int_instrprof_value_profile : Intrin<br class="">
<br class="">
 def int_memcpy  : Intrinsic<[],<br class="">
                              [llvm_anyptr_ty, llvm_anyptr_ty, llvm_anyint_ty,<br class="">
-                              llvm_i32_ty, llvm_i1_ty],<br class="">
+                              llvm_i1_ty],<br class="">
                             [IntrReadWriteArgMem, NoCapture<0>, NoCapture<1>,<br class="">
                              ReadOnly<1>]>;<br class="">
 def int_memmove : Intrinsic<[],<br class="">
                             [llvm_anyptr_ty, llvm_anyptr_ty, llvm_anyint_ty,<br class="">
-                             llvm_i32_ty, llvm_i1_ty],<br class="">
+                             llvm_i1_ty],<br class="">
                             [IntrReadWriteArgMem, NoCapture<0>, NoCapture<1>,<br class="">
                              ReadOnly<1>]>;<br class="">
 def int_memset  : Intrinsic<[],<br class="">
                             [llvm_anyptr_ty, llvm_i8_ty, llvm_anyint_ty,<br class="">
-                             llvm_i32_ty, llvm_i1_ty],<br class="">
+                             llvm_i1_ty],<br class="">
                             [IntrReadWriteArgMem, NoCapture<0>]>;<br class="">
<br class="">
 let Properties = [IntrNoMem] in {<br class="">
<br class="">
Modified: llvm/trunk/lib/Analysis/Lint.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/Lint.cpp?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/Lint.cpp?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/Analysis/Lint.cpp (original)<br class="">
+++ llvm/trunk/lib/Analysis/Lint.cpp Wed Nov 18 16:17:24 2015<br class="">
@@ -284,9 +284,9 @@ void Lint::visitCallSite(CallSite CS) {<br class="">
       MemCpyInst *MCI = cast<MemCpyInst>(&I);<br class="">
       // TODO: If the size is known, use it.<br class="">
       visitMemoryReference(I, MCI->getDest(), MemoryLocation::UnknownSize,<br class="">
-                           MCI->getAlignment(), nullptr, MemRef::Write);<br class="">
+                           MCI->getDestAlignment(), nullptr, MemRef::Write);<br class="">
       visitMemoryReference(I, MCI->getSource(), MemoryLocation::UnknownSize,<br class="">
-                           MCI->getAlignment(), nullptr, MemRef::Read);<br class="">
+                           MCI->getSrcAlignment(), nullptr, MemRef::Read);<br class="">
<br class="">
       // Check that the memcpy arguments don't overlap. The AliasAnalysis API<br class="">
       // isn't expressive enough for what we really want to do. Known partial<br class="">
@@ -306,16 +306,16 @@ void Lint::visitCallSite(CallSite CS) {<br class="">
       MemMoveInst *MMI = cast<MemMoveInst>(&I);<br class="">
       // TODO: If the size is known, use it.<br class="">
       visitMemoryReference(I, MMI->getDest(), MemoryLocation::UnknownSize,<br class="">
-                           MMI->getAlignment(), nullptr, MemRef::Write);<br class="">
+                           MMI->getDestAlignment(), nullptr, MemRef::Write);<br class="">
       visitMemoryReference(I, MMI->getSource(), MemoryLocation::UnknownSize,<br class="">
-                           MMI->getAlignment(), nullptr, MemRef::Read);<br class="">
+                           MMI->getSrcAlignment(), nullptr, MemRef::Read);<br class="">
       break;<br class="">
     }<br class="">
     case Intrinsic::memset: {<br class="">
       MemSetInst *MSI = cast<MemSetInst>(&I);<br class="">
       // TODO: If the size is known, use it.<br class="">
       visitMemoryReference(I, MSI->getDest(), MemoryLocation::UnknownSize,<br class="">
-                           MSI->getAlignment(), nullptr, MemRef::Write);<br class="">
+                           MSI->getDestAlignment(), nullptr, MemRef::Write);<br class="">
       break;<br class="">
     }<br class="">
<br class="">
<br class="">
Modified: llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp (original)<br class="">
+++ llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp Wed Nov 18 16:17:24 2015<br class="">
@@ -1665,8 +1665,8 @@ bool CodeGenPrepare::optimizeCallInst(Ca<br class="">
       unsigned Align = getKnownAlignment(MI->getDest(), *DL);<br class="">
       if (MemTransferInst *MTI = dyn_cast<MemTransferInst>(MI))<br class="">
         Align = std::min(Align, getKnownAlignment(MTI->getSource(), *DL));<br class="">
-      if (Align > MI->getAlignment())<br class="">
-        MI->setAlignment(ConstantInt::get(MI->getAlignmentType(), Align));<br class="">
+      if (Align > MI->getDestAlignment())<br class="">
+        MI->setDestAlignment(Align);<br class="">
     }<br class="">
   }<br class="">
<br class="">
<br class="">
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original)<br class="">
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Wed Nov 18 16:17:24 2015<br class="">
@@ -4365,69 +4365,73 @@ SelectionDAGBuilder::visitIntrinsicCall(<br class="">
   case Intrinsic::longjmp:<br class="">
     return &"_longjmp"[!TLI.usesUnderscoreLongJmp()];<br class="">
   case Intrinsic::memcpy: {<br class="">
+    const MemCpyInst &MemCpyI = cast<MemCpyInst>(I);<br class="">
     // FIXME: this definition of "user defined address space" is x86-specific<br class="">
     // Assert for address < 256 since we support only user defined address<br class="">
     // spaces.<br class="">
-    assert(cast<PointerType>(I.getArgOperand(0)->getType())->getAddressSpace()<br class="">
-           < 256 &&<br class="">
-           cast<PointerType>(I.getArgOperand(1)->getType())->getAddressSpace()<br class="">
-           < 256 &&<br class="">
+    assert(MemCpyI.getDestAddressSpace() < 256 &&<br class="">
+           MemCpyI.getSourceAddressSpace() < 256 &&<br class="">
            "Unknown address space");<br class="">
-    SDValue Op1 = getValue(I.getArgOperand(0));<br class="">
-    SDValue Op2 = getValue(I.getArgOperand(1));<br class="">
-    SDValue Op3 = getValue(I.getArgOperand(2));<br class="">
-    unsigned Align = cast<ConstantInt>(I.getArgOperand(3))->getZExtValue();<br class="">
+    SDValue Op1 = getValue(MemCpyI.getDest());<br class="">
+    SDValue Op2 = getValue(MemCpyI.getSource());<br class="">
+    SDValue Op3 = getValue(MemCpyI.getLength());<br class="">
+    // FIXME: Support passing different dest/src alignments to the memcpy<br class="">
+    // DAG node.<br class="">
+    unsigned Align = std::min(MemCpyI.getDestAlignment(),<br class="">
+                              MemCpyI.getSrcAlignment());<br class="">
     if (!Align)<br class="">
       Align = 1; // @llvm.memcpy defines 0 and 1 to both mean no alignment.<br class="">
-    bool isVol = cast<ConstantInt>(I.getArgOperand(4))->getZExtValue();<br class="">
+    bool isVol = MemCpyI.isVolatile();<br class="">
     bool isTC = I.isTailCall() && isInTailCallPosition(&I, DAG.getTarget());<br class="">
     SDValue MC = DAG.getMemcpy(getRoot(), sdl, Op1, Op2, Op3, Align, isVol,<br class="">
                                false, isTC,<br class="">
-                               MachinePointerInfo(I.getArgOperand(0)),<br class="">
-                               MachinePointerInfo(I.getArgOperand(1)));<br class="">
+                               MachinePointerInfo(MemCpyI.getDest()),<br class="">
+                               MachinePointerInfo(MemCpyI.getSource()));<br class="">
     updateDAGForMaybeTailCall(MC);<br class="">
     return nullptr;<br class="">
   }<br class="">
   case Intrinsic::memset: {<br class="">
+    const MemSetInst &MemSetI = cast<MemSetInst>(I);<br class="">
     // FIXME: this definition of "user defined address space" is x86-specific<br class="">
     // Assert for address < 256 since we support only user defined address<br class="">
     // spaces.<br class="">
-    assert(cast<PointerType>(I.getArgOperand(0)->getType())->getAddressSpace()<br class="">
-           < 256 &&<br class="">
+    assert(MemSetI.getDestAddressSpace() < 256 &&<br class="">
            "Unknown address space");<br class="">
-    SDValue Op1 = getValue(I.getArgOperand(0));<br class="">
-    SDValue Op2 = getValue(I.getArgOperand(1));<br class="">
-    SDValue Op3 = getValue(I.getArgOperand(2));<br class="">
-    unsigned Align = cast<ConstantInt>(I.getArgOperand(3))->getZExtValue();<br class="">
+    SDValue Op1 = getValue(MemSetI.getDest());<br class="">
+    SDValue Op2 = getValue(MemSetI.getValue());<br class="">
+    SDValue Op3 = getValue(MemSetI.getLength());<br class="">
+    unsigned Align = MemSetI.getDestAlignment();<br class="">
     if (!Align)<br class="">
       Align = 1; // @llvm.memset defines 0 and 1 to both mean no alignment.<br class="">
-    bool isVol = cast<ConstantInt>(I.getArgOperand(4))->getZExtValue();<br class="">
+    bool isVol = MemSetI.isVolatile();<br class="">
     bool isTC = I.isTailCall() && isInTailCallPosition(&I, DAG.getTarget());<br class="">
     SDValue MS = DAG.getMemset(getRoot(), sdl, Op1, Op2, Op3, Align, isVol,<br class="">
-                               isTC, MachinePointerInfo(I.getArgOperand(0)));<br class="">
+                               isTC, MachinePointerInfo(MemSetI.getDest()));<br class="">
     updateDAGForMaybeTailCall(MS);<br class="">
     return nullptr;<br class="">
   }<br class="">
   case Intrinsic::memmove: {<br class="">
+    const MemMoveInst &MemMoveI = cast<MemMoveInst>(I);<br class="">
     // FIXME: this definition of "user defined address space" is x86-specific<br class="">
     // Assert for address < 256 since we support only user defined address<br class="">
     // spaces.<br class="">
-    assert(cast<PointerType>(I.getArgOperand(0)->getType())->getAddressSpace()<br class="">
-           < 256 &&<br class="">
-           cast<PointerType>(I.getArgOperand(1)->getType())->getAddressSpace()<br class="">
-           < 256 &&<br class="">
+    assert(MemMoveI.getDestAddressSpace() < 256 &&<br class="">
+           MemMoveI.getSourceAddressSpace() < 256 &&<br class="">
            "Unknown address space");<br class="">
-    SDValue Op1 = getValue(I.getArgOperand(0));<br class="">
-    SDValue Op2 = getValue(I.getArgOperand(1));<br class="">
-    SDValue Op3 = getValue(I.getArgOperand(2));<br class="">
-    unsigned Align = cast<ConstantInt>(I.getArgOperand(3))->getZExtValue();<br class="">
+    SDValue Op1 = getValue(MemMoveI.getDest());<br class="">
+    SDValue Op2 = getValue(MemMoveI.getSource());<br class="">
+    SDValue Op3 = getValue(MemMoveI.getLength());<br class="">
+    // FIXME: Support passing different dest/src alignments to the memcpy<br class="">
+    // DAG node.<br class="">
+    unsigned Align = std::min(MemMoveI.getDestAlignment(),<br class="">
+                              MemMoveI.getSrcAlignment());<br class="">
     if (!Align)<br class="">
       Align = 1; // @llvm.memmove defines 0 and 1 to both mean no alignment.<br class="">
-    bool isVol = cast<ConstantInt>(I.getArgOperand(4))->getZExtValue();<br class="">
+    bool isVol = MemMoveI.isVolatile();<br class="">
     bool isTC = I.isTailCall() && isInTailCallPosition(&I, DAG.getTarget());<br class="">
     SDValue MM = DAG.getMemmove(getRoot(), sdl, Op1, Op2, Op3, Align, isVol,<br class="">
-                                isTC, MachinePointerInfo(I.getArgOperand(0)),<br class="">
-                                MachinePointerInfo(I.getArgOperand(1)));<br class="">
+                                isTC, MachinePointerInfo(MemMoveI.getDest()),<br class="">
+                                MachinePointerInfo(MemMoveI.getSource()));<br class="">
     updateDAGForMaybeTailCall(MM);<br class="">
     return nullptr;<br class="">
   }<br class="">
<br class="">
Modified: llvm/trunk/lib/IR/Attributes.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Attributes.cpp?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Attributes.cpp?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/IR/Attributes.cpp (original)<br class="">
+++ llvm/trunk/lib/IR/Attributes.cpp Wed Nov 18 16:17:24 2015<br class="">
@@ -830,11 +830,6 @@ AttributeSet AttributeSet::removeAttribu<br class="">
   if (!pImpl) return AttributeSet();<br class="">
   if (!Attrs.pImpl) return *this;<br class="">
<br class="">
-  // FIXME it is not obvious how this should work for alignment.<br class="">
-  // For now, say we can't pass in alignment, which no current use does.<br class="">
-  assert(!Attrs.hasAttribute(Index, Attribute::Alignment) &&<br class="">
-         "Attempt to change alignment!");<br class="">
-<br class="">
   // Add the attribute slots before the one we're trying to add.<br class="">
   SmallVector<AttributeSet, 4> AttrSet;<br class="">
   uint64_t NumAttrs = pImpl->getNumAttributes();<br class="">
<br class="">
Modified: llvm/trunk/lib/IR/AutoUpgrade.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/AutoUpgrade.cpp?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/AutoUpgrade.cpp?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/IR/AutoUpgrade.cpp (original)<br class="">
+++ llvm/trunk/lib/IR/AutoUpgrade.cpp Wed Nov 18 16:17:24 2015<br class="">
@@ -144,6 +144,36 @@ static bool UpgradeIntrinsicFunction1(Fu<br class="">
     }<br class="">
     break;<br class="">
   }<br class="">
+  case 'm': {<br class="">
+    if (Name.startswith("memcpy.") && F->arg_size() == 5) {<br class="">
+      F->setName(Name + ".old");<br class="">
+      // Get the types of dest, src, and len.<br class="">
+      ArrayRef<Type *> ParamTypes = F->getFunctionType()->params().slice(0, 3);<br class="">
+      NewFn = Intrinsic::getDeclaration(F->getParent(), Intrinsic::memcpy,<br class="">
+                                        ParamTypes);<br class="">
+      return true;<br class="">
+    }<br class="">
+    if (Name.startswith("memmove.") && F->arg_size() == 5) {<br class="">
+      F->setName(Name + ".old");<br class="">
+      // Get the types of dest, src, and len.<br class="">
+      ArrayRef<Type *> ParamTypes = F->getFunctionType()->params().slice(0, 3);<br class="">
+      NewFn = Intrinsic::getDeclaration(F->getParent(), Intrinsic::memmove,<br class="">
+                                        ParamTypes);<br class="">
+      return true;<br class="">
+    }<br class="">
+    if (Name.startswith("memset.") && F->arg_size() == 5) {<br class="">
+      F->setName(Name + ".old");<br class="">
+      // Get the types of dest and len.<br class="">
+      Type *ParamTypes[2] = {<br class="">
+        F->getFunctionType()->getParamType(0),<br class="">
+        F->getFunctionType()->getParamType(2)<br class="">
+      };<br class="">
+      NewFn = Intrinsic::getDeclaration(F->getParent(), Intrinsic::memset,<br class="">
+                                        ParamTypes);<br class="">
+      return true;<br class="">
+    }<br class="">
+    break;<br class="">
+  }<br class="">
<br class="">
   case 'o':<br class="">
     // We only need to change the name to match the mangling including the<br class="">
@@ -727,6 +757,31 @@ void llvm::UpgradeIntrinsicCall(CallInst<br class="">
     CI->eraseFromParent();<br class="">
     return;<br class="">
<br class="">
+  case Intrinsic::memcpy:<br class="">
+  case Intrinsic::memmove:<br class="">
+  case Intrinsic::memset: {<br class="">
+    // Remove alignment argument (3), and add alignment attributes to the<br class="">
+    // dest/src pointers.<br class="">
+    Value *Args[4] = {<br class="">
+      CI->getArgOperand(0),<br class="">
+      CI->getArgOperand(1),<br class="">
+      CI->getArgOperand(2),<br class="">
+      CI->getArgOperand(4)<br class="">
+    };<br class="">
+    auto *MemCI = cast<MemIntrinsic>(Builder.CreateCall(NewFn, Args, Name));<br class="">
+<br class="">
+    // All mem intrinsics support dest alignment.<br class="">
+    const ConstantInt *Align = cast<ConstantInt>(CI->getArgOperand(3));<br class="">
+    MemCI->setDestAlignment(Align->getZExtValue());<br class="">
+<br class="">
+    // Memcpy/Memmove also support source alignment.<br class="">
+    if (auto *MemTransferI = dyn_cast<MemTransferInst>(MemCI))<br class="">
+      MemTransferI->setSrcAlignment(Align->getZExtValue());<br class="">
+    CI->replaceAllUsesWith(MemCI);<br class="">
+    CI->eraseFromParent();<br class="">
+    return;<br class="">
+  }<br class="">
+<br class="">
   case Intrinsic::objectsize:<br class="">
     CI->replaceAllUsesWith(Builder.CreateCall(<br class="">
         NewFn, {CI->getArgOperand(0), CI->getArgOperand(1)}, Name));<br class="">
<br class="">
Modified: llvm/trunk/lib/IR/IRBuilder.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/IRBuilder.cpp?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/IRBuilder.cpp?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/IR/IRBuilder.cpp (original)<br class="">
+++ llvm/trunk/lib/IR/IRBuilder.cpp Wed Nov 18 16:17:24 2015<br class="">
@@ -15,6 +15,7 @@<br class="">
 #include "llvm/IR/Function.h"<br class="">
 #include "llvm/IR/GlobalVariable.h"<br class="">
 #include "llvm/IR/IRBuilder.h"<br class="">
+#include "llvm/IR/IntrinsicInst.h"<br class="">
 #include "llvm/IR/Intrinsics.h"<br class="">
 #include "llvm/IR/LLVMContext.h"<br class="">
 #include "llvm/IR/Statepoint.h"<br class="">
@@ -79,11 +80,11 @@ static InvokeInst *createInvokeHelper(Va<br class="">
 }<br class="">
<br class="">
 CallInst *IRBuilderBase::<br class="">
-CreateMemSet(Value *Ptr, Value *Val, Value *Size, unsigned Align,<br class="">
+CreateMemSet(Value *Ptr, Value *Val, Value *Size, unsigned DstAlign,<br class="">
              bool isVolatile, MDNode *TBAATag, MDNode *ScopeTag,<br class="">
              MDNode *NoAliasTag) {<br class="">
   Ptr = getCastedInt8PtrValue(Ptr);<br class="">
-  Value *Ops[] = { Ptr, Val, Size, getInt32(Align), getInt1(isVolatile) };<br class="">
+  Value *Ops[] = { Ptr, Val, Size, getInt1(isVolatile) };<br class="">
   Type *Tys[] = { Ptr->getType(), Size->getType() };<br class="">
   Module *M = BB->getParent()->getParent();<br class="">
   Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memset, Tys);<br class="">
@@ -99,18 +100,21 @@ CreateMemSet(Value *Ptr, Value *Val, Val<br class="">
<br class="">
   if (NoAliasTag)<br class="">
     CI->setMetadata(LLVMContext::MD_noalias, NoAliasTag);<br class="">
+<br class="">
+  cast<MemSetInst>(CI)->setDestAlignment(DstAlign);<br class="">
<br class="">
   return CI;<br class="">
 }<br class="">
<br class="">
 CallInst *IRBuilderBase::<br class="">
-CreateMemCpy(Value *Dst, Value *Src, Value *Size, unsigned Align,<br class="">
+CreateMemCpy(Value *Dst, Value *Src, Value *Size, unsigned DstAlign,<br class="">
+             IntegerAlignment SrcAlign,<br class="">
              bool isVolatile, MDNode *TBAATag, MDNode *TBAAStructTag,<br class="">
              MDNode *ScopeTag, MDNode *NoAliasTag) {<br class="">
   Dst = getCastedInt8PtrValue(Dst);<br class="">
   Src = getCastedInt8PtrValue(Src);<br class="">
<br class="">
-  Value *Ops[] = { Dst, Src, Size, getInt32(Align), getInt1(isVolatile) };<br class="">
+  Value *Ops[] = { Dst, Src, Size, getInt1(isVolatile) };<br class="">
   Type *Tys[] = { Dst->getType(), Src->getType(), Size->getType() };<br class="">
   Module *M = BB->getParent()->getParent();<br class="">
   Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memcpy, Tys);<br class="">
@@ -130,18 +134,23 @@ CreateMemCpy(Value *Dst, Value *Src, Val<br class="">
<br class="">
   if (NoAliasTag)<br class="">
     CI->setMetadata(LLVMContext::MD_noalias, NoAliasTag);<br class="">
+<br class="">
+  auto *MCI = cast<MemCpyInst>(CI);<br class="">
+  MCI->setDestAlignment(DstAlign);<br class="">
+  MCI->setSrcAlignment(SrcAlign);<br class="">
<br class="">
   return CI;<br class="">
 }<br class="">
<br class="">
 CallInst *IRBuilderBase::<br class="">
-CreateMemMove(Value *Dst, Value *Src, Value *Size, unsigned Align,<br class="">
+CreateMemMove(Value *Dst, Value *Src, Value *Size, unsigned DstAlign,<br class="">
+              IntegerAlignment SrcAlign,<br class="">
               bool isVolatile, MDNode *TBAATag, MDNode *ScopeTag,<br class="">
               MDNode *NoAliasTag) {<br class="">
   Dst = getCastedInt8PtrValue(Dst);<br class="">
   Src = getCastedInt8PtrValue(Src);<br class="">
<br class="">
-  Value *Ops[] = { Dst, Src, Size, getInt32(Align), getInt1(isVolatile) };<br class="">
+  Value *Ops[] = { Dst, Src, Size, getInt1(isVolatile) };<br class="">
   Type *Tys[] = { Dst->getType(), Src->getType(), Size->getType() };<br class="">
   Module *M = BB->getParent()->getParent();<br class="">
   Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memmove, Tys);<br class="">
@@ -157,6 +166,10 @@ CreateMemMove(Value *Dst, Value *Src, Va<br class="">
<br class="">
   if (NoAliasTag)<br class="">
     CI->setMetadata(LLVMContext::MD_noalias, NoAliasTag);<br class="">
+<br class="">
+  auto *MMI = cast<MemMoveInst>(CI);<br class="">
+  MMI->setDestAlignment(DstAlign);<br class="">
+  MMI->setSrcAlignment(SrcAlign);<br class="">
<br class="">
   return CI;<br class="">
 }<br class="">
<br class="">
Modified: llvm/trunk/lib/IR/Verifier.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Verifier.cpp?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Verifier.cpp?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/IR/Verifier.cpp (original)<br class="">
+++ llvm/trunk/lib/IR/Verifier.cpp Wed Nov 18 16:17:24 2015<br class="">
@@ -3511,7 +3511,7 @@ void Verifier::visitIntrinsicCallSite(In<br class="">
     const APInt &AlignVal = AlignCI->getValue();<br class="">
     Assert(AlignCI->isZero() || AlignVal.isPowerOf2(),<br class="">
            "alignment argument of memory intrinsics must be a power of 2", CS);<br class="">
-    Assert(isa<ConstantInt>(CS.getArgOperand(4)),<br class="">
+    Assert(isa<ConstantInt>(CS.getArgOperand(3)),<br class="">
            "isvolatile argument of memory intrinsics must be a constant int",<br class="">
            CS);<br class="">
     break;<br class="">
<br class="">
Modified: llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp (original)<br class="">
+++ llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp Wed Nov 18 16:17:24 2015<br class="">
@@ -3379,7 +3379,8 @@ bool AArch64FastISel::fastLowerIntrinsic<br class="">
       // Small memcpy's are common enough that we want to do them without a call<br class="">
       // if possible.<br class="">
       uint64_t Len = cast<ConstantInt>(MTI->getLength())->getZExtValue();<br class="">
-      unsigned Alignment = MTI->getAlignment();<br class="">
+      unsigned Alignment = std::min(MTI->getDestAlignment(),<br class="">
+                                    MTI->getSrcAlignment());<br class="">
       if (isMemCpySmall(Len, Alignment)) {<br class="">
         Address Dest, Src;<br class="">
         if (!computeAddress(MTI->getRawDest(), Dest) ||<br class="">
@@ -3399,7 +3400,7 @@ bool AArch64FastISel::fastLowerIntrinsic<br class="">
       return false;<br class="">
<br class="">
     const char *IntrMemName = isa<MemCpyInst>(II) ? "memcpy" : "memmove";<br class="">
-    return lowerCallTo(II, IntrMemName, II->getNumArgOperands() - 2);<br class="">
+    return lowerCallTo(II, IntrMemName, II->getNumArgOperands() - 1);<br class="">
   }<br class="">
   case Intrinsic::memset: {<br class="">
     const MemSetInst *MSI = cast<MemSetInst>(II);<br class="">
@@ -3415,7 +3416,7 @@ bool AArch64FastISel::fastLowerIntrinsic<br class="">
       // address spaces.<br class="">
       return false;<br class="">
<br class="">
-    return lowerCallTo(II, "memset", II->getNumArgOperands() - 2);<br class="">
+    return lowerCallTo(II, "memset", II->getNumArgOperands() - 1);<br class="">
   }<br class="">
   case Intrinsic::sin:<br class="">
   case Intrinsic::cos:<br class="">
<br class="">
Modified: llvm/trunk/lib/Target/AMDGPU/AMDGPUPromoteAlloca.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/AMDGPUPromoteAlloca.cpp?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/AMDGPUPromoteAlloca.cpp?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/Target/AMDGPU/AMDGPUPromoteAlloca.cpp (original)<br class="">
+++ llvm/trunk/lib/Target/AMDGPU/AMDGPUPromoteAlloca.cpp Wed Nov 18 16:17:24 2015<br class="">
@@ -400,15 +400,15 @@ void AMDGPUPromoteAlloca::visitAlloca(Al<br class="">
     case Intrinsic::memcpy: {<br class="">
       MemCpyInst *MemCpy = cast<MemCpyInst>(Intr);<br class="">
       Builder.CreateMemCpy(MemCpy->getRawDest(), MemCpy->getRawSource(),<br class="">
-                           MemCpy->getLength(), MemCpy->getAlignment(),<br class="">
-                           MemCpy->isVolatile());<br class="">
+                           MemCpy->getLength(), MemCpy->getDestAlignment(),<br class="">
+                           MemCpy->getSrcAlignment(), MemCpy->isVolatile());<br class="">
       Intr->eraseFromParent();<br class="">
       continue;<br class="">
     }<br class="">
     case Intrinsic::memset: {<br class="">
       MemSetInst *MemSet = cast<MemSetInst>(Intr);<br class="">
       Builder.CreateMemSet(MemSet->getRawDest(), MemSet->getValue(),<br class="">
-                           MemSet->getLength(), MemSet->getAlignment(),<br class="">
+                           MemSet->getLength(), MemSet->getDestAlignment(),<br class="">
                            MemSet->isVolatile());<br class="">
       Intr->eraseFromParent();<br class="">
       continue;<br class="">
<br class="">
Modified: llvm/trunk/lib/Target/ARM/ARMFastISel.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMFastISel.cpp?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMFastISel.cpp?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/Target/ARM/ARMFastISel.cpp (original)<br class="">
+++ llvm/trunk/lib/Target/ARM/ARMFastISel.cpp Wed Nov 18 16:17:24 2015<br class="">
@@ -2328,8 +2328,8 @@ bool ARMFastISel::SelectCall(const Instr<br class="">
   for (ImmutableCallSite::arg_iterator i = CS.arg_begin(), e = CS.arg_end();<br class="">
        i != e; ++i) {<br class="">
     // If we're lowering a memory intrinsic instead of a regular call, skip the<br class="">
-    // last two arguments, which shouldn't be passed to the underlying function.<br class="">
-    if (IntrMemName && e-i <= 2)<br class="">
+    // last argument, which shouldn't be passed to the underlying function.<br class="">
+    if (IntrMemName && e-i <= 1)<br class="">
       break;<br class="">
<br class="">
     ISD::ArgFlagsTy Flags;<br class="">
@@ -2527,7 +2527,8 @@ bool ARMFastISel::SelectIntrinsicCall(co<br class="">
         if (!ARMComputeAddress(MTI.getRawDest(), Dest) ||<br class="">
             !ARMComputeAddress(MTI.getRawSource(), Src))<br class="">
           return false;<br class="">
-        unsigned Alignment = MTI.getAlignment();<br class="">
+        unsigned Alignment = std::min(MTI.getDestAlignment(),<br class="">
+                                      MTI.getSrcAlignment());<br class="">
         if (ARMTryEmitSmallMemCpy(Dest, Src, Len, Alignment))<br class="">
           return true;<br class="">
       }<br class="">
<br class="">
Modified: llvm/trunk/lib/Target/Mips/MipsFastISel.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsFastISel.cpp?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsFastISel.cpp?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/Target/Mips/MipsFastISel.cpp (original)<br class="">
+++ llvm/trunk/lib/Target/Mips/MipsFastISel.cpp Wed Nov 18 16:17:24 2015<br class="">
@@ -1403,7 +1403,7 @@ bool MipsFastISel::fastLowerIntrinsicCal<br class="">
     if (!MTI->getLength()->getType()->isIntegerTy(32))<br class="">
       return false;<br class="">
     const char *IntrMemName = isa<MemCpyInst>(II) ? "memcpy" : "memmove";<br class="">
-    return lowerCallTo(II, IntrMemName, II->getNumArgOperands() - 2);<br class="">
+    return lowerCallTo(II, IntrMemName, II->getNumArgOperands() - 1);<br class="">
   }<br class="">
   case Intrinsic::memset: {<br class="">
     const MemSetInst *MSI = cast<MemSetInst>(II);<br class="">
@@ -1412,7 +1412,7 @@ bool MipsFastISel::fastLowerIntrinsicCal<br class="">
       return false;<br class="">
     if (!MSI->getLength()->getType()->isIntegerTy(32))<br class="">
       return false;<br class="">
-    return lowerCallTo(II, "memset", II->getNumArgOperands() - 2);<br class="">
+    return lowerCallTo(II, "memset", II->getNumArgOperands() - 1);<br class="">
   }<br class="">
   }<br class="">
   return false;<br class="">
<br class="">
Modified: llvm/trunk/lib/Target/X86/X86FastISel.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FastISel.cpp?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FastISel.cpp?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/Target/X86/X86FastISel.cpp (original)<br class="">
+++ llvm/trunk/lib/Target/X86/X86FastISel.cpp Wed Nov 18 16:17:24 2015<br class="">
@@ -2409,7 +2409,7 @@ bool X86FastISel::fastLowerIntrinsicCall<br class="">
     if (MCI->getSourceAddressSpace() > 255 || MCI->getDestAddressSpace() > 255)<br class="">
       return false;<br class="">
<br class="">
-    return lowerCallTo(II, "memcpy", II->getNumArgOperands() - 2);<br class="">
+    return lowerCallTo(II, "memcpy", II->getNumArgOperands() - 1);<br class="">
   }<br class="">
   case Intrinsic::memset: {<br class="">
     const MemSetInst *MSI = cast<MemSetInst>(II);<br class="">
@@ -2424,7 +2424,7 @@ bool X86FastISel::fastLowerIntrinsicCall<br class="">
     if (MSI->getDestAddressSpace() > 255)<br class="">
       return false;<br class="">
<br class="">
-    return lowerCallTo(II, "memset", II->getNumArgOperands() - 2);<br class="">
+    return lowerCallTo(II, "memset", II->getNumArgOperands() - 1);<br class="">
   }<br class="">
   case Intrinsic::stackprotector: {<br class="">
     // Emit code to store the stack guard onto the stack.<br class="">
<br class="">
Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp (original)<br class="">
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp Wed Nov 18 16:17:24 2015<br class="">
@@ -60,14 +60,18 @@ static Type *reduceToSingleValueType(Typ<br class="">
   return T;<br class="">
 }<br class="">
<br class="">
-Instruction *InstCombiner::SimplifyMemTransfer(MemIntrinsic *MI) {<br class="">
+Instruction *InstCombiner::SimplifyMemTransfer(MemTransferInst *MI) {<br class="">
   unsigned DstAlign = getKnownAlignment(MI->getArgOperand(0), DL, MI, AC, DT);<br class="">
   unsigned SrcAlign = getKnownAlignment(MI->getArgOperand(1), DL, MI, AC, DT);<br class="">
-  unsigned MinAlign = std::min(DstAlign, SrcAlign);<br class="">
-  unsigned CopyAlign = MI->getAlignment();<br class="">
+  unsigned CopyDestAlign = MI->getDestAlignment();<br class="">
+  unsigned CopySrcAlign = MI->getSrcAlignment();<br class="">
<br class="">
-  if (CopyAlign < MinAlign) {<br class="">
-    MI->setAlignment(ConstantInt::get(MI->getAlignmentType(), MinAlign, false));<br class="">
+  if (CopyDestAlign < DstAlign) {<br class="">
+    MI->setDestAlignment(DstAlign);<br class="">
+    return MI;<br class="">
+  }<br class="">
+  if (CopySrcAlign < SrcAlign) {<br class="">
+    MI->setSrcAlignment(SrcAlign);<br class="">
     return MI;<br class="">
   }<br class="">
<br class="">
@@ -135,8 +139,8 @@ Instruction *InstCombiner::SimplifyMemTr<br class="">
<br class="">
   // If the memcpy/memmove provides better alignment info than we can<br class="">
   // infer, use it.<br class="">
-  SrcAlign = std::max(SrcAlign, CopyAlign);<br class="">
-  DstAlign = std::max(DstAlign, CopyAlign);<br class="">
+  SrcAlign = std::max(SrcAlign, CopySrcAlign);<br class="">
+  DstAlign = std::max(DstAlign, CopyDestAlign);<br class="">
<br class="">
   Value *Src = Builder->CreateBitCast(MI->getArgOperand(1), NewSrcPtrTy);<br class="">
   Value *Dest = Builder->CreateBitCast(MI->getArgOperand(0), NewDstPtrTy);<br class="">
@@ -156,9 +160,8 @@ Instruction *InstCombiner::SimplifyMemTr<br class="">
<br class="">
 Instruction *InstCombiner::SimplifyMemSet(MemSetInst *MI) {<br class="">
   unsigned Alignment = getKnownAlignment(MI->getDest(), DL, MI, AC, DT);<br class="">
-  if (MI->getAlignment() < Alignment) {<br class="">
-    MI->setAlignment(ConstantInt::get(MI->getAlignmentType(),<br class="">
-                                             Alignment, false));<br class="">
+  if (MI->getDestAlignment() < Alignment) {<br class="">
+    MI->setDestAlignment(Alignment);<br class="">
     return MI;<br class="">
   }<br class="">
<br class="">
@@ -168,7 +171,7 @@ Instruction *InstCombiner::SimplifyMemSe<br class="">
   if (!LenC || !FillC || !FillC->getType()->isIntegerTy(8))<br class="">
     return nullptr;<br class="">
   uint64_t Len = LenC->getLimitedValue();<br class="">
-  Alignment = MI->getAlignment();<br class="">
+  Alignment = MI->getDestAlignment();<br class="">
   assert(Len && "0-sized memory setting should be removed already.");<br class="">
<br class="">
   // memset(s,c,n) -> store s, c (for n=1,2,4,8)<br class="">
@@ -743,8 +746,8 @@ Instruction *InstCombiner::visitCallInst<br class="">
<br class="">
     // If we can determine a pointer alignment that is bigger than currently<br class="">
     // set, update the alignment.<br class="">
-    if (isa<MemTransferInst>(MI)) {<br class="">
-      if (Instruction *I = SimplifyMemTransfer(MI))<br class="">
+    if (auto *MTI = dyn_cast<MemTransferInst>(MI)) {<br class="">
+      if (Instruction *I = SimplifyMemTransfer(MTI))<br class="">
         return I;<br class="">
     } else if (MemSetInst *MSI = dyn_cast<MemSetInst>(MI)) {<br class="">
       if (Instruction *I = SimplifyMemSet(MSI))<br class="">
<br class="">
Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineInternal.h<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineInternal.h?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineInternal.h?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineInternal.h (original)<br class="">
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineInternal.h Wed Nov 18 16:17:24 2015<br class="">
@@ -558,7 +558,7 @@ private:<br class="">
   Instruction *PromoteCastOfAllocation(BitCastInst &CI, AllocaInst &AI);<br class="">
   Instruction *MatchBSwap(BinaryOperator &I);<br class="">
   bool SimplifyStoreAtEndOfBlock(StoreInst &SI);<br class="">
-  Instruction *SimplifyMemTransfer(MemIntrinsic *MI);<br class="">
+  Instruction *SimplifyMemTransfer(MemTransferInst *MI);<br class="">
   Instruction *SimplifyMemSet(MemSetInst *MI);<br class="">
<br class="">
   Value *EvaluateInDifferentType(Value *V, Type *Ty, bool isSigned);<br class="">
<br class="">
Modified: llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp (original)<br class="">
+++ llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp Wed Nov 18 16:17:24 2015<br class="">
@@ -1356,20 +1356,21 @@ void DFSanVisitor::visitMemTransferInst(<br class="">
   Value *LenShadow = IRB.CreateMul(<br class="">
       I.getLength(),<br class="">
       ConstantInt::get(I.getLength()->getType(), DFSF.DFS.ShadowWidth / 8));<br class="">
-  Value *AlignShadow;<br class="">
-  if (ClPreserveAlignment) {<br class="">
-    AlignShadow = IRB.CreateMul(I.getAlignmentCst(),<br class="">
-                                ConstantInt::get(I.getAlignmentCst()->getType(),<br class="">
-                                                 DFSF.DFS.ShadowWidth / 8));<br class="">
-  } else {<br class="">
-    AlignShadow = ConstantInt::get(I.getAlignmentCst()->getType(),<br class="">
-                                   DFSF.DFS.ShadowWidth / 8);<br class="">
-  }<br class="">
   Type *Int8Ptr = Type::getInt8PtrTy(*DFSF.DFS.Ctx);<br class="">
   DestShadow = IRB.CreateBitCast(DestShadow, Int8Ptr);<br class="">
   SrcShadow = IRB.CreateBitCast(SrcShadow, Int8Ptr);<br class="">
-  IRB.CreateCall(I.getCalledValue(), {DestShadow, SrcShadow, LenShadow,<br class="">
-                                      AlignShadow, I.getVolatileCst()});<br class="">
+  auto *MTI = cast<MemTransferInst>(IRB.CreateCall(I.getCalledValue(),<br class="">
+                                                   { DestShadow, SrcShadow,<br class="">
+                                                     LenShadow,<br class="">
+                                                     I.getVolatileCst() }));<br class="">
+<br class="">
+  if (ClPreserveAlignment) {<br class="">
+    MTI->setDestAlignment(I.getDestAlignment() * (DFSF.DFS.ShadowWidth / 8));<br class="">
+    MTI->setSrcAlignment(I.getSrcAlignment() * (DFSF.DFS.ShadowWidth / 8));<br class="">
+  } else {<br class="">
+    MTI->setDestAlignment(DFSF.DFS.ShadowWidth / 8);<br class="">
+    MTI->setSrcAlignment(DFSF.DFS.ShadowWidth / 8);<br class="">
+  }<br class="">
 }<br class="">
<br class="">
 void DFSanVisitor::visitReturnInst(ReturnInst &RI) {<br class="">
<br class="">
Modified: llvm/trunk/lib/Transforms/Instrumentation/MemorySanitizer.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/MemorySanitizer.cpp?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/MemorySanitizer.cpp?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/Transforms/Instrumentation/MemorySanitizer.cpp (original)<br class="">
+++ llvm/trunk/lib/Transforms/Instrumentation/MemorySanitizer.cpp Wed Nov 18 16:17:24 2015<br class="">
@@ -1117,7 +1117,7 @@ struct MemorySanitizerVisitor : public I<br class="">
               unsigned CopyAlign = std::min(ArgAlign, kShadowTLSAlignment);<br class="">
               Value *Cpy = EntryIRB.CreateMemCpy(<br class="">
                   getShadowPtr(V, EntryIRB.getInt8Ty(), EntryIRB), Base, Size,<br class="">
-                  CopyAlign);<br class="">
+                  CopyAlign, CopyAlign);<br class="">
               DEBUG(dbgs() << "  ByValCpy: " << *Cpy << "\n");<br class="">
               (void)Cpy;<br class="">
             }<br class="">
@@ -2482,7 +2482,7 @@ struct MemorySanitizerVisitor : public I<br class="">
         unsigned Alignment = std::min(ParamAlignment, kShadowTLSAlignment);<br class="">
         Store = IRB.CreateMemCpy(ArgShadowBase,<br class="">
                                  getShadowPtr(A, Type::getInt8Ty(*MS.C), IRB),<br class="">
-                                 Size, Alignment);<br class="">
+                                 Size, Alignment, Alignment);<br class="">
       } else {<br class="">
         Size = DL.getTypeAllocSize(A->getType());<br class="">
         if (ArgOffset + Size > kParamTLSSize) break;<br class="">
@@ -2834,7 +2834,7 @@ struct VarArgAMD64Helper : public VarArg<br class="">
         Value *Base = getShadowPtrForVAArgument(RealTy, IRB, OverflowOffset);<br class="">
         OverflowOffset += RoundUpToAlignment(ArgSize, 8);<br class="">
         IRB.CreateMemCpy(Base, MSV.getShadowPtr(A, IRB.getInt8Ty(), IRB),<br class="">
-                         ArgSize, kShadowTLSAlignment);<br class="">
+                         ArgSize, kShadowTLSAlignment, kShadowTLSAlignment);<br class="">
       } else {<br class="">
         ArgKind AK = classifyArgument(A);<br class="">
         if (AK == AK_GeneralPurpose && GpOffset >= AMD64GpEndOffset)<br class="">
@@ -2912,7 +2912,7 @@ struct VarArgAMD64Helper : public VarArg<br class="">
         IRB.CreateAdd(ConstantInt::get(MS.IntptrTy, AMD64FpEndOffset),<br class="">
                       VAArgOverflowSize);<br class="">
       VAArgTLSCopy = IRB.CreateAlloca(Type::getInt8Ty(*MS.C), CopySize);<br class="">
-      IRB.CreateMemCpy(VAArgTLSCopy, MS.VAArgTLS, CopySize, 8);<br class="">
+      IRB.CreateMemCpy(VAArgTLSCopy, MS.VAArgTLS, CopySize, 8, 8);<br class="">
     }<br class="">
<br class="">
     // Instrument va_start.<br class="">
@@ -2931,7 +2931,7 @@ struct VarArgAMD64Helper : public VarArg<br class="">
       Value *RegSaveAreaShadowPtr =<br class="">
         MSV.getShadowPtr(RegSaveAreaPtr, IRB.getInt8Ty(), IRB);<br class="">
       IRB.CreateMemCpy(RegSaveAreaShadowPtr, VAArgTLSCopy,<br class="">
-                       AMD64FpEndOffset, 16);<br class="">
+                       AMD64FpEndOffset, 16, 16);<br class="">
<br class="">
       Value *OverflowArgAreaPtrPtr =<br class="">
         IRB.CreateIntToPtr(<br class="">
@@ -2943,7 +2943,8 @@ struct VarArgAMD64Helper : public VarArg<br class="">
         MSV.getShadowPtr(OverflowArgAreaPtr, IRB.getInt8Ty(), IRB);<br class="">
       Value *SrcPtr = IRB.CreateConstGEP1_32(IRB.getInt8Ty(), VAArgTLSCopy,<br class="">
                                              AMD64FpEndOffset);<br class="">
-      IRB.CreateMemCpy(OverflowArgAreaShadowPtr, SrcPtr, VAArgOverflowSize, 16);<br class="">
+      IRB.CreateMemCpy(OverflowArgAreaShadowPtr, SrcPtr, VAArgOverflowSize,<br class="">
+                       16, 16);<br class="">
     }<br class="">
   }<br class="">
 };<br class="">
@@ -3029,7 +3030,7 @@ struct VarArgMIPS64Helper : public VarAr<br class="">
       // If there is a va_start in this function, make a backup copy of<br class="">
       // va_arg_tls somewhere in the function entry block.<br class="">
       VAArgTLSCopy = IRB.CreateAlloca(Type::getInt8Ty(*MS.C), CopySize);<br class="">
-      IRB.CreateMemCpy(VAArgTLSCopy, MS.VAArgTLS, CopySize, 8);<br class="">
+      IRB.CreateMemCpy(VAArgTLSCopy, MS.VAArgTLS, CopySize, 8, 8);<br class="">
     }<br class="">
<br class="">
     // Instrument va_start.<br class="">
@@ -3044,7 +3045,7 @@ struct VarArgMIPS64Helper : public VarAr<br class="">
       Value *RegSaveAreaPtr = IRB.CreateLoad(RegSaveAreaPtrPtr);<br class="">
       Value *RegSaveAreaShadowPtr =<br class="">
       MSV.getShadowPtr(RegSaveAreaPtr, IRB.getInt8Ty(), IRB);<br class="">
-      IRB.CreateMemCpy(RegSaveAreaShadowPtr, VAArgTLSCopy, CopySize, 8);<br class="">
+      IRB.CreateMemCpy(RegSaveAreaShadowPtr, VAArgTLSCopy, CopySize, 8, 8);<br class="">
     }<br class="">
   }<br class="">
 };<br class="">
<br class="">
Modified: llvm/trunk/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp?rev=253511&r1=253510&r2=253511&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp?rev=253511&r1=253510&r2=253511&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp (original)<br class="">
+++ llvm/trunk/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp Wed Nov 18 16:17:24 2015<br class="">
@@ -347,6 +347,8 @@ bool AlignmentFromAssumptions::processAs<br class="">
       // instruction, but only for one operand, save it. If we reach the<br class="">
       // other operand through another assumption later, then we may<br class="">
       // change the alignment at that point.<br class="">
+      // FIXME: The above statement is no longer true.  Fix the code below<br class="">
+      // to be able to reason about different dest/src alignments.<br class="">
       if (MemTransferInst *MTI = dyn_cast<MemTransferInst>(MI)) {<br class="">
         unsigned NewSrcAlignment = getNewAlignment(AASCEV, AlignSCEV, OffSCEV,<br class="">
           MTI->getSource(), SE);<br class="">
@@ -376,20 +378,23 @@ bool AlignmentFromAssumptions::processAs<br class="">
         if (AltSrcAlignment <= std::max(NewDestAlignment, AltDestAlignment))<br class="">
           NewAlignment = std::max(NewAlignment, AltSrcAlignment);<br class="">
<br class="">
-        if (NewAlignment > MI->getAlign</blockquote></div>
</div></blockquote></div><br class=""></div></body></html>