[llvm-branch-commits] [libcxxabi] c962491 - Save/restore OuterTemplateParams in AbstractManglingParser::parseEncoding.

2021-06-09 Thread Justin Lebar via llvm-branch-commits

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.

2023-04-05 Thread Justin Lebar via llvm-branch-commits

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