xref: /llvm-project/clang/test/CodeGen/integer-overflow.c (revision 51924e517bd2d25faea6ef873db3c59ec4d09bf8)
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: sub nsw i32 0,
25   // WRAPV: sub i32 0,
26   // TRAPV: sub nsw i32 0,
27   f11G = -a;
28 
29   // DEFAULT: mul nsw i32
30   // WRAPV: mul i32
31   // TRAPV: llvm.smul.with.overflow.i32
32   f11G = a * b;
33 }
34