From 26bc7cb05edd6bea4b9a1593baf0fbe9e45f54e4 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Thu, 31 Oct 2019 17:02:42 +0000 Subject: [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 --- clang/utils/TableGen/MveEmitter.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'clang/utils/TableGen') diff --git a/clang/utils/TableGen/MveEmitter.cpp b/clang/utils/TableGen/MveEmitter.cpp index 9c3328e3bbf..1f9752261fb 100644 --- a/clang/utils/TableGen/MveEmitter.cpp +++ b/clang/utils/TableGen/MveEmitter.cpp @@ -782,15 +782,14 @@ public: } llvm::APInt typelo, typehi; - if (cast(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(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); -- cgit v1.2.3