diff options
Diffstat (limited to 'test/CodeGen/ubsan-shift.c')
-rw-r--r-- | test/CodeGen/ubsan-shift.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/test/CodeGen/ubsan-shift.c b/test/CodeGen/ubsan-shift.c new file mode 100644 index 000000000000..90c15d8c086f --- /dev/null +++ b/test/CodeGen/ubsan-shift.c @@ -0,0 +1,47 @@ +// RUN: %clang_cc1 -triple=x86_64-apple-darwin -fsanitize=shift-exponent,shift-base -emit-llvm %s -o - | FileCheck %s + +// CHECK-LABEL: define i32 @f1 +int f1(int c, int shamt) { +// CHECK: icmp ule i32 %{{.*}}, 31, !nosanitize +// CHECK: icmp ule i32 %{{.*}}, 31, !nosanitize + return 1 << (c << shamt); +} + +// CHECK-LABEL: define i32 @f2 +int f2(long c, int shamt) { +// CHECK: icmp ule i32 %{{.*}}, 63, !nosanitize +// CHECK: icmp ule i64 %{{.*}}, 31, !nosanitize + return 1 << (c << shamt); +} + +// CHECK-LABEL: define i32 @f3 +unsigned f3(unsigned c, int shamt) { +// CHECK: icmp ule i32 %{{.*}}, 31, !nosanitize +// CHECK: icmp ule i32 %{{.*}}, 31, !nosanitize + return 1U << (c << shamt); +} + +// CHECK-LABEL: define i32 @f4 +unsigned f4(unsigned long c, int shamt) { +// CHECK: icmp ule i32 %{{.*}}, 63, !nosanitize +// CHECK: icmp ule i64 %{{.*}}, 31, !nosanitize + return 1U << (c << shamt); +} + +// CHECK-LABEL: define i32 @f5 +int f5(int c, long long shamt) { +// CHECK: icmp ule i64 %{{[0-9]+}}, 31, !nosanitize +// +// CHECK: sub nuw nsw i32 31, %sh_prom, !nosanitize +// CHECK: lshr i32 %{{.*}}, %shl.zeros, !nosanitize + return c << shamt; +} + +// CHECK-LABEL: define i32 @f6 +int f6(int c, int shamt) { +// CHECK: icmp ule i32 %[[WIDTH:.*]], 31, !nosanitize +// +// CHECK: sub nuw nsw i32 31, %[[WIDTH]], !nosanitize +// CHECK: lshr i32 %{{.*}}, %shl.zeros, !nosanitize + return c << shamt; +} |