22// The most important assertion is the attributes at the end of the file, which
33// shows that ubsan does not currently attach 'nomerge'.
44//
5- // RUN: %clang -fsanitize=signed-integer-overflow -S - emit-llvm -fsanitize- trap=all -O3 -mllvm -ubsan-unique-traps %s -o - \
5+ // RUN: %clang_cc1 -triple x86_64-linux-gnu - emit-llvm -fsanitize=signed-integer-overflow -fsanitize- trap=signed-integer-overflow -O3 -mllvm -ubsan-unique-traps %s -o - \
66// RUN: | FileCheck %s
7-
8- #include <stdio.h>
9- #include <stdlib.h>
7+ //
8+ // REQUIRES: x86-registered-target
109
1110// CHECK-LABEL: define dso_local noundef i32 @f(
1211// CHECK-SAME: i32 noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
1312// CHECK-NEXT: [[ENTRY:.*:]]
14- // CHECK-NEXT: [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META5 :![0-9]+]]
15- // CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META5 ]]
16- // CHECK-NEXT: br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META5 ]]
13+ // CHECK-NEXT: [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2 :![0-9]+]]
14+ // CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2 ]]
15+ // CHECK-NEXT: br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2 ]]
1716// CHECK: [[TRAP]]:
18- // CHECK-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR4:[0-9]+]], !nosanitize [[META5 ]]
19- // CHECK-NEXT: unreachable, !nosanitize [[META5 ]]
17+ // CHECK-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR4:[0-9]+]], !nosanitize [[META2 ]]
18+ // CHECK-NEXT: unreachable, !nosanitize [[META2 ]]
2019// CHECK: [[CONT]]:
21- // CHECK-NEXT: [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META5 ]]
20+ // CHECK-NEXT: [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2 ]]
2221// CHECK-NEXT: ret i32 [[TMP2]]
2322//
2423int f (int x ) {
@@ -28,14 +27,14 @@ int f(int x) {
2827// CHECK-LABEL: define dso_local noundef i32 @g(
2928// CHECK-SAME: i32 noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0]] {
3029// CHECK-NEXT: [[ENTRY:.*:]]
31- // CHECK-NEXT: [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META5 ]]
32- // CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META5 ]]
33- // CHECK-NEXT: br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META5 ]]
30+ // CHECK-NEXT: [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2 ]]
31+ // CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2 ]]
32+ // CHECK-NEXT: br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2 ]]
3433// CHECK: [[TRAP]]:
35- // CHECK-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR4]], !nosanitize [[META5 ]]
36- // CHECK-NEXT: unreachable, !nosanitize [[META5 ]]
34+ // CHECK-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR4]], !nosanitize [[META2 ]]
35+ // CHECK-NEXT: unreachable, !nosanitize [[META2 ]]
3736// CHECK: [[CONT]]:
38- // CHECK-NEXT: [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META5 ]]
37+ // CHECK-NEXT: [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2 ]]
3938// CHECK-NEXT: ret i32 [[TMP2]]
4039//
4140int g (int x ) {
@@ -45,22 +44,22 @@ int g(int x) {
4544// CHECK-LABEL: define dso_local noundef i32 @h(
4645// CHECK-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
4746// CHECK-NEXT: [[ENTRY:.*:]]
48- // CHECK-NEXT: [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META5 ]]
49- // CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META5 ]]
50- // CHECK-NEXT: br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META5 ]]
47+ // CHECK-NEXT: [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2 ]]
48+ // CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2 ]]
49+ // CHECK-NEXT: br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2 ]]
5150// CHECK: [[TRAP]]:
52- // CHECK-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR4]], !nosanitize [[META5 ]]
53- // CHECK-NEXT: unreachable, !nosanitize [[META5 ]]
51+ // CHECK-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR4]], !nosanitize [[META2 ]]
52+ // CHECK-NEXT: unreachable, !nosanitize [[META2 ]]
5453// CHECK: [[CONT]]:
55- // CHECK-NEXT: [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 129), !nosanitize [[META5 ]]
56- // CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META5 ]]
57- // CHECK-NEXT: br i1 [[TMP3]], label %[[TRAP1:.*]], label %[[CONT2:.*]], !nosanitize [[META5 ]]
54+ // CHECK-NEXT: [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 129), !nosanitize [[META2 ]]
55+ // CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2 ]]
56+ // CHECK-NEXT: br i1 [[TMP3]], label %[[TRAP1:.*]], label %[[CONT2:.*]], !nosanitize [[META2 ]]
5857// CHECK: [[TRAP1]]:
59- // CHECK-NEXT: tail call void @llvm.ubsantrap(i8 4) #[[ATTR4]], !nosanitize [[META5 ]]
60- // CHECK-NEXT: unreachable, !nosanitize [[META5 ]]
58+ // CHECK-NEXT: tail call void @llvm.ubsantrap(i8 4) #[[ATTR4]], !nosanitize [[META2 ]]
59+ // CHECK-NEXT: unreachable, !nosanitize [[META2 ]]
6160// CHECK: [[CONT2]]:
62- // CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META5 ]]
63- // CHECK-NEXT: [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META5 ]]
61+ // CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2 ]]
62+ // CHECK-NEXT: [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2 ]]
6463// CHECK-NEXT: [[COND:%.*]] = tail call i32 @llvm.smin.i32(i32 [[TMP5]], i32 [[TMP4]])
6564// CHECK-NEXT: ret i32 [[COND]]
6665//
@@ -73,30 +72,30 @@ int h(int x, int y) {
7372// CHECK-LABEL: define dso_local noundef i32 @m(
7473// CHECK-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
7574// CHECK-NEXT: [[ENTRY:.*:]]
76- // CHECK-NEXT: [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META5 ]]
77- // CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META5 ]]
78- // CHECK-NEXT: br i1 [[TMP1]], label %[[TRAP_I:.*]], label %[[F_EXIT:.*]], !nosanitize [[META5 ]]
75+ // CHECK-NEXT: [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2 ]]
76+ // CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2 ]]
77+ // CHECK-NEXT: br i1 [[TMP1]], label %[[TRAP_I:.*]], label %[[F_EXIT:.*]], !nosanitize [[META2 ]]
7978// CHECK: [[TRAP_I]]:
80- // CHECK-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR4]], !nosanitize [[META5 ]]
81- // CHECK-NEXT: unreachable, !nosanitize [[META5 ]]
79+ // CHECK-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR4]], !nosanitize [[META2 ]]
80+ // CHECK-NEXT: unreachable, !nosanitize [[META2 ]]
8281// CHECK: [[F_EXIT]]:
83- // CHECK-NEXT: [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 127), !nosanitize [[META5 ]]
84- // CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META5 ]]
85- // CHECK-NEXT: br i1 [[TMP3]], label %[[TRAP_I2:.*]], label %[[G_EXIT:.*]], !nosanitize [[META5 ]]
82+ // CHECK-NEXT: [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 127), !nosanitize [[META2 ]]
83+ // CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2 ]]
84+ // CHECK-NEXT: br i1 [[TMP3]], label %[[TRAP_I2:.*]], label %[[G_EXIT:.*]], !nosanitize [[META2 ]]
8685// CHECK: [[TRAP_I2]]:
87- // CHECK-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR4]], !nosanitize [[META5 ]]
88- // CHECK-NEXT: unreachable, !nosanitize [[META5 ]]
86+ // CHECK-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR4]], !nosanitize [[META2 ]]
87+ // CHECK-NEXT: unreachable, !nosanitize [[META2 ]]
8988// CHECK: [[G_EXIT]]:
90- // CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META5 ]]
91- // CHECK-NEXT: [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META5 ]]
92- // CHECK-NEXT: [[TMP6:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[TMP4]], i32 [[TMP5]]), !nosanitize [[META5 ]]
93- // CHECK-NEXT: [[TMP7:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1, !nosanitize [[META5 ]]
94- // CHECK-NEXT: br i1 [[TMP7]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META5 ]]
89+ // CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2 ]]
90+ // CHECK-NEXT: [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2 ]]
91+ // CHECK-NEXT: [[TMP6:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[TMP4]], i32 [[TMP5]]), !nosanitize [[META2 ]]
92+ // CHECK-NEXT: [[TMP7:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1, !nosanitize [[META2 ]]
93+ // CHECK-NEXT: br i1 [[TMP7]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2 ]]
9594// CHECK: [[TRAP]]:
96- // CHECK-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR4]], !nosanitize [[META5 ]]
97- // CHECK-NEXT: unreachable, !nosanitize [[META5 ]]
95+ // CHECK-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR4]], !nosanitize [[META2 ]]
96+ // CHECK-NEXT: unreachable, !nosanitize [[META2 ]]
9897// CHECK: [[CONT]]:
99- // CHECK-NEXT: [[TMP8:%.*]] = extractvalue { i32, i1 } [[TMP6]], 0, !nosanitize [[META5 ]]
98+ // CHECK-NEXT: [[TMP8:%.*]] = extractvalue { i32, i1 } [[TMP6]], 0, !nosanitize [[META2 ]]
10099// CHECK-NEXT: ret i32 [[TMP8]]
101100//
102101int m (int x , int y ) {
0 commit comments