xref: /llvm-project/clang/test/CodeGen/ubsan-trap-merge.c (revision cb8a90b7d17f851dec9c1c2d429622909aa5b605)
1 // NOTE: Assertions have mostly been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
2 // The most important assertions are the attributes at the end of the file, which
3 // show whether -ubsan-unique-traps and -fno-sanitize-merge attach 'nomerge'
4 // to each ubsan call.
5 //
6 // N.B. although the clang driver defaults to -fsanitize-merge=undefined,
7 // clang_cc1 defaults to non-merge. (This is similar to -fsanitize-recover, for
8 // which the default is also applied at the driver level only.)
9 // RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -fsanitize=signed-integer-overflow -O3 %s -o - -fsanitize-trap=signed-integer-overflow | FileCheck %s --check-prefixes=TRAP-NOMERGE
10 // RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -fsanitize=signed-integer-overflow -O3 %s -o -                                         | FileCheck %s --check-prefixes=HANDLER-NOMERGE
11 // RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -fsanitize=signed-integer-overflow -O3 %s -o - -fsanitize-minimal-runtime              | FileCheck %s --check-prefixes=MINRT-NOMERGE
12 //
13 // RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -fsanitize=signed-integer-overflow -O3 -fno-sanitize-merge=signed-integer-overflow  %s -o - -fsanitize-trap=signed-integer-overflow | FileCheck %s --check-prefixes=TRAP-NOMERGE
14 // RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -fsanitize=signed-integer-overflow -O3 -fno-sanitize-merge=signed-integer-overflow  %s -o -                                         | FileCheck %s --check-prefixes=HANDLER-NOMERGE
15 // RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -fsanitize=signed-integer-overflow -O3 -fno-sanitize-merge=signed-integer-overflow  %s -o - -fsanitize-minimal-runtime              | FileCheck %s --check-prefixes=MINRT-NOMERGE
16 //
17 // RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -fsanitize=signed-integer-overflow -O3 -fsanitize-merge=signed-integer-overflow %s -o - -fsanitize-trap=signed-integer-overflow | FileCheck %s --check-prefixes=TRAP-MERGE
18 // RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -fsanitize=signed-integer-overflow -O3 -fsanitize-merge=signed-integer-overflow %s -o -                                         | FileCheck %s --check-prefixes=HANDLER-MERGE
19 // RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -fsanitize=signed-integer-overflow -O3 -fsanitize-merge=signed-integer-overflow %s -o - -fsanitize-minimal-runtime              | FileCheck %s --check-prefixes=MINRT-MERGE
20 //
21 // REQUIRES: x86-registered-target
22 
23 // TRAP-LABEL: define dso_local range(i32 -2147483523, -2147483648) i32 @f(
24 // TRAP-SAME: i32 noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
25 // TRAP-NEXT:  [[ENTRY:.*:]]
26 // TRAP-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2:![0-9]+]]
27 // TRAP-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
28 // TRAP-NEXT:    br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
29 // TRAP:       [[TRAP]]:
30 // TRAP-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4:[0-9]+]], !nosanitize [[META2]]
31 // TRAP-NEXT:    unreachable, !nosanitize [[META2]]
32 // TRAP:       [[CONT]]:
33 // TRAP-NEXT:    [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
34 // TRAP-NEXT:    ret i32 [[TMP2]]
35 //
36 // HANDLER-LABEL: define dso_local range(i32 -2147483523, -2147483648) i32 @f(
37 // HANDLER-SAME: i32 noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
38 // HANDLER-NEXT:  [[ENTRY:.*:]]
39 // HANDLER-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2:![0-9]+]]
40 // HANDLER-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
41 // HANDLER-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]]
42 // HANDLER:       [[HANDLER_ADD_OVERFLOW]]:
43 // HANDLER-NEXT:    [[TMP2:%.*]] = zext nneg i32 [[X]] to i64, !nosanitize [[META2]]
44 // HANDLER-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB1:[0-9]+]], i64 [[TMP2]], i64 125) #[[ATTR4:[0-9]+]], !nosanitize [[META2]]
45 // HANDLER-NEXT:    unreachable, !nosanitize [[META2]]
46 // HANDLER:       [[CONT]]:
47 // HANDLER-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
48 // HANDLER-NEXT:    ret i32 [[TMP3]]
49 //
50 // MINRT-LABEL: define dso_local range(i32 -2147483523, -2147483648) i32 @f(
51 // MINRT-SAME: i32 noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
52 // MINRT-NEXT:  [[ENTRY:.*:]]
53 // MINRT-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2:![0-9]+]]
54 // MINRT-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
55 // MINRT-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]]
56 // MINRT:       [[HANDLER_ADD_OVERFLOW]]:
57 // MINRT-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4:[0-9]+]], !nosanitize [[META2]]
58 // MINRT-NEXT:    unreachable, !nosanitize [[META2]]
59 // MINRT:       [[CONT]]:
60 // MINRT-NEXT:    [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
61 // MINRT-NEXT:    ret i32 [[TMP2]]
62 // TRAP-NOMERGE-LABEL: define dso_local range(i32 -2147483523, -2147483648) i32 @f(
63 // TRAP-NOMERGE-SAME: i32 noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
64 // TRAP-NOMERGE-NEXT:  [[ENTRY:.*:]]
65 // TRAP-NOMERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2:![0-9]+]]
66 // TRAP-NOMERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
67 // TRAP-NOMERGE-NEXT:    br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
68 // TRAP-NOMERGE:       [[TRAP]]:
69 // TRAP-NOMERGE-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4:[0-9]+]], !nosanitize [[META2]]
70 // TRAP-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
71 // TRAP-NOMERGE:       [[CONT]]:
72 // TRAP-NOMERGE-NEXT:    [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
73 // TRAP-NOMERGE-NEXT:    ret i32 [[TMP2]]
74 //
75 // HANDLER-NOMERGE-LABEL: define dso_local range(i32 -2147483523, -2147483648) i32 @f(
76 // HANDLER-NOMERGE-SAME: i32 noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
77 // HANDLER-NOMERGE-NEXT:  [[ENTRY:.*:]]
78 // HANDLER-NOMERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2:![0-9]+]]
79 // HANDLER-NOMERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
80 // HANDLER-NOMERGE-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]]
81 // HANDLER-NOMERGE:       [[HANDLER_ADD_OVERFLOW]]:
82 // HANDLER-NOMERGE-NEXT:    [[TMP2:%.*]] = zext nneg i32 [[X]] to i64, !nosanitize [[META2]]
83 // HANDLER-NOMERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB1:[0-9]+]], i64 [[TMP2]], i64 125) #[[ATTR4:[0-9]+]], !nosanitize [[META2]]
84 // HANDLER-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
85 // HANDLER-NOMERGE:       [[CONT]]:
86 // HANDLER-NOMERGE-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
87 // HANDLER-NOMERGE-NEXT:    ret i32 [[TMP3]]
88 //
89 // MINRT-NOMERGE-LABEL: define dso_local range(i32 -2147483523, -2147483648) i32 @f(
90 // MINRT-NOMERGE-SAME: i32 noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
91 // MINRT-NOMERGE-NEXT:  [[ENTRY:.*:]]
92 // MINRT-NOMERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2:![0-9]+]]
93 // MINRT-NOMERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
94 // MINRT-NOMERGE-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]]
95 // MINRT-NOMERGE:       [[HANDLER_ADD_OVERFLOW]]:
96 // MINRT-NOMERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4:[0-9]+]], !nosanitize [[META2]]
97 // MINRT-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
98 // MINRT-NOMERGE:       [[CONT]]:
99 // MINRT-NOMERGE-NEXT:    [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
100 // MINRT-NOMERGE-NEXT:    ret i32 [[TMP2]]
101 //
102 // TRAP-MERGE-LABEL: define dso_local range(i32 -2147483523, -2147483648) i32 @f(
103 // TRAP-MERGE-SAME: i32 noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
104 // TRAP-MERGE-NEXT:  [[ENTRY:.*:]]
105 // TRAP-MERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2:![0-9]+]]
106 // TRAP-MERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
107 // TRAP-MERGE-NEXT:    br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
108 // TRAP-MERGE:       [[TRAP]]:
109 // TRAP-MERGE-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4:[0-9]+]], !nosanitize [[META2]]
110 // TRAP-MERGE-NEXT:    unreachable, !nosanitize [[META2]]
111 // TRAP-MERGE:       [[CONT]]:
112 // TRAP-MERGE-NEXT:    [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
113 // TRAP-MERGE-NEXT:    ret i32 [[TMP2]]
114 //
115 // HANDLER-MERGE-LABEL: define dso_local range(i32 -2147483523, -2147483648) i32 @f(
116 // HANDLER-MERGE-SAME: i32 noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
117 // HANDLER-MERGE-NEXT:  [[ENTRY:.*:]]
118 // HANDLER-MERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2:![0-9]+]]
119 // HANDLER-MERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
120 // HANDLER-MERGE-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]]
121 // HANDLER-MERGE:       [[HANDLER_ADD_OVERFLOW]]:
122 // HANDLER-MERGE-NEXT:    [[TMP2:%.*]] = zext nneg i32 [[X]] to i64, !nosanitize [[META2]]
123 // HANDLER-MERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB1:[0-9]+]], i64 [[TMP2]], i64 125) #[[ATTR4:[0-9]+]], !nosanitize [[META2]]
124 // HANDLER-MERGE-NEXT:    unreachable, !nosanitize [[META2]]
125 // HANDLER-MERGE:       [[CONT]]:
126 // HANDLER-MERGE-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
127 // HANDLER-MERGE-NEXT:    ret i32 [[TMP3]]
128 //
129 // MINRT-MERGE-LABEL: define dso_local range(i32 -2147483523, -2147483648) i32 @f(
130 // MINRT-MERGE-SAME: i32 noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
131 // MINRT-MERGE-NEXT:  [[ENTRY:.*:]]
132 // MINRT-MERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2:![0-9]+]]
133 // MINRT-MERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
134 // MINRT-MERGE-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]]
135 // MINRT-MERGE:       [[HANDLER_ADD_OVERFLOW]]:
136 // MINRT-MERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4:[0-9]+]], !nosanitize [[META2]]
137 // MINRT-MERGE-NEXT:    unreachable, !nosanitize [[META2]]
138 // MINRT-MERGE:       [[CONT]]:
139 // MINRT-MERGE-NEXT:    [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
140 // MINRT-MERGE-NEXT:    ret i32 [[TMP2]]
141 //
142 int f(int x) {
143   return x + 125;
144 }
145 
146 // TRAP-LABEL: define dso_local range(i32 -2147483521, -2147483648) i32 @g(
147 // TRAP-SAME: i32 noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0]] {
148 // TRAP-NEXT:  [[ENTRY:.*:]]
149 // TRAP-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
150 // TRAP-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
151 // TRAP-NEXT:    br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
152 // TRAP:       [[TRAP]]:
153 // TRAP-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
154 // TRAP-NEXT:    unreachable, !nosanitize [[META2]]
155 // TRAP:       [[CONT]]:
156 // TRAP-NEXT:    [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
157 // TRAP-NEXT:    ret i32 [[TMP2]]
158 //
159 // HANDLER-LABEL: define dso_local range(i32 -2147483521, -2147483648) i32 @g(
160 // HANDLER-SAME: i32 noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0]] {
161 // HANDLER-NEXT:  [[ENTRY:.*:]]
162 // HANDLER-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
163 // HANDLER-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
164 // HANDLER-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
165 // HANDLER:       [[HANDLER_ADD_OVERFLOW]]:
166 // HANDLER-NEXT:    [[TMP2:%.*]] = zext nneg i32 [[X]] to i64, !nosanitize [[META2]]
167 // HANDLER-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB2:[0-9]+]], i64 [[TMP2]], i64 127) #[[ATTR4]], !nosanitize [[META2]]
168 // HANDLER-NEXT:    unreachable, !nosanitize [[META2]]
169 // HANDLER:       [[CONT]]:
170 // HANDLER-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
171 // HANDLER-NEXT:    ret i32 [[TMP3]]
172 //
173 // MINRT-LABEL: define dso_local range(i32 -2147483521, -2147483648) i32 @g(
174 // MINRT-SAME: i32 noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0]] {
175 // MINRT-NEXT:  [[ENTRY:.*:]]
176 // MINRT-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
177 // MINRT-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
178 // MINRT-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
179 // MINRT:       [[HANDLER_ADD_OVERFLOW]]:
180 // MINRT-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4]], !nosanitize [[META2]]
181 // MINRT-NEXT:    unreachable, !nosanitize [[META2]]
182 // MINRT:       [[CONT]]:
183 // MINRT-NEXT:    [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
184 // MINRT-NEXT:    ret i32 [[TMP2]]
185 // TRAP-NOMERGE-LABEL: define dso_local range(i32 -2147483521, -2147483648) i32 @g(
186 // TRAP-NOMERGE-SAME: i32 noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0]] {
187 // TRAP-NOMERGE-NEXT:  [[ENTRY:.*:]]
188 // TRAP-NOMERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
189 // TRAP-NOMERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
190 // TRAP-NOMERGE-NEXT:    br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
191 // TRAP-NOMERGE:       [[TRAP]]:
192 // TRAP-NOMERGE-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
193 // TRAP-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
194 // TRAP-NOMERGE:       [[CONT]]:
195 // TRAP-NOMERGE-NEXT:    [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
196 // TRAP-NOMERGE-NEXT:    ret i32 [[TMP2]]
197 //
198 // HANDLER-NOMERGE-LABEL: define dso_local range(i32 -2147483521, -2147483648) i32 @g(
199 // HANDLER-NOMERGE-SAME: i32 noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0]] {
200 // HANDLER-NOMERGE-NEXT:  [[ENTRY:.*:]]
201 // HANDLER-NOMERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
202 // HANDLER-NOMERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
203 // HANDLER-NOMERGE-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
204 // HANDLER-NOMERGE:       [[HANDLER_ADD_OVERFLOW]]:
205 // HANDLER-NOMERGE-NEXT:    [[TMP2:%.*]] = zext nneg i32 [[X]] to i64, !nosanitize [[META2]]
206 // HANDLER-NOMERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB2:[0-9]+]], i64 [[TMP2]], i64 127) #[[ATTR4]], !nosanitize [[META2]]
207 // HANDLER-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
208 // HANDLER-NOMERGE:       [[CONT]]:
209 // HANDLER-NOMERGE-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
210 // HANDLER-NOMERGE-NEXT:    ret i32 [[TMP3]]
211 //
212 // MINRT-NOMERGE-LABEL: define dso_local range(i32 -2147483521, -2147483648) i32 @g(
213 // MINRT-NOMERGE-SAME: i32 noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0]] {
214 // MINRT-NOMERGE-NEXT:  [[ENTRY:.*:]]
215 // MINRT-NOMERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
216 // MINRT-NOMERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
217 // MINRT-NOMERGE-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
218 // MINRT-NOMERGE:       [[HANDLER_ADD_OVERFLOW]]:
219 // MINRT-NOMERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4]], !nosanitize [[META2]]
220 // MINRT-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
221 // MINRT-NOMERGE:       [[CONT]]:
222 // MINRT-NOMERGE-NEXT:    [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
223 // MINRT-NOMERGE-NEXT:    ret i32 [[TMP2]]
224 //
225 // TRAP-MERGE-LABEL: define dso_local range(i32 -2147483521, -2147483648) i32 @g(
226 // TRAP-MERGE-SAME: i32 noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0]] {
227 // TRAP-MERGE-NEXT:  [[ENTRY:.*:]]
228 // TRAP-MERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
229 // TRAP-MERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
230 // TRAP-MERGE-NEXT:    br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
231 // TRAP-MERGE:       [[TRAP]]:
232 // TRAP-MERGE-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
233 // TRAP-MERGE-NEXT:    unreachable, !nosanitize [[META2]]
234 // TRAP-MERGE:       [[CONT]]:
235 // TRAP-MERGE-NEXT:    [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
236 // TRAP-MERGE-NEXT:    ret i32 [[TMP2]]
237 //
238 // HANDLER-MERGE-LABEL: define dso_local range(i32 -2147483521, -2147483648) i32 @g(
239 // HANDLER-MERGE-SAME: i32 noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0]] {
240 // HANDLER-MERGE-NEXT:  [[ENTRY:.*:]]
241 // HANDLER-MERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
242 // HANDLER-MERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
243 // HANDLER-MERGE-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
244 // HANDLER-MERGE:       [[HANDLER_ADD_OVERFLOW]]:
245 // HANDLER-MERGE-NEXT:    [[TMP2:%.*]] = zext nneg i32 [[X]] to i64, !nosanitize [[META2]]
246 // HANDLER-MERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB2:[0-9]+]], i64 [[TMP2]], i64 127) #[[ATTR4]], !nosanitize [[META2]]
247 // HANDLER-MERGE-NEXT:    unreachable, !nosanitize [[META2]]
248 // HANDLER-MERGE:       [[CONT]]:
249 // HANDLER-MERGE-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
250 // HANDLER-MERGE-NEXT:    ret i32 [[TMP3]]
251 //
252 // MINRT-MERGE-LABEL: define dso_local range(i32 -2147483521, -2147483648) i32 @g(
253 // MINRT-MERGE-SAME: i32 noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0]] {
254 // MINRT-MERGE-NEXT:  [[ENTRY:.*:]]
255 // MINRT-MERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
256 // MINRT-MERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
257 // MINRT-MERGE-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
258 // MINRT-MERGE:       [[HANDLER_ADD_OVERFLOW]]:
259 // MINRT-MERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4]], !nosanitize [[META2]]
260 // MINRT-MERGE-NEXT:    unreachable, !nosanitize [[META2]]
261 // MINRT-MERGE:       [[CONT]]:
262 // MINRT-MERGE-NEXT:    [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
263 // MINRT-MERGE-NEXT:    ret i32 [[TMP2]]
264 //
265 int g(int x) {
266   return x + 127;
267 }
268 
269 //
270 // HANDLER-LABEL: define dso_local range(i32 -2147483521, -2147483648) i32 @h(
271 // HANDLER-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
272 // HANDLER-NEXT:  [[ENTRY:.*:]]
273 // HANDLER-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
274 // HANDLER-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
275 // HANDLER-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
276 // HANDLER:       [[HANDLER_ADD_OVERFLOW]]:
277 // HANDLER-NEXT:    [[TMP2:%.*]] = zext nneg i32 [[X]] to i64, !nosanitize [[META2]]
278 // HANDLER-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB3:[0-9]+]], i64 [[TMP2]], i64 127) #[[ATTR4]], !nosanitize [[META2]]
279 // HANDLER-NEXT:    unreachable, !nosanitize [[META2]]
280 // HANDLER:       [[CONT]]:
281 // HANDLER-NEXT:    [[TMP3:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 129), !nosanitize [[META2]]
282 // HANDLER-NEXT:    [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1, !nosanitize [[META2]]
283 // HANDLER-NEXT:    br i1 [[TMP4]], label %[[HANDLER_ADD_OVERFLOW1:.*]], label %[[CONT2:.*]], !prof [[PROF3]], !nosanitize [[META2]]
284 // HANDLER:       [[HANDLER_ADD_OVERFLOW1]]:
285 // HANDLER-NEXT:    [[TMP5:%.*]] = zext nneg i32 [[Y]] to i64, !nosanitize [[META2]]
286 // HANDLER-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB4:[0-9]+]], i64 [[TMP5]], i64 129) #[[ATTR4]], !nosanitize [[META2]]
287 // HANDLER-NEXT:    unreachable, !nosanitize [[META2]]
288 // HANDLER:       [[CONT2]]:
289 // HANDLER-NEXT:    [[TMP6:%.*]] = extractvalue { i32, i1 } [[TMP3]], 0, !nosanitize [[META2]]
290 // HANDLER-NEXT:    [[TMP7:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
291 // HANDLER-NEXT:    [[COND:%.*]] = tail call i32 @llvm.smin.i32(i32 [[TMP7]], i32 [[TMP6]])
292 // HANDLER-NEXT:    ret i32 [[COND]]
293 //
294 // MINRT-LABEL: define dso_local range(i32 -2147483521, -2147483648) i32 @h(
295 // MINRT-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
296 // MINRT-NEXT:  [[ENTRY:.*:]]
297 // MINRT-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
298 // MINRT-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
299 // MINRT-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
300 // MINRT:       [[HANDLER_ADD_OVERFLOW]]:
301 // MINRT-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4]], !nosanitize [[META2]]
302 // MINRT-NEXT:    unreachable, !nosanitize [[META2]]
303 // MINRT:       [[CONT]]:
304 // MINRT-NEXT:    [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 129), !nosanitize [[META2]]
305 // MINRT-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
306 // MINRT-NEXT:    br i1 [[TMP3]], label %[[HANDLER_ADD_OVERFLOW1:.*]], label %[[CONT2:.*]], !prof [[PROF3]], !nosanitize [[META2]]
307 // MINRT:       [[HANDLER_ADD_OVERFLOW1]]:
308 // MINRT-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4]], !nosanitize [[META2]]
309 // MINRT-NEXT:    unreachable, !nosanitize [[META2]]
310 // MINRT:       [[CONT2]]:
311 // MINRT-NEXT:    [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
312 // MINRT-NEXT:    [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
313 // MINRT-NEXT:    [[COND:%.*]] = tail call i32 @llvm.smin.i32(i32 [[TMP5]], i32 [[TMP4]])
314 // MINRT-NEXT:    ret i32 [[COND]]
315 // TRAP-NOMERGE-LABEL: define dso_local range(i32 -2147483521, -2147483648) i32 @h(
316 // TRAP-NOMERGE-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
317 // TRAP-NOMERGE-NEXT:  [[ENTRY:.*:]]
318 // TRAP-NOMERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
319 // TRAP-NOMERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
320 // TRAP-NOMERGE-NEXT:    br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
321 // TRAP-NOMERGE:       [[TRAP]]:
322 // TRAP-NOMERGE-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
323 // TRAP-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
324 // TRAP-NOMERGE:       [[CONT]]:
325 // TRAP-NOMERGE-NEXT:    [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 129), !nosanitize [[META2]]
326 // TRAP-NOMERGE-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
327 // TRAP-NOMERGE-NEXT:    br i1 [[TMP3]], label %[[TRAP1:.*]], label %[[CONT2:.*]], !nosanitize [[META2]]
328 // TRAP-NOMERGE:       [[TRAP1]]:
329 // TRAP-NOMERGE-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
330 // TRAP-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
331 // TRAP-NOMERGE:       [[CONT2]]:
332 // TRAP-NOMERGE-NEXT:    [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
333 // TRAP-NOMERGE-NEXT:    [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
334 // TRAP-NOMERGE-NEXT:    [[COND:%.*]] = tail call i32 @llvm.smin.i32(i32 [[TMP5]], i32 [[TMP4]])
335 // TRAP-NOMERGE-NEXT:    ret i32 [[COND]]
336 //
337 // HANDLER-NOMERGE-LABEL: define dso_local range(i32 -2147483521, -2147483648) i32 @h(
338 // HANDLER-NOMERGE-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
339 // HANDLER-NOMERGE-NEXT:  [[ENTRY:.*:]]
340 // HANDLER-NOMERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
341 // HANDLER-NOMERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
342 // HANDLER-NOMERGE-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
343 // HANDLER-NOMERGE:       [[HANDLER_ADD_OVERFLOW]]:
344 // HANDLER-NOMERGE-NEXT:    [[TMP2:%.*]] = zext nneg i32 [[X]] to i64, !nosanitize [[META2]]
345 // HANDLER-NOMERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB3:[0-9]+]], i64 [[TMP2]], i64 127) #[[ATTR4]], !nosanitize [[META2]]
346 // HANDLER-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
347 // HANDLER-NOMERGE:       [[CONT]]:
348 // HANDLER-NOMERGE-NEXT:    [[TMP3:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 129), !nosanitize [[META2]]
349 // HANDLER-NOMERGE-NEXT:    [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1, !nosanitize [[META2]]
350 // HANDLER-NOMERGE-NEXT:    br i1 [[TMP4]], label %[[HANDLER_ADD_OVERFLOW1:.*]], label %[[CONT2:.*]], !prof [[PROF3]], !nosanitize [[META2]]
351 // HANDLER-NOMERGE:       [[HANDLER_ADD_OVERFLOW1]]:
352 // HANDLER-NOMERGE-NEXT:    [[TMP5:%.*]] = zext nneg i32 [[Y]] to i64, !nosanitize [[META2]]
353 // HANDLER-NOMERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB4:[0-9]+]], i64 [[TMP5]], i64 129) #[[ATTR4]], !nosanitize [[META2]]
354 // HANDLER-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
355 // HANDLER-NOMERGE:       [[CONT2]]:
356 // HANDLER-NOMERGE-NEXT:    [[TMP6:%.*]] = extractvalue { i32, i1 } [[TMP3]], 0, !nosanitize [[META2]]
357 // HANDLER-NOMERGE-NEXT:    [[TMP7:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
358 // HANDLER-NOMERGE-NEXT:    [[COND:%.*]] = tail call i32 @llvm.smin.i32(i32 [[TMP7]], i32 [[TMP6]])
359 // HANDLER-NOMERGE-NEXT:    ret i32 [[COND]]
360 //
361 // MINRT-NOMERGE-LABEL: define dso_local range(i32 -2147483521, -2147483648) i32 @h(
362 // MINRT-NOMERGE-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
363 // MINRT-NOMERGE-NEXT:  [[ENTRY:.*:]]
364 // MINRT-NOMERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
365 // MINRT-NOMERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
366 // MINRT-NOMERGE-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
367 // MINRT-NOMERGE:       [[HANDLER_ADD_OVERFLOW]]:
368 // MINRT-NOMERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4]], !nosanitize [[META2]]
369 // MINRT-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
370 // MINRT-NOMERGE:       [[CONT]]:
371 // MINRT-NOMERGE-NEXT:    [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 129), !nosanitize [[META2]]
372 // MINRT-NOMERGE-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
373 // MINRT-NOMERGE-NEXT:    br i1 [[TMP3]], label %[[HANDLER_ADD_OVERFLOW1:.*]], label %[[CONT2:.*]], !prof [[PROF3]], !nosanitize [[META2]]
374 // MINRT-NOMERGE:       [[HANDLER_ADD_OVERFLOW1]]:
375 // MINRT-NOMERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4]], !nosanitize [[META2]]
376 // MINRT-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
377 // MINRT-NOMERGE:       [[CONT2]]:
378 // MINRT-NOMERGE-NEXT:    [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
379 // MINRT-NOMERGE-NEXT:    [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
380 // MINRT-NOMERGE-NEXT:    [[COND:%.*]] = tail call i32 @llvm.smin.i32(i32 [[TMP5]], i32 [[TMP4]])
381 // MINRT-NOMERGE-NEXT:    ret i32 [[COND]]
382 //
383 // TRAP-MERGE-LABEL: define dso_local range(i32 -2147483521, -2147483648) i32 @h(
384 // TRAP-MERGE-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
385 // TRAP-MERGE-NEXT:  [[ENTRY:.*:]]
386 // TRAP-MERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
387 // TRAP-MERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
388 // TRAP-MERGE-NEXT:    br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
389 // TRAP-MERGE:       [[TRAP]]:
390 // TRAP-MERGE-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
391 // TRAP-MERGE-NEXT:    unreachable, !nosanitize [[META2]]
392 // TRAP-MERGE:       [[CONT]]:
393 // TRAP-MERGE-NEXT:    [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 129), !nosanitize [[META2]]
394 // TRAP-MERGE-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
395 // TRAP-MERGE-NEXT:    br i1 [[TMP3]], label %[[TRAP]], label %[[CONT1:.*]], !nosanitize [[META2]]
396 // TRAP-MERGE:       [[CONT1]]:
397 // TRAP-MERGE-NEXT:    [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
398 // TRAP-MERGE-NEXT:    [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
399 // TRAP-MERGE-NEXT:    [[COND:%.*]] = tail call i32 @llvm.smin.i32(i32 [[TMP5]], i32 [[TMP4]])
400 // TRAP-MERGE-NEXT:    ret i32 [[COND]]
401 //
402 // HANDLER-MERGE-LABEL: define dso_local range(i32 -2147483521, -2147483648) i32 @h(
403 // HANDLER-MERGE-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
404 // HANDLER-MERGE-NEXT:  [[ENTRY:.*:]]
405 // HANDLER-MERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
406 // HANDLER-MERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
407 // HANDLER-MERGE-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
408 // HANDLER-MERGE:       [[HANDLER_ADD_OVERFLOW]]:
409 // HANDLER-MERGE-NEXT:    [[TMP2:%.*]] = zext nneg i32 [[X]] to i64, !nosanitize [[META2]]
410 // HANDLER-MERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB3:[0-9]+]], i64 [[TMP2]], i64 127) #[[ATTR4]], !nosanitize [[META2]]
411 // HANDLER-MERGE-NEXT:    unreachable, !nosanitize [[META2]]
412 // HANDLER-MERGE:       [[CONT]]:
413 // HANDLER-MERGE-NEXT:    [[TMP3:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 129), !nosanitize [[META2]]
414 // HANDLER-MERGE-NEXT:    [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1, !nosanitize [[META2]]
415 // HANDLER-MERGE-NEXT:    br i1 [[TMP4]], label %[[HANDLER_ADD_OVERFLOW1:.*]], label %[[CONT2:.*]], !prof [[PROF3]], !nosanitize [[META2]]
416 // HANDLER-MERGE:       [[HANDLER_ADD_OVERFLOW1]]:
417 // HANDLER-MERGE-NEXT:    [[TMP5:%.*]] = zext nneg i32 [[Y]] to i64, !nosanitize [[META2]]
418 // HANDLER-MERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB4:[0-9]+]], i64 [[TMP5]], i64 129) #[[ATTR4]], !nosanitize [[META2]]
419 // HANDLER-MERGE-NEXT:    unreachable, !nosanitize [[META2]]
420 // HANDLER-MERGE:       [[CONT2]]:
421 // HANDLER-MERGE-NEXT:    [[TMP6:%.*]] = extractvalue { i32, i1 } [[TMP3]], 0, !nosanitize [[META2]]
422 // HANDLER-MERGE-NEXT:    [[TMP7:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
423 // HANDLER-MERGE-NEXT:    [[COND:%.*]] = tail call i32 @llvm.smin.i32(i32 [[TMP7]], i32 [[TMP6]])
424 // HANDLER-MERGE-NEXT:    ret i32 [[COND]]
425 //
426 // MINRT-MERGE-LABEL: define dso_local range(i32 -2147483521, -2147483648) i32 @h(
427 // MINRT-MERGE-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
428 // MINRT-MERGE-NEXT:  [[ENTRY:.*:]]
429 // MINRT-MERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
430 // MINRT-MERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
431 // MINRT-MERGE-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
432 // MINRT-MERGE:       [[HANDLER_ADD_OVERFLOW]]:
433 // MINRT-MERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4]], !nosanitize [[META2]]
434 // MINRT-MERGE-NEXT:    unreachable, !nosanitize [[META2]]
435 // MINRT-MERGE:       [[CONT]]:
436 // MINRT-MERGE-NEXT:    [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 129), !nosanitize [[META2]]
437 // MINRT-MERGE-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
438 // MINRT-MERGE-NEXT:    br i1 [[TMP3]], label %[[HANDLER_ADD_OVERFLOW1:.*]], label %[[CONT2:.*]], !prof [[PROF3]], !nosanitize [[META2]]
439 // MINRT-MERGE:       [[HANDLER_ADD_OVERFLOW1]]:
440 // MINRT-MERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4]], !nosanitize [[META2]]
441 // MINRT-MERGE-NEXT:    unreachable, !nosanitize [[META2]]
442 // MINRT-MERGE:       [[CONT2]]:
443 // MINRT-MERGE-NEXT:    [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
444 // MINRT-MERGE-NEXT:    [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
445 // MINRT-MERGE-NEXT:    [[COND:%.*]] = tail call i32 @llvm.smin.i32(i32 [[TMP5]], i32 [[TMP4]])
446 // MINRT-MERGE-NEXT:    ret i32 [[COND]]
447 //
448 int h(int x, int y) {
449   x += 127;
450   y += 129;
451   return x < y ? x : y;
452 }
453 
454 // TRAP-LABEL: define dso_local noundef i32 @m(
455 // TRAP-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
456 // TRAP-NEXT:  [[ENTRY:.*:]]
457 // TRAP-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2]]
458 // TRAP-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
459 // TRAP-NEXT:    br i1 [[TMP1]], label %[[TRAP_I:.*]], label %[[F_EXIT:.*]], !nosanitize [[META2]]
460 // TRAP:       [[TRAP_I]]:
461 // TRAP-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
462 // TRAP-NEXT:    unreachable, !nosanitize [[META2]]
463 // TRAP:       [[F_EXIT]]:
464 // TRAP-NEXT:    [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 127), !nosanitize [[META2]]
465 // TRAP-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
466 // TRAP-NEXT:    br i1 [[TMP3]], label %[[TRAP_I2:.*]], label %[[G_EXIT:.*]], !nosanitize [[META2]]
467 // TRAP:       [[TRAP_I2]]:
468 // TRAP-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
469 // TRAP-NEXT:    unreachable, !nosanitize [[META2]]
470 // TRAP:       [[G_EXIT]]:
471 // TRAP-NEXT:    [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
472 // TRAP-NEXT:    [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
473 // TRAP-NEXT:    [[TMP6:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[TMP4]], i32 [[TMP5]]), !nosanitize [[META2]]
474 // TRAP-NEXT:    [[TMP7:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1, !nosanitize [[META2]]
475 // TRAP-NEXT:    br i1 [[TMP7]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
476 // TRAP:       [[TRAP]]:
477 // TRAP-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
478 // TRAP-NEXT:    unreachable, !nosanitize [[META2]]
479 // TRAP:       [[CONT]]:
480 // TRAP-NEXT:    [[TMP8:%.*]] = extractvalue { i32, i1 } [[TMP6]], 0, !nosanitize [[META2]]
481 // TRAP-NEXT:    ret i32 [[TMP8]]
482 //
483 // HANDLER-LABEL: define dso_local noundef i32 @m(
484 // HANDLER-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
485 // HANDLER-NEXT:  [[ENTRY:.*:]]
486 // HANDLER-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2]]
487 // HANDLER-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
488 // HANDLER-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW_I:.*]], label %[[F_EXIT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
489 // HANDLER:       [[HANDLER_ADD_OVERFLOW_I]]:
490 // HANDLER-NEXT:    [[TMP2:%.*]] = zext nneg i32 [[X]] to i64, !nosanitize [[META2]]
491 // HANDLER-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB1]], i64 [[TMP2]], i64 125) #[[ATTR4]], !nosanitize [[META2]]
492 // HANDLER-NEXT:    unreachable, !nosanitize [[META2]]
493 // HANDLER:       [[F_EXIT]]:
494 // HANDLER-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
495 // HANDLER-NEXT:    [[TMP4:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 127), !nosanitize [[META2]]
496 // HANDLER-NEXT:    [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP4]], 1, !nosanitize [[META2]]
497 // HANDLER-NEXT:    br i1 [[TMP5]], label %[[HANDLER_ADD_OVERFLOW_I2:.*]], label %[[G_EXIT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
498 // HANDLER:       [[HANDLER_ADD_OVERFLOW_I2]]:
499 // HANDLER-NEXT:    [[TMP6:%.*]] = zext nneg i32 [[Y]] to i64, !nosanitize [[META2]]
500 // HANDLER-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB2]], i64 [[TMP6]], i64 127) #[[ATTR4]], !nosanitize [[META2]]
501 // HANDLER-NEXT:    unreachable, !nosanitize [[META2]]
502 // HANDLER:       [[G_EXIT]]:
503 // HANDLER-NEXT:    [[TMP7:%.*]] = extractvalue { i32, i1 } [[TMP4]], 0, !nosanitize [[META2]]
504 // HANDLER-NEXT:    [[TMP8:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[TMP3]], i32 [[TMP7]]), !nosanitize [[META2]]
505 // HANDLER-NEXT:    [[TMP9:%.*]] = extractvalue { i32, i1 } [[TMP8]], 1, !nosanitize [[META2]]
506 // HANDLER-NEXT:    br i1 [[TMP9]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
507 // HANDLER:       [[HANDLER_ADD_OVERFLOW]]:
508 // HANDLER-NEXT:    [[TMP10:%.*]] = zext i32 [[TMP3]] to i64, !nosanitize [[META2]]
509 // HANDLER-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP7]] to i64, !nosanitize [[META2]]
510 // HANDLER-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB5:[0-9]+]], i64 [[TMP10]], i64 [[TMP11]]) #[[ATTR4]], !nosanitize [[META2]]
511 // HANDLER-NEXT:    unreachable, !nosanitize [[META2]]
512 // HANDLER:       [[CONT]]:
513 // HANDLER-NEXT:    [[TMP12:%.*]] = extractvalue { i32, i1 } [[TMP8]], 0, !nosanitize [[META2]]
514 // HANDLER-NEXT:    ret i32 [[TMP12]]
515 //
516 // MINRT-LABEL: define dso_local noundef i32 @m(
517 // MINRT-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
518 // MINRT-NEXT:  [[ENTRY:.*:]]
519 // MINRT-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2]]
520 // MINRT-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
521 // MINRT-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW_I:.*]], label %[[F_EXIT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
522 // MINRT:       [[HANDLER_ADD_OVERFLOW_I]]:
523 // MINRT-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4]], !nosanitize [[META2]]
524 // MINRT-NEXT:    unreachable, !nosanitize [[META2]]
525 // MINRT:       [[F_EXIT]]:
526 // MINRT-NEXT:    [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 127), !nosanitize [[META2]]
527 // MINRT-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
528 // MINRT-NEXT:    br i1 [[TMP3]], label %[[HANDLER_ADD_OVERFLOW_I2:.*]], label %[[G_EXIT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
529 // MINRT:       [[HANDLER_ADD_OVERFLOW_I2]]:
530 // MINRT-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4]], !nosanitize [[META2]]
531 // MINRT-NEXT:    unreachable, !nosanitize [[META2]]
532 // MINRT:       [[G_EXIT]]:
533 // MINRT-NEXT:    [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
534 // MINRT-NEXT:    [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
535 // MINRT-NEXT:    [[TMP6:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[TMP4]], i32 [[TMP5]]), !nosanitize [[META2]]
536 // MINRT-NEXT:    [[TMP7:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1, !nosanitize [[META2]]
537 // MINRT-NEXT:    br i1 [[TMP7]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
538 // MINRT:       [[HANDLER_ADD_OVERFLOW]]:
539 // MINRT-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4]], !nosanitize [[META2]]
540 // MINRT-NEXT:    unreachable, !nosanitize [[META2]]
541 // MINRT:       [[CONT]]:
542 // MINRT-NEXT:    [[TMP8:%.*]] = extractvalue { i32, i1 } [[TMP6]], 0, !nosanitize [[META2]]
543 // MINRT-NEXT:    ret i32 [[TMP8]]
544 // TRAP-NOMERGE-LABEL: define dso_local noundef i32 @m(
545 // TRAP-NOMERGE-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
546 // TRAP-NOMERGE-NEXT:  [[ENTRY:.*:]]
547 // TRAP-NOMERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2]]
548 // TRAP-NOMERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
549 // TRAP-NOMERGE-NEXT:    br i1 [[TMP1]], label %[[TRAP_I:.*]], label %[[F_EXIT:.*]], !nosanitize [[META2]]
550 // TRAP-NOMERGE:       [[TRAP_I]]:
551 // TRAP-NOMERGE-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
552 // TRAP-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
553 // TRAP-NOMERGE:       [[F_EXIT]]:
554 // TRAP-NOMERGE-NEXT:    [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 127), !nosanitize [[META2]]
555 // TRAP-NOMERGE-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
556 // TRAP-NOMERGE-NEXT:    br i1 [[TMP3]], label %[[TRAP_I2:.*]], label %[[G_EXIT:.*]], !nosanitize [[META2]]
557 // TRAP-NOMERGE:       [[TRAP_I2]]:
558 // TRAP-NOMERGE-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
559 // TRAP-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
560 // TRAP-NOMERGE:       [[G_EXIT]]:
561 // TRAP-NOMERGE-NEXT:    [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
562 // TRAP-NOMERGE-NEXT:    [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
563 // TRAP-NOMERGE-NEXT:    [[TMP6:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[TMP4]], i32 [[TMP5]]), !nosanitize [[META2]]
564 // TRAP-NOMERGE-NEXT:    [[TMP7:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1, !nosanitize [[META2]]
565 // TRAP-NOMERGE-NEXT:    br i1 [[TMP7]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
566 // TRAP-NOMERGE:       [[TRAP]]:
567 // TRAP-NOMERGE-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
568 // TRAP-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
569 // TRAP-NOMERGE:       [[CONT]]:
570 // TRAP-NOMERGE-NEXT:    [[TMP8:%.*]] = extractvalue { i32, i1 } [[TMP6]], 0, !nosanitize [[META2]]
571 // TRAP-NOMERGE-NEXT:    ret i32 [[TMP8]]
572 //
573 // HANDLER-NOMERGE-LABEL: define dso_local noundef i32 @m(
574 // HANDLER-NOMERGE-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
575 // HANDLER-NOMERGE-NEXT:  [[ENTRY:.*:]]
576 // HANDLER-NOMERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2]]
577 // HANDLER-NOMERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
578 // HANDLER-NOMERGE-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW_I:.*]], label %[[F_EXIT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
579 // HANDLER-NOMERGE:       [[HANDLER_ADD_OVERFLOW_I]]:
580 // HANDLER-NOMERGE-NEXT:    [[TMP2:%.*]] = zext nneg i32 [[X]] to i64, !nosanitize [[META2]]
581 // HANDLER-NOMERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB1]], i64 [[TMP2]], i64 125) #[[ATTR4]], !nosanitize [[META2]]
582 // HANDLER-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
583 // HANDLER-NOMERGE:       [[F_EXIT]]:
584 // HANDLER-NOMERGE-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
585 // HANDLER-NOMERGE-NEXT:    [[TMP4:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 127), !nosanitize [[META2]]
586 // HANDLER-NOMERGE-NEXT:    [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP4]], 1, !nosanitize [[META2]]
587 // HANDLER-NOMERGE-NEXT:    br i1 [[TMP5]], label %[[HANDLER_ADD_OVERFLOW_I2:.*]], label %[[G_EXIT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
588 // HANDLER-NOMERGE:       [[HANDLER_ADD_OVERFLOW_I2]]:
589 // HANDLER-NOMERGE-NEXT:    [[TMP6:%.*]] = zext nneg i32 [[Y]] to i64, !nosanitize [[META2]]
590 // HANDLER-NOMERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB2]], i64 [[TMP6]], i64 127) #[[ATTR4]], !nosanitize [[META2]]
591 // HANDLER-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
592 // HANDLER-NOMERGE:       [[G_EXIT]]:
593 // HANDLER-NOMERGE-NEXT:    [[TMP7:%.*]] = extractvalue { i32, i1 } [[TMP4]], 0, !nosanitize [[META2]]
594 // HANDLER-NOMERGE-NEXT:    [[TMP8:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[TMP3]], i32 [[TMP7]]), !nosanitize [[META2]]
595 // HANDLER-NOMERGE-NEXT:    [[TMP9:%.*]] = extractvalue { i32, i1 } [[TMP8]], 1, !nosanitize [[META2]]
596 // HANDLER-NOMERGE-NEXT:    br i1 [[TMP9]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
597 // HANDLER-NOMERGE:       [[HANDLER_ADD_OVERFLOW]]:
598 // HANDLER-NOMERGE-NEXT:    [[TMP10:%.*]] = zext i32 [[TMP3]] to i64, !nosanitize [[META2]]
599 // HANDLER-NOMERGE-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP7]] to i64, !nosanitize [[META2]]
600 // HANDLER-NOMERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB5:[0-9]+]], i64 [[TMP10]], i64 [[TMP11]]) #[[ATTR4]], !nosanitize [[META2]]
601 // HANDLER-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
602 // HANDLER-NOMERGE:       [[CONT]]:
603 // HANDLER-NOMERGE-NEXT:    [[TMP12:%.*]] = extractvalue { i32, i1 } [[TMP8]], 0, !nosanitize [[META2]]
604 // HANDLER-NOMERGE-NEXT:    ret i32 [[TMP12]]
605 //
606 // MINRT-NOMERGE-LABEL: define dso_local noundef i32 @m(
607 // MINRT-NOMERGE-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
608 // MINRT-NOMERGE-NEXT:  [[ENTRY:.*:]]
609 // MINRT-NOMERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2]]
610 // MINRT-NOMERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
611 // MINRT-NOMERGE-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW_I:.*]], label %[[F_EXIT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
612 // MINRT-NOMERGE:       [[HANDLER_ADD_OVERFLOW_I]]:
613 // MINRT-NOMERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4]], !nosanitize [[META2]]
614 // MINRT-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
615 // MINRT-NOMERGE:       [[F_EXIT]]:
616 // MINRT-NOMERGE-NEXT:    [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 127), !nosanitize [[META2]]
617 // MINRT-NOMERGE-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
618 // MINRT-NOMERGE-NEXT:    br i1 [[TMP3]], label %[[HANDLER_ADD_OVERFLOW_I2:.*]], label %[[G_EXIT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
619 // MINRT-NOMERGE:       [[HANDLER_ADD_OVERFLOW_I2]]:
620 // MINRT-NOMERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4]], !nosanitize [[META2]]
621 // MINRT-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
622 // MINRT-NOMERGE:       [[G_EXIT]]:
623 // MINRT-NOMERGE-NEXT:    [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
624 // MINRT-NOMERGE-NEXT:    [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
625 // MINRT-NOMERGE-NEXT:    [[TMP6:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[TMP4]], i32 [[TMP5]]), !nosanitize [[META2]]
626 // MINRT-NOMERGE-NEXT:    [[TMP7:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1, !nosanitize [[META2]]
627 // MINRT-NOMERGE-NEXT:    br i1 [[TMP7]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
628 // MINRT-NOMERGE:       [[HANDLER_ADD_OVERFLOW]]:
629 // MINRT-NOMERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4]], !nosanitize [[META2]]
630 // MINRT-NOMERGE-NEXT:    unreachable, !nosanitize [[META2]]
631 // MINRT-NOMERGE:       [[CONT]]:
632 // MINRT-NOMERGE-NEXT:    [[TMP8:%.*]] = extractvalue { i32, i1 } [[TMP6]], 0, !nosanitize [[META2]]
633 // MINRT-NOMERGE-NEXT:    ret i32 [[TMP8]]
634 //
635 // TRAP-MERGE-LABEL: define dso_local noundef i32 @m(
636 // TRAP-MERGE-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
637 // TRAP-MERGE-NEXT:  [[ENTRY:.*:]]
638 // TRAP-MERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2]]
639 // TRAP-MERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
640 // TRAP-MERGE-NEXT:    br i1 [[TMP1]], label %[[TRAP_I:.*]], label %[[F_EXIT:.*]], !nosanitize [[META2]]
641 // TRAP-MERGE:       [[TRAP_I]]:
642 // TRAP-MERGE-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
643 // TRAP-MERGE-NEXT:    unreachable, !nosanitize [[META2]]
644 // TRAP-MERGE:       [[F_EXIT]]:
645 // TRAP-MERGE-NEXT:    [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 127), !nosanitize [[META2]]
646 // TRAP-MERGE-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
647 // TRAP-MERGE-NEXT:    br i1 [[TMP3]], label %[[TRAP_I2:.*]], label %[[G_EXIT:.*]], !nosanitize [[META2]]
648 // TRAP-MERGE:       [[TRAP_I2]]:
649 // TRAP-MERGE-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
650 // TRAP-MERGE-NEXT:    unreachable, !nosanitize [[META2]]
651 // TRAP-MERGE:       [[G_EXIT]]:
652 // TRAP-MERGE-NEXT:    [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
653 // TRAP-MERGE-NEXT:    [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
654 // TRAP-MERGE-NEXT:    [[TMP6:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[TMP4]], i32 [[TMP5]]), !nosanitize [[META2]]
655 // TRAP-MERGE-NEXT:    [[TMP7:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1, !nosanitize [[META2]]
656 // TRAP-MERGE-NEXT:    br i1 [[TMP7]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
657 // TRAP-MERGE:       [[TRAP]]:
658 // TRAP-MERGE-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
659 // TRAP-MERGE-NEXT:    unreachable, !nosanitize [[META2]]
660 // TRAP-MERGE:       [[CONT]]:
661 // TRAP-MERGE-NEXT:    [[TMP8:%.*]] = extractvalue { i32, i1 } [[TMP6]], 0, !nosanitize [[META2]]
662 // TRAP-MERGE-NEXT:    ret i32 [[TMP8]]
663 //
664 // HANDLER-MERGE-LABEL: define dso_local noundef i32 @m(
665 // HANDLER-MERGE-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
666 // HANDLER-MERGE-NEXT:  [[ENTRY:.*:]]
667 // HANDLER-MERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2]]
668 // HANDLER-MERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
669 // HANDLER-MERGE-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW_I:.*]], label %[[F_EXIT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
670 // HANDLER-MERGE:       [[HANDLER_ADD_OVERFLOW_I]]:
671 // HANDLER-MERGE-NEXT:    [[TMP2:%.*]] = zext nneg i32 [[X]] to i64, !nosanitize [[META2]]
672 // HANDLER-MERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB1]], i64 [[TMP2]], i64 125) #[[ATTR4]], !nosanitize [[META2]]
673 // HANDLER-MERGE-NEXT:    unreachable, !nosanitize [[META2]]
674 // HANDLER-MERGE:       [[F_EXIT]]:
675 // HANDLER-MERGE-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
676 // HANDLER-MERGE-NEXT:    [[TMP4:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 127), !nosanitize [[META2]]
677 // HANDLER-MERGE-NEXT:    [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP4]], 1, !nosanitize [[META2]]
678 // HANDLER-MERGE-NEXT:    br i1 [[TMP5]], label %[[HANDLER_ADD_OVERFLOW_I2:.*]], label %[[G_EXIT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
679 // HANDLER-MERGE:       [[HANDLER_ADD_OVERFLOW_I2]]:
680 // HANDLER-MERGE-NEXT:    [[TMP6:%.*]] = zext nneg i32 [[Y]] to i64, !nosanitize [[META2]]
681 // HANDLER-MERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB2]], i64 [[TMP6]], i64 127) #[[ATTR4]], !nosanitize [[META2]]
682 // HANDLER-MERGE-NEXT:    unreachable, !nosanitize [[META2]]
683 // HANDLER-MERGE:       [[G_EXIT]]:
684 // HANDLER-MERGE-NEXT:    [[TMP7:%.*]] = extractvalue { i32, i1 } [[TMP4]], 0, !nosanitize [[META2]]
685 // HANDLER-MERGE-NEXT:    [[TMP8:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[TMP3]], i32 [[TMP7]]), !nosanitize [[META2]]
686 // HANDLER-MERGE-NEXT:    [[TMP9:%.*]] = extractvalue { i32, i1 } [[TMP8]], 1, !nosanitize [[META2]]
687 // HANDLER-MERGE-NEXT:    br i1 [[TMP9]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
688 // HANDLER-MERGE:       [[HANDLER_ADD_OVERFLOW]]:
689 // HANDLER-MERGE-NEXT:    [[TMP10:%.*]] = zext i32 [[TMP3]] to i64, !nosanitize [[META2]]
690 // HANDLER-MERGE-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP7]] to i64, !nosanitize [[META2]]
691 // HANDLER-MERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB5:[0-9]+]], i64 [[TMP10]], i64 [[TMP11]]) #[[ATTR4]], !nosanitize [[META2]]
692 // HANDLER-MERGE-NEXT:    unreachable, !nosanitize [[META2]]
693 // HANDLER-MERGE:       [[CONT]]:
694 // HANDLER-MERGE-NEXT:    [[TMP12:%.*]] = extractvalue { i32, i1 } [[TMP8]], 0, !nosanitize [[META2]]
695 // HANDLER-MERGE-NEXT:    ret i32 [[TMP12]]
696 //
697 // MINRT-MERGE-LABEL: define dso_local noundef i32 @m(
698 // MINRT-MERGE-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
699 // MINRT-MERGE-NEXT:  [[ENTRY:.*:]]
700 // MINRT-MERGE-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2]]
701 // MINRT-MERGE-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
702 // MINRT-MERGE-NEXT:    br i1 [[TMP1]], label %[[HANDLER_ADD_OVERFLOW_I:.*]], label %[[F_EXIT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
703 // MINRT-MERGE:       [[HANDLER_ADD_OVERFLOW_I]]:
704 // MINRT-MERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4]], !nosanitize [[META2]]
705 // MINRT-MERGE-NEXT:    unreachable, !nosanitize [[META2]]
706 // MINRT-MERGE:       [[F_EXIT]]:
707 // MINRT-MERGE-NEXT:    [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 127), !nosanitize [[META2]]
708 // MINRT-MERGE-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
709 // MINRT-MERGE-NEXT:    br i1 [[TMP3]], label %[[HANDLER_ADD_OVERFLOW_I2:.*]], label %[[G_EXIT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
710 // MINRT-MERGE:       [[HANDLER_ADD_OVERFLOW_I2]]:
711 // MINRT-MERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4]], !nosanitize [[META2]]
712 // MINRT-MERGE-NEXT:    unreachable, !nosanitize [[META2]]
713 // MINRT-MERGE:       [[G_EXIT]]:
714 // MINRT-MERGE-NEXT:    [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
715 // MINRT-MERGE-NEXT:    [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
716 // MINRT-MERGE-NEXT:    [[TMP6:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[TMP4]], i32 [[TMP5]]), !nosanitize [[META2]]
717 // MINRT-MERGE-NEXT:    [[TMP7:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1, !nosanitize [[META2]]
718 // MINRT-MERGE-NEXT:    br i1 [[TMP7]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
719 // MINRT-MERGE:       [[HANDLER_ADD_OVERFLOW]]:
720 // MINRT-MERGE-NEXT:    tail call void @__ubsan_handle_add_overflow_minimal_abort() #[[ATTR4]], !nosanitize [[META2]]
721 // MINRT-MERGE-NEXT:    unreachable, !nosanitize [[META2]]
722 // MINRT-MERGE:       [[CONT]]:
723 // MINRT-MERGE-NEXT:    [[TMP8:%.*]] = extractvalue { i32, i1 } [[TMP6]], 0, !nosanitize [[META2]]
724 // MINRT-MERGE-NEXT:    ret i32 [[TMP8]]
725 //
726 int m(int x, int y) {
727   return f(x) + g(y);
728 }
729 
730 // TRAP-MERGE: attributes #[[ATTR4]] = { noreturn nounwind }
731 // HANDLER-MERGE: attributes #[[ATTR4]] = { noreturn nounwind }
732 // MINRT-MERGE: attributes #[[ATTR4]] = { noreturn nounwind }
733 
734 // TRAP-NOMERGE: attributes #[[ATTR4]] = { nomerge noreturn nounwind }
735 // HANDLER-NOMERGE: attributes #[[ATTR4]] = { nomerge noreturn nounwind }
736 // MINRT-NOMERGE: attributes #[[ATTR4]] = { nomerge noreturn nounwind }
737