blob: d7fff4ee4a2a461f2063a86bf84a34be03f82e89 [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
4// 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 +00005
6
7// Tests for signed integer overflow stuff.
8// rdar://7432000 rdar://7221421
9void test1() {
10 // DEFAULT: define void @test1
11 // WRAPV: define void @test1
12 // TRAPV: define void @test1
13 extern volatile int f11G, a, b;
14
15 // DEFAULT: add nsw i32
16 // WRAPV: add i32
17 // TRAPV: llvm.sadd.with.overflow.i32
David Chisnall7f18e672010-09-17 18:29:54 +000018 // TRAPV_HANDLER: foo(
Chris Lattnera4d71452010-06-26 21:25:03 +000019 f11G = a + b;
20
21 // DEFAULT: sub nsw i32
22 // WRAPV: sub i32
23 // TRAPV: llvm.ssub.with.overflow.i32
David Chisnall7f18e672010-09-17 18:29:54 +000024 // TRAPV_HANDLER: foo(
Chris Lattnera4d71452010-06-26 21:25:03 +000025 f11G = a - b;
26
Chris Lattnera4d71452010-06-26 21:25:03 +000027 // DEFAULT: mul nsw i32
28 // WRAPV: mul i32
29 // TRAPV: llvm.smul.with.overflow.i32
David Chisnall7f18e672010-09-17 18:29:54 +000030 // TRAPV_HANDLER: foo(
Chris Lattnera4d71452010-06-26 21:25:03 +000031 f11G = a * b;
Chris Lattner640d3262010-06-26 22:18:28 +000032
33 // DEFAULT: sub nsw i32 0,
34 // WRAPV: sub i32 0,
35 // TRAPV: llvm.ssub.with.overflow.i32(i32 0
David Chisnall7f18e672010-09-17 18:29:54 +000036 // TRAPV_HANDLER: foo(
Chris Lattner640d3262010-06-26 22:18:28 +000037 f11G = -a;
38
39 // PR7426 - Overflow checking for increments.
40
41 // DEFAULT: add nsw i32 {{.*}}, 1
42 // WRAPV: add i32 {{.*}}, 1
43 // TRAPV: llvm.sadd.with.overflow.i32({{.*}}, i32 1)
David Chisnall7f18e672010-09-17 18:29:54 +000044 // TRAPV_HANDLER: foo(
Chris Lattner640d3262010-06-26 22:18:28 +000045 ++a;
46
47 // DEFAULT: add nsw i32 {{.*}}, -1
48 // WRAPV: add i32 {{.*}}, -1
49 // TRAPV: 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;
Chris Lattner2cb42222011-03-01 00:03:48 +000052
Chris Lattner2cb42222011-03-01 00:03:48 +000053 // -fwrapv should turn off inbounds for GEP's, PR9256
54 extern int* P;
55 ++P;
56 // DEFAULT: getelementptr inbounds i32*
57 // WRAPV: getelementptr i32*
58 // TRAPV: getelementptr inbounds i32*
Eli Friedmanfa0b4092011-03-02 01:49:12 +000059
60 // PR9350: char increment never overflows.
61 extern volatile signed char PR9350;
62 // DEFAULT: add i8 {{.*}}, 1
63 // WRAPV: add i8 {{.*}}, 1
64 // TRAPV: add i8 {{.*}}, 1
65 ++PR9350;
Chris Lattnera4d71452010-06-26 21:25:03 +000066}