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