summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeGen/catch-undef-behavior.c
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2012-11-06 02:30:30 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2012-11-06 02:30:30 +0000
commitc86a114409b198065cb9927a84c7701a0fa3af56 (patch)
tree695587a5144a91f59862f6846d40b02e7b2eb06b /clang/test/CodeGen/catch-undef-behavior.c
parent58a1d90d6a5ec3abbc5696b37b3a5669be9cd17a (diff)
downloadbcm5719-llvm-c86a114409b198065cb9927a84c7701a0fa3af56.tar.gz
bcm5719-llvm-c86a114409b198065cb9927a84c7701a0fa3af56.zip
Classify the INT_MIN/-1 check as -fsanitize=signed-integer-overflow, not as -fsanitize=divide-by-zero.
llvm-svn: 167433
Diffstat (limited to 'clang/test/CodeGen/catch-undef-behavior.c')
-rw-r--r--clang/test/CodeGen/catch-undef-behavior.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/clang/test/CodeGen/catch-undef-behavior.c b/clang/test/CodeGen/catch-undef-behavior.c
index bc5ec63e1ae..4198b62ea56 100644
--- a/clang/test/CodeGen/catch-undef-behavior.c
+++ b/clang/test/CodeGen/catch-undef-behavior.c
@@ -1,5 +1,6 @@
-// RUN: %clang_cc1 -fsanitize=alignment,null,object-size,shift,return,signed-integer-overflow,vla-bound,float-cast-overflow -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s
+// RUN: %clang_cc1 -fsanitize=alignment,null,object-size,shift,return,signed-integer-overflow,vla-bound,float-cast-overflow,divide-by-zero -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s
// RUN: %clang_cc1 -fsanitize=null -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK-NULL
+// RUN: %clang_cc1 -fsanitize=signed-integer-overflow -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK-OVERFLOW
// CHECK: @[[INT:.*]] = private unnamed_addr constant { i16, i16, [6 x i8] } { i16 0, i16 11, [6 x i8] c"'int'\00" }
@@ -221,3 +222,27 @@ float float_float_overflow(double f) {
// CHECK: call void @__ubsan_handle_float_cast_overflow(
return f;
}
+
+// CHECK: @int_divide_overflow
+// CHECK-OVERFLOW: @int_divide_overflow
+int int_divide_overflow(int a, int b) {
+ // CHECK: %[[ZERO:.*]] = icmp ne i32 %[[B:.*]], 0
+ // CHECK-OVERFLOW-NOT: icmp ne i32 %{{.*}}, 0
+
+ // CHECK: %[[AOK:.*]] = icmp ne i32 %[[A:.*]], -2147483648
+ // CHECK-NEXT: %[[BOK:.*]] = icmp ne i32 %[[B]], -1
+ // CHECK-NEXT: %[[OVER:.*]] = or i1 %[[AOK]], %[[BOK]]
+
+ // CHECK-OVERFLOW: %[[AOK:.*]] = icmp ne i32 %[[A:.*]], -2147483648
+ // CHECK-OVERFLOW-NEXT: %[[BOK:.*]] = icmp ne i32 %[[B:.*]], -1
+ // CHECK-OVERFLOW-NEXT: %[[OK:.*]] = or i1 %[[AOK]], %[[BOK]]
+
+ // CHECK: %[[OK:.*]] = and i1 %[[ZERO]], %[[OVER]]
+
+ // CHECK: br i1 %[[OK]]
+ // CHECK-OVERFLOW: br i1 %[[OK]]
+ return a / b;
+
+ // CHECK: }
+ // CHECK-OVERFLOW: }
+}
OpenPOWER on IntegriCloud