|
1 | 1 | // Check that -fsanitize=signed-integer-wrap instruments with -fwrapv
|
2 |
| -// RUN: %clang_cc1 -fwrapv -triple x86_64-apple-darwin -emit-llvm -o - %s -fsanitize=signed-integer-wrap | FileCheck %s --check-prefix=CHECK |
| 2 | +// RUN: %clang_cc1 -fwrapv -triple x86_64-apple-darwin -emit-llvm -o - %s -fsanitize=signed-integer-wrap | FileCheck %s --check-prefix=CHECKSIW |
3 | 3 |
|
4 | 4 | // Check that -fsanitize=signed-integer-overflow doesn't instrument with -fwrapv
|
5 | 5 | // RUN: %clang_cc1 -fwrapv -triple x86_64-apple-darwin -emit-llvm -o - %s -fsanitize=signed-integer-overflow | FileCheck %s --check-prefix=CHECKSIO
|
6 | 6 |
|
7 | 7 | extern volatile int a, b, c;
|
8 | 8 |
|
9 |
| -// CHECK-LABEL: define void @test_add_overflow |
| 9 | +// CHECKSIW-LABEL: define void @test_add_overflow |
10 | 10 | void test_add_overflow(void) {
|
11 |
| - // CHECK: [[ADD0:%.*]] = load {{.*}} i32 |
12 |
| - // CHECK-NEXT: [[ADD1:%.*]] = load {{.*}} i32 |
13 |
| - // CHECK-NEXT: [[ADD2:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[ADD0]], i32 [[ADD1]]) |
14 |
| - // CHECK: [[ADD4:%.*]] = extractvalue { i32, i1 } [[ADD2]], 1 |
15 |
| - // CHECK-NEXT: [[ADD5:%.*]] = xor i1 [[ADD4]], true |
16 |
| - // CHECK-NEXT: br i1 [[ADD5]], {{.*}} %handler.add_overflow |
17 |
| - // CHECK: call void @__ubsan_handle_add_overflow |
| 11 | + // CHECKSIW: [[ADD0:%.*]] = load {{.*}} i32 |
| 12 | + // CHECKSIW-NEXT: [[ADD1:%.*]] = load {{.*}} i32 |
| 13 | + // CHECKSIW-NEXT: [[ADD2:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[ADD0]], i32 [[ADD1]]) |
| 14 | + // CHECKSIW: [[ADD4:%.*]] = extractvalue { i32, i1 } [[ADD2]], 1 |
| 15 | + // CHECKSIW-NEXT: [[ADD5:%.*]] = xor i1 [[ADD4]], true |
| 16 | + // CHECKSIW-NEXT: br i1 [[ADD5]], {{.*}} %handler.add_overflow |
| 17 | + // CHECKSIW: call void @__ubsan_handle_add_overflow |
18 | 18 |
|
19 | 19 | // CHECKSIO-NOT: call void @__ubsan_handle_add_overflow
|
20 | 20 | a = b + c;
|
21 | 21 | }
|
22 | 22 |
|
23 |
| -// CHECK-LABEL: define void @test_inc_overflow |
| 23 | +// CHECKSIW-LABEL: define void @test_inc_overflow |
24 | 24 | void test_inc_overflow(void) {
|
25 | 25 | // This decays and gets handled by __ubsan_handle_add_overflow...
|
26 |
| - // CHECK: [[INC0:%.*]] = load {{.*}} i32 |
27 |
| - // CHECK-NEXT: [[INC1:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[INC0]], i32 1) |
28 |
| - // CHECK: [[INC3:%.*]] = extractvalue { i32, i1 } [[INC1]], 1 |
29 |
| - // CHECK-NEXT: [[INC4:%.*]] = xor i1 [[INC3]], true |
30 |
| - // CHECK-NEXT: br i1 [[INC4]], {{.*}} %handler.add_overflow |
31 |
| - // CHECK: call void @__ubsan_handle_add_overflow |
| 26 | + // CHECKSIW: [[INC0:%.*]] = load {{.*}} i32 |
| 27 | + // CHECKSIW-NEXT: [[INC1:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[INC0]], i32 1) |
| 28 | + // CHECKSIW: [[INC3:%.*]] = extractvalue { i32, i1 } [[INC1]], 1 |
| 29 | + // CHECKSIW-NEXT: [[INC4:%.*]] = xor i1 [[INC3]], true |
| 30 | + // CHECKSIW-NEXT: br i1 [[INC4]], {{.*}} %handler.add_overflow |
| 31 | + // CHECKSIW: call void @__ubsan_handle_add_overflow |
32 | 32 |
|
33 | 33 | // CHECKSIO-NOT: call void @__ubsan_handle_add_overflow
|
34 | 34 | a++;
|
35 | 35 | }
|
36 | 36 |
|
37 |
| -// CHECK-LABEL: define void @test_sub_overflow |
| 37 | +// CHECKSIW-LABEL: define void @test_sub_overflow |
38 | 38 | void test_sub_overflow(void) {
|
39 |
| - // CHECK: [[SUB0:%.*]] = load {{.*}} i32 |
40 |
| - // CHECK-NEXT: [[SUB1:%.*]] = load {{.*}} i32 |
41 |
| - // CHECK-NEXT: [[SUB2:%.*]] = call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 [[SUB0]], i32 [[SUB1]]) |
42 |
| - // CHECK: [[SUB4:%.*]] = extractvalue { i32, i1 } [[SUB2]], 1 |
43 |
| - // CHECK-NEXT: [[SUB5:%.*]] = xor i1 [[SUB4]], true |
| 39 | + // CHECKSIW: [[SUB0:%.*]] = load {{.*}} i32 |
| 40 | + // CHECKSIW-NEXT: [[SUB1:%.*]] = load {{.*}} i32 |
| 41 | + // CHECKSIW-NEXT: [[SUB2:%.*]] = call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 [[SUB0]], i32 [[SUB1]]) |
| 42 | + // CHECKSIW: [[SUB4:%.*]] = extractvalue { i32, i1 } [[SUB2]], 1 |
| 43 | + // CHECKSIW-NEXT: [[SUB5:%.*]] = xor i1 [[SUB4]], true |
44 | 44 | // CHECK-NEXT br i1 [[SUB5]], {{.*}} %handler.sub_overflow
|
45 |
| - // CHECK: call void @__ubsan_handle_sub_overflow |
| 45 | + // CHECKSIW: call void @__ubsan_handle_sub_overflow |
46 | 46 |
|
47 | 47 | // CHECKSIO-NOT: call void @__ubsan_handle_sub_overflow
|
48 | 48 | a = b - c;
|
49 | 49 | }
|
50 | 50 |
|
51 |
| -// CHECK-LABEL: define void @test_mul_overflow |
| 51 | +// CHECKSIW-LABEL: define void @test_mul_overflow |
52 | 52 | void test_mul_overflow(void) {
|
53 |
| - // CHECK: [[MUL0:%.*]] = load {{.*}} i32 |
54 |
| - // CHECK-NEXT: [[MUL1:%.*]] = load {{.*}} i32 |
55 |
| - // CHECK-NEXT: [[MUL2:%.*]] = call { i32, i1 } @llvm.smul.with.overflow.i32(i32 [[MUL0]], i32 [[MUL1]]) |
56 |
| - // CHECK: [[MUL4:%.*]] = extractvalue { i32, i1 } [[MUL2]], 1 |
| 53 | + // CHECKSIW: [[MUL0:%.*]] = load {{.*}} i32 |
| 54 | + // CHECKSIW-NEXT: [[MUL1:%.*]] = load {{.*}} i32 |
| 55 | + // CHECKSIW-NEXT: [[MUL2:%.*]] = call { i32, i1 } @llvm.smul.with.overflow.i32(i32 [[MUL0]], i32 [[MUL1]]) |
| 56 | + // CHECKSIW: [[MUL4:%.*]] = extractvalue { i32, i1 } [[MUL2]], 1 |
57 | 57 | // CHECK-NEXT [[MUL5:%.*]] = xor i1 [[MUL4]], true
|
58 | 58 | // CHECK-NEXT br i1 [[MUL5]], {{.*}} %handler.mul_overflow
|
59 |
| - // CHECK: call void @__ubsan_handle_mul_overflow |
| 59 | + // CHECKSIW: call void @__ubsan_handle_mul_overflow |
60 | 60 |
|
61 | 61 | // CHECKSIO-NOT: call void @__ubsan_handle_mul_overflow
|
62 | 62 | a = b * c;
|
63 | 63 | }
|
64 | 64 |
|
65 |
| -// CHECK-LABEL: define void @test_div_overflow |
| 65 | +// CHECKSIW-LABEL: define void @test_div_overflow |
66 | 66 | void test_div_overflow(void) {
|
67 |
| - // CHECK: [[DIV0:%.*]] = load {{.*}} i32 |
68 |
| - // CHECK-NEXT: [[DIV1:%.*]] = load {{.*}} i32 |
69 |
| - // CHECK-NEXT: [[DIV2:%.*]] = icmp ne i32 [[DIV0]], -2147483648 |
70 |
| - // CHECK-NEXT: [[DIV3:%.*]] = icmp ne i32 [[DIV1]], -1 |
71 |
| - // CHECK-NEXT: [[DIVOR:%or]] = or i1 [[DIV2]], [[DIV3]] |
72 |
| - // CHECK-NEXT: br {{.*}} %handler.divrem_overflow |
| 67 | + // CHECKSIW: [[DIV0:%.*]] = load {{.*}} i32 |
| 68 | + // CHECKSIW-NEXT: [[DIV1:%.*]] = load {{.*}} i32 |
| 69 | + // CHECKSIW-NEXT: [[DIV2:%.*]] = icmp ne i32 [[DIV0]], -2147483648 |
| 70 | + // CHECKSIW-NEXT: [[DIV3:%.*]] = icmp ne i32 [[DIV1]], -1 |
| 71 | + // CHECKSIW-NEXT: [[DIVOR:%or]] = or i1 [[DIV2]], [[DIV3]] |
| 72 | + // CHECKSIW-NEXT: br {{.*}} %handler.divrem_overflow |
73 | 73 |
|
74 | 74 | // -fsanitize=signed-integer-overflow still instruments division even with -fwrapv
|
75 | 75 | // CHECKSIO: br {{.*}} %handler.divrem_overflow
|
|
0 commit comments