xref: /llvm-project/clang/test/CodeGen/integer-overflow.c (revision 431bef44098ad37188c0f692b28e683d37a79e0f)
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 
5 
6 // Tests for signed integer overflow stuff.
7 // rdar://7432000 rdar://7221421
8 void test1() {
9   // DEFAULT: define void @test1
10   // WRAPV: define void @test1
11   // TRAPV: define void @test1
12   extern volatile int f11G, a, b;
13 
14   // DEFAULT: add nsw i32
15   // WRAPV: add i32
16   // TRAPV: llvm.sadd.with.overflow.i32
17   f11G = a + b;
18 
19   // DEFAULT: sub nsw i32
20   // WRAPV: sub i32
21   // TRAPV: llvm.ssub.with.overflow.i32
22   f11G = a - b;
23 
24   // DEFAULT: mul nsw i32
25   // WRAPV: mul i32
26   // TRAPV: llvm.smul.with.overflow.i32
27   f11G = a * b;
28 
29   // DEFAULT: sub nsw i32 0,
30   // WRAPV: sub i32 0,
31   // TRAPV: llvm.ssub.with.overflow.i32(i32 0
32   f11G = -a;
33 
34   // PR7426 - Overflow checking for increments.
35 
36   // DEFAULT: add nsw i32 {{.*}}, 1
37   // WRAPV: add i32 {{.*}}, 1
38   // TRAPV: llvm.sadd.with.overflow.i32({{.*}}, i32 1)
39   ++a;
40 
41   // DEFAULT: add nsw i32 {{.*}}, -1
42   // WRAPV: add i32 {{.*}}, -1
43   // TRAPV: llvm.sadd.with.overflow.i32({{.*}}, i32 -1)
44   --a;
45 }
46