Remove check for Android in Mips.cpp (#123793)
[llvm-project.git] / llvm / test / Instrumentation / BoundsChecking / runtimes.ll
blob7cf78a5d54e71a4a82b67aa112e50ec681274702
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 5
2 ; RUN: opt < %s -passes='bounds-checking<trap;merge>'   -S | FileCheck %s --check-prefixes=TR
3 ; RUN: opt < %s -passes='bounds-checking<rt;merge>'     -S | FileCheck %s --check-prefixes=RT
5 ; RUN: opt < %s -passes=bounds-checking                 -S | FileCheck %s --check-prefixes=TR-NOMERGE
6 ; RUN: opt < %s -passes='bounds-checking<trap>'         -S | FileCheck %s --check-prefixes=TR-NOMERGE
7 ; RUN: opt < %s -passes='bounds-checking<rt>'           -S | FileCheck %s --check-prefixes=RT-NOMERGE
8 ; RUN: opt < %s -passes='bounds-checking<rt-abort>'     -S | FileCheck %s --check-prefixes=RTABORT-NOMERGE
9 ; RUN: opt < %s -passes='bounds-checking<min-rt>'       -S | FileCheck %s --check-prefixes=MINRT-NOMERGE
10 ; RUN: opt < %s -passes='bounds-checking<min-rt-abort>' -S | FileCheck %s --check-prefixes=MINRTABORT-NOMERGE
12 ; RUN: opt < %s -passes='bounds-checking<trap;guard=3>'   -S | FileCheck %s --check-prefixes=TR-GUARD
13 ; RUN: opt < %s -passes='bounds-checking<rt;guard=-5>'     -S | FileCheck %s --check-prefixes=RT-GUARD
14 target 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"
16 define void @f1(i64 %x) nounwind {
17 ; TR-LABEL: define void @f1(
18 ; TR-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
19 ; TR-NEXT:    [[TMP1:%.*]] = mul i64 16, [[X]]
20 ; TR-NEXT:    [[TMP2:%.*]] = alloca i128, i64 [[X]], align 8
21 ; TR-NEXT:    [[TMP3:%.*]] = sub i64 [[TMP1]], 0, !nosanitize [[META0:![0-9]+]]
22 ; TR-NEXT:    [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 16, !nosanitize [[META0]]
23 ; TR-NEXT:    [[TMP5:%.*]] = or i1 false, [[TMP4]], !nosanitize [[META0]]
24 ; TR-NEXT:    [[TMP6:%.*]] = or i1 false, [[TMP5]], !nosanitize [[META0]]
25 ; TR-NEXT:    br i1 [[TMP6]], label %[[TRAP:.*]], label %[[BB7:.*]]
26 ; TR:       [[BB7]]:
27 ; TR-NEXT:    [[TMP8:%.*]] = load i128, ptr [[TMP2]], align 4
28 ; TR-NEXT:    ret void
29 ; TR:       [[TRAP]]:
30 ; TR-NEXT:    call void @llvm.trap() #[[ATTR2:[0-9]+]], !nosanitize [[META0]]
31 ; TR-NEXT:    unreachable, !nosanitize [[META0]]
33 ; RT-LABEL: define void @f1(
34 ; RT-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
35 ; RT-NEXT:    [[TMP1:%.*]] = mul i64 16, [[X]]
36 ; RT-NEXT:    [[TMP2:%.*]] = alloca i128, i64 [[X]], align 8
37 ; RT-NEXT:    [[TMP3:%.*]] = sub i64 [[TMP1]], 0, !nosanitize [[META0:![0-9]+]]
38 ; RT-NEXT:    [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 16, !nosanitize [[META0]]
39 ; RT-NEXT:    [[TMP5:%.*]] = or i1 false, [[TMP4]], !nosanitize [[META0]]
40 ; RT-NEXT:    [[TMP6:%.*]] = or i1 false, [[TMP5]], !nosanitize [[META0]]
41 ; RT-NEXT:    br i1 [[TMP6]], label %[[TRAP:.*]], label %[[BB7:.*]]
42 ; RT:       [[BB7]]:
43 ; RT-NEXT:    [[TMP8:%.*]] = load i128, ptr [[TMP2]], align 4
44 ; RT-NEXT:    ret void
45 ; RT:       [[TRAP]]:
46 ; RT-NEXT:    call void @__ubsan_handle_local_out_of_bounds() #[[ATTR0]], !nosanitize [[META0]]
47 ; RT-NEXT:    br label %[[BB7]], !nosanitize [[META0]]
49 ; TR-NOMERGE-LABEL: define void @f1(
50 ; TR-NOMERGE-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
51 ; TR-NOMERGE-NEXT:    [[TMP1:%.*]] = mul i64 16, [[X]]
52 ; TR-NOMERGE-NEXT:    [[TMP2:%.*]] = alloca i128, i64 [[X]], align 8
53 ; TR-NOMERGE-NEXT:    [[TMP3:%.*]] = sub i64 [[TMP1]], 0, !nosanitize [[META0:![0-9]+]]
54 ; TR-NOMERGE-NEXT:    [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 16, !nosanitize [[META0]]
55 ; TR-NOMERGE-NEXT:    [[TMP5:%.*]] = or i1 false, [[TMP4]], !nosanitize [[META0]]
56 ; TR-NOMERGE-NEXT:    [[TMP6:%.*]] = or i1 false, [[TMP5]], !nosanitize [[META0]]
57 ; TR-NOMERGE-NEXT:    br i1 [[TMP6]], label %[[TRAP:.*]], label %[[BB7:.*]]
58 ; TR-NOMERGE:       [[BB7]]:
59 ; TR-NOMERGE-NEXT:    [[TMP8:%.*]] = load i128, ptr [[TMP2]], align 4
60 ; TR-NOMERGE-NEXT:    ret void
61 ; TR-NOMERGE:       [[TRAP]]:
62 ; TR-NOMERGE-NEXT:    call void @llvm.ubsantrap(i8 3) #[[ATTR2:[0-9]+]], !nosanitize [[META0]]
63 ; TR-NOMERGE-NEXT:    unreachable, !nosanitize [[META0]]
65 ; RT-NOMERGE-LABEL: define void @f1(
66 ; RT-NOMERGE-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
67 ; RT-NOMERGE-NEXT:    [[TMP1:%.*]] = mul i64 16, [[X]]
68 ; RT-NOMERGE-NEXT:    [[TMP2:%.*]] = alloca i128, i64 [[X]], align 8
69 ; RT-NOMERGE-NEXT:    [[TMP3:%.*]] = sub i64 [[TMP1]], 0, !nosanitize [[META0:![0-9]+]]
70 ; RT-NOMERGE-NEXT:    [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 16, !nosanitize [[META0]]
71 ; RT-NOMERGE-NEXT:    [[TMP5:%.*]] = or i1 false, [[TMP4]], !nosanitize [[META0]]
72 ; RT-NOMERGE-NEXT:    [[TMP6:%.*]] = or i1 false, [[TMP5]], !nosanitize [[META0]]
73 ; RT-NOMERGE-NEXT:    br i1 [[TMP6]], label %[[TRAP:.*]], label %[[BB7:.*]]
74 ; RT-NOMERGE:       [[BB7]]:
75 ; RT-NOMERGE-NEXT:    [[TMP8:%.*]] = load i128, ptr [[TMP2]], align 4
76 ; RT-NOMERGE-NEXT:    ret void
77 ; RT-NOMERGE:       [[TRAP]]:
78 ; RT-NOMERGE-NEXT:    call void @__ubsan_handle_local_out_of_bounds() #[[ATTR1:[0-9]+]], !nosanitize [[META0]]
79 ; RT-NOMERGE-NEXT:    br label %[[BB7]], !nosanitize [[META0]]
81 ; RTABORT-NOMERGE-LABEL: define void @f1(
82 ; RTABORT-NOMERGE-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
83 ; RTABORT-NOMERGE-NEXT:    [[TMP1:%.*]] = mul i64 16, [[X]]
84 ; RTABORT-NOMERGE-NEXT:    [[TMP2:%.*]] = alloca i128, i64 [[X]], align 8
85 ; RTABORT-NOMERGE-NEXT:    [[TMP3:%.*]] = sub i64 [[TMP1]], 0, !nosanitize [[META0:![0-9]+]]
86 ; RTABORT-NOMERGE-NEXT:    [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 16, !nosanitize [[META0]]
87 ; RTABORT-NOMERGE-NEXT:    [[TMP5:%.*]] = or i1 false, [[TMP4]], !nosanitize [[META0]]
88 ; RTABORT-NOMERGE-NEXT:    [[TMP6:%.*]] = or i1 false, [[TMP5]], !nosanitize [[META0]]
89 ; RTABORT-NOMERGE-NEXT:    br i1 [[TMP6]], label %[[TRAP:.*]], label %[[BB7:.*]]
90 ; RTABORT-NOMERGE:       [[BB7]]:
91 ; RTABORT-NOMERGE-NEXT:    [[TMP8:%.*]] = load i128, ptr [[TMP2]], align 4
92 ; RTABORT-NOMERGE-NEXT:    ret void
93 ; RTABORT-NOMERGE:       [[TRAP]]:
94 ; RTABORT-NOMERGE-NEXT:    call void @__ubsan_handle_local_out_of_bounds_abort() #[[ATTR2:[0-9]+]], !nosanitize [[META0]]
95 ; RTABORT-NOMERGE-NEXT:    unreachable, !nosanitize [[META0]]
97 ; MINRT-NOMERGE-LABEL: define void @f1(
98 ; MINRT-NOMERGE-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
99 ; MINRT-NOMERGE-NEXT:    [[TMP1:%.*]] = mul i64 16, [[X]]
100 ; MINRT-NOMERGE-NEXT:    [[TMP2:%.*]] = alloca i128, i64 [[X]], align 8
101 ; MINRT-NOMERGE-NEXT:    [[TMP3:%.*]] = sub i64 [[TMP1]], 0, !nosanitize [[META0:![0-9]+]]
102 ; MINRT-NOMERGE-NEXT:    [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 16, !nosanitize [[META0]]
103 ; MINRT-NOMERGE-NEXT:    [[TMP5:%.*]] = or i1 false, [[TMP4]], !nosanitize [[META0]]
104 ; MINRT-NOMERGE-NEXT:    [[TMP6:%.*]] = or i1 false, [[TMP5]], !nosanitize [[META0]]
105 ; MINRT-NOMERGE-NEXT:    br i1 [[TMP6]], label %[[TRAP:.*]], label %[[BB7:.*]]
106 ; MINRT-NOMERGE:       [[BB7]]:
107 ; MINRT-NOMERGE-NEXT:    [[TMP8:%.*]] = load i128, ptr [[TMP2]], align 4
108 ; MINRT-NOMERGE-NEXT:    ret void
109 ; MINRT-NOMERGE:       [[TRAP]]:
110 ; MINRT-NOMERGE-NEXT:    call void @__ubsan_handle_local_out_of_bounds_minimal() #[[ATTR1:[0-9]+]], !nosanitize [[META0]]
111 ; MINRT-NOMERGE-NEXT:    br label %[[BB7]], !nosanitize [[META0]]
113 ; MINRTABORT-NOMERGE-LABEL: define void @f1(
114 ; MINRTABORT-NOMERGE-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
115 ; MINRTABORT-NOMERGE-NEXT:    [[TMP1:%.*]] = mul i64 16, [[X]]
116 ; MINRTABORT-NOMERGE-NEXT:    [[TMP2:%.*]] = alloca i128, i64 [[X]], align 8
117 ; MINRTABORT-NOMERGE-NEXT:    [[TMP3:%.*]] = sub i64 [[TMP1]], 0, !nosanitize [[META0:![0-9]+]]
118 ; MINRTABORT-NOMERGE-NEXT:    [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 16, !nosanitize [[META0]]
119 ; MINRTABORT-NOMERGE-NEXT:    [[TMP5:%.*]] = or i1 false, [[TMP4]], !nosanitize [[META0]]
120 ; MINRTABORT-NOMERGE-NEXT:    [[TMP6:%.*]] = or i1 false, [[TMP5]], !nosanitize [[META0]]
121 ; MINRTABORT-NOMERGE-NEXT:    br i1 [[TMP6]], label %[[TRAP:.*]], label %[[BB7:.*]]
122 ; MINRTABORT-NOMERGE:       [[BB7]]:
123 ; MINRTABORT-NOMERGE-NEXT:    [[TMP8:%.*]] = load i128, ptr [[TMP2]], align 4
124 ; MINRTABORT-NOMERGE-NEXT:    ret void
125 ; MINRTABORT-NOMERGE:       [[TRAP]]:
126 ; MINRTABORT-NOMERGE-NEXT:    call void @__ubsan_handle_local_out_of_bounds_minimal_abort() #[[ATTR2:[0-9]+]], !nosanitize [[META0]]
127 ; MINRTABORT-NOMERGE-NEXT:    unreachable, !nosanitize [[META0]]
129 ; TR-GUARD-LABEL: define void @f1(
130 ; TR-GUARD-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
131 ; TR-GUARD-NEXT:    [[TMP1:%.*]] = mul i64 16, [[X]]
132 ; TR-GUARD-NEXT:    [[TMP2:%.*]] = alloca i128, i64 [[X]], align 8
133 ; TR-GUARD-NEXT:    [[TMP3:%.*]] = sub i64 [[TMP1]], 0, !nosanitize [[META0:![0-9]+]]
134 ; TR-GUARD-NEXT:    [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 16, !nosanitize [[META0]]
135 ; TR-GUARD-NEXT:    [[TMP5:%.*]] = or i1 false, [[TMP4]], !nosanitize [[META0]]
136 ; TR-GUARD-NEXT:    [[TMP6:%.*]] = or i1 false, [[TMP5]], !nosanitize [[META0]]
137 ; TR-GUARD-NEXT:    [[TMP7:%.*]] = call i1 @llvm.allow.ubsan.check(i8 3), !nosanitize [[META0]]
138 ; TR-GUARD-NEXT:    [[TMP8:%.*]] = and i1 [[TMP6]], [[TMP7]], !nosanitize [[META0]]
139 ; TR-GUARD-NEXT:    br i1 [[TMP8]], label %[[TRAP:.*]], label %[[BB9:.*]]
140 ; TR-GUARD:       [[BB9]]:
141 ; TR-GUARD-NEXT:    [[TMP10:%.*]] = load i128, ptr [[TMP2]], align 4
142 ; TR-GUARD-NEXT:    ret void
143 ; TR-GUARD:       [[TRAP]]:
144 ; TR-GUARD-NEXT:    call void @llvm.ubsantrap(i8 3) #[[ATTR3:[0-9]+]], !nosanitize [[META0]]
145 ; TR-GUARD-NEXT:    unreachable, !nosanitize [[META0]]
147 ; RT-GUARD-LABEL: define void @f1(
148 ; RT-GUARD-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
149 ; RT-GUARD-NEXT:    [[TMP1:%.*]] = mul i64 16, [[X]]
150 ; RT-GUARD-NEXT:    [[TMP2:%.*]] = alloca i128, i64 [[X]], align 8
151 ; RT-GUARD-NEXT:    [[TMP3:%.*]] = sub i64 [[TMP1]], 0, !nosanitize [[META0:![0-9]+]]
152 ; RT-GUARD-NEXT:    [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 16, !nosanitize [[META0]]
153 ; RT-GUARD-NEXT:    [[TMP5:%.*]] = or i1 false, [[TMP4]], !nosanitize [[META0]]
154 ; RT-GUARD-NEXT:    [[TMP6:%.*]] = or i1 false, [[TMP5]], !nosanitize [[META0]]
155 ; RT-GUARD-NEXT:    [[TMP7:%.*]] = call i1 @llvm.allow.ubsan.check(i8 -5), !nosanitize [[META0]]
156 ; RT-GUARD-NEXT:    [[TMP8:%.*]] = and i1 [[TMP6]], [[TMP7]], !nosanitize [[META0]]
157 ; RT-GUARD-NEXT:    br i1 [[TMP8]], label %[[TRAP:.*]], label %[[BB9:.*]]
158 ; RT-GUARD:       [[BB9]]:
159 ; RT-GUARD-NEXT:    [[TMP10:%.*]] = load i128, ptr [[TMP2]], align 4
160 ; RT-GUARD-NEXT:    ret void
161 ; RT-GUARD:       [[TRAP]]:
162 ; RT-GUARD-NEXT:    call void @__ubsan_handle_local_out_of_bounds() #[[ATTR2:[0-9]+]], !nosanitize [[META0]]
163 ; RT-GUARD-NEXT:    br label %[[BB9]], !nosanitize [[META0]]
165   %1 = alloca i128, i64 %x
166   %3 = load i128, ptr %1, align 4
167   ret void
171 ; TR: attributes #[[ATTR0]] = { nounwind }
172 ; TR: attributes #[[ATTR1:[0-9]+]] = { cold noreturn nounwind memory(inaccessiblemem: write) }
173 ; TR: attributes #[[ATTR2]] = { noreturn nounwind }
175 ; RT: attributes #[[ATTR0]] = { nounwind }
177 ; TR-NOMERGE: attributes #[[ATTR0]] = { nounwind }
178 ; TR-NOMERGE: attributes #[[ATTR1:[0-9]+]] = { cold noreturn nounwind }
179 ; TR-NOMERGE: attributes #[[ATTR2]] = { nomerge noreturn nounwind }
181 ; RT-NOMERGE: attributes #[[ATTR0]] = { nounwind }
182 ; RT-NOMERGE: attributes #[[ATTR1]] = { nomerge nounwind }
184 ; RTABORT-NOMERGE: attributes #[[ATTR0]] = { nounwind }
185 ; RTABORT-NOMERGE: attributes #[[ATTR1:[0-9]+]] = { noreturn nounwind }
186 ; RTABORT-NOMERGE: attributes #[[ATTR2]] = { nomerge noreturn nounwind }
188 ; MINRT-NOMERGE: attributes #[[ATTR0]] = { nounwind }
189 ; MINRT-NOMERGE: attributes #[[ATTR1]] = { nomerge nounwind }
191 ; MINRTABORT-NOMERGE: attributes #[[ATTR0]] = { nounwind }
192 ; MINRTABORT-NOMERGE: attributes #[[ATTR1:[0-9]+]] = { noreturn nounwind }
193 ; MINRTABORT-NOMERGE: attributes #[[ATTR2]] = { nomerge noreturn nounwind }
195 ; TR-GUARD: attributes #[[ATTR0]] = { nounwind }
196 ; TR-GUARD: attributes #[[ATTR1:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write) }
197 ; TR-GUARD: attributes #[[ATTR2:[0-9]+]] = { cold noreturn nounwind }
198 ; TR-GUARD: attributes #[[ATTR3]] = { nomerge noreturn nounwind }
200 ; RT-GUARD: attributes #[[ATTR0]] = { nounwind }
201 ; RT-GUARD: attributes #[[ATTR1:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write) }
202 ; RT-GUARD: attributes #[[ATTR2]] = { nomerge nounwind }
204 ; TR: [[META0]] = !{}
206 ; RT: [[META0]] = !{}
208 ; TR-NOMERGE: [[META0]] = !{}
210 ; RT-NOMERGE: [[META0]] = !{}
212 ; RTABORT-NOMERGE: [[META0]] = !{}
214 ; MINRT-NOMERGE: [[META0]] = !{}
216 ; MINRTABORT-NOMERGE: [[META0]] = !{}
218 ; TR-GUARD: [[META0]] = !{}
220 ; RT-GUARD: [[META0]] = !{}