File: memcpy-tbaa.ll

package info (click to toggle)
llvm-toolchain-20 1%3A20.1.6-1~exp1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 2,111,304 kB
  • sloc: cpp: 7,438,677; ansic: 1,393,822; asm: 1,012,926; python: 241,650; f90: 86,635; objc: 75,479; lisp: 42,144; pascal: 17,286; sh: 10,027; ml: 5,082; perl: 4,730; awk: 3,523; makefile: 3,349; javascript: 2,251; xml: 892; fortran: 672
file content (77 lines) | stat: -rw-r--r-- 3,568 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt < %s -passes=memcpyopt,dse -S -verify-memoryssa | FileCheck %s

define void @test() local_unnamed_addr {
; CHECK-LABEL: define void @test() local_unnamed_addr {
; CHECK-NEXT:    [[TEST_ARRAY_B:%.*]] = alloca [31 x float], align 4
; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr float, ptr [[TEST_ARRAY_B]], i64 1
; CHECK-NEXT:    store float 0x3E6AA51880000000, ptr [[TMP1]], align 4
; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr float, ptr [[TEST_ARRAY_B]], i64 1
; CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[TMP2]], align 4
; CHECK-NEXT:    ret void
;
  %test_array_a = alloca [31 x float], align 4
  %test_array_b = alloca [31 x float], align 4
  %1 = getelementptr float, ptr %test_array_b, i64 1
  store float 0x3E6AA51880000000, ptr %1, align 4, !tbaa !4
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(124) %test_array_a, ptr noundef nonnull align 4 dereferenceable(124) %test_array_b, i64 124, i1 false)
  %2 = getelementptr float, ptr %test_array_a, i64 1
  %3 = load float, ptr %2, align 4, !tbaa !7
  ret void
}

%struct.Outer = type { float, double, %struct.Inner }
%struct.Inner = type { i32, float }

; Function Attrs: nounwind uwtable
define dso_local float @f() {
; CHECK-LABEL: define dso_local float @f() {
; CHECK-NEXT:  [[ENTRY:.*:]]
; CHECK-NEXT:    [[TEST1:%.*]] = alloca [[STRUCT_OUTER:%.*]], align 8
; CHECK-NEXT:    [[F:%.*]] = getelementptr inbounds nuw [[STRUCT_OUTER]], ptr [[TEST1]], i32 0, i32 0
; CHECK-NEXT:    store float 0.000000e+00, ptr [[F]], align 8
; CHECK-NEXT:    [[F1:%.*]] = getelementptr inbounds nuw [[STRUCT_OUTER]], ptr [[TEST1]], i32 0, i32 0
; CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F1]], align 8
; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[TMP0]], 2.000000e+00
; CHECK-NEXT:    store float [[ADD]], ptr [[F1]], align 8
; CHECK-NEXT:    [[F2:%.*]] = getelementptr inbounds nuw [[STRUCT_OUTER]], ptr [[TEST1]], i32 0, i32 0
; CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F2]], align 8
; CHECK-NEXT:    ret float [[TMP1]]
;
entry:
  %test = alloca %struct.Outer, align 8
  %test1 = alloca %struct.Outer, align 8
  %f = getelementptr inbounds nuw %struct.Outer, ptr %test1, i32 0, i32 0
  store float 0.000000e+00, ptr %f, align 8, !tbaa !9
  %inner_a = getelementptr inbounds nuw %struct.Outer, ptr %test1, i32 0, i32 2
  %i = getelementptr inbounds nuw %struct.Inner, ptr %inner_a, i32 0, i32 0
  store i32 0, ptr %i, align 8, !tbaa !17
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %test, ptr align 8 %test1, i64 24, i1 false)
  %f1 = getelementptr inbounds nuw %struct.Outer, ptr %test, i32 0, i32 0
  %0 = load float, ptr %f1, align 8, !tbaa !9
  %add = fadd float %0, 2.000000e+00
  store float %add, ptr %f1, align 8, !tbaa !9
  %f2 = getelementptr inbounds nuw %struct.Outer, ptr %test, i32 0, i32 0
  %1 = load float, ptr %f2, align 8, !tbaa !9
  ret float %1
}

!1 = !{!"any data access", !2, i64 0}
!2 = !{!"any access", !3, i64 0}
!3 = !{!"Flang function root test"}
!4 = !{!5, !5, i64 0}
!5 = !{!"allocated data/test_array_a", !6, i64 0}
!6 = !{!"allocated data", !1, i64 0}
!7 = !{!8, !8, i64 0}
!8 = !{!"allocated data/test_array_b", !6, i64 0}
!9 = !{!10, !11, i64 0}
!10 = !{!"Outer", !11, i64 0, !14, i64 8, !15, i64 16}
!11 = !{!"float", !12, i64 0}
!12 = !{!"omnipotent char", !13, i64 0}
!13 = !{!"Simple C/C++ TBAA"}
!14 = !{!"double", !12, i64 0}
!15 = !{!"Inner", !16, i64 0, !11, i64 4}
!16 = !{!"int", !12, i64 0}
!17 = !{!10, !16, i64 16}