blob: ed2dede7814c7c69938b839874a5abbef43b7a77 [file] [log] [blame]
Nuno Lopes060ddb02012-05-09 21:21:49 +00001// RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - | FileCheck %s --check-prefix=DEFAULT
2// RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -fwrapv | FileCheck %s --check-prefix=WRAPV
3// RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -ftrapv | FileCheck %s --check-prefix=TRAPV
Richard Smithd6396a62012-11-05 22:21:05 +00004// RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -fsanitize=signed-integer-overflow | FileCheck %s --check-prefix=CATCH_UB
Nuno Lopes060ddb02012-05-09 21:21:49 +00005// RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -ftrapv -ftrapv-handler foo | FileCheck %s --check-prefix=TRAPV_HANDLER
Chris Lattnera4d71452010-06-26 21:25:03 +00006
7
8// Tests for signed integer overflow stuff.
9// rdar://7432000 rdar://7221421
10void test1() {
11 // DEFAULT: define void @test1
12 // WRAPV: define void @test1
13 // TRAPV: define void @test1
14 extern volatile int f11G, a, b;
15
16 // DEFAULT: add nsw i32
17 // WRAPV: add i32
18 // TRAPV: llvm.sadd.with.overflow.i32
Richard Smith9d3e2262012-08-25 00:32:28 +000019 // CATCH_UB: llvm.sadd.with.overflow.i32
David Chisnall7f18e672010-09-17 18:29:54 +000020 // TRAPV_HANDLER: foo(
Chris Lattnera4d71452010-06-26 21:25:03 +000021 f11G = a + b;
22
23 // DEFAULT: sub nsw i32
24 // WRAPV: sub i32
25 // TRAPV: llvm.ssub.with.overflow.i32
Richard Smith9d3e2262012-08-25 00:32:28 +000026 // CATCH_UB: llvm.ssub.with.overflow.i32
David Chisnall7f18e672010-09-17 18:29:54 +000027 // TRAPV_HANDLER: foo(
Chris Lattnera4d71452010-06-26 21:25:03 +000028 f11G = a - b;
29
Chris Lattnera4d71452010-06-26 21:25:03 +000030 // DEFAULT: mul nsw i32
31 // WRAPV: mul i32
32 // TRAPV: llvm.smul.with.overflow.i32
Richard Smith9d3e2262012-08-25 00:32:28 +000033 // CATCH_UB: llvm.smul.with.overflow.i32
David Chisnall7f18e672010-09-17 18:29:54 +000034 // TRAPV_HANDLER: foo(
Chris Lattnera4d71452010-06-26 21:25:03 +000035 f11G = a * b;
Chris Lattner640d3262010-06-26 22:18:28 +000036
37 // DEFAULT: sub nsw i32 0,
38 // WRAPV: sub i32 0,
39 // TRAPV: llvm.ssub.with.overflow.i32(i32 0
Richard Smith9d3e2262012-08-25 00:32:28 +000040 // CATCH_UB: llvm.ssub.with.overflow.i32(i32 0
David Chisnall7f18e672010-09-17 18:29:54 +000041 // TRAPV_HANDLER: foo(
Chris Lattner640d3262010-06-26 22:18:28 +000042 f11G = -a;
43
44 // PR7426 - Overflow checking for increments.
45
46 // DEFAULT: add nsw i32 {{.*}}, 1
47 // WRAPV: add i32 {{.*}}, 1
48 // TRAPV: llvm.sadd.with.overflow.i32({{.*}}, i32 1)
Richard Smith9d3e2262012-08-25 00:32:28 +000049 // CATCH_UB: llvm.sadd.with.overflow.i32({{.*}}, i32 1)
David Chisnall7f18e672010-09-17 18:29:54 +000050 // TRAPV_HANDLER: foo(
Chris Lattner640d3262010-06-26 22:18:28 +000051 ++a;
52
53 // DEFAULT: add nsw i32 {{.*}}, -1
54 // WRAPV: add i32 {{.*}}, -1
55 // TRAPV: llvm.sadd.with.overflow.i32({{.*}}, i32 -1)
Richard Smith9d3e2262012-08-25 00:32:28 +000056 // CATCH_UB: llvm.sadd.with.overflow.i32({{.*}}, i32 -1)
David Chisnall7f18e672010-09-17 18:29:54 +000057 // TRAPV_HANDLER: foo(
Chris Lattner640d3262010-06-26 22:18:28 +000058 --a;
Chris Lattner2cb42222011-03-01 00:03:48 +000059
Chris Lattner2cb42222011-03-01 00:03:48 +000060 // -fwrapv should turn off inbounds for GEP's, PR9256
61 extern int* P;
62 ++P;
63 // DEFAULT: getelementptr inbounds i32*
64 // WRAPV: getelementptr i32*
65 // TRAPV: getelementptr inbounds i32*
Richard Smith9d3e2262012-08-25 00:32:28 +000066 // CATCH_UB: getelementptr inbounds i32*
Eli Friedmanfa0b4092011-03-02 01:49:12 +000067
68 // PR9350: char increment never overflows.
69 extern volatile signed char PR9350;
70 // DEFAULT: add i8 {{.*}}, 1
71 // WRAPV: add i8 {{.*}}, 1
72 // TRAPV: add i8 {{.*}}, 1
Richard Smith9d3e2262012-08-25 00:32:28 +000073 // CATCH_UB: add i8 {{.*}}, 1
Eli Friedmanfa0b4092011-03-02 01:49:12 +000074 ++PR9350;
Chris Lattnera4d71452010-06-26 21:25:03 +000075}