[PATCH] D108221: [LoopIdiom] Keep TBAA when creating memcpy/memmove

William Moses via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 3 17:40:12 PDT 2021


wsmoses added a comment.

> Hmm.. what does it mean to have a `!tbaa` tag on a `llvm.memcpy`/`llvm.memmove` ? The langref only seem to mention `!tbaa.struct` for `llvm.memcpy`. Is it allowed to have both a `!tbaa` and a `!tbaa.struct` ? What would that mean ?

I presume it's used to mark that the (src and dst) pointer have the aliasing properties of the given TBAA metadata for the entire range. I'm not sure about the lang ref, but it does appear that regular TBAA occurs on memcpy throughout the test suite.

  wmoses at beast:/mnt/sabrent/wmoses/llvm-main/llvm/test ((HEAD detached from origin/main)) $ git grep "memcpy.*tbaa"
  Analysis/TypeBasedAliasAnalysis/functionattrs.ll:  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %p, i8* %q, i64 %n, i1 false), !tbaa !1
  Analysis/TypeBasedAliasAnalysis/functionattrs.ll:  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %p, i8* %q, i64 %n, i1 false), !tbaa !2
  Analysis/TypeBasedAliasAnalysis/memcpyopt.ll:; CHECK-NEXT: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* noundef nonnull align 1 dereferenceable(16) %p, i8* noundef nonnull align 1 dereferenceable(16) %q, i64 16, i1 false), !tbaa !0
  Analysis/TypeBasedAliasAnalysis/memcpyopt.ll:  tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %p, i8* %q, i64 16, i1 false), !tbaa !2
  Analysis/TypeBasedAliasAnalysis/memcpyopt.ll:  tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %q, i8* %p, i64 16, i1 false), !tbaa !2

The TBAA memcpyopt test has a meaningful use of the metadata on memcpy, namely:

  $ cat Analysis/TypeBasedAliasAnalysis/memcpyopt.ll
  ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
  ; RUN: opt -S -tbaa -basic-aa -memcpyopt -instcombine < %s | FileCheck %s
  
  target datalayout = "e-p:64:64:64"
  
  ; The second memcpy is redundant and can be deleted. There's an intervening store, but
  ; it has a TBAA tag which declares that it is unrelated.
  
  define void @foo(i8* nocapture %p, i8* nocapture %q, i8* nocapture %s) nounwind {
  ; CHECK: @foo
  ; CHECK-NEXT: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* noundef nonnull align 1 dereferenceable(16) %p, i8* noundef nonnull align 1 dereferenceable(16) %q, i64 16, i1 false), !tbaa !0
  ; CHECK-NEXT: store i8 2, i8* %s, align 1, !tbaa [[TAGA:!.*]]
  ; CHECK-NEXT: ret void
    tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %p, i8* %q, i64 16, i1 false), !tbaa !2
    store i8 2, i8* %s, align 1, !tbaa !1
    tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %q, i8* %p, i64 16, i1 false), !tbaa !2
    ret void
  }
  
  declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
  
  ; CHECK: [[TAGA]] = !{[[TYPEA:!.*]], [[TYPEA]], i64 0}
  ; CHECK: [[TYPEA]] = !{!"A", !{{.*}}}
  !0 = !{!"tbaa root"}
  !1 = !{!3, !3, i64 0}
  !2 = !{!4, !4, i64 0}
  !3 = !{!"A", !0}
  !4 = !{!"B", !0}


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D108221



More information about the llvm-commits mailing list