1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=haswell | FileCheck %s -check-prefix=NOAA 3; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=haswell -combiner-global-alias-analysis=1 | FileCheck %s -check-prefix=AA 4 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: # %entry 14; NOAA-NEXT: vmovups (%rdi), %xmm0 15; NOAA-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) 16; NOAA-NEXT: vmovups (%rsi), %xmm0 17; NOAA-NEXT: vmovups %xmm0, (%rdi) 18; NOAA-NEXT: vmovaps -{{[0-9]+}}(%rsp), %xmm0 19; NOAA-NEXT: vmovups %xmm0, (%rsi) 20; NOAA-NEXT: retq 21; 22; AA-LABEL: _Z4SwapP1SS0_: 23; AA: # %bb.0: # %entry 24; AA-NEXT: vmovups (%rdi), %xmm0 25; AA-NEXT: vmovups (%rsi), %xmm1 26; AA-NEXT: vmovups %xmm1, (%rdi) 27; AA-NEXT: vmovups %xmm0, (%rsi) 28; AA-NEXT: retq 29entry: 30 %tmp.sroa.0 = alloca [16 x i8], align 1 31 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 !2 34 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 void 37} 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: # %entry 42; NOAA-NEXT: retq 43; 44; AA-LABEL: onealloc_noreadback: 45; AA: # %bb.0: # %entry 46; AA-NEXT: retq 47entry: 48 %alloc = alloca [16 x i8], i8 2, align 1 49 %part2 = getelementptr inbounds [16 x i8], ptr %alloc, i64 1, i64 0 50 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %alloc) 51 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %part2) 52 call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %alloc, ptr align 1 %a, i64 16, i1 false) 53 tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %part2, ptr align 1 %b, i64 16, i1 false) 54 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %alloc) 55 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %part2) 56 ret void 57} 58 59 60define dso_local void @twoallocs_trivial(ptr nocapture %a, ptr nocapture %b) local_unnamed_addr { 61; NOAA-LABEL: twoallocs_trivial: 62; NOAA: # %bb.0: # %entry 63; NOAA-NEXT: retq 64; 65; AA-LABEL: twoallocs_trivial: 66; AA: # %bb.0: # %entry 67; AA-NEXT: retq 68entry: 69 %alloc1 = alloca [16 x i8], align 1 70 %alloc2 = alloca [16 x i8], align 1 71 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %alloc1) 72 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %alloc2) 73 call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %alloc1, ptr align 1 %a, i64 16, i1 false) 74 call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %alloc2, ptr align 1 %b, i64 16, i1 false) 75 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %alloc1) 76 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %alloc2) 77 ret void 78} 79 80define dso_local void @twoallocs(ptr nocapture %a, ptr nocapture %b) local_unnamed_addr { 81; NOAA-LABEL: twoallocs: 82; NOAA: # %bb.0: # %entry 83; NOAA-NEXT: vmovups (%rdi), %xmm0 84; NOAA-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) 85; NOAA-NEXT: vmovups %xmm0, (%rsi) 86; NOAA-NEXT: retq 87; 88; AA-LABEL: twoallocs: 89; AA: # %bb.0: # %entry 90; AA-NEXT: vmovups (%rdi), %xmm0 91; AA-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) 92; AA-NEXT: vmovups %xmm0, (%rsi) 93; AA-NEXT: retq 94entry: 95 %alloc1 = alloca [16 x i8], align 1 96 %alloc2 = alloca [16 x i8], align 1 97 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %alloc1) 98 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %alloc2) 99 call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %alloc2, ptr align 1 %a, i64 16, i1 false) 100 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %alloc1) 101 tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %b, ptr align 1 %alloc2, i64 16, i1 false) 102 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %alloc2) 103 ret void 104} 105 106define dso_local void @onealloc_readback_1(ptr nocapture %a, ptr nocapture %b) local_unnamed_addr { 107; NOAA-LABEL: onealloc_readback_1: 108; NOAA: # %bb.0: # %entry 109; NOAA-NEXT: vmovups (%rdi), %xmm0 110; NOAA-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) 111; NOAA-NEXT: vmovups (%rsi), %xmm0 112; NOAA-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) 113; NOAA-NEXT: vmovups %xmm0, (%rdi) 114; NOAA-NEXT: retq 115; 116; AA-LABEL: onealloc_readback_1: 117; AA: # %bb.0: # %entry 118; AA-NEXT: vmovups (%rsi), %xmm0 119; AA-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) 120; AA-NEXT: vmovups %xmm0, (%rdi) 121; AA-NEXT: retq 122entry: 123 %alloc = alloca [16 x i8], i8 2, align 1 124 %part1 = getelementptr inbounds [16 x i8], ptr %alloc, i64 1, i64 0 125 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %part1) 126 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %alloc) 127 call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %part1, ptr align 1 %a, i64 16, i1 false) 128 call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %alloc, ptr align 1 %b, i64 16, i1 false) 129 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %part1) 130 tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %a, ptr align 1 %alloc, i64 16, i1 false) 131 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %alloc) 132 ret void 133} 134 135define dso_local void @onealloc_readback_2(ptr nocapture %a, ptr nocapture %b) local_unnamed_addr { 136; NOAA-LABEL: onealloc_readback_2: 137; NOAA: # %bb.0: # %entry 138; NOAA-NEXT: vmovups (%rdi), %xmm0 139; NOAA-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) 140; NOAA-NEXT: vmovups (%rsi), %xmm0 141; NOAA-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) 142; NOAA-NEXT: vmovups %xmm0, (%rdi) 143; NOAA-NEXT: retq 144; 145; AA-LABEL: onealloc_readback_2: 146; AA: # %bb.0: # %entry 147; AA-NEXT: vmovups (%rsi), %xmm0 148; AA-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp) 149; AA-NEXT: vmovups %xmm0, (%rdi) 150; AA-NEXT: retq 151entry: 152 %alloc = alloca [16 x i8], i8 2, align 1 153 %part2 = getelementptr inbounds [16 x i8], ptr %alloc, i64 1, i64 0 154 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %alloc) 155 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %part2) 156 call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %alloc, ptr align 1 %a, i64 16, i1 false) 157 call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %part2, ptr align 1 %b, i64 16, i1 false) 158 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %alloc) 159 tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %a, ptr align 1 %part2, i64 16, i1 false) 160 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %part2) 161 ret void 162} 163 164 165!llvm.module.flags = !{!0} 166!llvm.ident = !{!1} 167 168!0 = !{i32 1, !"wchar_size", i32 4} 169!1 = !{!"clang version 9.0.0 (trunk 352631) (llvm/trunk 352632)"} 170!2 = !{i64 0, i64 16, !3} 171!3 = !{!4, !4, i64 0} 172!4 = !{!"omnipotent char", !5, i64 0} 173!5 = !{!"Simple C++ TBAA"} 174