1
1
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4
2
2
// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm -o - %s -fsanitize=signed-integer-overflow,integer-divide-by-zero,null -mllvm -ubsan-guard-checks | FileCheck %s
3
- // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm -o - %s -fsanitize=signed-integer-overflow,integer-divide-by-zero,null -mllvm -ubsan-guard-checks -fsanitize-trap=signed-integer-overflow,integer-divide-by-zero,null | FileCheck %s --check-prefixes=TRAP
4
- // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm -o - %s -fsanitize=signed-integer-overflow,integer-divide-by-zero,null -mllvm -ubsan-guard-checks -fsanitize-recover=signed-integer-overflow,integer-divide-by-zero,null | FileCheck %s --check-prefixes=RECOVER
3
+ // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm -o - %s -fsanitize=signed-integer-overflow,integer-divide-by-zero,null -mllvm -ubsan-guard-checks -fsanitize-trap=signed-integer-overflow,integer-divide-by-zero,null | FileCheck %s --check-prefixes=TR
4
+ // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm -o - %s -fsanitize=signed-integer-overflow,integer-divide-by-zero,null -mllvm -ubsan-guard-checks -fsanitize-recover=signed-integer-overflow,integer-divide-by-zero,null | FileCheck %s --check-prefixes=REC
5
5
6
6
7
7
// CHECK-LABEL: define dso_local i32 @div(
31
31
// CHECK-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], [[TMP1]]
32
32
// CHECK-NEXT: ret i32 [[DIV]]
33
33
//
34
- // TRAP -LABEL: define dso_local i32 @div(
35
- // TRAP -SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) #[[ATTR0:[0-9]+]] {
36
- // TRAP -NEXT: entry:
37
- // TRAP -NEXT: [[X_ADDR:%.*]] = alloca i32, align 4
38
- // TRAP -NEXT: [[Y_ADDR:%.*]] = alloca i32, align 4
39
- // TRAP -NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4
40
- // TRAP -NEXT: store i32 [[Y]], ptr [[Y_ADDR]], align 4
41
- // TRAP -NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4
42
- // TRAP -NEXT: [[TMP1:%.*]] = load i32, ptr [[Y_ADDR]], align 4
43
- // TRAP -NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0, !nosanitize [[META2:![0-9]+]]
44
- // TRAP -NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP0]], -2147483648, !nosanitize [[META2]]
45
- // TRAP -NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP1]], -1, !nosanitize [[META2]]
46
- // TRAP -NEXT: [[OR:%.*]] = or i1 [[TMP3]], [[TMP4]], !nosanitize [[META2]]
47
- // TRAP -NEXT: [[TMP5:%.*]] = and i1 [[TMP2]], [[OR]], !nosanitize [[META2]]
48
- // TRAP -NEXT: [[TMP6:%.*]] = call i1 @llvm.allow.ubsan.check(i8 3), !nosanitize [[META2]]
49
- // TRAP -NEXT: [[TMP7:%.*]] = xor i1 [[TMP6]], true, !nosanitize [[META2]]
50
- // TRAP -NEXT: [[TMP8:%.*]] = or i1 [[TMP5]], [[TMP7]], !nosanitize [[META2]]
51
- // TRAP -NEXT: br i1 [[TMP8]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize [[META2]]
52
- // TRAP : trap:
53
- // TRAP -NEXT: call void @llvm.ubsantrap(i8 3) #[[ATTR4:[0-9]+]], !nosanitize [[META2]]
54
- // TRAP -NEXT: unreachable, !nosanitize [[META2]]
55
- // TRAP : cont:
56
- // TRAP -NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], [[TMP1]]
57
- // TRAP -NEXT: ret i32 [[DIV]]
34
+ // TR -LABEL: define dso_local i32 @div(
35
+ // TR -SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) #[[ATTR0:[0-9]+]] {
36
+ // TR -NEXT: entry:
37
+ // TR -NEXT: [[X_ADDR:%.*]] = alloca i32, align 4
38
+ // TR -NEXT: [[Y_ADDR:%.*]] = alloca i32, align 4
39
+ // TR -NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4
40
+ // TR -NEXT: store i32 [[Y]], ptr [[Y_ADDR]], align 4
41
+ // TR -NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4
42
+ // TR -NEXT: [[TMP1:%.*]] = load i32, ptr [[Y_ADDR]], align 4
43
+ // TR -NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0, !nosanitize [[META2:![0-9]+]]
44
+ // TR -NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP0]], -2147483648, !nosanitize [[META2]]
45
+ // TR -NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP1]], -1, !nosanitize [[META2]]
46
+ // TR -NEXT: [[OR:%.*]] = or i1 [[TMP3]], [[TMP4]], !nosanitize [[META2]]
47
+ // TR -NEXT: [[TMP5:%.*]] = and i1 [[TMP2]], [[OR]], !nosanitize [[META2]]
48
+ // TR -NEXT: [[TMP6:%.*]] = call i1 @llvm.allow.ubsan.check(i8 3), !nosanitize [[META2]]
49
+ // TR -NEXT: [[TMP7:%.*]] = xor i1 [[TMP6]], true, !nosanitize [[META2]]
50
+ // TR -NEXT: [[TMP8:%.*]] = or i1 [[TMP5]], [[TMP7]], !nosanitize [[META2]]
51
+ // TR -NEXT: br i1 [[TMP8]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize [[META2]]
52
+ // TR : trap:
53
+ // TR -NEXT: call void @llvm.ubsantrap(i8 3) #[[ATTR4:[0-9]+]], !nosanitize [[META2]]
54
+ // TR -NEXT: unreachable, !nosanitize [[META2]]
55
+ // TR : cont:
56
+ // TR -NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], [[TMP1]]
57
+ // TR -NEXT: ret i32 [[DIV]]
58
58
//
59
- // RECOVER -LABEL: define dso_local i32 @div(
60
- // RECOVER -SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) #[[ATTR0:[0-9]+]] {
61
- // RECOVER -NEXT: entry:
62
- // RECOVER -NEXT: [[X_ADDR:%.*]] = alloca i32, align 4
63
- // RECOVER -NEXT: [[Y_ADDR:%.*]] = alloca i32, align 4
64
- // RECOVER -NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4
65
- // RECOVER -NEXT: store i32 [[Y]], ptr [[Y_ADDR]], align 4
66
- // RECOVER -NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4
67
- // RECOVER -NEXT: [[TMP1:%.*]] = load i32, ptr [[Y_ADDR]], align 4
68
- // RECOVER -NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0, !nosanitize [[META2:![0-9]+]]
69
- // RECOVER -NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP0]], -2147483648, !nosanitize [[META2]]
70
- // RECOVER -NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP1]], -1, !nosanitize [[META2]]
71
- // RECOVER -NEXT: [[OR:%.*]] = or i1 [[TMP3]], [[TMP4]], !nosanitize [[META2]]
72
- // RECOVER -NEXT: [[TMP5:%.*]] = and i1 [[TMP2]], [[OR]], !nosanitize [[META2]]
73
- // RECOVER -NEXT: [[TMP6:%.*]] = call i1 @llvm.allow.ubsan.check(i8 3), !nosanitize [[META2]]
74
- // RECOVER -NEXT: [[TMP7:%.*]] = xor i1 [[TMP6]], true, !nosanitize [[META2]]
75
- // RECOVER -NEXT: [[TMP8:%.*]] = or i1 [[TMP5]], [[TMP7]], !nosanitize [[META2]]
76
- // RECOVER -NEXT: br i1 [[TMP8]], label [[CONT:%.*]], label [[HANDLER_DIVREM_OVERFLOW:%.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]]
77
- // RECOVER : handler.divrem_overflow:
78
- // RECOVER -NEXT: [[TMP9:%.*]] = zext i32 [[TMP0]] to i64, !nosanitize [[META2]]
79
- // RECOVER -NEXT: [[TMP10:%.*]] = zext i32 [[TMP1]] to i64, !nosanitize [[META2]]
80
- // RECOVER -NEXT: call void @__ubsan_handle_divrem_overflow(ptr @[[GLOB1:[0-9]+]], i64 [[TMP9]], i64 [[TMP10]]) #[[ATTR4:[0-9]+]], !nosanitize [[META2]]
81
- // RECOVER -NEXT: br label [[CONT]], !nosanitize [[META2]]
82
- // RECOVER : cont:
83
- // RECOVER -NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], [[TMP1]]
84
- // RECOVER -NEXT: ret i32 [[DIV]]
59
+ // REC -LABEL: define dso_local i32 @div(
60
+ // REC -SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) #[[ATTR0:[0-9]+]] {
61
+ // REC -NEXT: entry:
62
+ // REC -NEXT: [[X_ADDR:%.*]] = alloca i32, align 4
63
+ // REC -NEXT: [[Y_ADDR:%.*]] = alloca i32, align 4
64
+ // REC -NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4
65
+ // REC -NEXT: store i32 [[Y]], ptr [[Y_ADDR]], align 4
66
+ // REC -NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4
67
+ // REC -NEXT: [[TMP1:%.*]] = load i32, ptr [[Y_ADDR]], align 4
68
+ // REC -NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0, !nosanitize [[META2:![0-9]+]]
69
+ // REC -NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP0]], -2147483648, !nosanitize [[META2]]
70
+ // REC -NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP1]], -1, !nosanitize [[META2]]
71
+ // REC -NEXT: [[OR:%.*]] = or i1 [[TMP3]], [[TMP4]], !nosanitize [[META2]]
72
+ // REC -NEXT: [[TMP5:%.*]] = and i1 [[TMP2]], [[OR]], !nosanitize [[META2]]
73
+ // REC -NEXT: [[TMP6:%.*]] = call i1 @llvm.allow.ubsan.check(i8 3), !nosanitize [[META2]]
74
+ // REC -NEXT: [[TMP7:%.*]] = xor i1 [[TMP6]], true, !nosanitize [[META2]]
75
+ // REC -NEXT: [[TMP8:%.*]] = or i1 [[TMP5]], [[TMP7]], !nosanitize [[META2]]
76
+ // REC -NEXT: br i1 [[TMP8]], label [[CONT:%.*]], label [[HANDLER_DIVREM_OVERFLOW:%.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]]
77
+ // REC : handler.divrem_overflow:
78
+ // REC -NEXT: [[TMP9:%.*]] = zext i32 [[TMP0]] to i64, !nosanitize [[META2]]
79
+ // REC -NEXT: [[TMP10:%.*]] = zext i32 [[TMP1]] to i64, !nosanitize [[META2]]
80
+ // REC -NEXT: call void @__ubsan_handle_divrem_overflow(ptr @[[GLOB1:[0-9]+]], i64 [[TMP9]], i64 [[TMP10]]) #[[ATTR4:[0-9]+]], !nosanitize [[META2]]
81
+ // REC -NEXT: br label [[CONT]], !nosanitize [[META2]]
82
+ // REC : cont:
83
+ // REC -NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], [[TMP1]]
84
+ // REC -NEXT: ret i32 [[DIV]]
85
85
//
86
86
int div (int x , int y ) {
87
87
return x / y ;
@@ -106,42 +106,42 @@ int div(int x, int y) {
106
106
// CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP0]], align 4
107
107
// CHECK-NEXT: ret i32 [[TMP6]]
108
108
//
109
- // TRAP -LABEL: define dso_local i32 @null(
110
- // TRAP -SAME: ptr noundef [[X:%.*]]) #[[ATTR0]] {
111
- // TRAP -NEXT: entry:
112
- // TRAP -NEXT: [[X_ADDR:%.*]] = alloca ptr, align 8
113
- // TRAP -NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8
114
- // TRAP -NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8
115
- // TRAP -NEXT: [[TMP1:%.*]] = icmp ne ptr [[TMP0]], null, !nosanitize [[META2]]
116
- // TRAP -NEXT: [[TMP2:%.*]] = call i1 @llvm.allow.ubsan.check(i8 22), !nosanitize [[META2]]
117
- // TRAP -NEXT: [[TMP3:%.*]] = xor i1 [[TMP2]], true, !nosanitize [[META2]]
118
- // TRAP -NEXT: [[TMP4:%.*]] = or i1 [[TMP1]], [[TMP3]], !nosanitize [[META2]]
119
- // TRAP -NEXT: br i1 [[TMP4]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize [[META2]]
120
- // TRAP : trap:
121
- // TRAP -NEXT: call void @llvm.ubsantrap(i8 22) #[[ATTR4]], !nosanitize [[META2]]
122
- // TRAP -NEXT: unreachable, !nosanitize [[META2]]
123
- // TRAP : cont:
124
- // TRAP -NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
125
- // TRAP -NEXT: ret i32 [[TMP5]]
109
+ // TR -LABEL: define dso_local i32 @null(
110
+ // TR -SAME: ptr noundef [[X:%.*]]) #[[ATTR0]] {
111
+ // TR -NEXT: entry:
112
+ // TR -NEXT: [[X_ADDR:%.*]] = alloca ptr, align 8
113
+ // TR -NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8
114
+ // TR -NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8
115
+ // TR -NEXT: [[TMP1:%.*]] = icmp ne ptr [[TMP0]], null, !nosanitize [[META2]]
116
+ // TR -NEXT: [[TMP2:%.*]] = call i1 @llvm.allow.ubsan.check(i8 22), !nosanitize [[META2]]
117
+ // TR -NEXT: [[TMP3:%.*]] = xor i1 [[TMP2]], true, !nosanitize [[META2]]
118
+ // TR -NEXT: [[TMP4:%.*]] = or i1 [[TMP1]], [[TMP3]], !nosanitize [[META2]]
119
+ // TR -NEXT: br i1 [[TMP4]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize [[META2]]
120
+ // TR : trap:
121
+ // TR -NEXT: call void @llvm.ubsantrap(i8 22) #[[ATTR4]], !nosanitize [[META2]]
122
+ // TR -NEXT: unreachable, !nosanitize [[META2]]
123
+ // TR : cont:
124
+ // TR -NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
125
+ // TR -NEXT: ret i32 [[TMP5]]
126
126
//
127
- // RECOVER -LABEL: define dso_local i32 @null(
128
- // RECOVER -SAME: ptr noundef [[X:%.*]]) #[[ATTR0]] {
129
- // RECOVER -NEXT: entry:
130
- // RECOVER -NEXT: [[X_ADDR:%.*]] = alloca ptr, align 8
131
- // RECOVER -NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8
132
- // RECOVER -NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8
133
- // RECOVER -NEXT: [[TMP1:%.*]] = icmp ne ptr [[TMP0]], null, !nosanitize [[META2]]
134
- // RECOVER -NEXT: [[TMP2:%.*]] = call i1 @llvm.allow.ubsan.check(i8 22), !nosanitize [[META2]]
135
- // RECOVER -NEXT: [[TMP3:%.*]] = xor i1 [[TMP2]], true, !nosanitize [[META2]]
136
- // RECOVER -NEXT: [[TMP4:%.*]] = or i1 [[TMP1]], [[TMP3]], !nosanitize [[META2]]
137
- // RECOVER -NEXT: br i1 [[TMP4]], label [[CONT:%.*]], label [[HANDLER_TYPE_MISMATCH:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
138
- // RECOVER : handler.type_mismatch:
139
- // RECOVER -NEXT: [[TMP5:%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META2]]
140
- // RECOVER -NEXT: call void @__ubsan_handle_type_mismatch_v1(ptr @[[GLOB2:[0-9]+]], i64 [[TMP5]]) #[[ATTR4]], !nosanitize [[META2]]
141
- // RECOVER -NEXT: br label [[CONT]], !nosanitize [[META2]]
142
- // RECOVER : cont:
143
- // RECOVER -NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP0]], align 4
144
- // RECOVER -NEXT: ret i32 [[TMP6]]
127
+ // REC -LABEL: define dso_local i32 @null(
128
+ // REC -SAME: ptr noundef [[X:%.*]]) #[[ATTR0]] {
129
+ // REC -NEXT: entry:
130
+ // REC -NEXT: [[X_ADDR:%.*]] = alloca ptr, align 8
131
+ // REC -NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8
132
+ // REC -NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8
133
+ // REC -NEXT: [[TMP1:%.*]] = icmp ne ptr [[TMP0]], null, !nosanitize [[META2]]
134
+ // REC -NEXT: [[TMP2:%.*]] = call i1 @llvm.allow.ubsan.check(i8 22), !nosanitize [[META2]]
135
+ // REC -NEXT: [[TMP3:%.*]] = xor i1 [[TMP2]], true, !nosanitize [[META2]]
136
+ // REC -NEXT: [[TMP4:%.*]] = or i1 [[TMP1]], [[TMP3]], !nosanitize [[META2]]
137
+ // REC -NEXT: br i1 [[TMP4]], label [[CONT:%.*]], label [[HANDLER_TYPE_MISMATCH:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
138
+ // REC : handler.type_mismatch:
139
+ // REC -NEXT: [[TMP5:%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META2]]
140
+ // REC -NEXT: call void @__ubsan_handle_type_mismatch_v1(ptr @[[GLOB2:[0-9]+]], i64 [[TMP5]]) #[[ATTR4]], !nosanitize [[META2]]
141
+ // REC -NEXT: br label [[CONT]], !nosanitize [[META2]]
142
+ // REC : cont:
143
+ // REC -NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP0]], align 4
144
+ // REC -NEXT: ret i32 [[TMP6]]
145
145
//
146
146
int null (int * x ) {
147
147
return * x ;
@@ -172,53 +172,53 @@ int null(int* x) {
172
172
// CHECK: cont:
173
173
// CHECK-NEXT: ret i32 [[TMP3]]
174
174
//
175
- // TRAP -LABEL: define dso_local i32 @overflow(
176
- // TRAP -SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) #[[ATTR0]] {
177
- // TRAP -NEXT: entry:
178
- // TRAP -NEXT: [[X_ADDR:%.*]] = alloca i32, align 4
179
- // TRAP -NEXT: [[Y_ADDR:%.*]] = alloca i32, align 4
180
- // TRAP -NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4
181
- // TRAP -NEXT: store i32 [[Y]], ptr [[Y_ADDR]], align 4
182
- // TRAP -NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4
183
- // TRAP -NEXT: [[TMP1:%.*]] = load i32, ptr [[Y_ADDR]], align 4
184
- // TRAP -NEXT: [[TMP2:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[TMP0]], i32 [[TMP1]]), !nosanitize [[META2]]
185
- // TRAP -NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
186
- // TRAP -NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
187
- // TRAP -NEXT: [[TMP5:%.*]] = xor i1 [[TMP4]], true, !nosanitize [[META2]]
188
- // TRAP -NEXT: [[TMP6:%.*]] = call i1 @llvm.allow.ubsan.check(i8 0), !nosanitize [[META2]]
189
- // TRAP -NEXT: [[TMP7:%.*]] = xor i1 [[TMP6]], true, !nosanitize [[META2]]
190
- // TRAP -NEXT: [[TMP8:%.*]] = or i1 [[TMP5]], [[TMP7]], !nosanitize [[META2]]
191
- // TRAP -NEXT: br i1 [[TMP8]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize [[META2]]
192
- // TRAP : trap:
193
- // TRAP -NEXT: call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
194
- // TRAP -NEXT: unreachable, !nosanitize [[META2]]
195
- // TRAP : cont:
196
- // TRAP -NEXT: ret i32 [[TMP3]]
175
+ // TR -LABEL: define dso_local i32 @overflow(
176
+ // TR -SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) #[[ATTR0]] {
177
+ // TR -NEXT: entry:
178
+ // TR -NEXT: [[X_ADDR:%.*]] = alloca i32, align 4
179
+ // TR -NEXT: [[Y_ADDR:%.*]] = alloca i32, align 4
180
+ // TR -NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4
181
+ // TR -NEXT: store i32 [[Y]], ptr [[Y_ADDR]], align 4
182
+ // TR -NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4
183
+ // TR -NEXT: [[TMP1:%.*]] = load i32, ptr [[Y_ADDR]], align 4
184
+ // TR -NEXT: [[TMP2:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[TMP0]], i32 [[TMP1]]), !nosanitize [[META2]]
185
+ // TR -NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
186
+ // TR -NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
187
+ // TR -NEXT: [[TMP5:%.*]] = xor i1 [[TMP4]], true, !nosanitize [[META2]]
188
+ // TR -NEXT: [[TMP6:%.*]] = call i1 @llvm.allow.ubsan.check(i8 0), !nosanitize [[META2]]
189
+ // TR -NEXT: [[TMP7:%.*]] = xor i1 [[TMP6]], true, !nosanitize [[META2]]
190
+ // TR -NEXT: [[TMP8:%.*]] = or i1 [[TMP5]], [[TMP7]], !nosanitize [[META2]]
191
+ // TR -NEXT: br i1 [[TMP8]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize [[META2]]
192
+ // TR : trap:
193
+ // TR -NEXT: call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
194
+ // TR -NEXT: unreachable, !nosanitize [[META2]]
195
+ // TR : cont:
196
+ // TR -NEXT: ret i32 [[TMP3]]
197
197
//
198
- // RECOVER -LABEL: define dso_local i32 @overflow(
199
- // RECOVER -SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) #[[ATTR0]] {
200
- // RECOVER -NEXT: entry:
201
- // RECOVER -NEXT: [[X_ADDR:%.*]] = alloca i32, align 4
202
- // RECOVER -NEXT: [[Y_ADDR:%.*]] = alloca i32, align 4
203
- // RECOVER -NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4
204
- // RECOVER -NEXT: store i32 [[Y]], ptr [[Y_ADDR]], align 4
205
- // RECOVER -NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4
206
- // RECOVER -NEXT: [[TMP1:%.*]] = load i32, ptr [[Y_ADDR]], align 4
207
- // RECOVER -NEXT: [[TMP2:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[TMP0]], i32 [[TMP1]]), !nosanitize [[META2]]
208
- // RECOVER -NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
209
- // RECOVER -NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
210
- // RECOVER -NEXT: [[TMP5:%.*]] = xor i1 [[TMP4]], true, !nosanitize [[META2]]
211
- // RECOVER -NEXT: [[TMP6:%.*]] = call i1 @llvm.allow.ubsan.check(i8 0), !nosanitize [[META2]]
212
- // RECOVER -NEXT: [[TMP7:%.*]] = xor i1 [[TMP6]], true, !nosanitize [[META2]]
213
- // RECOVER -NEXT: [[TMP8:%.*]] = or i1 [[TMP5]], [[TMP7]], !nosanitize [[META2]]
214
- // RECOVER -NEXT: br i1 [[TMP8]], label [[CONT:%.*]], label [[HANDLER_ADD_OVERFLOW:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
215
- // RECOVER : handler.add_overflow:
216
- // RECOVER -NEXT: [[TMP9:%.*]] = zext i32 [[TMP0]] to i64, !nosanitize [[META2]]
217
- // RECOVER -NEXT: [[TMP10:%.*]] = zext i32 [[TMP1]] to i64, !nosanitize [[META2]]
218
- // RECOVER -NEXT: call void @__ubsan_handle_add_overflow(ptr @[[GLOB3:[0-9]+]], i64 [[TMP9]], i64 [[TMP10]]) #[[ATTR4]], !nosanitize [[META2]]
219
- // RECOVER -NEXT: br label [[CONT]], !nosanitize [[META2]]
220
- // RECOVER : cont:
221
- // RECOVER -NEXT: ret i32 [[TMP3]]
198
+ // REC -LABEL: define dso_local i32 @overflow(
199
+ // REC -SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) #[[ATTR0]] {
200
+ // REC -NEXT: entry:
201
+ // REC -NEXT: [[X_ADDR:%.*]] = alloca i32, align 4
202
+ // REC -NEXT: [[Y_ADDR:%.*]] = alloca i32, align 4
203
+ // REC -NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4
204
+ // REC -NEXT: store i32 [[Y]], ptr [[Y_ADDR]], align 4
205
+ // REC -NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4
206
+ // REC -NEXT: [[TMP1:%.*]] = load i32, ptr [[Y_ADDR]], align 4
207
+ // REC -NEXT: [[TMP2:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[TMP0]], i32 [[TMP1]]), !nosanitize [[META2]]
208
+ // REC -NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
209
+ // REC -NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
210
+ // REC -NEXT: [[TMP5:%.*]] = xor i1 [[TMP4]], true, !nosanitize [[META2]]
211
+ // REC -NEXT: [[TMP6:%.*]] = call i1 @llvm.allow.ubsan.check(i8 0), !nosanitize [[META2]]
212
+ // REC -NEXT: [[TMP7:%.*]] = xor i1 [[TMP6]], true, !nosanitize [[META2]]
213
+ // REC -NEXT: [[TMP8:%.*]] = or i1 [[TMP5]], [[TMP7]], !nosanitize [[META2]]
214
+ // REC -NEXT: br i1 [[TMP8]], label [[CONT:%.*]], label [[HANDLER_ADD_OVERFLOW:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
215
+ // REC : handler.add_overflow:
216
+ // REC -NEXT: [[TMP9:%.*]] = zext i32 [[TMP0]] to i64, !nosanitize [[META2]]
217
+ // REC -NEXT: [[TMP10:%.*]] = zext i32 [[TMP1]] to i64, !nosanitize [[META2]]
218
+ // REC -NEXT: call void @__ubsan_handle_add_overflow(ptr @[[GLOB3:[0-9]+]], i64 [[TMP9]], i64 [[TMP10]]) #[[ATTR4]], !nosanitize [[META2]]
219
+ // REC -NEXT: br label [[CONT]], !nosanitize [[META2]]
220
+ // REC : cont:
221
+ // REC -NEXT: ret i32 [[TMP3]]
222
222
//
223
223
int overflow (int x , int y ) {
224
224
return x + y ;
@@ -227,8 +227,8 @@ int overflow(int x, int y) {
227
227
// CHECK: [[META2]] = !{}
228
228
// CHECK: [[PROF3]] = !{!"branch_weights", i32 1048575, i32 1}
229
229
//.
230
- // TRAP : [[META2]] = !{}
230
+ // TR : [[META2]] = !{}
231
231
//.
232
- // RECOVER : [[META2]] = !{}
233
- // RECOVER : [[PROF3]] = !{!"branch_weights", i32 1048575, i32 1}
232
+ // REC : [[META2]] = !{}
233
+ // REC : [[PROF3]] = !{!"branch_weights", i32 1048575, i32 1}
234
234
//.
0 commit comments