• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s --check-prefix=DEFAULT
2 // RUN: %clang_cc1 %s -emit-llvm -o - -fwrapv | FileCheck %s --check-prefix=WRAPV
3 // RUN: %clang_cc1 %s -emit-llvm -o - -ftrapv | FileCheck %s --check-prefix=TRAPV
4 // RUN: %clang_cc1 %s -emit-llvm -o - -ftrapv -ftrapv-handler foo | FileCheck %s --check-prefix=TRAPV_HANDLER
5 
6 
7 // Tests for signed integer overflow stuff.
8 // rdar://7432000 rdar://7221421
test1()9 void 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
18   // TRAPV_HANDLER: foo(
19   f11G = a + b;
20 
21   // DEFAULT: sub nsw i32
22   // WRAPV: sub i32
23   // TRAPV: llvm.ssub.with.overflow.i32
24   // TRAPV_HANDLER: foo(
25   f11G = a - b;
26 
27   // DEFAULT: mul nsw i32
28   // WRAPV: mul i32
29   // TRAPV: llvm.smul.with.overflow.i32
30   // TRAPV_HANDLER: foo(
31   f11G = a * b;
32 
33   // DEFAULT: sub nsw i32 0,
34   // WRAPV: sub i32 0,
35   // TRAPV: llvm.ssub.with.overflow.i32(i32 0
36   // TRAPV_HANDLER: foo(
37   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)
44   // TRAPV_HANDLER: foo(
45   ++a;
46 
47   // DEFAULT: add nsw i32 {{.*}}, -1
48   // WRAPV: add i32 {{.*}}, -1
49   // TRAPV: llvm.sadd.with.overflow.i32({{.*}}, i32 -1)
50   // TRAPV_HANDLER: foo(
51   --a;
52 
53   // -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*
59 
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;
66 }
67