xref: /llvm-project/llvm/test/Instrumentation/DataFlowSanitizer/array.ll (revision ecb85b5cd89f9797c538675ee3ab93e350c57bd5)
13e8eff37SArthur Eubanks; RUN: opt < %s -passes=dfsan -dfsan-event-callbacks=true -S | FileCheck %s --check-prefixes=CHECK,EVENT_CALLBACKS
23e8eff37SArthur Eubanks; RUN: opt < %s -passes=dfsan -S | FileCheck %s --check-prefixes=CHECK,FAST
33e8eff37SArthur Eubanks; RUN: opt < %s -passes=dfsan -dfsan-combine-pointer-labels-on-load=false -S | FileCheck %s --check-prefixes=CHECK,NO_COMBINE_LOAD_PTR
43e8eff37SArthur Eubanks; RUN: opt < %s -passes=dfsan -dfsan-combine-pointer-labels-on-store=true -S | FileCheck %s --check-prefixes=CHECK,COMBINE_STORE_PTR
53e8eff37SArthur Eubanks; RUN: opt < %s -passes=dfsan -dfsan-debug-nonzero-labels -S | FileCheck %s --check-prefixes=CHECK,DEBUG_NONZERO_LABELS
6ea981165SJianzhou Zhaotarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
7ea981165SJianzhou Zhaotarget triple = "x86_64-unknown-linux-gnu"
8ea981165SJianzhou Zhao
946f52fb6SGeorge Balatsouras; CHECK: @__dfsan_arg_tls = external thread_local(initialexec) global [[TLS_ARR:\[100 x i64\]]]
1046f52fb6SGeorge Balatsouras; CHECK: @__dfsan_retval_tls = external thread_local(initialexec) global [[TLS_ARR]]
11ea981165SJianzhou Zhaodefine [4 x i8] @pass_array([4 x i8] %a) {
12c6b5a25eSGeorge Balatsouras  ; NO_COMBINE_LOAD_PTR: @pass_array.dfsan
13*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: %1 = load [4 x i8], ptr @__dfsan_arg_tls, align [[ALIGN:2]]
14*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: store [4 x i8] %1, ptr @__dfsan_retval_tls, align [[ALIGN]]
15ea981165SJianzhou Zhao
16c6b5a25eSGeorge Balatsouras  ; DEBUG_NONZERO_LABELS: @pass_array.dfsan
17*ecb85b5cSFangrui Song  ; DEBUG_NONZERO_LABELS: [[L:%.*]] = load [4 x i8], ptr @__dfsan_arg_tls, align [[ALIGN:2]]
18*ecb85b5cSFangrui Song  ; DEBUG_NONZERO_LABELS: [[L0:%.*]] = extractvalue [4 x i8] [[L]], 0
19*ecb85b5cSFangrui Song  ; DEBUG_NONZERO_LABELS: [[L1:%.*]] = extractvalue [4 x i8] [[L]], 1
20*ecb85b5cSFangrui Song  ; DEBUG_NONZERO_LABELS: [[L01:%.*]] = or i8 [[L0]], [[L1]]
21*ecb85b5cSFangrui Song  ; DEBUG_NONZERO_LABELS: [[L2:%.*]] = extractvalue [4 x i8] [[L]], 2
22*ecb85b5cSFangrui Song  ; DEBUG_NONZERO_LABELS: [[L012:%.*]] = or i8 [[L01]], [[L2]]
23*ecb85b5cSFangrui Song  ; DEBUG_NONZERO_LABELS: [[L3:%.*]] = extractvalue [4 x i8] [[L]], 3
24*ecb85b5cSFangrui Song  ; DEBUG_NONZERO_LABELS: [[L0123:%.*]] = or i8 [[L012]], [[L3]]
25*ecb85b5cSFangrui Song  ; DEBUG_NONZERO_LABELS: {{.*}} = icmp ne i8 [[L0123]], 0
26ea981165SJianzhou Zhao  ; DEBUG_NONZERO_LABELS: call void @__dfsan_nonzero_label()
27ea981165SJianzhou Zhao
28ea981165SJianzhou Zhao  ret [4 x i8] %a
29ea981165SJianzhou Zhao}
30ea981165SJianzhou Zhao
3166c3444fSMatt Arsenault%ArrayOfStruct = type [4 x {ptr, i32}]
32ea981165SJianzhou Zhao
33ea981165SJianzhou Zhaodefine %ArrayOfStruct @pass_array_of_struct(%ArrayOfStruct %as) {
34c6b5a25eSGeorge Balatsouras  ; NO_COMBINE_LOAD_PTR: @pass_array_of_struct.dfsan
35*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: %1 = load [4 x { i8, i8 }], ptr @__dfsan_arg_tls, align [[ALIGN:2]]
36*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: store [4 x { i8, i8 }] %1, ptr @__dfsan_retval_tls, align [[ALIGN]]
37ea981165SJianzhou Zhao
38ea981165SJianzhou Zhao  ret %ArrayOfStruct %as
39ea981165SJianzhou Zhao}
40ea981165SJianzhou Zhao
4166c3444fSMatt Arsenaultdefine ptr @alloca_ret_array() {
42c6b5a25eSGeorge Balatsouras  ; NO_COMBINE_LOAD_PTR: @alloca_ret_array.dfsan
43*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: store i8 0, ptr @__dfsan_retval_tls, align 2
44ea981165SJianzhou Zhao  %p = alloca [4 x i1]
4566c3444fSMatt Arsenault  ret ptr %p
46ea981165SJianzhou Zhao}
47ea981165SJianzhou Zhao
48ea981165SJianzhou Zhaodefine [4 x i1] @load_alloca_array() {
49c6b5a25eSGeorge Balatsouras  ; NO_COMBINE_LOAD_PTR-LABEL: @load_alloca_array.dfsan
50*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR-NEXT: %[[#R:]] = alloca i8, align 1
5146f52fb6SGeorge Balatsouras  ; NO_COMBINE_LOAD_PTR-NEXT: %p = alloca [4 x i1]
52*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR-NEXT: %[[#R+1]] = load i8, ptr %[[#R]], align 1
53*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR-NEXT: %[[#R+2]] = insertvalue [4 x i8] undef, i8 %[[#R+1]], 0
54*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR-NEXT: %[[#R+3]] = insertvalue [4 x i8] %[[#R+2]], i8 %[[#R+1]], 1
55*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR-NEXT: %[[#R+4]] = insertvalue [4 x i8] %[[#R+3]], i8 %[[#R+1]], 2
56*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR-NEXT: %[[#R+5]] = insertvalue [4 x i8] %[[#R+4]], i8 %[[#R+1]], 3
5766c3444fSMatt Arsenault  ; NO_COMBINE_LOAD_PTR-NEXT: %a = load [4 x i1], ptr %p
58*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR-NEXT: store [4 x i8] %[[#R+5]], ptr @__dfsan_retval_tls, align 2
5946f52fb6SGeorge Balatsouras  ; NO_COMBINE_LOAD_PTR-NEXT: ret [4 x i1] %a
6046f52fb6SGeorge Balatsouras
61ea981165SJianzhou Zhao  %p = alloca [4 x i1]
6266c3444fSMatt Arsenault  %a = load [4 x i1], ptr %p
63ea981165SJianzhou Zhao  ret [4 x i1] %a
64ea981165SJianzhou Zhao}
65ea981165SJianzhou Zhao
6666c3444fSMatt Arsenaultdefine [0 x i1] @load_array0(ptr %p) {
67c6b5a25eSGeorge Balatsouras  ; NO_COMBINE_LOAD_PTR: @load_array0.dfsan
68*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: store [0 x i8] zeroinitializer, ptr @__dfsan_retval_tls, align 2
6966c3444fSMatt Arsenault  %a = load [0 x i1], ptr %p
70ea981165SJianzhou Zhao  ret [0 x i1] %a
71ea981165SJianzhou Zhao}
72ea981165SJianzhou Zhao
7366c3444fSMatt Arsenaultdefine [1 x i1] @load_array1(ptr %p) {
74c6b5a25eSGeorge Balatsouras  ; NO_COMBINE_LOAD_PTR: @load_array1.dfsan
75*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: [[L:%.*]] = load i8,
76*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: [[S:%.*]] = insertvalue [1 x i8] undef, i8 [[L]], 0
77*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: store [1 x i8] [[S]], ptr @__dfsan_retval_tls, align 2
78ea981165SJianzhou Zhao
79c6b5a25eSGeorge Balatsouras  ; EVENT_CALLBACKS: @load_array1.dfsan
80*ecb85b5cSFangrui Song  ; EVENT_CALLBACKS: [[L:%.*]] = or i8
81*ecb85b5cSFangrui Song  ; EVENT_CALLBACKS: call void @__dfsan_load_callback(i8 zeroext [[L]], ptr {{.*}})
82ea981165SJianzhou Zhao
83c6b5a25eSGeorge Balatsouras  ; FAST: @load_array1.dfsan
84*ecb85b5cSFangrui Song  ; FAST: [[P:%.*]] = load i8, ptr @__dfsan_arg_tls, align [[ALIGN:2]]
85*ecb85b5cSFangrui Song  ; FAST: [[L:%.*]] = load i8, ptr {{.*}}, align 1
86*ecb85b5cSFangrui Song  ; FAST: [[U:%.*]] = or i8 [[L]], [[P]]
87*ecb85b5cSFangrui Song  ; FAST: [[S1:%.*]] = insertvalue [1 x i8] undef, i8 [[U]], 0
88*ecb85b5cSFangrui Song  ; FAST: store [1 x i8] [[S1]], ptr @__dfsan_retval_tls, align [[ALIGN]]
89ea981165SJianzhou Zhao
9066c3444fSMatt Arsenault  %a = load [1 x i1], ptr %p
91ea981165SJianzhou Zhao  ret [1 x i1] %a
92ea981165SJianzhou Zhao}
93ea981165SJianzhou Zhao
9466c3444fSMatt Arsenaultdefine [2 x i1] @load_array2(ptr %p) {
95c6b5a25eSGeorge Balatsouras  ; NO_COMBINE_LOAD_PTR: @load_array2.dfsan
96*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: [[P1:%.*]] = getelementptr i8, ptr [[P0:%.*]], i64 1
97*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR-DAG: [[E1:%.*]] = load i8, ptr [[P1]], align 1
98*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR-DAG: [[E0:%.*]] = load i8, ptr [[P0]], align 1
99*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: [[U:%.*]] = or i8 [[E0]], [[E1]]
100*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: [[S1:%.*]] = insertvalue [2 x i8] undef, i8 [[U]], 0
101*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: [[S2:%.*]] = insertvalue [2 x i8] [[S1]], i8 [[U]], 1
102*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: store [2 x i8] [[S2]], ptr @__dfsan_retval_tls, align [[ALIGN:2]]
103ea981165SJianzhou Zhao
104c6b5a25eSGeorge Balatsouras  ; EVENT_CALLBACKS: @load_array2.dfsan
105*ecb85b5cSFangrui Song  ; EVENT_CALLBACKS: [[O1:%.*]] = or i8
106*ecb85b5cSFangrui Song  ; EVENT_CALLBACKS: [[O2:%.*]] = or i8 [[O1]]
107*ecb85b5cSFangrui Song  ; EVENT_CALLBACKS: call void @__dfsan_load_callback(i8 zeroext [[O2]], ptr {{.*}})
108ea981165SJianzhou Zhao
109c6b5a25eSGeorge Balatsouras  ; FAST: @load_array2.dfsan
110*ecb85b5cSFangrui Song  ; FAST: [[P:%.*]] = load i8, ptr @__dfsan_arg_tls, align [[ALIGN:2]]
111*ecb85b5cSFangrui Song  ; FAST: [[O:%.*]] = or i8
112*ecb85b5cSFangrui Song  ; FAST: [[U:%.*]] = or i8 [[O]], [[P]]
113*ecb85b5cSFangrui Song  ; FAST: [[S:%.*]] = insertvalue [2 x i8] undef, i8 [[U]], 0
114*ecb85b5cSFangrui Song  ; FAST: [[S1:%.*]] = insertvalue [2 x i8] [[S]], i8 [[U]], 1
115*ecb85b5cSFangrui Song  ; FAST: store [2 x i8] [[S1]], ptr @__dfsan_retval_tls, align [[ALIGN]]
11666c3444fSMatt Arsenault  %a = load [2 x i1], ptr %p
117ea981165SJianzhou Zhao  ret [2 x i1] %a
118ea981165SJianzhou Zhao}
119ea981165SJianzhou Zhao
12066c3444fSMatt Arsenaultdefine [4 x i1] @load_array4(ptr %p) {
121c6b5a25eSGeorge Balatsouras  ; NO_COMBINE_LOAD_PTR: @load_array4.dfsan
122*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: [[T:%.*]] = trunc i32 {{.*}} to i8
123*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: [[S1:%.*]] = insertvalue [4 x i8] undef, i8 [[T]], 0
124*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: [[S2:%.*]] = insertvalue [4 x i8] [[S1]], i8 [[T]], 1
125*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: [[S3:%.*]] = insertvalue [4 x i8] [[S2]], i8 [[T]], 2
126*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: [[S4:%.*]] = insertvalue [4 x i8] [[S3]], i8 [[T]], 3
127*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: store [4 x i8] [[S4]], ptr @__dfsan_retval_tls, align 2
128ea981165SJianzhou Zhao
129c6b5a25eSGeorge Balatsouras  ; EVENT_CALLBACKS: @load_array4.dfsan
130*ecb85b5cSFangrui Song  ; EVENT_CALLBACKS: [[O0:%.*]] = or i32
131*ecb85b5cSFangrui Song  ; EVENT_CALLBACKS: [[O1:%.*]] = or i32 [[O0]]
132*ecb85b5cSFangrui Song  ; EVENT_CALLBACKS: [[O2:%.*]] = trunc i32 [[O1]] to i8
133*ecb85b5cSFangrui Song  ; EVENT_CALLBACKS: [[O3:%.*]] = or i8 [[O2]]
134*ecb85b5cSFangrui Song  ; EVENT_CALLBACKS: call void @__dfsan_load_callback(i8 zeroext [[O3]], ptr {{.*}})
135ea981165SJianzhou Zhao
136c6b5a25eSGeorge Balatsouras  ; FAST: @load_array4.dfsan
137*ecb85b5cSFangrui Song  ; FAST: [[T:%.*]] = trunc i32 {{.*}} to i8
138*ecb85b5cSFangrui Song  ; FAST: [[O:%.*]] = or i8 [[T]]
139*ecb85b5cSFangrui Song  ; FAST: [[S1:%.*]] = insertvalue [4 x i8] undef, i8 [[O]], 0
140*ecb85b5cSFangrui Song  ; FAST: [[S2:%.*]] = insertvalue [4 x i8] [[S1]], i8 [[O]], 1
141*ecb85b5cSFangrui Song  ; FAST: [[S3:%.*]] = insertvalue [4 x i8] [[S2]], i8 [[O]], 2
142*ecb85b5cSFangrui Song  ; FAST: [[S4:%.*]] = insertvalue [4 x i8] [[S3]], i8 [[O]], 3
143*ecb85b5cSFangrui Song  ; FAST: store [4 x i8] [[S4]], ptr @__dfsan_retval_tls, align 2
144ea981165SJianzhou Zhao
14566c3444fSMatt Arsenault  %a = load [4 x i1], ptr %p
146ea981165SJianzhou Zhao  ret [4 x i1] %a
147ea981165SJianzhou Zhao}
148ea981165SJianzhou Zhao
149ea981165SJianzhou Zhaodefine i1 @extract_array([4 x i1] %a) {
150c6b5a25eSGeorge Balatsouras  ; NO_COMBINE_LOAD_PTR: @extract_array.dfsan
151*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: [[AM:%.*]] = load [4 x i8], ptr @__dfsan_arg_tls, align [[ALIGN:2]]
152*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: [[EM:%.*]] = extractvalue [4 x i8] [[AM]], 2
153*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: store i8 [[EM]], ptr @__dfsan_retval_tls, align 2
154ea981165SJianzhou Zhao  %e2 = extractvalue [4 x i1] %a, 2
155ea981165SJianzhou Zhao  ret i1 %e2
156ea981165SJianzhou Zhao}
157ea981165SJianzhou Zhao
158ea981165SJianzhou Zhaodefine [4 x i1] @insert_array([4 x i1] %a, i1 %e2) {
159c6b5a25eSGeorge Balatsouras  ; NO_COMBINE_LOAD_PTR: @insert_array.dfsan
160*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: [[EM:%.*]] = load i8, ptr
161*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR-SAME: inttoptr (i64 add (i64 ptrtoint (ptr @__dfsan_arg_tls to i64), i64 4) to ptr), align [[ALIGN:2]]
162*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: [[AM:%.*]] = load [4 x i8], ptr @__dfsan_arg_tls, align [[ALIGN]]
163*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: [[AM1:%.*]] = insertvalue [4 x i8] [[AM]], i8 [[EM]], 0
164*ecb85b5cSFangrui Song  ; NO_COMBINE_LOAD_PTR: store [4 x i8] [[AM1]], ptr @__dfsan_retval_tls, align [[ALIGN]]
165ea981165SJianzhou Zhao  %a1 = insertvalue [4 x i1] %a, i1 %e2, 0
166ea981165SJianzhou Zhao  ret [4 x i1] %a1
167ea981165SJianzhou Zhao}
168ea981165SJianzhou Zhao
169ea981165SJianzhou Zhaodefine void @store_alloca_array([4 x i1] %a) {
170c6b5a25eSGeorge Balatsouras  ; FAST: @store_alloca_array.dfsan
171*ecb85b5cSFangrui Song  ; FAST: [[S:%.*]] = load [4 x i8], ptr @__dfsan_arg_tls, align [[ALIGN:2]]
172*ecb85b5cSFangrui Song  ; FAST: [[SP:%.*]] = alloca i8, align 1
173*ecb85b5cSFangrui Song  ; FAST: [[E0:%.*]] = extractvalue [4 x i8] [[S]], 0
174*ecb85b5cSFangrui Song  ; FAST: [[E1:%.*]] = extractvalue [4 x i8] [[S]], 1
175*ecb85b5cSFangrui Song  ; FAST: [[E01:%.*]] = or i8 [[E0]], [[E1]]
176*ecb85b5cSFangrui Song  ; FAST: [[E2:%.*]] = extractvalue [4 x i8] [[S]], 2
177*ecb85b5cSFangrui Song  ; FAST: [[E012:%.*]] = or i8 [[E01]], [[E2]]
178*ecb85b5cSFangrui Song  ; FAST: [[E3:%.*]] = extractvalue [4 x i8] [[S]], 3
179*ecb85b5cSFangrui Song  ; FAST: [[E0123:%.*]] = or i8 [[E012]], [[E3]]
180*ecb85b5cSFangrui Song  ; FAST: store i8 [[E0123]], ptr [[SP]], align 1
181ea981165SJianzhou Zhao  %p = alloca [4 x i1]
18266c3444fSMatt Arsenault  store [4 x i1] %a, ptr %p
183ea981165SJianzhou Zhao  ret void
184ea981165SJianzhou Zhao}
185ea981165SJianzhou Zhao
18666c3444fSMatt Arsenaultdefine void @store_zero_array(ptr %p) {
187c6b5a25eSGeorge Balatsouras  ; FAST: @store_zero_array.dfsan
188*ecb85b5cSFangrui Song  ; FAST: store i32 0, ptr {{.*}}
18966c3444fSMatt Arsenault  store [4 x i1] zeroinitializer, ptr %p
190ea981165SJianzhou Zhao  ret void
191ea981165SJianzhou Zhao}
192ea981165SJianzhou Zhao
19366c3444fSMatt Arsenaultdefine void @store_array2([2 x i1] %a, ptr %p) {
194c6b5a25eSGeorge Balatsouras  ; EVENT_CALLBACKS: @store_array2.dfsan
195*ecb85b5cSFangrui Song  ; EVENT_CALLBACKS: [[E12:%.*]] = or i8
196*ecb85b5cSFangrui Song  ; EVENT_CALLBACKS: call void @__dfsan_store_callback(i8 zeroext [[E12]], ptr %p)
197ea981165SJianzhou Zhao
198c6b5a25eSGeorge Balatsouras  ; FAST: @store_array2.dfsan
199*ecb85b5cSFangrui Song  ; FAST: [[S:%.*]] = load [2 x i8], ptr @__dfsan_arg_tls, align [[ALIGN:2]]
200*ecb85b5cSFangrui Song  ; FAST: [[E1:%.*]] = extractvalue [2 x i8] [[S]], 0
201*ecb85b5cSFangrui Song  ; FAST: [[E2:%.*]] = extractvalue [2 x i8] [[S]], 1
202*ecb85b5cSFangrui Song  ; FAST: [[E12:%.*]] = or i8 [[E1]], [[E2]]
203*ecb85b5cSFangrui Song  ; FAST: [[SP0:%.*]] = getelementptr i8, ptr [[SP:%.*]], i32 0
204*ecb85b5cSFangrui Song  ; FAST: store i8 [[E12]], ptr [[SP0]], align 1
205*ecb85b5cSFangrui Song  ; FAST: [[SP1:%.*]] = getelementptr i8, ptr [[SP]], i32 1
206*ecb85b5cSFangrui Song  ; FAST: store i8 [[E12]], ptr [[SP1]], align 1
207ea981165SJianzhou Zhao
208c6b5a25eSGeorge Balatsouras  ; COMBINE_STORE_PTR: @store_array2.dfsan
209*ecb85b5cSFangrui Song  ; COMBINE_STORE_PTR: [[O:%.*]] = or i8
210*ecb85b5cSFangrui Song  ; COMBINE_STORE_PTR: [[U:%.*]] = or i8 [[O]]
211*ecb85b5cSFangrui Song  ; COMBINE_STORE_PTR: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 0
212*ecb85b5cSFangrui Song  ; COMBINE_STORE_PTR: store i8 [[U]], ptr [[P1]], align 1
213*ecb85b5cSFangrui Song  ; COMBINE_STORE_PTR: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 1
214*ecb85b5cSFangrui Song  ; COMBINE_STORE_PTR: store i8 [[U]], ptr [[P2]], align 1
215ea981165SJianzhou Zhao
21666c3444fSMatt Arsenault  store [2 x i1] %a, ptr %p
217ea981165SJianzhou Zhao  ret void
218ea981165SJianzhou Zhao}
219ea981165SJianzhou Zhao
22066c3444fSMatt Arsenaultdefine void @store_array17([17 x i1] %a, ptr %p) {
221c6b5a25eSGeorge Balatsouras  ; FAST: @store_array17.dfsan
222*ecb85b5cSFangrui Song  ; FAST: %[[#R:]]   = load [17 x i8], ptr @__dfsan_arg_tls, align 2
223*ecb85b5cSFangrui Song  ; FAST: %[[#R+1]]  = extractvalue [17 x i8] %[[#R]], 0
224*ecb85b5cSFangrui Song  ; FAST: %[[#R+2]]  = extractvalue [17 x i8] %[[#R]], 1
225*ecb85b5cSFangrui Song  ; FAST: %[[#R+3]]  = or i8 %[[#R+1]], %[[#R+2]]
226*ecb85b5cSFangrui Song  ; FAST: %[[#R+4]]  = extractvalue [17 x i8] %[[#R]], 2
227*ecb85b5cSFangrui Song  ; FAST: %[[#R+5]]  = or i8 %[[#R+3]], %[[#R+4]]
228*ecb85b5cSFangrui Song  ; FAST: %[[#R+6]]  = extractvalue [17 x i8] %[[#R]], 3
229*ecb85b5cSFangrui Song  ; FAST: %[[#R+7]]  = or i8 %[[#R+5]], %[[#R+6]]
230*ecb85b5cSFangrui Song  ; FAST: %[[#R+8]]  = extractvalue [17 x i8] %[[#R]], 4
231*ecb85b5cSFangrui Song  ; FAST: %[[#R+9]]  = or i8 %[[#R+7]], %[[#R+8]]
232*ecb85b5cSFangrui Song  ; FAST: %[[#R+10]] = extractvalue [17 x i8] %[[#R]], 5
233*ecb85b5cSFangrui Song  ; FAST: %[[#R+11]] = or i8 %[[#R+9]], %[[#R+10]]
234*ecb85b5cSFangrui Song  ; FAST: %[[#R+12]] = extractvalue [17 x i8] %[[#R]], 6
235*ecb85b5cSFangrui Song  ; FAST: %[[#R+13]] = or i8 %[[#R+11]], %[[#R+12]]
236*ecb85b5cSFangrui Song  ; FAST: %[[#R+14]] = extractvalue [17 x i8] %[[#R]], 7
237*ecb85b5cSFangrui Song  ; FAST: %[[#R+15]] = or i8 %[[#R+13]], %[[#R+14]]
238*ecb85b5cSFangrui Song  ; FAST: %[[#R+16]] = extractvalue [17 x i8] %[[#R]], 8
239*ecb85b5cSFangrui Song  ; FAST: %[[#R+17]] = or i8 %[[#R+15]], %[[#R+16]]
240*ecb85b5cSFangrui Song  ; FAST: %[[#R+18]] = extractvalue [17 x i8] %[[#R]], 9
241*ecb85b5cSFangrui Song  ; FAST: %[[#R+19]] = or i8 %[[#R+17]], %[[#R+18]]
242*ecb85b5cSFangrui Song  ; FAST: %[[#R+20]] = extractvalue [17 x i8] %[[#R]], 10
243*ecb85b5cSFangrui Song  ; FAST: %[[#R+21]] = or i8 %[[#R+19]], %[[#R+20]]
244*ecb85b5cSFangrui Song  ; FAST: %[[#R+22]] = extractvalue [17 x i8] %[[#R]], 11
245*ecb85b5cSFangrui Song  ; FAST: %[[#R+23]] = or i8 %[[#R+21]], %[[#R+22]]
246*ecb85b5cSFangrui Song  ; FAST: %[[#R+24]] = extractvalue [17 x i8] %[[#R]], 12
247*ecb85b5cSFangrui Song  ; FAST: %[[#R+25]] = or i8 %[[#R+23]], %[[#R+24]]
248*ecb85b5cSFangrui Song  ; FAST: %[[#R+26]] = extractvalue [17 x i8] %[[#R]], 13
249*ecb85b5cSFangrui Song  ; FAST: %[[#R+27]] = or i8 %[[#R+25]], %[[#R+26]]
250*ecb85b5cSFangrui Song  ; FAST: %[[#R+28]] = extractvalue [17 x i8] %[[#R]], 14
251*ecb85b5cSFangrui Song  ; FAST: %[[#R+29]] = or i8 %[[#R+27]], %[[#R+28]]
252*ecb85b5cSFangrui Song  ; FAST: %[[#R+30]] = extractvalue [17 x i8] %[[#R]], 15
253*ecb85b5cSFangrui Song  ; FAST: %[[#R+31]] = or i8 %[[#R+29]], %[[#R+30]]
254*ecb85b5cSFangrui Song  ; FAST: %[[#R+32]] = extractvalue [17 x i8] %[[#R]], 16
255*ecb85b5cSFangrui Song  ; FAST: %[[#R+33]] = or i8 %[[#R+31]], %[[#R+32]]
256*ecb85b5cSFangrui Song  ; FAST: %[[#VREG:]]  = insertelement <8 x i8> poison, i8 %[[#R+33]], i32 0
257*ecb85b5cSFangrui Song  ; FAST: %[[#VREG+1]] = insertelement <8 x i8> %[[#VREG]], i8 %[[#R+33]], i32 1
258*ecb85b5cSFangrui Song  ; FAST: %[[#VREG+2]] = insertelement <8 x i8> %[[#VREG+1]], i8 %[[#R+33]], i32 2
259*ecb85b5cSFangrui Song  ; FAST: %[[#VREG+3]] = insertelement <8 x i8> %[[#VREG+2]], i8 %[[#R+33]], i32 3
260*ecb85b5cSFangrui Song  ; FAST: %[[#VREG+4]] = insertelement <8 x i8> %[[#VREG+3]], i8 %[[#R+33]], i32 4
261*ecb85b5cSFangrui Song  ; FAST: %[[#VREG+5]] = insertelement <8 x i8> %[[#VREG+4]], i8 %[[#R+33]], i32 5
262*ecb85b5cSFangrui Song  ; FAST: %[[#VREG+6]] = insertelement <8 x i8> %[[#VREG+5]], i8 %[[#R+33]], i32 6
263*ecb85b5cSFangrui Song  ; FAST: %[[#VREG+7]] = insertelement <8 x i8> %[[#VREG+6]], i8 %[[#R+33]], i32 7
264*ecb85b5cSFangrui Song  ; FAST: %[[#VREG+8]] = getelementptr <8 x i8>, ptr %[[P:.*]], i32 0
265*ecb85b5cSFangrui Song  ; FAST: store <8 x i8> %[[#VREG+7]], ptr %[[#VREG+8]], align 1
266*ecb85b5cSFangrui Song  ; FAST: %[[#VREG+9]] = getelementptr <8 x i8>, ptr %[[P]], i32 1
267*ecb85b5cSFangrui Song  ; FAST: store <8 x i8> %[[#VREG+7]], ptr %[[#VREG+9]], align 1
268*ecb85b5cSFangrui Song  ; FAST: %[[#VREG+10]] = getelementptr i8, ptr %[[P]], i32 16
269*ecb85b5cSFangrui Song  ; FAST: store i8 %[[#R+33]], ptr %[[#VREG+10]], align 1
27066c3444fSMatt Arsenault  store [17 x i1] %a, ptr %p
271ea981165SJianzhou Zhao  ret void
272ea981165SJianzhou Zhao}
273ea981165SJianzhou Zhao
274ea981165SJianzhou Zhaodefine [2 x i32] @const_array() {
275c6b5a25eSGeorge Balatsouras  ; FAST: @const_array.dfsan
276*ecb85b5cSFangrui Song  ; FAST: store [2 x i8] zeroinitializer, ptr @__dfsan_retval_tls, align 2
277ea981165SJianzhou Zhao  ret [2 x i32] [ i32 42, i32 11 ]
278ea981165SJianzhou Zhao}
279ea981165SJianzhou Zhao
280ea981165SJianzhou Zhaodefine [4 x i8] @call_array([4 x i8] %a) {
281c6b5a25eSGeorge Balatsouras  ; FAST-LABEL: @call_array.dfsan
282*ecb85b5cSFangrui Song  ; FAST: %[[#R:]] = load [4 x i8], ptr @__dfsan_arg_tls, align [[ALIGN:2]]
283*ecb85b5cSFangrui Song  ; FAST: store [4 x i8] %[[#R]], ptr @__dfsan_arg_tls, align [[ALIGN]]
284*ecb85b5cSFangrui Song  ; FAST: %_dfsret = load [4 x i8], ptr @__dfsan_retval_tls, align [[ALIGN]]
285*ecb85b5cSFangrui Song  ; FAST: store [4 x i8] %_dfsret, ptr @__dfsan_retval_tls, align [[ALIGN]]
286ea981165SJianzhou Zhao
287ea981165SJianzhou Zhao  %r = call [4 x i8] @pass_array([4 x i8] %a)
288ea981165SJianzhou Zhao  ret [4 x i8] %r
289ea981165SJianzhou Zhao}
290ea981165SJianzhou Zhao
291ea981165SJianzhou Zhao%LargeArr = type [1000 x i8]
292ea981165SJianzhou Zhao
293ea981165SJianzhou Zhaodefine i8 @fun_with_large_args(i1 %i, %LargeArr %a) {
294c6b5a25eSGeorge Balatsouras  ; FAST: @fun_with_large_args.dfsan
295*ecb85b5cSFangrui Song  ; FAST: store i8 0, ptr @__dfsan_retval_tls, align 2
296ea981165SJianzhou Zhao  %r = extractvalue %LargeArr %a, 0
297ea981165SJianzhou Zhao  ret i8 %r
298ea981165SJianzhou Zhao}
299ea981165SJianzhou Zhao
300ea981165SJianzhou Zhaodefine %LargeArr @fun_with_large_ret() {
301c6b5a25eSGeorge Balatsouras  ; FAST: @fun_with_large_ret.dfsan
302d10f173fSGeorge Balatsouras  ; FAST-NEXT: ret  [1000 x i8] zeroinitializer
303ea981165SJianzhou Zhao  ret %LargeArr zeroinitializer
304ea981165SJianzhou Zhao}
305ea981165SJianzhou Zhao
306ea981165SJianzhou Zhaodefine i8 @call_fun_with_large_ret() {
307c6b5a25eSGeorge Balatsouras  ; FAST: @call_fun_with_large_ret.dfsan
308*ecb85b5cSFangrui Song  ; FAST: store i8 0, ptr @__dfsan_retval_tls, align 2
309ea981165SJianzhou Zhao  %r = call %LargeArr @fun_with_large_ret()
310ea981165SJianzhou Zhao  %e = extractvalue %LargeArr %r, 0
311ea981165SJianzhou Zhao  ret i8 %e
312ea981165SJianzhou Zhao}
313ea981165SJianzhou Zhao
314ea981165SJianzhou Zhaodefine i8 @call_fun_with_large_args(i1 %i, %LargeArr %a) {
315c6b5a25eSGeorge Balatsouras  ; FAST: @call_fun_with_large_args.dfsan
316*ecb85b5cSFangrui Song  ; FAST: [[I:%.*]] = load i8, ptr @__dfsan_arg_tls, align [[ALIGN:2]]
317*ecb85b5cSFangrui Song  ; FAST: store i8 [[I]], ptr @__dfsan_arg_tls, align [[ALIGN]]
318c6b5a25eSGeorge Balatsouras  ; FAST: %r = call i8 @fun_with_large_args.dfsan(i1 %i, [1000 x i8] %a)
319ea981165SJianzhou Zhao
320ea981165SJianzhou Zhao  %r = call i8 @fun_with_large_args(i1 %i, %LargeArr %a)
321ea981165SJianzhou Zhao  ret i8 %r
322ea981165SJianzhou Zhao}
323