9
9
; RUN: opt < %s -passes='bounds-checking<min-rt>' -S | FileCheck %s --check-prefixes=MINRT-NOMERGE
10
10
; RUN: opt < %s -passes='bounds-checking<min-rt-abort>' -S | FileCheck %s --check-prefixes=MINRTABORT-NOMERGE
11
11
;
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
12
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"
13
15
14
16
define void @f1 (i64 %x ) nounwind {
@@ -123,6 +125,42 @@ define void @f1(i64 %x) nounwind {
123
125
; MINRTABORT-NOMERGE: [[TRAP]]:
124
126
; MINRTABORT-NOMERGE-NEXT: call void @__ubsan_handle_local_out_of_bounds_minimal_abort() #[[ATTR2:[0-9]+]], !nosanitize [[META0]]
125
127
; MINRTABORT-NOMERGE-NEXT: unreachable, !nosanitize [[META0]]
128
+ ;
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]]
146
+ ;
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]]
126
164
;
127
165
%1 = alloca i128 , i64 %x
128
166
%3 = load i128 , ptr %1 , align 4
@@ -154,6 +192,15 @@ define void @f1(i64 %x) nounwind {
154
192
; MINRTABORT-NOMERGE: attributes #[[ATTR1:[0-9]+]] = { noreturn nounwind }
155
193
; MINRTABORT-NOMERGE: attributes #[[ATTR2]] = { nomerge noreturn nounwind }
156
194
;.
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 }
199
+ ;.
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 }
203
+ ;.
157
204
; TR: [[META0]] = !{}
158
205
;.
159
206
; RT: [[META0]] = !{}
@@ -168,3 +215,7 @@ define void @f1(i64 %x) nounwind {
168
215
;.
169
216
; MINRTABORT-NOMERGE: [[META0]] = !{}
170
217
;.
218
+ ; TR-GUARD: [[META0]] = !{}
219
+ ;.
220
+ ; RT-GUARD: [[META0]] = !{}
221
+ ;.
0 commit comments