[llvm-branch-commits] [libcxxabi] c962491 - Save/restore OuterTemplateParams in AbstractManglingParser::parseEncoding.
Author: Justin Lebar Date: 2021-06-09T17:56:23-07:00 New Revision: c962491a41c3fbc6de50b4c109a67d21b2044d71 URL: https://github.com/llvm/llvm-project/commit/c962491a41c3fbc6de50b4c109a67d21b2044d71 DIFF: https://github.com/llvm/llvm-project/commit/c962491a41c3fbc6de50b4c109a67d21b2044d71.diff LOG: Save/restore OuterTemplateParams in AbstractManglingParser::parseEncoding. Previously we were only saving plain TemplateParams. Differential Revision: https://reviews.llvm.org/D103996 Added: Modified: libcxxabi/src/demangle/ItaniumDemangle.h libcxxabi/test/test_demangle.pass.cpp llvm/include/llvm/Demangle/ItaniumDemangle.h Removed: diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h index 202c959d40d2..9e6ae75eda7b 100644 --- a/libcxxabi/src/demangle/ItaniumDemangle.h +++ b/libcxxabi/src/demangle/ItaniumDemangle.h @@ -5235,14 +5235,18 @@ Node *AbstractManglingParser::parseEncoding() { class SaveTemplateParams { AbstractManglingParser *Parser; decltype(TemplateParams) OldParams; +decltype(OuterTemplateParams) OldOuterParams; public: SaveTemplateParams(AbstractManglingParser *TheParser) : Parser(TheParser) { OldParams = std::move(Parser->TemplateParams); + OldOuterParams = std::move(Parser->OuterTemplateParams); Parser->TemplateParams.clear(); + Parser->OuterTemplateParams.clear(); } ~SaveTemplateParams() { Parser->TemplateParams = std::move(OldParams); + Parser->OuterTemplateParams = std::move(OldOuterParams); } } SaveTemplateParams(this); diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp index 449d7052e2f5..009bf4502878 100644 --- a/libcxxabi/test/test_demangle.pass.cpp +++ b/libcxxabi/test/test_demangle.pass.cpp @@ -29601,7 +29601,7 @@ const char* cases[][2] = {"_Z1fPU11objcproto1A11objc_object", "f(id)"}, {"_Z1fPKU11objcproto1A7NSArray", "f(NSArray const*)"}, {"_ZNK1AIJ1Z1Y1XEEcv1BIJDpPT_EEIJS2_S1_S0_EEEv", "A::operator B() const"}, - {"_ZNK3Ncr6Silver7Utility6detail12CallOnThreadIZ53-[DeploymentSetupController handleManualServerEntry:]E3$_5EclIJEEEDTclclL_ZNS2_4getTIS4_EERT_vEEspclsr3stdE7forwardIT_Efp_EEEDpOSA_", "decltype(-[DeploymentSetupController handleManualServerEntry:]::$_5& Ncr::Silver::Utility::detail::getT<-[DeploymentSetupController handleManualServerEntry:]::$_5>()()(std::forward<-[DeploymentSetupController handleManualServerEntry:]::$_5>(fp)...)) Ncr::Silver::Utility::detail::CallOnThread<-[DeploymentSetupController handleManualServerEntry:]::$_5>::operator()<>(-[DeploymentSetupController handleManualServerEntry:]::$_5&&...) const"}, + {"_ZNK3Ncr6Silver7Utility6detail12CallOnThreadIZ53-[DeploymentSetupController handleManualServerEntry:]E3$_5EclIJEEEDTclclL_ZNS2_4getTIS4_EERT_vEEspclsr3stdE7forwardIT_Efp_EEEDpOSA_", "decltype(-[DeploymentSetupController handleManualServerEntry:]::$_5& Ncr::Silver::Utility::detail::getT<-[DeploymentSetupController handleManualServerEntry:]::$_5>()()()) Ncr::Silver::Utility::detail::CallOnThread<-[DeploymentSetupController handleManualServerEntry:]::$_5>::operator()<>() const"}, {"_Zli2_xy", "operator\"\" _x(unsigned long long)"}, {"_Z1fIiEDcT_", "decltype(auto) f(int)"}, {"_ZZ4testvEN1g3fooE5Point", "test()::g::foo(Point)"}, @@ -29847,6 +29847,9 @@ const char* cases[][2] = // Optional template-args for vendor extended type qualifier. // See https://bugs.llvm.org/show_bug.cgi?id=48009. {"_Z3fooILi79EEbU7_ExtIntIXT_EEi", "bool foo<79>(int _ExtInt<79>)"}, + + {"_ZN3xxx3yyyIvNS_1AILm0EEEZNS_2bb2cc2ddILNS_1eE1EEEvRKNS_1fERKNS_1g1hINS_1iEEERKNS_1jEfRKNS_1kEiPhEUlvE_JEEEvT1_DpT2_", "void xxx::yyy, void xxx::bb::cc::dd<(xxx::e)1>(xxx::f const&, xxx::g::h const&, xxx::j const&, float, xxx::k const&, int, unsigned char*)::'lambda'()>(void xxx::bb::cc::dd<(xxx::e)1>(xxx::f const&, xxx::g::h const&, xxx::j const&, float, xxx::k const&, int, unsigned char*)::'lambda'())"}, + }; const unsigned N = sizeof(cases) / sizeof(cases[0]); diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h index 4e3af0cb2649..300be2bc7486 100644 --- a/llvm/include/llvm/Demangle/ItaniumDemangle.h +++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h @@ -5235,14 +5235,18 @@ Node *AbstractManglingParser::parseEncoding() { class SaveTemplateParams { AbstractManglingParser *Parser; decltype(TemplateParams) OldParams; +decltype(OuterTemplateParams) OldOuterParams; public: SaveTemplateParams(AbstractManglingParser *TheParser) : Parser(TheParser) { OldParams = std::move(Parser->TemplateParams); + OldOuterParams = std::move(Parser->OuterTemplateParams); Parser->TemplateParams.clear(); + Parser->OuterTemplateParams.clear(); } ~SaveTem
[llvm-branch-commits] [llvm] 7b0ddb9 - Mark threadIdx.x and friends as noundef.
Author: Justin Lebar Date: 2023-04-05T13:02:16-07:00 New Revision: 7b0ddb98042c69487014b00673e29a8353f5e28f URL: https://github.com/llvm/llvm-project/commit/7b0ddb98042c69487014b00673e29a8353f5e28f DIFF: https://github.com/llvm/llvm-project/commit/7b0ddb98042c69487014b00673e29a8353f5e28f.diff LOG: Mark threadIdx.x and friends as noundef. threadIdx.x and similar functions never return undef. Simple enough to say, but why does it matter? Consider the following IR that reads threadIdx.x and blockIdx.x. %a = call i32 @llvm.nvvm.read.ptx.sreg.ctaid.x(), !range !138 %b = call i32 @llvm.nvvm.read.ptx.sreg.tid.x(), !range !139 %c = shl nuw nsw i32 %a, 6 %linear_index = or i32 %c, %b %linear_index.fr = freeze i32 %linear_index If %a or %b may be undef, then computeKnownBits will not recurse through the freeze instruction. Therefore we will not know anything about the known bits of linear_index.fr, even though we have range metadata! Bad Things fall out of this. Differential Revision: https://reviews.llvm.org/D147589 Added: Modified: llvm/include/llvm/IR/IntrinsicsNVVM.td Removed: diff --git a/llvm/include/llvm/IR/IntrinsicsNVVM.td b/llvm/include/llvm/IR/IntrinsicsNVVM.td index e0cb64ccc9942..d1a2537fe662d 100644 --- a/llvm/include/llvm/IR/IntrinsicsNVVM.td +++ b/llvm/include/llvm/IR/IntrinsicsNVVM.td @@ -1600,131 +1600,131 @@ def int_nvvm_isspacep_shared // Environment register read def int_nvvm_read_ptx_sreg_envreg0 - : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable], + : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable, NoUndef], "llvm.nvvm.read.ptx.sreg.envreg0">, ClangBuiltin<"__nvvm_read_ptx_sreg_envreg0">; def int_nvvm_read_ptx_sreg_envreg1 - : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable], + : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable, NoUndef], "llvm.nvvm.read.ptx.sreg.envreg1">, ClangBuiltin<"__nvvm_read_ptx_sreg_envreg1">; def int_nvvm_read_ptx_sreg_envreg2 - : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable], + : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable, NoUndef], "llvm.nvvm.read.ptx.sreg.envreg2">, ClangBuiltin<"__nvvm_read_ptx_sreg_envreg2">; def int_nvvm_read_ptx_sreg_envreg3 - : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable], + : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable, NoUndef], "llvm.nvvm.read.ptx.sreg.envreg3">, ClangBuiltin<"__nvvm_read_ptx_sreg_envreg3">; def int_nvvm_read_ptx_sreg_envreg4 - : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable], + : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable, NoUndef], "llvm.nvvm.read.ptx.sreg.envreg4">, ClangBuiltin<"__nvvm_read_ptx_sreg_envreg4">; def int_nvvm_read_ptx_sreg_envreg5 - : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable], + : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable, NoUndef], "llvm.nvvm.read.ptx.sreg.envreg5">, ClangBuiltin<"__nvvm_read_ptx_sreg_envreg5">; def int_nvvm_read_ptx_sreg_envreg6 - : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable], + : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable, NoUndef], "llvm.nvvm.read.ptx.sreg.envreg6">, ClangBuiltin<"__nvvm_read_ptx_sreg_envreg6">; def int_nvvm_read_ptx_sreg_envreg7 - : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable], + : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable, NoUndef], "llvm.nvvm.read.ptx.sreg.envreg7">, ClangBuiltin<"__nvvm_read_ptx_sreg_envreg7">; def int_nvvm_read_ptx_sreg_envreg8 - : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable], + : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable, NoUndef], "llvm.nvvm.read.ptx.sreg.envreg8">, ClangBuiltin<"__nvvm_read_ptx_sreg_envreg8">; def int_nvvm_read_ptx_sreg_envreg9 - : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable], + : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable, NoUndef], "llvm.nvvm.read.ptx.sreg.envreg9">, ClangBuiltin<"__nvvm_read_ptx_sreg_envreg9">; def int_nvvm_read_ptx_sreg_envreg10 - : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable], + : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable, NoUndef], "llvm.nvvm.read.ptx.sreg.envreg10">, ClangBuiltin<"__nvvm_read_ptx_sreg_envreg10">; def int_nvvm_read_ptx_sreg_envreg11 - : DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrSpeculatable], + : DefaultAttrsIntrinsic<[llvm