Mercurial > hg > CbC > CbC_llvm
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) |