11// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4
22// 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
55
66
77// CHECK-LABEL: define dso_local i32 @div(
3131// CHECK-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], [[TMP1]]
3232// CHECK-NEXT: ret i32 [[DIV]]
3333//
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]]
5858//
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]]
8585//
8686int div (int x , int y ) {
8787 return x / y ;
@@ -106,42 +106,42 @@ int div(int x, int y) {
106106// CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP0]], align 4
107107// CHECK-NEXT: ret i32 [[TMP6]]
108108//
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]]
126126//
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]]
145145//
146146int null (int * x ) {
147147 return * x ;
@@ -172,53 +172,53 @@ int null(int* x) {
172172// CHECK: cont:
173173// CHECK-NEXT: ret i32 [[TMP3]]
174174//
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]]
197197//
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]]
222222//
223223int overflow (int x , int y ) {
224224 return x + y ;
@@ -227,8 +227,8 @@ int overflow(int x, int y) {
227227// CHECK: [[META2]] = !{}
228228// CHECK: [[PROF3]] = !{!"branch_weights", i32 1048575, i32 1}
229229//.
230- // TRAP : [[META2]] = !{}
230+ // TR : [[META2]] = !{}
231231//.
232- // RECOVER : [[META2]] = !{}
233- // RECOVER : [[PROF3]] = !{!"branch_weights", i32 1048575, i32 1}
232+ // REC : [[META2]] = !{}
233+ // REC : [[PROF3]] = !{!"branch_weights", i32 1048575, i32 1}
234234//.
0 commit comments