xref: /aosp_15_r20/external/clang/test/CodeGen/integer-overflow.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - | FileCheck %s --check-prefix=DEFAULT
2*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -fwrapv | FileCheck %s --check-prefix=WRAPV
3*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -ftrapv | FileCheck %s --check-prefix=TRAPV
4*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -fsanitize=signed-integer-overflow | FileCheck %s --check-prefix=CATCH_UB
5*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -ftrapv -ftrapv-handler foo | FileCheck %s --check-prefix=TRAPV_HANDLER
6*67e74705SXin Li 
7*67e74705SXin Li 
8*67e74705SXin Li // Tests for signed integer overflow stuff.
9*67e74705SXin Li // rdar://7432000 rdar://7221421
test1()10*67e74705SXin Li void test1() {
11*67e74705SXin Li   // DEFAULT-LABEL: define void @test1
12*67e74705SXin Li   // WRAPV-LABEL: define void @test1
13*67e74705SXin Li   // TRAPV-LABEL: define void @test1
14*67e74705SXin Li   extern volatile int f11G, a, b;
15*67e74705SXin Li 
16*67e74705SXin Li   // DEFAULT: add nsw i32
17*67e74705SXin Li   // WRAPV: add i32
18*67e74705SXin Li   // TRAPV: llvm.sadd.with.overflow.i32
19*67e74705SXin Li   // CATCH_UB: llvm.sadd.with.overflow.i32
20*67e74705SXin Li   // TRAPV_HANDLER: foo(
21*67e74705SXin Li   f11G = a + b;
22*67e74705SXin Li 
23*67e74705SXin Li   // DEFAULT: sub nsw i32
24*67e74705SXin Li   // WRAPV: sub i32
25*67e74705SXin Li   // TRAPV: llvm.ssub.with.overflow.i32
26*67e74705SXin Li   // CATCH_UB: llvm.ssub.with.overflow.i32
27*67e74705SXin Li   // TRAPV_HANDLER: foo(
28*67e74705SXin Li   f11G = a - b;
29*67e74705SXin Li 
30*67e74705SXin Li   // DEFAULT: mul nsw i32
31*67e74705SXin Li   // WRAPV: mul i32
32*67e74705SXin Li   // TRAPV: llvm.smul.with.overflow.i32
33*67e74705SXin Li   // CATCH_UB: llvm.smul.with.overflow.i32
34*67e74705SXin Li   // TRAPV_HANDLER: foo(
35*67e74705SXin Li   f11G = a * b;
36*67e74705SXin Li 
37*67e74705SXin Li   // DEFAULT: sub nsw i32 0,
38*67e74705SXin Li   // WRAPV: sub i32 0,
39*67e74705SXin Li   // TRAPV: llvm.ssub.with.overflow.i32(i32 0
40*67e74705SXin Li   // CATCH_UB: llvm.ssub.with.overflow.i32(i32 0
41*67e74705SXin Li   // TRAPV_HANDLER: foo(
42*67e74705SXin Li   f11G = -a;
43*67e74705SXin Li 
44*67e74705SXin Li   // PR7426 - Overflow checking for increments.
45*67e74705SXin Li 
46*67e74705SXin Li   // DEFAULT: add nsw i32 {{.*}}, 1
47*67e74705SXin Li   // WRAPV: add i32 {{.*}}, 1
48*67e74705SXin Li   // TRAPV: llvm.sadd.with.overflow.i32({{.*}}, i32 1)
49*67e74705SXin Li   // CATCH_UB: llvm.sadd.with.overflow.i32({{.*}}, i32 1)
50*67e74705SXin Li   // TRAPV_HANDLER: foo(
51*67e74705SXin Li   ++a;
52*67e74705SXin Li 
53*67e74705SXin Li   // DEFAULT: add nsw i32 {{.*}}, -1
54*67e74705SXin Li   // WRAPV: add i32 {{.*}}, -1
55*67e74705SXin Li   // TRAPV: llvm.ssub.with.overflow.i32({{.*}}, i32 1)
56*67e74705SXin Li   // CATCH_UB: llvm.ssub.with.overflow.i32({{.*}}, i32 1)
57*67e74705SXin Li   // TRAPV_HANDLER: foo(
58*67e74705SXin Li   --a;
59*67e74705SXin Li 
60*67e74705SXin Li   // -fwrapv should turn off inbounds for GEP's, PR9256
61*67e74705SXin Li   extern int* P;
62*67e74705SXin Li   ++P;
63*67e74705SXin Li   // DEFAULT: getelementptr inbounds i32, i32*
64*67e74705SXin Li   // WRAPV: getelementptr i32, i32*
65*67e74705SXin Li   // TRAPV: getelementptr inbounds i32, i32*
66*67e74705SXin Li   // CATCH_UB: getelementptr inbounds i32, i32*
67*67e74705SXin Li 
68*67e74705SXin Li   // PR9350: char increment never overflows.
69*67e74705SXin Li   extern volatile signed char PR9350;
70*67e74705SXin Li   // DEFAULT: add i8 {{.*}}, 1
71*67e74705SXin Li   // WRAPV: add i8 {{.*}}, 1
72*67e74705SXin Li   // TRAPV: add i8 {{.*}}, 1
73*67e74705SXin Li   // CATCH_UB: add i8 {{.*}}, 1
74*67e74705SXin Li   ++PR9350;
75*67e74705SXin Li 
76*67e74705SXin Li   // PR24256: don't instrument __builtin_frame_address.
77*67e74705SXin Li   __builtin_frame_address(0 + 0);
78*67e74705SXin Li   // DEFAULT:  call i8* @llvm.frameaddress(i32 0)
79*67e74705SXin Li   // WRAPV:    call i8* @llvm.frameaddress(i32 0)
80*67e74705SXin Li   // TRAPV:    call i8* @llvm.frameaddress(i32 0)
81*67e74705SXin Li   // CATCH_UB: call i8* @llvm.frameaddress(i32 0)
82*67e74705SXin Li }
83