[mips] clz is defined to give 32 for zero. Similarly, dclz gives 64.

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
This commit is contained in:
Daniel Sanders 2014-07-09 13:43:19 +00:00
parent 85bcadcdc6
commit cfbb71dfb6
2 changed files with 34 additions and 0 deletions

View File

@ -5513,6 +5513,8 @@ public:
if (RegNo == 1) return 5;
return -1;
}
bool isCLZForZeroUndef() const override { return false; }
};
const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {

View File

@ -0,0 +1,32 @@
// 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)
}