mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 15:46:07 +00:00

Summary: While debugging another issue, I noticed that Mips currently specifies that the count leading zero builtins are undefined when the input is zero. The architecture specifications say that the clz and dclz instructions write 32 or 64 respectively when given zero. This doesn't fix any bugs that I'm aware of but it may improve optimisation in some cases. Differential Revision: http://reviews.llvm.org/D4431 llvm-svn: 212618
33 lines
875 B
C
33 lines
875 B
C
// RUN: %clang_cc1 %s -triple mips-unknown-linux-gnu -emit-llvm -o - | FileCheck %s
|
|
//
|
|
// Test that the ctlz and cttz builtins are defined for zero.
|
|
// Based on count-builtin.c
|
|
|
|
int leading, trailing, pop;
|
|
|
|
void test_i16(short P) {
|
|
leading = __builtin_clzs(P);
|
|
trailing = __builtin_ctzs(P);
|
|
|
|
// CHECK: @test_i16
|
|
// CHECK: call i16 @llvm.ctlz.i16(i16 {{.*}}, i1 false)
|
|
// CHECK: call i16 @llvm.cttz.i16(i16 {{.*}}, i1 false)
|
|
}
|
|
|
|
void test_i32(int P) {
|
|
leading = __builtin_clz(P);
|
|
trailing = __builtin_ctz(P);
|
|
|
|
// CHECK: @test_i32
|
|
// CHECK: call i32 @llvm.ctlz.i32(i32 {{.*}}, i1 false)
|
|
// CHECK: call i32 @llvm.cttz.i32(i32 {{.*}}, i1 false)
|
|
}
|
|
|
|
void test_i64(float P) {
|
|
leading = __builtin_clzll(P);
|
|
trailing = __builtin_ctzll(P);
|
|
// CHECK: @test_i64
|
|
// CHECK: call i64 @llvm.ctlz.i64(i64 {{.*}}, i1 false)
|
|
// CHECK: call i64 @llvm.cttz.i64(i64 {{.*}}, i1 false)
|
|
}
|