comparison clang/test/CodeGen/unsigned-overflow.c @ 207:2e18cbf3894f

LLVM12
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Jun 2021 06:07:14 +0900
parents 1d019706d866
children c4bab56944e8
comparison
equal deleted inserted replaced
173:0572611fdcc8 207:2e18cbf3894f
6 unsigned int ii, ij, ik; 6 unsigned int ii, ij, ik;
7 7
8 extern void opaquelong(unsigned long); 8 extern void opaquelong(unsigned long);
9 extern void opaqueint(unsigned int); 9 extern void opaqueint(unsigned int);
10 10
11 // CHECK-LABEL: define void @testlongadd() 11 // CHECK-LABEL: define{{.*}} void @testlongadd()
12 void testlongadd() { 12 void testlongadd() {
13 13
14 // CHECK: [[T1:%.*]] = load i64, i64* @lj 14 // CHECK: [[T1:%.*]] = load i64, i64* @lj
15 // CHECK-NEXT: [[T2:%.*]] = load i64, i64* @lk 15 // CHECK-NEXT: [[T2:%.*]] = load i64, i64* @lk
16 // CHECK-NEXT: [[T3:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[T1]], i64 [[T2]]) 16 // CHECK-NEXT: [[T3:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[T1]], i64 [[T2]])
18 // CHECK-NEXT: [[T5:%.*]] = extractvalue { i64, i1 } [[T3]], 1 18 // CHECK-NEXT: [[T5:%.*]] = extractvalue { i64, i1 } [[T3]], 1
19 // CHECK: call void @__ubsan_handle_add_overflow 19 // CHECK: call void @__ubsan_handle_add_overflow
20 li = lj + lk; 20 li = lj + lk;
21 } 21 }
22 22
23 // CHECK-LABEL: define void @testlongsub() 23 // CHECK-LABEL: define{{.*}} void @testlongsub()
24 void testlongsub() { 24 void testlongsub() {
25 25
26 // CHECK: [[T1:%.*]] = load i64, i64* @lj 26 // CHECK: [[T1:%.*]] = load i64, i64* @lj
27 // CHECK-NEXT: [[T2:%.*]] = load i64, i64* @lk 27 // CHECK-NEXT: [[T2:%.*]] = load i64, i64* @lk
28 // CHECK-NEXT: [[T3:%.*]] = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 [[T1]], i64 [[T2]]) 28 // CHECK-NEXT: [[T3:%.*]] = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 [[T1]], i64 [[T2]])
30 // CHECK-NEXT: [[T5:%.*]] = extractvalue { i64, i1 } [[T3]], 1 30 // CHECK-NEXT: [[T5:%.*]] = extractvalue { i64, i1 } [[T3]], 1
31 // CHECK: call void @__ubsan_handle_sub_overflow 31 // CHECK: call void @__ubsan_handle_sub_overflow
32 li = lj - lk; 32 li = lj - lk;
33 } 33 }
34 34
35 // CHECK-LABEL: define void @testlongmul() 35 // CHECK-LABEL: define{{.*}} void @testlongmul()
36 void testlongmul() { 36 void testlongmul() {
37 37
38 // CHECK: [[T1:%.*]] = load i64, i64* @lj 38 // CHECK: [[T1:%.*]] = load i64, i64* @lj
39 // CHECK-NEXT: [[T2:%.*]] = load i64, i64* @lk 39 // CHECK-NEXT: [[T2:%.*]] = load i64, i64* @lk
40 // CHECK-NEXT: [[T3:%.*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 [[T1]], i64 [[T2]]) 40 // CHECK-NEXT: [[T3:%.*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 [[T1]], i64 [[T2]])
42 // CHECK-NEXT: [[T5:%.*]] = extractvalue { i64, i1 } [[T3]], 1 42 // CHECK-NEXT: [[T5:%.*]] = extractvalue { i64, i1 } [[T3]], 1
43 // CHECK: call void @__ubsan_handle_mul_overflow 43 // CHECK: call void @__ubsan_handle_mul_overflow
44 li = lj * lk; 44 li = lj * lk;
45 } 45 }
46 46
47 // CHECK-LABEL: define void @testlongpostinc() 47 // CHECK-LABEL: define{{.*}} void @testlongpostinc()
48 void testlongpostinc() { 48 void testlongpostinc() {
49 opaquelong(li++); 49 opaquelong(li++);
50 50
51 // CHECK: [[T1:%.*]] = load i64, i64* @li 51 // CHECK: [[T1:%.*]] = load i64, i64* @li
52 // CHECK-NEXT: [[T2:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[T1]], i64 1) 52 // CHECK-NEXT: [[T2:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[T1]], i64 1)
53 // CHECK-NEXT: [[T3:%.*]] = extractvalue { i64, i1 } [[T2]], 0 53 // CHECK-NEXT: [[T3:%.*]] = extractvalue { i64, i1 } [[T2]], 0
54 // CHECK-NEXT: [[T4:%.*]] = extractvalue { i64, i1 } [[T2]], 1 54 // CHECK-NEXT: [[T4:%.*]] = extractvalue { i64, i1 } [[T2]], 1
55 // CHECK: call void @__ubsan_handle_add_overflow 55 // CHECK: call void @__ubsan_handle_add_overflow
56 } 56 }
57 57
58 // CHECK-LABEL: define void @testlongpreinc() 58 // CHECK-LABEL: define{{.*}} void @testlongpreinc()
59 void testlongpreinc() { 59 void testlongpreinc() {
60 opaquelong(++li); 60 opaquelong(++li);
61 61
62 // CHECK: [[T1:%.*]] = load i64, i64* @li 62 // CHECK: [[T1:%.*]] = load i64, i64* @li
63 // CHECK-NEXT: [[T2:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[T1]], i64 1) 63 // CHECK-NEXT: [[T2:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[T1]], i64 1)
64 // CHECK-NEXT: [[T3:%.*]] = extractvalue { i64, i1 } [[T2]], 0 64 // CHECK-NEXT: [[T3:%.*]] = extractvalue { i64, i1 } [[T2]], 0
65 // CHECK-NEXT: [[T4:%.*]] = extractvalue { i64, i1 } [[T2]], 1 65 // CHECK-NEXT: [[T4:%.*]] = extractvalue { i64, i1 } [[T2]], 1
66 // CHECK: call void @__ubsan_handle_add_overflow 66 // CHECK: call void @__ubsan_handle_add_overflow
67 } 67 }
68 68
69 // CHECK-LABEL: define void @testintadd() 69 // CHECK-LABEL: define{{.*}} void @testintadd()
70 void testintadd() { 70 void testintadd() {
71 71
72 // CHECK: [[T1:%.*]] = load i32, i32* @ij 72 // CHECK: [[T1:%.*]] = load i32, i32* @ij
73 // CHECK-NEXT: [[T2:%.*]] = load i32, i32* @ik 73 // CHECK-NEXT: [[T2:%.*]] = load i32, i32* @ik
74 // CHECK-NEXT: [[T3:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[T1]], i32 [[T2]]) 74 // CHECK-NEXT: [[T3:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[T1]], i32 [[T2]])
76 // CHECK-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T3]], 1 76 // CHECK-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T3]], 1
77 // CHECK: call void @__ubsan_handle_add_overflow 77 // CHECK: call void @__ubsan_handle_add_overflow
78 ii = ij + ik; 78 ii = ij + ik;
79 } 79 }
80 80
81 // CHECK-LABEL: define void @testintsub() 81 // CHECK-LABEL: define{{.*}} void @testintsub()
82 void testintsub() { 82 void testintsub() {
83 83
84 // CHECK: [[T1:%.*]] = load i32, i32* @ij 84 // CHECK: [[T1:%.*]] = load i32, i32* @ij
85 // CHECK-NEXT: [[T2:%.*]] = load i32, i32* @ik 85 // CHECK-NEXT: [[T2:%.*]] = load i32, i32* @ik
86 // CHECK-NEXT: [[T3:%.*]] = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 [[T1]], i32 [[T2]]) 86 // CHECK-NEXT: [[T3:%.*]] = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 [[T1]], i32 [[T2]])
88 // CHECK-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T3]], 1 88 // CHECK-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T3]], 1
89 // CHECK: call void @__ubsan_handle_sub_overflow 89 // CHECK: call void @__ubsan_handle_sub_overflow
90 ii = ij - ik; 90 ii = ij - ik;
91 } 91 }
92 92
93 // CHECK-LABEL: define void @testintmul() 93 // CHECK-LABEL: define{{.*}} void @testintmul()
94 void testintmul() { 94 void testintmul() {
95 95
96 // CHECK: [[T1:%.*]] = load i32, i32* @ij 96 // CHECK: [[T1:%.*]] = load i32, i32* @ij
97 // CHECK-NEXT: [[T2:%.*]] = load i32, i32* @ik 97 // CHECK-NEXT: [[T2:%.*]] = load i32, i32* @ik
98 // CHECK-NEXT: [[T3:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 [[T1]], i32 [[T2]]) 98 // CHECK-NEXT: [[T3:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 [[T1]], i32 [[T2]])
100 // CHECK-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T3]], 1 100 // CHECK-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T3]], 1
101 // CHECK: call void @__ubsan_handle_mul_overflow 101 // CHECK: call void @__ubsan_handle_mul_overflow
102 ii = ij * ik; 102 ii = ij * ik;
103 } 103 }
104 104
105 // CHECK-LABEL: define void @testintpostinc() 105 // CHECK-LABEL: define{{.*}} void @testintpostinc()
106 void testintpostinc() { 106 void testintpostinc() {
107 opaqueint(ii++); 107 opaqueint(ii++);
108 108
109 // CHECK: [[T1:%.*]] = load i32, i32* @ii 109 // CHECK: [[T1:%.*]] = load i32, i32* @ii
110 // CHECK-NEXT: [[T2:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[T1]], i32 1) 110 // CHECK-NEXT: [[T2:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[T1]], i32 1)
111 // CHECK-NEXT: [[T3:%.*]] = extractvalue { i32, i1 } [[T2]], 0 111 // CHECK-NEXT: [[T3:%.*]] = extractvalue { i32, i1 } [[T2]], 0
112 // CHECK-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T2]], 1 112 // CHECK-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T2]], 1
113 // CHECK: call void @__ubsan_handle_add_overflow 113 // CHECK: call void @__ubsan_handle_add_overflow
114 } 114 }
115 115
116 // CHECK-LABEL: define void @testintpreinc() 116 // CHECK-LABEL: define{{.*}} void @testintpreinc()
117 void testintpreinc() { 117 void testintpreinc() {
118 opaqueint(++ii); 118 opaqueint(++ii);
119 119
120 // CHECK: [[T1:%.*]] = load i32, i32* @ii 120 // CHECK: [[T1:%.*]] = load i32, i32* @ii
121 // CHECK-NEXT: [[T2:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[T1]], i32 1) 121 // CHECK-NEXT: [[T2:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[T1]], i32 1)