62 lines · c
1// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -ftrapv %s -emit-llvm -o - | FileCheck %s2 3unsigned int ui, uj, uk;4int i, j, k;5 6// CHECK-LABEL: define{{.*}} void @test0()7void test0(void) {8 // -ftrapv doesn't affect unsigned arithmetic.9 // CHECK: [[T1:%.*]] = load i32, ptr @uj10 // CHECK-NEXT: [[T2:%.*]] = load i32, ptr @uk11 // CHECK-NEXT: [[T3:%.*]] = add i32 [[T1]], [[T2]]12 // CHECK-NEXT: store i32 [[T3]], ptr @ui13 ui = uj + uk;14 15 // CHECK: [[T1:%.*]] = load i32, ptr @j16 // CHECK-NEXT: [[T2:%.*]] = load i32, ptr @k17 // CHECK-NEXT: [[T3:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[T1]], i32 [[T2]])18 // CHECK-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T3]], 019 // CHECK-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T3]], 120 // CHECK-NEXT: [[T6:%.*]] = xor i1 [[T5]], true21 // CHECK-NEXT: br i1 [[T6]]22 // CHECK: call void @llvm.ubsantrap(i8 0)23 i = j + k;24}25 26// CHECK-LABEL: define{{.*}} void @test1()27void test1(void) {28 extern void opaque(int);29 opaque(i++);30 31 // CHECK: [[T1:%.*]] = load i32, ptr @i32 // CHECK-NEXT: [[T2:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[T1]], i32 1)33 // CHECK-NEXT: [[T3:%.*]] = extractvalue { i32, i1 } [[T2]], 034 // CHECK-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T2]], 135 // CHECK-NEXT: [[T5:%.*]] = xor i1 [[T4]], true36 // CHECK-NEXT: br i1 [[T5]]37 // CHECK: call void @llvm.ubsantrap(i8 0)38}39 40// CHECK-LABEL: define{{.*}} void @test2()41void test2(void) {42 extern void opaque(int);43 opaque(++i);44 45 // CHECK: [[T1:%.*]] = load i32, ptr @i46 // CHECK-NEXT: [[T2:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[T1]], i32 1)47 // CHECK-NEXT: [[T3:%.*]] = extractvalue { i32, i1 } [[T2]], 048 // CHECK-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T2]], 149 // CHECK-NEXT: [[T5:%.*]] = xor i1 [[T4]], true50 // CHECK-NEXT: br i1 [[T5]]51 // CHECK: call void @llvm.ubsantrap(i8 0)52}53 54// CHECK-LABEL: define{{.*}} void @test3(55void test3(int a, int b, float c, float d) {56 // CHECK-NOT: @llvm.trap57 (void)(a / b);58 (void)(a % b);59 (void)(c / d);60 // CHECK: }61}62