[PATCH] D150970: [MemCpyOpt] Use memcpy source directly if dest is known to be immutable from attributes

Kohei Asano via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 7 06:25:59 PDT 2023


khei4 marked an inline comment as done.
khei4 added inline comments.


================
Comment at: llvm/test/Transforms/MemCpyOpt/memcpy.ll:527
   ret void
 }
 
----------------
nikic wrote:
> khei4 wrote:
> > nikic wrote:
> > > We're missing a test where the alignment can be enforced. For that you want to copy from another alloca with lower alignment, and the alignment will be increased by the transform.
> > Sorry, I'm not sure how this could be. I now found that MemDepAlign is just memcpy's arguments alignment attributes value, so basically enforcing from parameter attributes works, but I couldn't find the way to enforce lower alignment actually!
> > (I might too naive, but I tried for example, 
> > ```
> > @g = global ptr null, align 4
> > 
> > define void @immut_param_enforced_alignment(ptr align 16 noalias %val) {
> >   %val1 = alloca i8, align 16
> >   store ptr %val, ptr @g
> >   %p = load ptr, ptr @g
> >   call void @llvm.memcpy.p0.p0.i64(ptr align 16 %val1, ptr %p, i64 1, i1 false)
> >   call void @f(ptr nocapture noalias readonly %val1)
> >   ret void
> > }
> > ```
> > this can't enforce the alignment.)
> > 
> I believe you need something like this:
> ```
> define void @test() {
>   %val = alloca i8, align 1
>   store i32 42, ptr %val
>   %val1 = alloca i8, align 4
>   call void @llvm.memcpy.p0.p0.i64(ptr %val1, ptr %val, i64 1, i1 false)
>   call void @f_full_readonly(ptr %val1)
>   ret void
> }
> ```
> Here the `align 1` on the first alloca will be changed to `align 4` by the transform.
Thank you! Now I see DataLayout specify the alignment for stored types!


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

https://reviews.llvm.org/D150970



More information about the llvm-commits mailing list