[clang,MveEmitter] Fix sign/zero extension in range limits.

In the code that generates Sema range checks on constant arguments, I
had a piece of code that checks the bounds specified in the Tablegen
intrinsic description against the range of the integer type being
tested. If the bounds are large enough to permit any value of the
integer type, you can omit the compile-time range check. (This case is
expected to come up in some of the bitwise operation intrinsics.)

But somehow I got my signed/unsigned check backwards (asking for the
signed min/max of an unsigned type and vice versa), and also made a
sign extension error in which a signed negative value gets
zero-extended. Now rewritten more sensibly, and it should get its
first sensible test from the next batch of intrinsics I'm planning to
add in D69791.

Reviewers: dmgreen

Subscribers: cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D69789
This commit is contained in:
Simon Tatham 2019-10-31 17:02:42 +00:00
parent 38f016520f
commit 26bc7cb05e
1 changed files with 6 additions and 7 deletions

View File

@ -782,15 +782,14 @@ public:
}
llvm::APInt typelo, typehi;
if (cast<ScalarType>(IA.ArgType)->kind() == ScalarTypeKind::UnsignedInt) {
typelo = llvm::APInt::getSignedMinValue(IA.ArgType->sizeInBits());
typehi = llvm::APInt::getSignedMaxValue(IA.ArgType->sizeInBits());
unsigned Bits = IA.ArgType->sizeInBits();
if (cast<ScalarType>(IA.ArgType)->kind() == ScalarTypeKind::SignedInt) {
typelo = llvm::APInt::getSignedMinValue(Bits).sext(128);
typehi = llvm::APInt::getSignedMaxValue(Bits).sext(128);
} else {
typelo = llvm::APInt::getMinValue(IA.ArgType->sizeInBits());
typehi = llvm::APInt::getMaxValue(IA.ArgType->sizeInBits());
typelo = llvm::APInt::getMinValue(Bits).zext(128);
typehi = llvm::APInt::getMaxValue(Bits).zext(128);
}
typelo = typelo.sext(128);
typehi = typehi.sext(128);
std::string Index = utostr(kv.first);