Author: Craig Topper Date: 2020-08-18T12:33:40-07:00 New Revision: 6b1f9f2bd4437910804d571284b7c5bb66eac250
URL: https://github.com/llvm/llvm-project/commit/6b1f9f2bd4437910804d571284b7c5bb66eac250 DIFF: https://github.com/llvm/llvm-project/commit/6b1f9f2bd4437910804d571284b7c5bb66eac250.diff LOG: [X86] Don't call SemaBuiltinConstantArg from CheckX86BuiltinTileDuplicate if Argument is Type or Value Dependent. SemaBuiltinConstantArg has an early exit for that case that doesn't produce an error and doesn't update the APInt. We need to detect that case and not use the APInt value. While there delete the signature of CheckX86BuiltinTileArgumentsRange that takes a single Argument index to check. There's another version that takes an ArrayRef and single value is convertible to an ArrayRef. Added: Modified: clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaChecking.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 1d12551a8ad2..19d58b889ef7 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -12192,7 +12192,6 @@ class Sema final { bool CheckX86BuiltinTileArguments(unsigned BuiltinID, CallExpr *TheCall); bool CheckX86BuiltinTileArgumentsRange(CallExpr *TheCall, ArrayRef<int> ArgNums); - bool CheckX86BuiltinTileArgumentsRange(CallExpr *TheCall, int ArgNum); bool CheckX86BuiltinTileDuplicate(CallExpr *TheCall, ArrayRef<int> ArgNums); bool CheckX86BuiltinTileRangeAndDuplicate(CallExpr *TheCall, ArrayRef<int> ArgNums); diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 70d3a682fc70..deceffdb0ba5 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -3705,7 +3705,7 @@ bool Sema::CheckX86BuiltinGatherScatterScale(unsigned BuiltinID, enum { TileRegLow = 0, TileRegHigh = 7 }; bool Sema::CheckX86BuiltinTileArgumentsRange(CallExpr *TheCall, - ArrayRef<int> ArgNums) { + ArrayRef<int> ArgNums) { for (int ArgNum : ArgNums) { if (SemaBuiltinConstantArgRange(TheCall, ArgNum, TileRegLow, TileRegHigh)) return true; @@ -3713,19 +3713,20 @@ bool Sema::CheckX86BuiltinTileArgumentsRange(CallExpr *TheCall, return false; } -bool Sema::CheckX86BuiltinTileArgumentsRange(CallExpr *TheCall, int ArgNum) { - return SemaBuiltinConstantArgRange(TheCall, ArgNum, TileRegLow, TileRegHigh); -} - bool Sema::CheckX86BuiltinTileDuplicate(CallExpr *TheCall, ArrayRef<int> ArgNums) { // Because the max number of tile register is TileRegHigh + 1, so here we use // each bit to represent the usage of them in bitset. std::bitset<TileRegHigh + 1> ArgValues; for (int ArgNum : ArgNums) { - llvm::APSInt Arg; - SemaBuiltinConstantArg(TheCall, ArgNum, Arg); - int ArgExtValue = Arg.getExtValue(); + Expr *Arg = TheCall->getArg(ArgNum); + if (Arg->isTypeDependent() || Arg->isValueDependent()) + continue; + + llvm::APSInt Result; + if (SemaBuiltinConstantArg(TheCall, ArgNum, Result)) + return true; + int ArgExtValue = Result.getExtValue(); assert((ArgExtValue >= TileRegLow || ArgExtValue <= TileRegHigh) && "Incorrect tile register num."); if (ArgValues.test(ArgExtValue)) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits