File: ctor-memset.ll

package info (click to toggle)
llvm-toolchain-19 1%3A19.1.7-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,998,520 kB
  • sloc: cpp: 6,951,680; ansic: 1,486,157; asm: 913,598; python: 232,024; f90: 80,126; objc: 75,281; lisp: 37,276; pascal: 16,990; sh: 10,009; ml: 5,058; perl: 4,724; awk: 3,523; makefile: 3,167; javascript: 2,504; xml: 892; fortran: 664; cs: 573
file content (141 lines) | stat: -rw-r--r-- 5,339 bytes parent folder | download | duplicates (10)
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals
; RUN: opt -S -passes=globalopt < %s | FileCheck %s

target datalayout = "p1:32:32"

@llvm.global_ctors = appending global [11 x { i32, ptr, ptr }] [
  { i32, ptr, ptr } { i32 65535, ptr @ctor0, ptr null },
  { i32, ptr, ptr } { i32 65535, ptr @ctor1, ptr null },
  { i32, ptr, ptr } { i32 65535, ptr @ctor2, ptr null },
  { i32, ptr, ptr } { i32 65535, ptr @ctor3, ptr null },
  { i32, ptr, ptr } { i32 65535, ptr @ctor4, ptr null },
  { i32, ptr, ptr } { i32 65535, ptr @ctor5, ptr null },
  { i32, ptr, ptr } { i32 65535, ptr @ctor6, ptr null },
  { i32, ptr, ptr } { i32 65535, ptr @ctor7, ptr null },
  { i32, ptr, ptr } { i32 65535, ptr @ctor8, ptr null },
  { i32, ptr, ptr } { i32 65535, ptr @ctor9, ptr null },
  { i32, ptr, ptr } { i32 65535, ptr @ctor10, ptr null }
]


; memset of all-zero global
@g0 = global { i32, i32 } zeroinitializer
;.
; CHECK: @[[LLVM_GLOBAL_CTORS:[a-zA-Z0-9_$"\\.-]+]] = appending global [4 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @ctor3, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @ctor4, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @ctor7, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @ctor10, ptr null }]
; CHECK: @[[G0:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32 } zeroinitializer
; CHECK: @[[G1:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32, i32 } { i32 0, i32 0, i32 1 }
; CHECK: @[[G2:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32, i32 } { i32 1, i32 0, i32 0 }
; CHECK: @[[G3:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32 } { i32 0, i32 1 }
; CHECK: @[[G4:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32 } { i32 0, i32 undef }
; CHECK: @[[G5:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i16, i32 } { i16 0, i32 1 }
; CHECK: @[[G6:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32 } { i32 -1, i32 -1 }
; CHECK: @[[G7:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32 } { i32 -1, i32 1 }
; CHECK: @[[G8:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr addrspace(1) global { i32, i32 } zeroinitializer
; CHECK: @[[G9:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global [100000000 x i32] zeroinitializer
; CHECK: @[[G10:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { [99999999 x i32], i32 } { [99999999 x i32] zeroinitializer, i32 1 }
;.
define internal void @ctor0() {
  call void @llvm.memset.p0.i64(ptr @g0, i8 0, i64 8, i1 false)
  ret void
}

; memset of zero prefix
@g1 = global { i32, i32, i32 } { i32 0, i32 0, i32 1 }

define internal void @ctor1() {
  call void @llvm.memset.p0.i64(ptr @g1, i8 0, i64 8, i1 false)
  ret void
}

; memset of zero suffix
@g2 = global { i32, i32, i32 } { i32 1, i32 0, i32 0 }

define internal void @ctor2() {
  call void @llvm.memset.p0.i64(ptr getelementptr (i32, ptr @g2, i64 1), i8 0, i64 8, i1 false)
  ret void
}

; memset of some non-zero bytes
@g3 = global { i32, i32 } { i32 0, i32 1 }

define internal void @ctor3() {
; CHECK-LABEL: @ctor3(
; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr @g3, i8 0, i64 8, i1 false)
; CHECK-NEXT:    ret void
;
  call void @llvm.memset.p0.i64(ptr @g3, i8 0, i64 8, i1 false)
  ret void
}

; memset of some undef bytes
@g4 = global { i32, i32 } { i32 0, i32 undef }

define internal void @ctor4() {
; CHECK-LABEL: @ctor4(
; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr @g4, i8 0, i64 8, i1 false)
; CHECK-NEXT:    ret void
;
  call void @llvm.memset.p0.i64(ptr @g4, i8 0, i64 8, i1 false)
  ret void
}

; memset including padding bytes
; FIXME: We still incorrectly optimize the memset away here, even though code
; might access the padding.
@g5 = global { i16, i32 } { i16 0, i32 1 }

define internal void @ctor5() {
  call void @llvm.memset.p0.i64(ptr @g5, i8 0, i64 4, i1 false)
  ret void
}

; memset of non-zero value (matching initializer)
@g6 = global { i32, i32 } { i32 -1, i32 -1 }

define internal void @ctor6() {
  call void @llvm.memset.p0.i64(ptr @g6, i8 -1, i64 8, i1 false)
  ret void
}

; memset of non-zero value (not matching initializer)
@g7 = global { i32, i32 } { i32 -1, i32 1 }

define internal void @ctor7() {
; CHECK-LABEL: @ctor7(
; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr @g7, i8 -1, i64 8, i1 false)
; CHECK-NEXT:    ret void
;
  call void @llvm.memset.p0.i64(ptr @g7, i8 -1, i64 8, i1 false)
  ret void
}

; memset of zero value in differently-sized address space
@g8 = addrspace(1) global { i32, i32 } zeroinitializer

define internal void @ctor8() {
  call void @llvm.memset.p0.i64(ptr addrspacecast (ptr addrspace(1) @g8 to ptr), i8 0, i64 8, i1 false)
  ret void
}

@g9 = global [100000000 x i32] zeroinitializer

define internal void @ctor9() {
  call void @llvm.memset.p0.i64(ptr @g9, i8 0, i64 100000000, i1 false)
  ret void
}

@g10 = global { [99999999 x i32], i32 } { [99999999 x i32 ] zeroinitializer, i32 1 }

define internal void @ctor10() {
; CHECK-LABEL: @ctor10(
; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr @g10, i8 0, i64 100000000, i1 false)
; CHECK-NEXT:    ret void
;
  call void @llvm.memset.p0.i64(ptr @g10, i8 0, i64 100000000, i1 false)
  ret void
}

declare void @llvm.memset.p0.i64(ptr, i8, i64, i1)
;.
; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: write) }
;.