166 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=haswell | FileCheck %s -check-prefix=NOAA3; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=haswell -combiner-global-alias-analysis=1 | FileCheck %s -check-prefix=AA4 5declare void @llvm.lifetime.start.p0(i64, ptr nocapture)6declare void @llvm.memcpy.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1)7declare void @llvm.lifetime.end.p0(i64, ptr nocapture)8 9%struct.S = type { [16 x i8] }10 11define dso_local void @_Z4SwapP1SS0_(ptr nocapture %a, ptr nocapture %b) local_unnamed_addr {12; NOAA-LABEL: _Z4SwapP1SS0_:13; NOAA: # %bb.0: # %entry14; NOAA-NEXT: vmovups (%rdi), %xmm015; NOAA-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)16; NOAA-NEXT: vmovups (%rsi), %xmm017; NOAA-NEXT: vmovups %xmm0, (%rdi)18; NOAA-NEXT: vmovaps -{{[0-9]+}}(%rsp), %xmm019; NOAA-NEXT: vmovups %xmm0, (%rsi)20; NOAA-NEXT: retq21;22; AA-LABEL: _Z4SwapP1SS0_:23; AA: # %bb.0: # %entry24; AA-NEXT: vmovups (%rdi), %xmm025; AA-NEXT: vmovups (%rsi), %xmm126; AA-NEXT: vmovups %xmm1, (%rdi)27; AA-NEXT: vmovups %xmm0, (%rsi)28; AA-NEXT: retq29entry:30 %tmp.sroa.0 = alloca [16 x i8], align 131 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %tmp.sroa.0)32 call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %tmp.sroa.0, ptr align 1 %a, i64 16, i1 false)33 tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 %a, ptr align 1 %b, i64 16, i1 false), !tbaa.struct !234 call void @llvm.memcpy.p0.p0.i64(ptr align 1 %b, ptr nonnull align 1 %tmp.sroa.0, i64 16, i1 false)35 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %tmp.sroa.0)36 ret void37}38 39define dso_local void @onealloc_noreadback(ptr nocapture %a, ptr nocapture %b) local_unnamed_addr {40; NOAA-LABEL: onealloc_noreadback:41; NOAA: # %bb.0: # %entry42; NOAA-NEXT: retq43;44; AA-LABEL: onealloc_noreadback:45; AA: # %bb.0: # %entry46; AA-NEXT: retq47entry:48 %alloc = alloca [16 x i8], i8 2, align 149 %part2 = getelementptr inbounds [16 x i8], ptr %alloc, i64 1, i64 050 call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %alloc)51 call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %alloc, ptr align 1 %a, i64 16, i1 false)52 tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %part2, ptr align 1 %b, i64 16, i1 false)53 call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %alloc)54 ret void55}56 57 58define dso_local void @twoallocs_trivial(ptr nocapture %a, ptr nocapture %b) local_unnamed_addr {59; NOAA-LABEL: twoallocs_trivial:60; NOAA: # %bb.0: # %entry61; NOAA-NEXT: retq62;63; AA-LABEL: twoallocs_trivial:64; AA: # %bb.0: # %entry65; AA-NEXT: retq66entry:67 %alloc1 = alloca [16 x i8], align 168 %alloc2 = alloca [16 x i8], align 169 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %alloc1)70 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %alloc2)71 call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %alloc1, ptr align 1 %a, i64 16, i1 false)72 call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %alloc2, ptr align 1 %b, i64 16, i1 false)73 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %alloc1)74 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %alloc2)75 ret void76}77 78define dso_local void @twoallocs(ptr nocapture %a, ptr nocapture %b) local_unnamed_addr {79; NOAA-LABEL: twoallocs:80; NOAA: # %bb.0: # %entry81; NOAA-NEXT: vmovups (%rdi), %xmm082; NOAA-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)83; NOAA-NEXT: vmovups %xmm0, (%rsi)84; NOAA-NEXT: retq85;86; AA-LABEL: twoallocs:87; AA: # %bb.0: # %entry88; AA-NEXT: vmovups (%rdi), %xmm089; AA-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)90; AA-NEXT: vmovups %xmm0, (%rsi)91; AA-NEXT: retq92entry:93 %alloc1 = alloca [16 x i8], align 194 %alloc2 = alloca [16 x i8], align 195 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %alloc1)96 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %alloc2)97 call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %alloc2, ptr align 1 %a, i64 16, i1 false)98 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %alloc1)99 tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %b, ptr align 1 %alloc2, i64 16, i1 false)100 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %alloc2)101 ret void102}103 104define dso_local void @onealloc_readback_1(ptr nocapture %a, ptr nocapture %b) local_unnamed_addr {105; NOAA-LABEL: onealloc_readback_1:106; NOAA: # %bb.0: # %entry107; NOAA-NEXT: vmovups (%rdi), %xmm0108; NOAA-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)109; NOAA-NEXT: vmovups (%rsi), %xmm0110; NOAA-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)111; NOAA-NEXT: vmovups %xmm0, (%rdi)112; NOAA-NEXT: retq113;114; AA-LABEL: onealloc_readback_1:115; AA: # %bb.0: # %entry116; AA-NEXT: vmovups (%rsi), %xmm0117; AA-NEXT: vmovups %xmm0, (%rdi)118; AA-NEXT: retq119entry:120 %alloc = alloca [16 x i8], i8 2, align 1121 %part1 = getelementptr inbounds [16 x i8], ptr %alloc, i64 1, i64 0122 call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %alloc)123 call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %part1, ptr align 1 %a, i64 16, i1 false)124 call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %alloc, ptr align 1 %b, i64 16, i1 false)125 tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %a, ptr align 1 %alloc, i64 16, i1 false)126 call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %alloc)127 ret void128}129 130define dso_local void @onealloc_readback_2(ptr nocapture %a, ptr nocapture %b) local_unnamed_addr {131; NOAA-LABEL: onealloc_readback_2:132; NOAA: # %bb.0: # %entry133; NOAA-NEXT: vmovups (%rdi), %xmm0134; NOAA-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)135; NOAA-NEXT: vmovups (%rsi), %xmm0136; NOAA-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)137; NOAA-NEXT: vmovups %xmm0, (%rdi)138; NOAA-NEXT: retq139;140; AA-LABEL: onealloc_readback_2:141; AA: # %bb.0: # %entry142; AA-NEXT: vmovups (%rsi), %xmm0143; AA-NEXT: vmovups %xmm0, (%rdi)144; AA-NEXT: retq145entry:146 %alloc = alloca [16 x i8], i8 2, align 1147 %part2 = getelementptr inbounds [16 x i8], ptr %alloc, i64 1, i64 0148 call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %alloc)149 call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %alloc, ptr align 1 %a, i64 16, i1 false)150 call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %part2, ptr align 1 %b, i64 16, i1 false)151 tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %a, ptr align 1 %part2, i64 16, i1 false)152 call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %alloc)153 ret void154}155 156 157!llvm.module.flags = !{!0}158!llvm.ident = !{!1}159 160!0 = !{i32 1, !"wchar_size", i32 4}161!1 = !{!"clang version 9.0.0 (trunk 352631) (llvm/trunk 352632)"}162!2 = !{i64 0, i64 16, !3}163!3 = !{!4, !4, i64 0}164!4 = !{!"omnipotent char", !5, i64 0}165!5 = !{!"Simple C++ TBAA"}166