aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.ci/generate_test_report_lib.py10
-rw-r--r--.ci/generate_test_report_lib_test.py43
-rw-r--r--.ci/premerge_advisor_explain.py4
-rw-r--r--.ci/premerge_advisor_upload.py2
-rw-r--r--.github/workflows/build-ci-container-tooling.yml2
-rw-r--r--.github/workflows/check-ci.yml2
-rw-r--r--.github/workflows/docs.yml2
-rw-r--r--.github/workflows/gha-codeql.yml4
-rw-r--r--.github/workflows/hlsl-test-all.yaml4
-rw-r--r--.github/workflows/libclang-abi-tests.yml2
-rw-r--r--.github/workflows/libcxx-build-containers.yml2
-rw-r--r--.github/workflows/libcxx-run-benchmarks.yml2
-rw-r--r--.github/workflows/llvm-abi-tests.yml2
-rw-r--r--.github/workflows/llvm-bugs.yml6
-rw-r--r--.github/workflows/new-issues.yml2
-rw-r--r--.github/workflows/premerge.yaml2
-rw-r--r--.github/workflows/release-binaries.yml6
-rw-r--r--.github/workflows/scorecard.yml2
-rw-r--r--bolt/lib/Core/BinaryContext.cpp18
-rw-r--r--bolt/test/X86/unclaimed-pc-rel.s24
-rw-r--r--clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp6
-rw-r--r--clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt2
-rw-r--r--clang-tools-extra/clang-tidy/bugprone/DefaultOperatorNewOnOveralignedTypeCheck.cpp (renamed from clang-tools-extra/clang-tidy/cert/DefaultOperatorNewAlignmentCheck.cpp)11
-rw-r--r--clang-tools-extra/clang-tidy/bugprone/DefaultOperatorNewOnOveralignedTypeCheck.h (renamed from clang-tools-extra/clang-tidy/cert/DefaultOperatorNewAlignmentCheck.h)17
-rw-r--r--clang-tools-extra/clang-tidy/bugprone/InvalidEnumDefaultInitializationCheck.cpp2
-rw-r--r--clang-tools-extra/clang-tidy/bugprone/RawMemoryCallOnNonTrivialTypeCheck.cpp (renamed from clang-tools-extra/clang-tidy/cert/NonTrivialTypesLibcMemoryCallsCheck.cpp)15
-rw-r--r--clang-tools-extra/clang-tidy/bugprone/RawMemoryCallOnNonTrivialTypeCheck.h (renamed from clang-tools-extra/clang-tidy/cert/NonTrivialTypesLibcMemoryCallsCheck.h)19
-rw-r--r--clang-tools-extra/clang-tidy/bugprone/SmartPtrArrayMismatchCheck.cpp16
-rw-r--r--clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp11
-rw-r--r--clang-tools-extra/clang-tidy/cert/CMakeLists.txt2
-rw-r--r--clang-tools-extra/clang-tidy/google/FunctionNamingCheck.cpp8
-rw-r--r--clang-tools-extra/clang-tidy/llvm/UseNewMLIROpBuilderCheck.cpp68
-rw-r--r--clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp12
-rw-r--r--clang-tools-extra/clang-tidy/modernize/AvoidCArraysCheck.cpp16
-rw-r--r--clang-tools-extra/clang-tidy/modernize/UseAutoCheck.cpp55
-rw-r--r--clang-tools-extra/clang-tidy/modernize/UseDesignatedInitializersCheck.cpp12
-rw-r--r--clang-tools-extra/clang-tidy/modernize/UseEmplaceCheck.cpp26
-rw-r--r--clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp2
-rw-r--r--clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp22
-rw-r--r--clang-tools-extra/clangd/Selection.cpp12
-rw-r--r--clang-tools-extra/clangd/refactor/tweaks/OverridePureVirtuals.cpp5
-rw-r--r--clang-tools-extra/clangd/unittests/SelectionTests.cpp13
-rw-r--r--clang-tools-extra/clangd/unittests/tweaks/OverridePureVirtualsTests.cpp39
-rw-r--r--clang-tools-extra/docs/ReleaseNotes.rst25
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/bugprone/default-operator-new-on-overaligned-type.rst20
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/bugprone/raw-memory-call-on-non-trivial-type.rst35
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/cert/mem57-cpp.rst10
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/cert/oop57-cpp.rst35
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines/pro-bounds-avoid-unchecked-container-access.rst4
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/list.rst8
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/modernize/use-std-format.rst12
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/modernize/use-std-print.rst32
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/readability/container-size-empty.rst10
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/readability/redundant-string-cstr.rst14
-rw-r--r--clang-tools-extra/test/clang-tidy/checkers/bugprone/default-operator-new-on-overaligned-type-cpp17.cpp12
-rw-r--r--clang-tools-extra/test/clang-tidy/checkers/bugprone/default-operator-new-on-overaligned-type.cpp (renamed from clang-tools-extra/test/clang-tidy/checkers/cert/mem57-cpp.cpp)6
-rw-r--r--clang-tools-extra/test/clang-tidy/checkers/bugprone/raw-memory-call-on-non-trivial-type.cpp (renamed from clang-tools-extra/test/clang-tidy/checkers/cert/oop57-cpp.cpp)8
-rw-r--r--clang-tools-extra/test/clang-tidy/checkers/cert/mem57-cpp-cpp17.cpp12
-rw-r--r--clang-tools-extra/test/clang-tidy/checkers/llvm/use-new-mlir-op-builder.cpp53
-rw-r--r--clang-tools-extra/test/pp-trace/pp-trace-include.cpp1
-rw-r--r--clang-tools-extra/test/pp-trace/pp-trace-macro.cpp1
-rw-r--r--clang/docs/LanguageExtensions.rst5
-rw-r--r--clang/docs/ReleaseNotes.rst12
-rw-r--r--clang/include/clang/AST/APNumericStorage.h5
-rw-r--r--clang/include/clang/AST/AbstractBasicReader.h2
-rw-r--r--clang/include/clang/Basic/DebugOptions.def2
-rw-r--r--clang/include/clang/Basic/DiagnosticLexKinds.td8
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td2
-rw-r--r--clang/include/clang/Basic/riscv_sifive_vector.td27
-rw-r--r--clang/include/clang/CIR/Dialect/IR/CIROps.td10
-rw-r--r--clang/include/clang/Driver/Options.td13
-rw-r--r--clang/include/clang/Lex/PPEmbedParameters.h2
-rw-r--r--clang/include/clang/Lex/Preprocessor.h6
-rw-r--r--clang/include/clang/Lex/PreprocessorOptions.h4
-rw-r--r--clang/include/clang/Serialization/ASTReader.h8
-rw-r--r--clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h8
-rw-r--r--clang/lib/AST/ByteCode/Floating.h3
-rw-r--r--clang/lib/AST/ByteCode/IntegralAP.h2
-rw-r--r--clang/lib/Analysis/ExprMutationAnalyzer.cpp13
-rw-r--r--clang/lib/Basic/SourceManager.cpp18
-rw-r--r--clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp11
-rw-r--r--clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp8
-rw-r--r--clang/lib/CodeGen/CodeGenModule.cpp12
-rw-r--r--clang/lib/Driver/ToolChains/Clang.cpp9
-rw-r--r--clang/lib/Format/FormatTokenLexer.cpp13
-rw-r--r--clang/lib/Format/TokenAnnotator.cpp23
-rw-r--r--clang/lib/Frontend/ASTUnit.cpp6
-rw-r--r--clang/lib/Frontend/InitPreprocessor.cpp6
-rw-r--r--clang/lib/Frontend/TextDiagnostic.cpp76
-rw-r--r--clang/lib/Headers/hvx_hexagon_protos.h393
-rw-r--r--clang/lib/Lex/PPMacroExpansion.cpp14
-rw-r--r--clang/lib/Sema/SemaType.cpp10
-rw-r--r--clang/lib/Serialization/ASTReader.cpp4
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp64
-rw-r--r--clang/lib/StaticAnalyzer/Core/CallEvent.cpp18
-rw-r--r--clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp2
-rw-r--r--clang/test/AST/ByteCode/cxx11.cpp2
-rw-r--r--clang/test/C/C2y/n3457.c38
-rw-r--r--clang/test/C/C2y/n3457_1.c20
-rw-r--r--clang/test/C/C2y/n3457_2.c10
-rw-r--r--clang/test/CIR/CodeGen/builtins-floating-point.c11
-rw-r--r--clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_16.c131
-rw-r--r--clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_32.c111
-rw-r--r--clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_bf.c135
-rw-r--r--clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexpa_v.c234
-rw-r--r--clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexpa_v_64.c90
-rw-r--r--clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_16.c131
-rw-r--r--clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_32.c111
-rw-r--r--clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_bf.c134
-rw-r--r--clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexpa_v.c234
-rw-r--r--clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexpa_v_64.c90
-rw-r--r--clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_16.c248
-rw-r--r--clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_32.c208
-rw-r--r--clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_bf.c248
-rw-r--r--clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexpa_v.c448
-rw-r--r--clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexpa_v_64.c167
-rw-r--r--clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_16.c261
-rw-r--r--clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_32.c228
-rw-r--r--clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_bf.c272
-rw-r--r--clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexpa_v.c492
-rw-r--r--clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexpa_v_64.c183
-rw-r--r--clang/test/CodeGen/SystemZ/builtins-systemz-zvector.c8
-rw-r--r--clang/test/CodeGen/SystemZ/builtins-systemz-zvector5.c2
-rw-r--r--clang/test/CodeGen/embed-bitcode-marker-with-nonzero-as.c2
-rw-r--r--clang/test/CodeGen/llvm_compiler_used_elements_are_unqual.c64
-rw-r--r--clang/test/DebugInfo/KeyInstructions/flag.cpp3
-rw-r--r--clang/test/Frontend/diags-interesting-source-region-colors.cpp30
-rw-r--r--clang/test/Preprocessor/unwind-tables.c2
-rw-r--r--clang/test/SemaCXX/vector.cpp13
-rwxr-xr-xclang/tools/scan-build/bin/set-xcode-analyzer26
-rw-r--r--clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp15
-rw-r--r--clang/unittests/Format/FormatTestComments.cpp450
-rw-r--r--clang/unittests/Format/TokenAnnotatorTest.cpp25
-rw-r--r--clang/www/c_status.html2
-rwxr-xr-xclang/www/cxx_dr_status.html3077
-rwxr-xr-xclang/www/make_cxx_dr_status72
-rw-r--r--compiler-rt/test/hwasan/TestCases/Linux/fixed-shadow.c12
-rw-r--r--compiler-rt/test/tsan/cxa_guard_acquire.cpp13
-rw-r--r--compiler-rt/test/ubsan/TestCases/Misc/Posix/print_stack_trace.cpp4
-rw-r--r--flang/examples/FeatureList/FeatureList.cpp3
-rw-r--r--flang/include/flang/Parser/dump-parse-tree.h3
-rw-r--r--flang/include/flang/Parser/openmp-utils.h31
-rw-r--r--flang/include/flang/Parser/parse-tree.h56
-rw-r--r--flang/include/flang/Semantics/openmp-utils.h2
-rw-r--r--flang/lib/Lower/OpenMP/OpenMP.cpp18
-rw-r--r--flang/lib/Parser/openmp-parsers.cpp44
-rw-r--r--flang/lib/Parser/openmp-utils.cpp39
-rw-r--r--flang/lib/Parser/unparse.cpp28
-rw-r--r--flang/lib/Semantics/canonicalize-omp.cpp156
-rw-r--r--flang/lib/Semantics/check-omp-structure.cpp703
-rw-r--r--flang/lib/Semantics/check-omp-structure.h37
-rw-r--r--flang/lib/Semantics/openmp-utils.cpp17
-rw-r--r--flang/lib/Semantics/resolve-directives.cpp59
-rw-r--r--flang/lib/Semantics/resolve-names.cpp4
-rw-r--r--flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtbegin.o0
-rw-r--r--flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtend.o0
-rw-r--r--flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crti.o0
-rw-r--r--flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtn.o0
-rw-r--r--flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtbegin.o0
-rw-r--r--flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtend.o0
-rw-r--r--flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crti.o0
-rw-r--r--flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtn.o0
-rw-r--r--flang/test/Driver/gcc-triple.f9018
-rw-r--r--flang/test/Lower/OpenMP/Todo/omp-declarative-allocate-align.f902
-rw-r--r--flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f902
-rw-r--r--flang/test/Parser/OpenMP/allocate-align-tree.f9048
-rw-r--r--flang/test/Parser/OpenMP/allocate-tree-spec-part.f9063
-rw-r--r--flang/test/Parser/OpenMP/allocate-tree.f9080
-rw-r--r--flang/test/Parser/OpenMP/allocate-unparse.f9024
-rw-r--r--flang/test/Semantics/OpenMP/allocate-align01.f902
-rw-r--r--flang/test/Semantics/OpenMP/allocate-directive.f902
-rw-r--r--flang/test/Semantics/OpenMP/allocate01.f902
-rw-r--r--flang/test/Semantics/OpenMP/allocate02.f901
-rw-r--r--flang/test/Semantics/OpenMP/allocate03.f901
-rw-r--r--flang/test/Semantics/OpenMP/allocate06.f902
-rw-r--r--flang/test/Semantics/OpenMP/allocate08.f908
-rw-r--r--flang/test/Semantics/OpenMP/allocate09.f904
-rw-r--r--flang/test/Semantics/OpenMP/allocate10.f9011
-rw-r--r--flang/test/Semantics/OpenMP/allocate11.f9027
-rw-r--r--flang/test/Semantics/OpenMP/allocate12.f9016
-rw-r--r--flang/test/Semantics/OpenMP/allocators01.f902
-rw-r--r--flang/test/Semantics/OpenMP/allocators04.f9031
-rw-r--r--flang/test/Semantics/OpenMP/allocators05.f902
-rw-r--r--flang/test/Semantics/OpenMP/allocators07.f906
-rw-r--r--libc/CMakeLists.txt7
-rw-r--r--libcxx/docs/FeatureTestMacroTable.rst2
-rw-r--r--libcxx/docs/ReleaseNotes/22.rst2
-rw-r--r--libcxx/docs/Status/Cxx2cPapers.csv2
-rw-r--r--libcxx/include/CMakeLists.txt1
-rw-r--r--libcxx/include/__configuration/availability.h38
-rw-r--r--libcxx/include/__format/formatter_output.h62
-rw-r--r--libcxx/include/__functional/identity.h2
-rw-r--r--libcxx/include/__new/align_val_t.h6
-rw-r--r--libcxx/include/__new/exceptions.h6
-rw-r--r--libcxx/include/__type_traits/is_within_lifetime.h29
-rw-r--r--libcxx/include/deque3
-rw-r--r--libcxx/include/forward_list2
-rw-r--r--libcxx/include/list2
-rw-r--r--libcxx/include/map2
-rw-r--r--libcxx/include/module.modulemap.in1
-rw-r--r--libcxx/include/set2
-rw-r--r--libcxx/include/string33
-rw-r--r--libcxx/include/type_traits8
-rw-r--r--libcxx/include/unordered_set3
-rw-r--r--libcxx/include/version4
-rw-r--r--libcxx/modules/std/type_traits.inc3
-rw-r--r--libcxx/test/libcxx/input.output/iostreams.base/ios.base/ios.base.cons/dtor.uninitialized.pass.cpp3
-rw-r--r--libcxx/test/libcxx/utilities/function.objects/lifetimebound.verify.cpp20
-rw-r--r--libcxx/test/libcxx/utilities/meta/is_within_lifetime.verify.cpp26
-rw-r--r--libcxx/test/std/input.output/file.streams/fstreams/filebuf.virtuals/setbuf.pass.cpp3
-rw-r--r--libcxx/test/std/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp3
-rw-r--r--libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.elem/arrow.pass.cpp4
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/type_traits.version.compile.pass.cpp4
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp4
-rw-r--r--libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_double.pass.cpp3
-rw-r--r--libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_float.pass.cpp3
-rw-r--r--libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_long_double.pass.cpp3
-rw-r--r--libcxx/test/std/strings/basic.string/string.capacity/over_max_size.pass.cpp10
-rw-r--r--libcxx/test/std/utilities/meta/meta.const.eval/is_within_lifetime.compile.pass.cpp148
-rw-r--r--libcxx/utils/generate_feature_test_macro_components.py3
-rw-r--r--libcxx/utils/libcxx/test/features.py34
-rw-r--r--libcxxabi/src/demangle/Utility.h2
-rw-r--r--libcxxabi/test/test_demangle.pass.cpp4
-rw-r--r--libcxxabi/test/uncaught_exception.pass.cpp3
-rw-r--r--lld/docs/ld.lld.113
-rw-r--r--lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp10
-rw-r--r--llvm/docs/MIRLangRef.rst56
-rw-r--r--llvm/docs/ProgrammersManual.rst82
-rw-r--r--llvm/examples/Kaleidoscope/Chapter9/toy.cpp2
-rw-r--r--llvm/examples/OptSubcommand/llvm-hello-sub.cpp2
-rw-r--r--llvm/include/llvm/ADT/APFloat.h6
-rw-r--r--llvm/include/llvm/ADT/APInt.h2
-rw-r--r--llvm/include/llvm/ADT/BitVector.h6
-rw-r--r--llvm/include/llvm/ADT/GenericSSAContext.h2
-rw-r--r--llvm/include/llvm/ADT/STLExtras.h4
-rw-r--r--llvm/include/llvm/ADT/StringSwitch.h35
-rw-r--r--llvm/include/llvm/ADT/ilist.h26
-rw-r--r--llvm/include/llvm/ADT/ilist_node_options.h43
-rw-r--r--llvm/include/llvm/Analysis/AliasAnalysis.h2
-rw-r--r--llvm/include/llvm/Analysis/ConstantFolding.h40
-rw-r--r--llvm/include/llvm/Analysis/ConstraintSystem.h2
-rw-r--r--llvm/include/llvm/Analysis/DDG.h6
-rw-r--r--llvm/include/llvm/Analysis/DOTGraphTraitsPass.h4
-rw-r--r--llvm/include/llvm/Analysis/IR2Vec.h4
-rw-r--r--llvm/include/llvm/Analysis/LoopIterator.h8
-rw-r--r--llvm/include/llvm/Analysis/MemorySSA.h2
-rw-r--r--llvm/include/llvm/Analysis/TargetFolder.h1
-rw-r--r--llvm/include/llvm/Analysis/TargetTransformInfo.h2
-rw-r--r--llvm/include/llvm/Analysis/TargetTransformInfoImpl.h2
-rw-r--r--llvm/include/llvm/CAS/ActionCache.h6
-rw-r--r--llvm/include/llvm/CAS/BuiltinUnifiedCASDatabases.h59
-rw-r--r--llvm/include/llvm/CAS/ObjectStore.h47
-rw-r--r--llvm/include/llvm/CAS/OnDiskGraphDB.h12
-rw-r--r--llvm/include/llvm/CAS/OnDiskKeyValueDB.h15
-rw-r--r--llvm/include/llvm/CAS/UnifiedOnDiskCache.h172
-rw-r--r--llvm/include/llvm/CodeGen/BasicBlockSectionsProfileReader.h2
-rw-r--r--llvm/include/llvm/CodeGen/DIE.h2
-rw-r--r--llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h2
-rw-r--r--llvm/include/llvm/CodeGen/GlobalMergeFunctions.h2
-rw-r--r--llvm/include/llvm/CodeGen/MachineScheduler.h2
-rw-r--r--llvm/include/llvm/CodeGen/RDFRegisters.h2
-rw-r--r--llvm/include/llvm/CodeGen/RegAllocRegistry.h2
-rw-r--r--llvm/include/llvm/CodeGen/SDPatternMatch.h2
-rw-r--r--llvm/include/llvm/CodeGen/WindowScheduler.h2
-rw-r--r--llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h4
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Native/DbiModuleList.h2
-rw-r--r--llvm/include/llvm/Demangle/Utility.h2
-rw-r--r--llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h2
-rw-r--r--llvm/include/llvm/ExecutionEngine/Orc/MachOBuilder.h2
-rw-r--r--llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.h2
-rw-r--r--llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/LibraryResolver.h2
-rw-r--r--llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h6
-rw-r--r--llvm/include/llvm/IR/ConstantFold.h25
-rw-r--r--llvm/include/llvm/IR/DebugProgramInstruction.h2
-rw-r--r--llvm/include/llvm/IR/DroppedVariableStats.h2
-rw-r--r--llvm/include/llvm/IR/IntrinsicsHexagonDep.td174
-rw-r--r--llvm/include/llvm/IR/TrackingMDRef.h7
-rw-r--r--llvm/include/llvm/MC/MCAssembler.h4
-rw-r--r--llvm/include/llvm/MC/MCRegisterInfo.h2
-rw-r--r--llvm/include/llvm/MCA/SourceMgr.h2
-rw-r--r--llvm/include/llvm/ObjCopy/ConfigManager.h2
-rw-r--r--llvm/include/llvm/ObjCopy/MultiFormatConfig.h2
-rw-r--r--llvm/include/llvm/Object/ELF.h2
-rw-r--r--llvm/include/llvm/Object/ELFObjectFile.h4
-rw-r--r--llvm/include/llvm/ObjectYAML/DXContainerYAML.h4
-rw-r--r--llvm/include/llvm/ProfileData/DataAccessProf.h2
-rw-r--r--llvm/include/llvm/SandboxIR/Context.h2
-rw-r--r--llvm/include/llvm/SandboxIR/Instruction.h2
-rw-r--r--llvm/include/llvm/SandboxIR/Pass.h2
-rw-r--r--llvm/include/llvm/SandboxIR/PassManager.h8
-rw-r--r--llvm/include/llvm/Support/Allocator.h2
-rw-r--r--llvm/include/llvm/Support/Atomic.h4
-rw-r--r--llvm/include/llvm/Support/BinaryStreamArray.h8
-rw-r--r--llvm/include/llvm/Support/Chrono.h8
-rw-r--r--llvm/include/llvm/Support/CommandLine.h2
-rw-r--r--llvm/include/llvm/Support/ConvertUTF.h27
-rw-r--r--llvm/include/llvm/Support/DebugCounter.h2
-rw-r--r--llvm/include/llvm/Support/ErrorHandling.h4
-rw-r--r--llvm/include/llvm/Support/FormatVariadicDetails.h4
-rw-r--r--llvm/include/llvm/Support/GenericLoopInfo.h16
-rw-r--r--llvm/include/llvm/Support/GenericLoopInfoImpl.h6
-rw-r--r--llvm/include/llvm/Support/JSON.h20
-rw-r--r--llvm/include/llvm/Support/MD5.h2
-rw-r--r--llvm/include/llvm/Support/Mutex.h4
-rw-r--r--llvm/include/llvm/Support/OnDiskHashTable.h32
-rw-r--r--llvm/include/llvm/Support/PointerLikeTypeTraits.h4
-rw-r--r--llvm/include/llvm/Support/Program.h4
-rw-r--r--llvm/include/llvm/Support/RISCVISAUtils.h4
-rw-r--r--llvm/include/llvm/Support/RWMutex.h6
-rw-r--r--llvm/include/llvm/Support/Registry.h4
-rw-r--r--llvm/include/llvm/Support/ScaledNumber.h6
-rw-r--r--llvm/include/llvm/Support/SuffixTree.h2
-rw-r--r--llvm/include/llvm/Support/Threading.h2
-rw-r--r--llvm/include/llvm/Support/TrailingObjects.h6
-rw-r--r--llvm/include/llvm/Support/UnicodeCharRanges.h2
-rw-r--r--llvm/include/llvm/Support/float128.h2
-rw-r--r--llvm/include/llvm/Support/thread.h2
-rw-r--r--llvm/include/llvm/Transforms/Coroutines/CoroAnnotationElide.h2
-rw-r--r--llvm/include/llvm/Transforms/IPO/FatLTOCleanup.h2
-rw-r--r--llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Legality.h2
-rw-r--r--llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/SeedCollector.h2
-rw-r--r--llvm/lib/Analysis/AliasAnalysis.cpp2
-rw-r--r--llvm/lib/Analysis/ScalarEvolution.cpp198
-rw-r--r--llvm/lib/Analysis/TargetTransformInfo.cpp6
-rw-r--r--llvm/lib/BinaryFormat/Dwarf.cpp7
-rw-r--r--llvm/lib/CAS/ActionCaches.cpp166
-rw-r--r--llvm/lib/CAS/BuiltinCAS.cpp14
-rw-r--r--llvm/lib/CAS/BuiltinCAS.h25
-rw-r--r--llvm/lib/CAS/BuiltinUnifiedCASDatabases.cpp38
-rw-r--r--llvm/lib/CAS/CMakeLists.txt3
-rw-r--r--llvm/lib/CAS/InMemoryCAS.cpp8
-rw-r--r--llvm/lib/CAS/ObjectStore.cpp93
-rw-r--r--llvm/lib/CAS/OnDiskCAS.cpp211
-rw-r--r--llvm/lib/CAS/OnDiskGraphDB.cpp34
-rw-r--r--llvm/lib/CAS/OnDiskKeyValueDB.cpp21
-rw-r--r--llvm/lib/CAS/UnifiedOnDiskCache.cpp613
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp5
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp3
-rw-r--r--llvm/lib/CodeGen/CodeGenPrepare.cpp2
-rw-r--r--llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp4
-rw-r--r--llvm/lib/CodeGen/MachineOperand.cpp8
-rw-r--r--llvm/lib/CodeGen/MachineScheduler.cpp4
-rw-r--r--llvm/lib/CodeGen/MachineStableHash.cpp3
-rw-r--r--llvm/lib/CodeGen/RegAllocFast.cpp2
-rw-r--r--llvm/lib/CodeGen/RegisterCoalescer.cpp2
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp2
-rw-r--r--llvm/lib/DWARFLinker/Parallel/DWARFLinkerUnit.h2
-rw-r--r--llvm/lib/DWARFLinker/Parallel/StringEntryToDwarfStringPoolEntryMap.h2
-rw-r--r--llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp2
-rw-r--r--llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp2
-rw-r--r--llvm/lib/IR/ConstantsContext.h2
-rw-r--r--llvm/lib/IR/ModuleSummaryIndex.cpp4
-rw-r--r--llvm/lib/LTO/LTO.cpp40
-rw-r--r--llvm/lib/MC/GOFFObjectWriter.cpp2
-rw-r--r--llvm/lib/MC/MCDXContainerWriter.cpp2
-rw-r--r--llvm/lib/MC/MCGOFFStreamer.cpp2
-rw-r--r--llvm/lib/ObjCopy/COFF/COFFWriter.h2
-rw-r--r--llvm/lib/ObjCopy/ELF/ELFObject.h10
-rw-r--r--llvm/lib/ObjCopy/MachO/MachOReader.h2
-rw-r--r--llvm/lib/ObjCopy/XCOFF/XCOFFWriter.h2
-rw-r--r--llvm/lib/ObjectYAML/GOFFYAML.cpp2
-rw-r--r--llvm/lib/Passes/StandardInstrumentations.cpp4
-rw-r--r--llvm/lib/SandboxIR/Context.cpp2
-rw-r--r--llvm/lib/Support/BalancedPartitioning.cpp2
-rw-r--r--llvm/lib/Support/BranchProbability.cpp2
-rw-r--r--llvm/lib/Support/CommandLine.cpp12
-rw-r--r--llvm/lib/Support/DAGDeltaAlgorithm.cpp16
-rw-r--r--llvm/lib/Support/DynamicLibrary.cpp2
-rw-r--r--llvm/lib/Support/StringRef.cpp5
-rw-r--r--llvm/lib/Support/Timer.cpp2
-rw-r--r--llvm/lib/Support/UnicodeNameToCodepoint.cpp8
-rw-r--r--llvm/lib/Target/AArch64/AArch64PrologueEpilogue.cpp150
-rw-r--r--llvm/lib/Target/AArch64/AArch64PrologueEpilogue.h6
-rw-r--r--llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp17
-rw-r--r--llvm/lib/Target/AArch64/AArch64TargetTransformInfo.h2
-rw-r--r--llvm/lib/Target/AMDGPU/AMDGPU.h6
-rw-r--r--llvm/lib/Target/AMDGPU/AMDGPUArgumentUsageInfo.h2
-rw-r--r--llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp2
-rw-r--r--llvm/lib/Target/AMDGPU/AMDGPUPerfHintAnalysis.h2
-rw-r--r--llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.cpp4
-rw-r--r--llvm/lib/Target/AMDGPU/AMDGPUUnifyDivergentExitNodes.cpp4
-rw-r--r--llvm/lib/Target/AMDGPU/AMDGPUWaitSGPRHazards.cpp2
-rw-r--r--llvm/lib/Target/AMDGPU/GCNSchedStrategy.h4
-rw-r--r--llvm/lib/Target/AMDGPU/SIInstrInfo.cpp6
-rw-r--r--llvm/lib/Target/Hexagon/HexagonDepIICHVX.td132
-rw-r--r--llvm/lib/Target/Hexagon/HexagonDepInstrInfo.td391
-rw-r--r--llvm/lib/Target/Hexagon/HexagonDepMapAsm2Intrin.td116
-rw-r--r--llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp2
-rw-r--r--llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp4
-rw-r--r--llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td4
-rw-r--r--llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td4
-rw-r--r--llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp2
-rw-r--r--llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp2
-rw-r--r--llvm/lib/Target/NVPTX/NVPTXAliasAnalysis.h2
-rw-r--r--llvm/lib/Target/PowerPC/PPCInstrFuture.td8
-rw-r--r--llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp2
-rw-r--r--llvm/lib/Target/PowerPC/PPCTargetTransformInfo.h2
-rw-r--r--llvm/lib/Target/RISCV/RISCVInsertWriteVXRM.cpp2
-rw-r--r--llvm/lib/Target/SPIRV/MCTargetDesc/SPIRVTargetStreamer.cpp2
-rw-r--r--llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp30
-rw-r--r--llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.h2
-rw-r--r--llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp2
-rw-r--r--llvm/lib/Target/SystemZ/SystemZTargetObjectFile.h2
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.h4
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblySortRegion.h2
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp117
-rw-r--r--llvm/lib/Target/X86/X86LoadValueInjectionLoadHardening.cpp19
-rw-r--r--llvm/lib/Target/X86/X86TargetTransformInfo.cpp2
-rw-r--r--llvm/lib/Target/X86/X86TargetTransformInfo.h2
-rw-r--r--llvm/lib/TextAPI/BinaryReader/DylibReader.cpp2
-rw-r--r--llvm/lib/TextAPI/RecordVisitor.cpp2
-rw-r--r--llvm/lib/Transforms/Coroutines/CoroCloner.h2
-rw-r--r--llvm/lib/Transforms/IPO/AttributorAttributes.cpp4
-rw-r--r--llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp4
-rw-r--r--llvm/lib/Transforms/IPO/OpenMPOpt.cpp6
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp24
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp29
-rw-r--r--llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp2
-rw-r--r--llvm/lib/Transforms/Scalar/DropUnnecessaryAssumes.cpp3
-rw-r--r--llvm/lib/Transforms/Scalar/GVNSink.cpp2
-rw-r--r--llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp30
-rw-r--r--llvm/lib/Transforms/Scalar/StructurizeCFG.cpp4
-rw-r--r--llvm/lib/Transforms/Utils/LoopUtils.cpp5
-rw-r--r--llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp21
-rw-r--r--llvm/lib/Transforms/Vectorize/SandboxVectorizer/DependencyGraph.cpp2
-rw-r--r--llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/BottomUpVec.cpp4
-rw-r--r--llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizer.cpp2
-rw-r--r--llvm/lib/Transforms/Vectorize/VPlan.h26
-rw-r--r--llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h61
-rw-r--r--llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp10
-rw-r--r--llvm/lib/Transforms/Vectorize/VPlanSLP.h3
-rw-r--r--llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp275
-rw-r--r--llvm/lib/Transforms/Vectorize/VPlanUtils.cpp25
-rw-r--r--llvm/test/Analysis/CostModel/AArch64/masked_ldst_vls.ll11
-rw-r--r--llvm/test/Analysis/CostModel/AArch64/sve-fixed-length.ll11
-rw-r--r--llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll351
-rw-r--r--llvm/test/CodeGen/AArch64/framelayout-split-sve.mir133
-rw-r--r--llvm/test/CodeGen/AArch64/split-sve-stack-frame-layout.ll49
-rw-r--r--llvm/test/CodeGen/AArch64/sve-fixed-length-loads-stores.ll11
-rw-r--r--llvm/test/CodeGen/AMDGPU/GlobalISel/memory-legalizer-atomic-fence.ll14
-rw-r--r--llvm/test/CodeGen/AMDGPU/GlobalISel/mmra.ll2
-rw-r--r--llvm/test/CodeGen/LoongArch/lasx/fp-max-min.ll116
-rw-r--r--llvm/test/CodeGen/LoongArch/lsx/fp-max-min.ll68
-rw-r--r--llvm/test/CodeGen/SPIRV/pointers/composite-fun-fix-ptr-arg.ll14
-rw-r--r--llvm/test/CodeGen/X86/bittest-big-integer.ll7083
-rw-r--r--llvm/test/CodeGen/X86/isel-llvm.sincos.ll133
-rw-r--r--llvm/test/CodeGen/X86/llvm.sincos.vec.ll404
-rw-r--r--llvm/test/MC/Disassembler/PowerPC/ppc-encoding-ISAFuture.txt6
-rw-r--r--llvm/test/MC/Disassembler/PowerPC/ppc64le-encoding-ISAFuture.txt6
-rw-r--r--llvm/test/MC/PowerPC/ppc-encoding-ISAFuture.s8
-rw-r--r--llvm/test/Transforms/DropUnnecessaryAssumes/basic.ll12
-rw-r--r--llvm/test/Transforms/IndVarSimplify/loop-guard-order.ll5
-rw-r--r--llvm/test/Transforms/InstCombine/or.ll95
-rw-r--r--llvm/test/Transforms/InstCombine/select-safe-transforms.ll51
-rw-r--r--llvm/test/Transforms/LoopUnroll/zeroed-branch-weights.ll30
-rw-r--r--llvm/test/Transforms/LoopVectorize/AArch64/vplan-printing.ll59
-rw-r--r--llvm/test/Transforms/LoopVectorize/first-order-recurrence-sink-replicate-region.ll25
-rw-r--r--llvm/test/Transforms/LoopVectorize/hoist-and-sink-mem-ops-with-invariant-pointers.ll247
-rw-r--r--llvm/test/Transforms/LoopVectorize/vplan-sink-scalars-and-merge.ll17
-rw-r--r--llvm/test/Transforms/PhaseOrdering/AArch64/hoist-load-from-vector-loop.ll46
-rw-r--r--llvm/test/Transforms/SLPVectorizer/X86/parent-non-schedule-multi-use-in-binop.ll40
-rw-r--r--llvm/test/lit.cfg.py2
-rw-r--r--llvm/tools/bugpoint/ListReducer.h2
-rw-r--r--llvm/tools/bugpoint/ToolRunner.h2
-rw-r--r--llvm/tools/dsymutil/BinaryHolder.h2
-rw-r--r--llvm/tools/lli/lli.cpp2
-rw-r--r--llvm/tools/llvm-cov/CoverageExporter.h2
-rw-r--r--llvm/tools/llvm-cov/CoverageFilters.h2
-rw-r--r--llvm/tools/llvm-cov/SourceCoverageView.h4
-rw-r--r--llvm/tools/llvm-diff/lib/DiffConsumer.h2
-rw-r--r--llvm/tools/llvm-diff/lib/DifferenceEngine.h2
-rw-r--r--llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp2
-rw-r--r--llvm/tools/llvm-exegesis/lib/Analysis.cpp2
-rw-r--r--llvm/tools/llvm-exegesis/lib/Assembler.cpp4
-rw-r--r--llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp10
-rw-r--r--llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp4
-rw-r--r--llvm/tools/llvm-exegesis/lib/BenchmarkRunner.h4
-rw-r--r--llvm/tools/llvm-exegesis/lib/Clustering.h8
-rw-r--r--llvm/tools/llvm-exegesis/lib/Error.h2
-rw-r--r--llvm/tools/llvm-exegesis/lib/ParallelSnippetGenerator.cpp2
-rw-r--r--llvm/tools/llvm-exegesis/lib/ParallelSnippetGenerator.h2
-rw-r--r--llvm/tools/llvm-exegesis/lib/SnippetRepetitor.cpp2
-rw-r--r--llvm/tools/llvm-exegesis/lib/SubprocessMemory.h4
-rw-r--r--llvm/tools/llvm-exegesis/lib/Target.cpp4
-rw-r--r--llvm/tools/llvm-exegesis/lib/UopsBenchmarkRunner.h2
-rw-r--r--llvm/tools/llvm-exegesis/lib/X86/Target.cpp14
-rw-r--r--llvm/tools/llvm-libtool-darwin/DependencyInfo.h2
-rw-r--r--llvm/tools/llvm-mca/CodeRegionGenerator.cpp2
-rw-r--r--llvm/tools/llvm-mca/CodeRegionGenerator.h2
-rw-r--r--llvm/tools/llvm-objdump/SourcePrinter.h2
-rw-r--r--llvm/tools/llvm-objdump/llvm-objdump.h2
-rw-r--r--llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp2
-rw-r--r--llvm/tools/llvm-pdbutil/DumpOutputStyle.h2
-rw-r--r--llvm/tools/llvm-pdbutil/OutputStyle.h2
-rw-r--r--llvm/tools/llvm-pdbutil/StreamUtil.h2
-rw-r--r--llvm/tools/llvm-profgen/ProfiledBinary.cpp2
-rw-r--r--llvm/tools/llvm-rc/ResourceScriptStmt.h10
-rw-r--r--llvm/tools/llvm-rc/ResourceVisitor.h2
-rw-r--r--llvm/tools/llvm-readobj/ObjDumper.cpp2
-rw-r--r--llvm/tools/llvm-readtapi/DiffEngine.h2
-rw-r--r--llvm/tools/llvm-xray/xray-graph.h2
-rw-r--r--llvm/unittests/ADT/APFloatTest.cpp2
-rw-r--r--llvm/unittests/ADT/BitVectorTest.cpp4
-rw-r--r--llvm/unittests/ADT/BreadthFirstIteratorTest.cpp6
-rw-r--r--llvm/unittests/ADT/DAGDeltaAlgorithmTest.cpp2
-rw-r--r--llvm/unittests/ADT/DenseMapTest.cpp23
-rw-r--r--llvm/unittests/ADT/DenseSetTest.cpp14
-rw-r--r--llvm/unittests/ADT/DepthFirstIteratorTest.cpp8
-rw-r--r--llvm/unittests/ADT/IListBaseTest.cpp25
-rw-r--r--llvm/unittests/ADT/IListIteratorBitsTest.cpp6
-rw-r--r--llvm/unittests/ADT/IListIteratorTest.cpp8
-rw-r--r--llvm/unittests/ADT/IListNodeBaseTest.cpp8
-rw-r--r--llvm/unittests/ADT/IListSentinelTest.cpp15
-rw-r--r--llvm/unittests/ADT/IntervalMapTest.cpp10
-rw-r--r--llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp6
-rw-r--r--llvm/unittests/ADT/IteratorTest.cpp18
-rw-r--r--llvm/unittests/ADT/PointerSumTypeTest.cpp7
-rw-r--r--llvm/unittests/ADT/PointerUnionTest.cpp12
-rw-r--r--llvm/unittests/ADT/PostOrderIteratorTest.cpp4
-rw-r--r--llvm/unittests/ADT/PriorityWorklistTest.cpp4
-rw-r--r--llvm/unittests/ADT/RangeAdapterTest.cpp30
-rw-r--r--llvm/unittests/ADT/SCCIteratorTest.cpp2
-rw-r--r--llvm/unittests/ADT/STLExtrasTest.cpp8
-rw-r--r--llvm/unittests/ADT/SimpleIListTest.cpp8
-rw-r--r--llvm/unittests/ADT/SmallPtrSetTest.cpp2
-rw-r--r--llvm/unittests/ADT/SmallStringTest.cpp2
-rw-r--r--llvm/unittests/ADT/SmallVectorTest.cpp26
-rw-r--r--llvm/unittests/ADT/SparseMultiSetTest.cpp4
-rw-r--r--llvm/unittests/ADT/SparseSetTest.cpp4
-rw-r--r--llvm/unittests/ADT/StringSwitchTest.cpp17
-rw-r--r--llvm/unittests/ADT/TestGraph.h8
-rw-r--r--llvm/unittests/ADT/TinyPtrVectorTest.cpp12
-rw-r--r--llvm/unittests/CAS/ActionCacheTest.cpp6
-rw-r--r--llvm/unittests/CAS/BuiltinUnifiedCASDatabasesTest.cpp67
-rw-r--r--llvm/unittests/CAS/CASTestConfig.cpp17
-rw-r--r--llvm/unittests/CAS/CASTestConfig.h41
-rw-r--r--llvm/unittests/CAS/CMakeLists.txt2
-rw-r--r--llvm/unittests/CAS/ObjectStoreTest.cpp134
-rw-r--r--llvm/unittests/CAS/OnDiskCommonUtils.h21
-rw-r--r--llvm/unittests/CAS/OnDiskGraphDBTest.cpp12
-rw-r--r--llvm/unittests/CAS/UnifiedOnDiskCacheTest.cpp198
-rw-r--r--llvm/unittests/CodeGen/AsmPrinterDwarfTest.cpp2
-rw-r--r--llvm/unittests/CodeGen/MFCommon.inc4
-rw-r--r--llvm/unittests/CodeGen/MachineOperandTest.cpp20
-rw-r--r--llvm/unittests/DebugInfo/CodeView/RandomAccessVisitorTest.cpp2
-rw-r--r--llvm/unittests/DebugInfo/CodeView/TypeIndexDiscoveryTest.cpp2
-rw-r--r--llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp2
-rw-r--r--llvm/unittests/ExecutionEngine/JITLink/JITLinkTestUtils.h2
-rw-r--r--llvm/unittests/MC/SystemZ/SystemZMCDisassemblerTest.cpp2
-rw-r--r--llvm/unittests/MC/X86/X86MCDisassemblerTest.cpp2
-rw-r--r--llvm/unittests/MIR/MachineMetadata.cpp2
-rw-r--r--llvm/unittests/MIR/MachineStableHashTest.cpp2
-rw-r--r--llvm/unittests/Object/XCOFFObjectFileTest.cpp4
-rw-r--r--llvm/unittests/Support/raw_ostream_proxy_test.cpp2
-rw-r--r--llvm/unittests/Target/AArch64/AArch64InstPrinterTest.cpp6
-rw-r--r--llvm/unittests/XRay/GraphTest.cpp8
-rw-r--r--llvm/unittests/tools/llvm-exegesis/AArch64/TargetTest.cpp2
-rw-r--r--llvm/unittests/tools/llvm-exegesis/PowerPC/TargetTest.cpp5
-rw-r--r--llvm/unittests/tools/llvm-exegesis/RISCV/TargetTest.cpp3
-rw-r--r--llvm/unittests/tools/llvm-exegesis/X86/SnippetFileTest.cpp3
-rw-r--r--llvm/unittests/tools/llvm-exegesis/X86/SnippetGeneratorTest.cpp3
-rw-r--r--llvm/unittests/tools/llvm-exegesis/X86/SnippetRepetitorTest.cpp7
-rw-r--r--llvm/unittests/tools/llvm-exegesis/X86/SubprocessMemoryTest.cpp2
-rw-r--r--llvm/unittests/tools/llvm-exegesis/X86/TargetTest.cpp11
-rw-r--r--llvm/unittests/tools/llvm-exegesis/X86/TestBase.h2
-rw-r--r--llvm/utils/FileCheck/FileCheck.cpp2
-rw-r--r--llvm/utils/TableGen/Basic/ARMTargetDefEmitter.cpp2
-rw-r--r--llvm/utils/TableGen/Common/CodeGenRegisters.cpp3
-rw-r--r--llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.h5
-rw-r--r--llvm/utils/TableGen/Common/InfoByHwMode.cpp2
-rw-r--r--llvm/utils/TableGen/RegisterBankEmitter.cpp3
-rw-r--r--llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/bugprone/BUILD.gn2
-rw-r--r--llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/cert/BUILD.gn2
-rw-r--r--llvm/utils/gn/secondary/libcxx/include/BUILD.gn1
-rw-r--r--llvm/utils/gn/secondary/lldb/tools/lldb-dap/tool/BUILD.gn2
-rw-r--r--llvm/utils/gn/secondary/llvm/lib/CAS/BUILD.gn3
-rw-r--r--llvm/utils/gn/secondary/llvm/lib/ExecutionEngine/Orc/TargetProcess/BUILD.gn2
-rw-r--r--llvm/utils/gn/secondary/llvm/unittests/CAS/BUILD.gn2
-rw-r--r--llvm/utils/gn/secondary/llvm/unittests/ExecutionEngine/Orc/BUILD.gn1
-rw-r--r--llvm/utils/profcheck-xfail.txt1
-rw-r--r--mlir/include/mlir/Dialect/GPU/IR/GPUDialect.h11
-rw-r--r--mlir/include/mlir/IR/BlockSupport.h10
-rw-r--r--mlir/include/mlir/Interfaces/TilingInterface.td4
-rw-r--r--mlir/lib/AsmParser/Parser.cpp4
-rw-r--r--mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp3
-rw-r--r--mlir/lib/Conversion/ControlFlowToLLVM/ControlFlowToLLVM.cpp8
-rw-r--r--mlir/lib/Conversion/MathToROCDL/MathToROCDL.cpp2
-rw-r--r--mlir/lib/Dialect/EmitC/IR/EmitC.cpp4
-rw-r--r--mlir/lib/Dialect/SCF/IR/SCF.cpp47
-rw-r--r--mlir/lib/Dialect/SparseTensor/Transforms/SparseTensorCodegen.cpp8
-rw-r--r--mlir/lib/IR/Operation.cpp18
-rw-r--r--mlir/test/Dialect/EmitC/invalid_ops.mlir38
-rw-r--r--mlir/test/python/CMakeLists.txt2
-rw-r--r--mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp12
-rw-r--r--openmp/runtime/src/z_Linux_asm.S4
-rw-r--r--polly/lib/Transform/ScheduleOptimizer.cpp53
-rw-r--r--polly/lib/Transform/ScheduleTreeTransform.cpp5
-rw-r--r--polly/test/ScheduleOptimizer/prevectorization_islbound.ll37
-rw-r--r--runtimes/cmake/Modules/HandleLibC.cmake4
-rw-r--r--third-party/benchmark/include/benchmark/benchmark.h10
-rw-r--r--utils/bazel/llvm-project-overlay/lldb/BUILD.bazel2
601 files changed, 16823 insertions, 9705 deletions
diff --git a/.ci/generate_test_report_lib.py b/.ci/generate_test_report_lib.py
index 36c9585..7820fbd 100644
--- a/.ci/generate_test_report_lib.py
+++ b/.ci/generate_test_report_lib.py
@@ -41,10 +41,12 @@ def _parse_ninja_log(ninja_log: list[str]) -> list[tuple[str, str]]:
# touch test/4.stamp
#
# index will point to the line that starts with Failed:. The progress
- # indicator is the line before this ([4/5] test/4.stamp) and contains a pretty
- # printed version of the target being built (test/4.stamp). We use this line
- # and remove the progress information to get a succinct name for the target.
- failing_action = ninja_log[index - 1].split("] ")[1]
+ # indicator is sometimes the line before this ([4/5] test/4.stamp) and
+ # will contain a pretty printed version of the target being built
+ # (test/4.stamp) when accurate. We instead parse the failed line rather
+ # than the progress indicator as the progress indicator may not be
+ # aligned with the failure.
+ failing_action = ninja_log[index].split("FAILED: ")[1]
failure_log = []
while (
index < len(ninja_log)
diff --git a/.ci/generate_test_report_lib_test.py b/.ci/generate_test_report_lib_test.py
index a8659e1..4068a3b7 100644
--- a/.ci/generate_test_report_lib_test.py
+++ b/.ci/generate_test_report_lib_test.py
@@ -39,7 +39,7 @@ class TestReports(unittest.TestCase):
self.assertEqual(
failures[0],
(
- "test/4.stamp",
+ "touch test/4.stamp",
dedent(
"""\
FAILED: touch test/4.stamp
@@ -77,7 +77,7 @@ class TestReports(unittest.TestCase):
self.assertEqual(
failures[0],
(
- "test/3.stamp",
+ "touch test/3.stamp",
dedent(
"""\
FAILED: touch test/3.stamp
@@ -106,7 +106,7 @@ class TestReports(unittest.TestCase):
self.assertEqual(
failures[0],
(
- "test/2.stamp",
+ "touch test/2.stamp",
dedent(
"""\
FAILED: touch test/2.stamp
@@ -117,7 +117,7 @@ class TestReports(unittest.TestCase):
self.assertEqual(
failures[1],
(
- "test/4.stamp",
+ "touch test/4.stamp",
dedent(
"""\
FAILED: touch test/4.stamp
@@ -150,7 +150,7 @@ class TestReports(unittest.TestCase):
self.assertEqual(
failures[0],
(
- "test/2.stamp",
+ "touch test/2.stamp",
dedent(
"""\
FAILED: touch test/2.stamp
@@ -159,6 +159,34 @@ class TestReports(unittest.TestCase):
),
)
+ # Test that we correctly handle cases where the FAILED: line does not
+ # match up with the progress indicator.
+ def test_ninja_log_mismatched_failed(self):
+ failures = generate_test_report_lib.find_failure_in_ninja_logs(
+ [
+ [
+ "[1/5] test/1.stamp",
+ "[2/5] test/2.stamp",
+ "ModuleNotFoundError: No module named 'mount_langley'",
+ "FAILED: tools/check-langley",
+ "Wow! This system is really broken!",
+ "[5/5] test/5.stamp",
+ ]
+ ]
+ )
+ self.assertEqual(len(failures), 1)
+ self.assertEqual(
+ failures[0],
+ (
+ "tools/check-langley",
+ dedent(
+ """\
+ FAILED: tools/check-langley
+ Wow! This system is really broken!"""
+ ),
+ ),
+ )
+
def test_title_only(self):
self.assertEqual(
generate_test_report_lib.generate_report("Foo", 0, [], []),
@@ -407,7 +435,6 @@ class TestReports(unittest.TestCase):
]
],
)
- print(test)
self.assertEqual(
generate_test_report_lib.generate_report(
"Foo",
@@ -449,7 +476,7 @@ class TestReports(unittest.TestCase):
All tests passed but another part of the build **failed**. Click on a failure below to see the details.
<details>
- <summary>test/2.stamp</summary>
+ <summary>touch test/2.stamp</summary>
```
FAILED: touch test/2.stamp
@@ -457,7 +484,7 @@ class TestReports(unittest.TestCase):
```
</details>
<details>
- <summary>test/4.stamp</summary>
+ <summary>touch test/4.stamp</summary>
```
FAILED: touch test/4.stamp
diff --git a/.ci/premerge_advisor_explain.py b/.ci/premerge_advisor_explain.py
index 06c6cb9..94f7949 100644
--- a/.ci/premerge_advisor_explain.py
+++ b/.ci/premerge_advisor_explain.py
@@ -40,7 +40,9 @@ def main(commit_sha: str, build_log_files: list[str]):
explanation_request["failures"].append(
{"name": name, "message": failure_message}
)
- advisor_response = requests.get(PREMERGE_ADVISOR_URL, json=explanation_request)
+ advisor_response = requests.get(
+ PREMERGE_ADVISOR_URL, json=explanation_request, timeout=5
+ )
if advisor_response.status_code == 200:
print(advisor_response.json())
else:
diff --git a/.ci/premerge_advisor_upload.py b/.ci/premerge_advisor_upload.py
index cb379b0..9e14743 100644
--- a/.ci/premerge_advisor_upload.py
+++ b/.ci/premerge_advisor_upload.py
@@ -45,7 +45,7 @@ def main(commit_sha, workflow_run_number, build_log_files):
for name, failure_message in ninja_failures:
failure_info["failures"].append({"name": name, "message": failure_message})
for premerge_advisor_url in PREMERGE_ADVISOR_URLS:
- requests.post(premerge_advisor_url, json=failure_info)
+ requests.post(premerge_advisor_url, json=failure_info, timeout=5)
if __name__ == "__main__":
diff --git a/.github/workflows/build-ci-container-tooling.yml b/.github/workflows/build-ci-container-tooling.yml
index c77c7861..992947e 100644
--- a/.github/workflows/build-ci-container-tooling.yml
+++ b/.github/workflows/build-ci-container-tooling.yml
@@ -63,7 +63,7 @@ jobs:
podman save ${{ steps.vars.outputs.container-name-lint-tag }} > ${{ steps.vars.outputs.container-lint-filename }}
- name: Upload container image
- uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: container-amd64
path: "*.tar"
diff --git a/.github/workflows/check-ci.yml b/.github/workflows/check-ci.yml
index f18a69c..6ecad55 100644
--- a/.github/workflows/check-ci.yml
+++ b/.github/workflows/check-ci.yml
@@ -28,7 +28,7 @@ jobs:
- name: Setup Python
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
- python-version: 3.13
+ python-version: 3.14
cache: 'pip'
- name: Install Python Dependencies
run: |
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index b5f3413..7374777c 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -97,7 +97,7 @@ jobs:
- name: Setup Python env
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
- python-version: '3.13'
+ python-version: '3.14'
cache: 'pip'
cache-dependency-path: 'llvm/docs/requirements-hashed.txt'
- name: Install python dependencies
diff --git a/.github/workflows/gha-codeql.yml b/.github/workflows/gha-codeql.yml
index 63388eb..6d490ca 100644
--- a/.github/workflows/gha-codeql.yml
+++ b/.github/workflows/gha-codeql.yml
@@ -29,9 +29,9 @@ jobs:
sparse-checkout: |
.github/
- name: Initialize CodeQL
- uses: github/codeql-action/init@303c0aef88fc2fe5ff6d63d3b1596bfd83dfa1f9 # v3.30.4
+ uses: github/codeql-action/init@5d5cd550d3e189c569da8f16ea8de2d821c9bf7a # v3.31.2
with:
languages: actions
queries: security-extended
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@303c0aef88fc2fe5ff6d63d3b1596bfd83dfa1f9 # v3.30.4
+ uses: github/codeql-action/analyze@5d5cd550d3e189c569da8f16ea8de2d821c9bf7a # v3.31.2
diff --git a/.github/workflows/hlsl-test-all.yaml b/.github/workflows/hlsl-test-all.yaml
index dcb8523..ce6ccfa 100644
--- a/.github/workflows/hlsl-test-all.yaml
+++ b/.github/workflows/hlsl-test-all.yaml
@@ -54,7 +54,7 @@ jobs:
path: golden-images
- name: Setup Windows
if: runner.os == 'Windows'
- uses: llvm/actions/setup-windows@main
+ uses: llvm/actions/setup-windows@42d80571b13f4599bbefbc7189728b64723c7f78 # main
with:
arch: amd64
- name: Build DXC
@@ -80,7 +80,7 @@ jobs:
ninja check-hlsl-unit
ninja ${{ inputs.TestTarget }}
- name: Publish Test Results
- uses: EnricoMi/publish-unit-test-result-action/macos@3a74b2957438d0b6e2e61d67b05318aa25c9e6c6 # v2.20.0
+ uses: EnricoMi/publish-unit-test-result-action/macos@34d7c956a59aed1bfebf31df77b8de55db9bbaaf # v2.21.0
if: always() && runner.os == 'macOS'
with:
comment_mode: off
diff --git a/.github/workflows/libclang-abi-tests.yml b/.github/workflows/libclang-abi-tests.yml
index 5ccf976..432c457 100644
--- a/.github/workflows/libclang-abi-tests.yml
+++ b/.github/workflows/libclang-abi-tests.yml
@@ -100,7 +100,7 @@ jobs:
repo: ${{ github.repository }}
steps:
- name: Install Ninja
- uses: llvm/actions/install-ninja@main
+ uses: llvm/actions/install-ninja@42d80571b13f4599bbefbc7189728b64723c7f78 # main
- name: Install abi-compliance-checker
run: |
sudo apt-get update
diff --git a/.github/workflows/libcxx-build-containers.yml b/.github/workflows/libcxx-build-containers.yml
index 312cb47..4bce861 100644
--- a/.github/workflows/libcxx-build-containers.yml
+++ b/.github/workflows/libcxx-build-containers.yml
@@ -55,7 +55,7 @@ jobs:
TAG: ${{ github.sha }}
- name: Log in to GitHub Container Registry
- uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
+ uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
with:
registry: ghcr.io
username: ${{ github.actor }}
diff --git a/.github/workflows/libcxx-run-benchmarks.yml b/.github/workflows/libcxx-run-benchmarks.yml
index 9e8f558..e2ca940 100644
--- a/.github/workflows/libcxx-run-benchmarks.yml
+++ b/.github/workflows/libcxx-run-benchmarks.yml
@@ -35,7 +35,7 @@ jobs:
steps:
- uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
with:
- python-version: '3.13'
+ python-version: '3.14'
- name: Extract information from the PR
id: vars
diff --git a/.github/workflows/llvm-abi-tests.yml b/.github/workflows/llvm-abi-tests.yml
index f73d180..961f1cc 100644
--- a/.github/workflows/llvm-abi-tests.yml
+++ b/.github/workflows/llvm-abi-tests.yml
@@ -88,7 +88,7 @@ jobs:
repo: ${{ github.repository }}
steps:
- name: Install Ninja
- uses: llvm/actions/install-ninja@main
+ uses: llvm/actions/install-ninja@42d80571b13f4599bbefbc7189728b64723c7f78 # main
- name: Install abi-compliance-checker
run: |
sudo apt-get update
diff --git a/.github/workflows/llvm-bugs.yml b/.github/workflows/llvm-bugs.yml
index 7d42abf..cd3f396 100644
--- a/.github/workflows/llvm-bugs.yml
+++ b/.github/workflows/llvm-bugs.yml
@@ -39,6 +39,12 @@ jobs:
repo: context.repo.repo
})
.then((issue) => {
+ var maybeTruncatedBody = issue.data.body;
+ if (maybeTruncatedBody.length > 15000) {
+ maybeTruncatedBody = maybeTruncatedBody.substring(0,
+ 15000) +
+ "<truncated>Please see the issue for the entire body."
+ }
const payload = {
author : issue.data.user.login,
issue : issue.data.number,
diff --git a/.github/workflows/new-issues.yml b/.github/workflows/new-issues.yml
index 8480a65..a5dcad2 100644
--- a/.github/workflows/new-issues.yml
+++ b/.github/workflows/new-issues.yml
@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-24.04
if: github.repository == 'llvm/llvm-project'
steps:
- - uses: llvm/actions/issue-labeler@main
+ - uses: llvm/actions/issue-labeler@42d80571b13f4599bbefbc7189728b64723c7f78 # main
with:
repo-token: ${{ secrets.ISSUE_SUBSCRIBER_TOKEN }}
configuration-path: .github/new-issues-labeler.yml
diff --git a/.github/workflows/premerge.yaml b/.github/workflows/premerge.yaml
index 6303a11..973d3ab 100644
--- a/.github/workflows/premerge.yaml
+++ b/.github/workflows/premerge.yaml
@@ -190,7 +190,7 @@ jobs:
with:
max-size: "2000M"
- name: Install Ninja
- uses: llvm/actions/install-ninja@main
+ uses: llvm/actions/install-ninja@42d80571b13f4599bbefbc7189728b64723c7f78 # main
- name: Build and Test
run: |
source <(git diff --name-only HEAD~1...HEAD | python3 .ci/compute_projects.py)
diff --git a/.github/workflows/release-binaries.yml b/.github/workflows/release-binaries.yml
index fa73b9d..acc4723 100644
--- a/.github/workflows/release-binaries.yml
+++ b/.github/workflows/release-binaries.yml
@@ -68,7 +68,7 @@ jobs:
# due to https://github.com/actions/runner-images/issues/10385
- uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
with:
- python-version: '3.13'
+ python-version: '3.14'
- name: Checkout LLVM
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
@@ -173,11 +173,11 @@ jobs:
ref: ${{ needs.prepare.outputs.ref }}
- name: Install Ninja
- uses: llvm/actions/install-ninja@a1ea791b03c8e61f53a0e66f2f73db283aa0f01e # main
+ uses: llvm/actions/install-ninja@42d80571b13f4599bbefbc7189728b64723c7f78 # main
- name: Setup Windows
if: startsWith(runner.os, 'Windows')
- uses: llvm/actions/setup-windows@main
+ uses: llvm/actions/setup-windows@42d80571b13f4599bbefbc7189728b64723c7f78 # main
with:
arch: amd64
diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml
index c07df33..bd3277a 100644
--- a/.github/workflows/scorecard.yml
+++ b/.github/workflows/scorecard.yml
@@ -36,7 +36,7 @@ jobs:
persist-credentials: false
- name: "Run analysis"
- uses: ossf/scorecard-action@05b42c624433fc40578a4040d5cf5e36ddca8cde # v2.4.2
+ uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
with:
results_file: results.sarif
results_format: sarif
diff --git a/bolt/lib/Core/BinaryContext.cpp b/bolt/lib/Core/BinaryContext.cpp
index a383ced..c7cd034a 100644
--- a/bolt/lib/Core/BinaryContext.cpp
+++ b/bolt/lib/Core/BinaryContext.cpp
@@ -778,13 +778,17 @@ void BinaryContext::populateJumpTables() {
}
if (opts::StrictMode && DataPCRelocations.size()) {
- LLVM_DEBUG({
- dbgs() << DataPCRelocations.size()
- << " unclaimed PC-relative relocations left in data:\n";
- for (uint64_t Reloc : DataPCRelocations)
- dbgs() << Twine::utohexstr(Reloc) << '\n';
- });
- assert(0 && "unclaimed PC-relative relocations left in data\n");
+ this->errs() << "BOLT-ERROR: " << DataPCRelocations.size()
+ << " unclaimed PC-relative relocation(s) left in data";
+ if (opts::Verbosity) {
+ this->errs() << ":\n";
+ for (uint64_t RelocOffset : DataPCRelocations)
+ this->errs() << " @0x" << Twine::utohexstr(RelocOffset) << '\n';
+ } else {
+ this->errs() << ". Re-run with -v=1 to see the list\n";
+ }
+ this->errs() << "BOLT-ERROR: unable to proceed with --strict\n";
+ exit(1);
}
clearList(DataPCRelocations);
}
diff --git a/bolt/test/X86/unclaimed-pc-rel.s b/bolt/test/X86/unclaimed-pc-rel.s
new file mode 100644
index 0000000..5292ccc
--- /dev/null
+++ b/bolt/test/X86/unclaimed-pc-rel.s
@@ -0,0 +1,24 @@
+## Check that unclaimed PC-relative relocation from data to code is detected
+## and reported to the user.
+
+# REQUIRES: system-linux
+
+# RUN: %clang %cflags -no-pie %s -o %t.exe -Wl,-q -nostartfiles
+# RUN: not llvm-bolt %t.exe -o %t.bolt --strict 2>&1 | FileCheck %s
+
+# CHECK: BOLT-ERROR: 1 unclaimed PC-relative relocation(s) left in data
+
+ .text
+ .globl _start
+ .type _start, %function
+_start:
+ movl $42, %eax
+.L0:
+ ret
+ .size _start, .-_start
+
+## Force relocation mode.
+ .reloc 0, R_X86_64_NONE
+
+ .section .rodata
+ .long .L0-.
diff --git a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp
index e6115f6..2e21a4c4 100644
--- a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp
@@ -24,6 +24,7 @@
#include "CopyConstructorInitCheck.h"
#include "CrtpConstructorAccessibilityCheck.h"
#include "DanglingHandleCheck.h"
+#include "DefaultOperatorNewOnOveralignedTypeCheck.h"
#include "DerivedMethodShadowingBaseMethodCheck.h"
#include "DynamicStaticInitializersCheck.h"
#include "EasilySwappableParametersCheck.h"
@@ -61,6 +62,7 @@
#include "ParentVirtualCallCheck.h"
#include "PointerArithmeticOnPolymorphicObjectCheck.h"
#include "PosixReturnCheck.h"
+#include "RawMemoryCallOnNonTrivialTypeCheck.h"
#include "RedundantBranchConditionCheck.h"
#include "ReservedIdentifierCheck.h"
#include "ReturnConstRefFromParameterCheck.h"
@@ -139,6 +141,8 @@ public:
"bugprone-copy-constructor-init");
CheckFactories.registerCheck<DanglingHandleCheck>(
"bugprone-dangling-handle");
+ CheckFactories.registerCheck<DefaultOperatorNewOnOveralignedTypeCheck>(
+ "bugprone-default-operator-new-on-overaligned-type");
CheckFactories.registerCheck<DerivedMethodShadowingBaseMethodCheck>(
"bugprone-derived-method-shadowing-base-method");
CheckFactories.registerCheck<DynamicStaticInitializersCheck>(
@@ -216,6 +220,8 @@ public:
CheckFactories.registerCheck<ParentVirtualCallCheck>(
"bugprone-parent-virtual-call");
CheckFactories.registerCheck<PosixReturnCheck>("bugprone-posix-return");
+ CheckFactories.registerCheck<RawMemoryCallOnNonTrivialTypeCheck>(
+ "bugprone-raw-memory-call-on-non-trivial-type");
CheckFactories.registerCheck<ReservedIdentifierCheck>(
"bugprone-reserved-identifier");
CheckFactories.registerCheck<SharedPtrArrayMismatchCheck>(
diff --git a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt
index c8943e5..31a0e69 100644
--- a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt
+++ b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt
@@ -20,6 +20,7 @@ add_clang_library(clangTidyBugproneModule STATIC
CopyConstructorInitCheck.cpp
CrtpConstructorAccessibilityCheck.cpp
DanglingHandleCheck.cpp
+ DefaultOperatorNewOnOveralignedTypeCheck.cpp
DerivedMethodShadowingBaseMethodCheck.cpp
DynamicStaticInitializersCheck.cpp
EasilySwappableParametersCheck.cpp
@@ -62,6 +63,7 @@ add_clang_library(clangTidyBugproneModule STATIC
ParentVirtualCallCheck.cpp
PointerArithmeticOnPolymorphicObjectCheck.cpp
PosixReturnCheck.cpp
+ RawMemoryCallOnNonTrivialTypeCheck.cpp
RedundantBranchConditionCheck.cpp
ReservedIdentifierCheck.cpp
ReturnConstRefFromParameterCheck.cpp
diff --git a/clang-tools-extra/clang-tidy/cert/DefaultOperatorNewAlignmentCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/DefaultOperatorNewOnOveralignedTypeCheck.cpp
index 45c170e..0aafdfd 100644
--- a/clang-tools-extra/clang-tidy/cert/DefaultOperatorNewAlignmentCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/DefaultOperatorNewOnOveralignedTypeCheck.cpp
@@ -6,21 +6,22 @@
//
//===----------------------------------------------------------------------===//
-#include "DefaultOperatorNewAlignmentCheck.h"
+#include "DefaultOperatorNewOnOveralignedTypeCheck.h"
#include "clang/AST/ASTContext.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/Basic/TargetInfo.h"
using namespace clang::ast_matchers;
-namespace clang::tidy::cert {
+namespace clang::tidy::bugprone {
-void DefaultOperatorNewAlignmentCheck::registerMatchers(MatchFinder *Finder) {
+void DefaultOperatorNewOnOveralignedTypeCheck::registerMatchers(
+ MatchFinder *Finder) {
Finder->addMatcher(
cxxNewExpr(unless(hasAnyPlacementArg(anything()))).bind("new"), this);
}
-void DefaultOperatorNewAlignmentCheck::check(
+void DefaultOperatorNewOnOveralignedTypeCheck::check(
const MatchFinder::MatchResult &Result) {
// Get the found 'new' expression.
const auto *NewExpr = Result.Nodes.getNodeAs<CXXNewExpr>("new");
@@ -61,4 +62,4 @@ void DefaultOperatorNewAlignmentCheck::check(
<< (SpecifiedAlignment / CharWidth);
}
-} // namespace clang::tidy::cert
+} // namespace clang::tidy::bugprone
diff --git a/clang-tools-extra/clang-tidy/cert/DefaultOperatorNewAlignmentCheck.h b/clang-tools-extra/clang-tidy/bugprone/DefaultOperatorNewOnOveralignedTypeCheck.h
index 8f9d0e4..b5b365b 100644
--- a/clang-tools-extra/clang-tidy/cert/DefaultOperatorNewAlignmentCheck.h
+++ b/clang-tools-extra/clang-tidy/bugprone/DefaultOperatorNewOnOveralignedTypeCheck.h
@@ -6,21 +6,22 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_DEFAULTOPERATORNEWALIGNMENTCHECK_H
-#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_DEFAULTOPERATORNEWALIGNMENTCHECK_H
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_DEFAULTOPERATORNEWONOVERALIGNEDTYPECHECK_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_DEFAULTOPERATORNEWONOVERALIGNEDTYPECHECK_H
#include "../ClangTidyCheck.h"
-namespace clang::tidy::cert {
+namespace clang::tidy::bugprone {
/// Checks if an object of type with extended alignment is allocated by using
/// the default operator new.
///
/// For the user-facing documentation see:
-/// https://clang.llvm.org/extra/clang-tidy/checks/cert/mem57-cpp.html
-class DefaultOperatorNewAlignmentCheck : public ClangTidyCheck {
+/// https://clang.llvm.org/extra/clang-tidy/checks/bugprone/bugprone-default-operator-new-on-overaligned-type.html
+class DefaultOperatorNewOnOveralignedTypeCheck : public ClangTidyCheck {
public:
- DefaultOperatorNewAlignmentCheck(StringRef Name, ClangTidyContext *Context)
+ DefaultOperatorNewOnOveralignedTypeCheck(StringRef Name,
+ ClangTidyContext *Context)
: ClangTidyCheck(Name, Context) {}
bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
return !LangOpts.CPlusPlus17;
@@ -29,6 +30,6 @@ public:
void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
};
-} // namespace clang::tidy::cert
+} // namespace clang::tidy::bugprone
-#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_DEFAULTOPERATORNEWALIGNMENTCHECK_H
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_DEFAULTOPERATORNEWONOVERALIGNEDTYPECHECK_H
diff --git a/clang-tools-extra/clang-tidy/bugprone/InvalidEnumDefaultInitializationCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/InvalidEnumDefaultInitializationCheck.cpp
index 76df992..18eb40f 100644
--- a/clang-tools-extra/clang-tidy/bugprone/InvalidEnumDefaultInitializationCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/InvalidEnumDefaultInitializationCheck.cpp
@@ -20,6 +20,8 @@ namespace clang::tidy::bugprone {
namespace {
+// Preserve same name as AST_MATCHER(isCompleteAndHasNoZeroValue)
+// NOLINTNEXTLINE(llvm-prefer-static-over-anonymous-namespace)
bool isCompleteAndHasNoZeroValue(const EnumDecl *D) {
const EnumDecl *Definition = D->getDefinition();
return Definition && Definition->isComplete() &&
diff --git a/clang-tools-extra/clang-tidy/cert/NonTrivialTypesLibcMemoryCallsCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/RawMemoryCallOnNonTrivialTypeCheck.cpp
index e266cf9..f7f7ccb 100644
--- a/clang-tools-extra/clang-tidy/cert/NonTrivialTypesLibcMemoryCallsCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/RawMemoryCallOnNonTrivialTypeCheck.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "NonTrivialTypesLibcMemoryCallsCheck.h"
+#include "RawMemoryCallOnNonTrivialTypeCheck.h"
#include "../utils/OptionsUtils.h"
#include "clang/AST/Decl.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
@@ -17,7 +17,7 @@
using namespace clang::ast_matchers;
-namespace clang::tidy::cert {
+namespace clang::tidy::bugprone {
namespace {
AST_MATCHER(CXXRecordDecl, isTriviallyDefaultConstructible) {
@@ -48,22 +48,21 @@ static constexpr llvm::StringRef ComparisonOperators[] = {
"operator==", "operator!=", "operator<",
"operator>", "operator<=", "operator>="};
-NonTrivialTypesLibcMemoryCallsCheck::NonTrivialTypesLibcMemoryCallsCheck(
+RawMemoryCallOnNonTrivialTypeCheck::RawMemoryCallOnNonTrivialTypeCheck(
StringRef Name, ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
MemSetNames(Options.get("MemSetNames", "")),
MemCpyNames(Options.get("MemCpyNames", "")),
MemCmpNames(Options.get("MemCmpNames", "")) {}
-void NonTrivialTypesLibcMemoryCallsCheck::storeOptions(
+void RawMemoryCallOnNonTrivialTypeCheck::storeOptions(
ClangTidyOptions::OptionMap &Opts) {
Options.store(Opts, "MemSetNames", MemSetNames);
Options.store(Opts, "MemCpyNames", MemCpyNames);
Options.store(Opts, "MemCmpNames", MemCmpNames);
}
-void NonTrivialTypesLibcMemoryCallsCheck::registerMatchers(
- MatchFinder *Finder) {
+void RawMemoryCallOnNonTrivialTypeCheck::registerMatchers(MatchFinder *Finder) {
using namespace ast_matchers::internal;
auto IsStructPointer = [](Matcher<CXXRecordDecl> Constraint = anything(),
bool Bind = false) {
@@ -103,7 +102,7 @@ void NonTrivialTypesLibcMemoryCallsCheck::registerMatchers(
this);
}
-void NonTrivialTypesLibcMemoryCallsCheck::check(
+void RawMemoryCallOnNonTrivialTypeCheck::check(
const MatchFinder::MatchResult &Result) {
if (const auto *Caller = Result.Nodes.getNodeAs<CallExpr>("lazyConstruct")) {
diag(Caller->getBeginLoc(), "calling %0 on a non-trivially default "
@@ -122,4 +121,4 @@ void NonTrivialTypesLibcMemoryCallsCheck::check(
}
}
-} // namespace clang::tidy::cert
+} // namespace clang::tidy::bugprone
diff --git a/clang-tools-extra/clang-tidy/cert/NonTrivialTypesLibcMemoryCallsCheck.h b/clang-tools-extra/clang-tidy/bugprone/RawMemoryCallOnNonTrivialTypeCheck.h
index 4589ce4..002aac6 100644
--- a/clang-tools-extra/clang-tidy/cert/NonTrivialTypesLibcMemoryCallsCheck.h
+++ b/clang-tools-extra/clang-tidy/bugprone/RawMemoryCallOnNonTrivialTypeCheck.h
@@ -6,22 +6,21 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_NONTRIVIALTYPESLIBCMEMORYCALLSCHECK_H
-#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_NONTRIVIALTYPESLIBCMEMORYCALLSCHECK_H
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_RAWMEMORYCALLONNONTRIVIALTYPECHECK_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_RAWMEMORYCALLONNONTRIVIALTYPECHECK_H
#include "../ClangTidyCheck.h"
-namespace clang::tidy::cert {
+namespace clang::tidy::bugprone {
-/// Flags use of the `C` standard library functions 'memset', 'memcpy' and
+/// Flags use of the C standard library functions 'memset', 'memcpy' and
/// 'memcmp' and similar derivatives on non-trivial types.
///
/// For the user-facing documentation see:
-/// https://clang.llvm.org/extra/clang-tidy/checks/cert/oop57-cpp.html
-class NonTrivialTypesLibcMemoryCallsCheck : public ClangTidyCheck {
+/// https://clang.llvm.org/extra/clang-tidy/checks/bugprone/raw-memory-call-on-non-trivial-type.html
+class RawMemoryCallOnNonTrivialTypeCheck : public ClangTidyCheck {
public:
- NonTrivialTypesLibcMemoryCallsCheck(StringRef Name,
- ClangTidyContext *Context);
+ RawMemoryCallOnNonTrivialTypeCheck(StringRef Name, ClangTidyContext *Context);
bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
return LangOpts.CPlusPlus && !LangOpts.ObjC;
}
@@ -35,6 +34,6 @@ private:
const StringRef MemCmpNames;
};
-} // namespace clang::tidy::cert
+} // namespace clang::tidy::bugprone
-#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_NONTRIVIALTYPESLIBCMEMORYCALLSCHECK_H
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_RAWMEMORYCALLONNONTRIVIALTYPECHECK_H
diff --git a/clang-tools-extra/clang-tidy/bugprone/SmartPtrArrayMismatchCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/SmartPtrArrayMismatchCheck.cpp
index ee797ec..f76e4a7 100644
--- a/clang-tools-extra/clang-tidy/bugprone/SmartPtrArrayMismatchCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/SmartPtrArrayMismatchCheck.cpp
@@ -15,13 +15,11 @@ using namespace clang::ast_matchers;
namespace clang::tidy::bugprone {
-namespace {
+static constexpr char ConstructExprN[] = "found_construct_expr";
+static constexpr char NewExprN[] = "found_new_expr";
+static constexpr char ConstructorN[] = "found_constructor";
-constexpr char ConstructExprN[] = "found_construct_expr";
-constexpr char NewExprN[] = "found_new_expr";
-constexpr char ConstructorN[] = "found_constructor";
-
-bool isInSingleDeclStmt(const DeclaratorDecl *D) {
+static bool isInSingleDeclStmt(const DeclaratorDecl *D) {
const DynTypedNodeList Parents =
D->getASTContext().getParentMapContext().getParents(*D);
for (const DynTypedNode &PNode : Parents)
@@ -30,8 +28,8 @@ bool isInSingleDeclStmt(const DeclaratorDecl *D) {
return false;
}
-const DeclaratorDecl *getConstructedVarOrField(const Expr *FoundConstructExpr,
- ASTContext &Ctx) {
+static const DeclaratorDecl *
+getConstructedVarOrField(const Expr *FoundConstructExpr, ASTContext &Ctx) {
const DynTypedNodeList ConstructParents =
Ctx.getParentMapContext().getParents(*FoundConstructExpr);
if (ConstructParents.size() != 1)
@@ -43,8 +41,6 @@ const DeclaratorDecl *getConstructedVarOrField(const Expr *FoundConstructExpr,
return nullptr;
}
-} // namespace
-
const char SmartPtrArrayMismatchCheck::PointerTypeN[] = "pointer_type";
SmartPtrArrayMismatchCheck::SmartPtrArrayMismatchCheck(
diff --git a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
index c1ca2ce..d517977 100644
--- a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
+++ b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
@@ -11,7 +11,9 @@
#include "../ClangTidyModuleRegistry.h"
#include "../bugprone/BadSignalToKillThreadCheck.h"
#include "../bugprone/CommandProcessorCheck.h"
+#include "../bugprone/DefaultOperatorNewOnOveralignedTypeCheck.h"
#include "../bugprone/PointerArithmeticOnPolymorphicObjectCheck.h"
+#include "../bugprone/RawMemoryCallOnNonTrivialTypeCheck.h"
#include "../bugprone/ReservedIdentifierCheck.h"
#include "../bugprone/SignalHandlerCheck.h"
#include "../bugprone/SignedCharMisuseCheck.h"
@@ -34,12 +36,10 @@
#include "../performance/MoveConstructorInitCheck.h"
#include "../readability/EnumInitialValueCheck.h"
#include "../readability/UppercaseLiteralSuffixCheck.h"
-#include "DefaultOperatorNewAlignmentCheck.h"
#include "DontModifyStdNamespaceCheck.h"
#include "FloatLoopCounter.h"
#include "LimitedRandomnessCheck.h"
#include "MutatingCopyCheck.h"
-#include "NonTrivialTypesLibcMemoryCallsCheck.h"
#include "ProperlySeededRandomGeneratorCheck.h"
#include "ThrownExceptionTypeCheck.h"
@@ -265,8 +265,9 @@ public:
CheckFactories.registerCheck<misc::ThrowByValueCatchByReferenceCheck>(
"cert-err61-cpp");
// MEM
- CheckFactories.registerCheck<DefaultOperatorNewAlignmentCheck>(
- "cert-mem57-cpp");
+ CheckFactories
+ .registerCheck<bugprone::DefaultOperatorNewOnOveralignedTypeCheck>(
+ "cert-mem57-cpp");
// MSC
CheckFactories.registerCheck<LimitedRandomnessCheck>("cert-msc50-cpp");
CheckFactories.registerCheck<ProperlySeededRandomGeneratorCheck>(
@@ -278,7 +279,7 @@ public:
"cert-oop11-cpp");
CheckFactories.registerCheck<bugprone::UnhandledSelfAssignmentCheck>(
"cert-oop54-cpp");
- CheckFactories.registerCheck<NonTrivialTypesLibcMemoryCallsCheck>(
+ CheckFactories.registerCheck<bugprone::RawMemoryCallOnNonTrivialTypeCheck>(
"cert-oop57-cpp");
CheckFactories.registerCheck<MutatingCopyCheck>("cert-oop58-cpp");
diff --git a/clang-tools-extra/clang-tidy/cert/CMakeLists.txt b/clang-tools-extra/clang-tidy/cert/CMakeLists.txt
index 453d1d3..db3b2f5 100644
--- a/clang-tools-extra/clang-tidy/cert/CMakeLists.txt
+++ b/clang-tools-extra/clang-tidy/cert/CMakeLists.txt
@@ -5,12 +5,10 @@ set(LLVM_LINK_COMPONENTS
add_clang_library(clangTidyCERTModule STATIC
CERTTidyModule.cpp
- DefaultOperatorNewAlignmentCheck.cpp
DontModifyStdNamespaceCheck.cpp
FloatLoopCounter.cpp
LimitedRandomnessCheck.cpp
MutatingCopyCheck.cpp
- NonTrivialTypesLibcMemoryCallsCheck.cpp
ProperlySeededRandomGeneratorCheck.cpp
ThrownExceptionTypeCheck.cpp
diff --git a/clang-tools-extra/clang-tidy/google/FunctionNamingCheck.cpp b/clang-tools-extra/clang-tidy/google/FunctionNamingCheck.cpp
index 3d75f4d..ce0e4e6 100644
--- a/clang-tools-extra/clang-tidy/google/FunctionNamingCheck.cpp
+++ b/clang-tools-extra/clang-tidy/google/FunctionNamingCheck.cpp
@@ -14,9 +14,7 @@ using namespace clang::ast_matchers;
namespace clang::tidy::google::objc {
-namespace {
-
-std::string validFunctionNameRegex(bool RequirePrefix) {
+static std::string validFunctionNameRegex(bool RequirePrefix) {
// Allow the following name patterns for all functions:
// • ABFoo (prefix + UpperCamelCase)
// • ABURL (prefix + capitalized acronym/initialism)
@@ -43,7 +41,7 @@ std::string validFunctionNameRegex(bool RequirePrefix) {
/// For now we will only fix functions of static storage class with names like
/// 'functionName' or 'function_name' and convert them to 'FunctionName'. For
/// other cases the user must determine an appropriate name on their own.
-FixItHint generateFixItHint(const FunctionDecl *Decl) {
+static FixItHint generateFixItHint(const FunctionDecl *Decl) {
// A fixit can be generated for functions of static storage class but
// otherwise the check cannot determine the appropriate function name prefix
// to use.
@@ -82,8 +80,6 @@ FixItHint generateFixItHint(const FunctionDecl *Decl) {
return {};
}
-} // namespace
-
void FunctionNamingCheck::registerMatchers(MatchFinder *Finder) {
// Enforce Objective-C function naming conventions on all functions except:
// • Functions defined in system headers.
diff --git a/clang-tools-extra/clang-tidy/llvm/UseNewMLIROpBuilderCheck.cpp b/clang-tools-extra/clang-tidy/llvm/UseNewMLIROpBuilderCheck.cpp
index bd51cc5..0014153 100644
--- a/clang-tools-extra/clang-tidy/llvm/UseNewMLIROpBuilderCheck.cpp
+++ b/clang-tools-extra/clang-tidy/llvm/UseNewMLIROpBuilderCheck.cpp
@@ -18,18 +18,15 @@
#include "llvm/Support/FormatVariadic.h"
namespace clang::tidy::llvm_check {
-namespace {
using namespace ::clang::ast_matchers;
using namespace ::clang::transformer;
-EditGenerator rewrite(RangeSelector Call, RangeSelector Builder,
- RangeSelector CallArgs) {
+static EditGenerator rewrite(RangeSelector Call, RangeSelector Builder) {
// This is using an EditGenerator rather than ASTEdit as we want to warn even
// if in macro.
- return [Call = std::move(Call), Builder = std::move(Builder),
- CallArgs =
- std::move(CallArgs)](const MatchFinder::MatchResult &Result)
+ return [Call = std::move(Call),
+ Builder = std::move(Builder)](const MatchFinder::MatchResult &Result)
-> Expected<SmallVector<transformer::Edit, 1>> {
Expected<CharSourceRange> CallRange = Call(Result);
if (!CallRange)
@@ -54,7 +51,7 @@ EditGenerator rewrite(RangeSelector Call, RangeSelector Builder,
auto NextToken = [&](std::optional<Token> CurrentToken) {
if (!CurrentToken)
return CurrentToken;
- if (CurrentToken->getEndLoc() >= CallRange->getEnd())
+ if (CurrentToken->is(clang::tok::eof))
return std::optional<Token>();
return clang::Lexer::findNextToken(CurrentToken->getLocation(), SM,
LangOpts);
@@ -68,9 +65,10 @@ EditGenerator rewrite(RangeSelector Call, RangeSelector Builder,
return llvm::make_error<llvm::StringError>(llvm::errc::invalid_argument,
"missing '<' token");
}
+
std::optional<Token> EndToken = NextToken(LessToken);
- for (std::optional<Token> GreaterToken = NextToken(EndToken);
- GreaterToken && GreaterToken->getKind() != clang::tok::greater;
+ std::optional<Token> GreaterToken = NextToken(EndToken);
+ for (; GreaterToken && GreaterToken->getKind() != clang::tok::greater;
GreaterToken = NextToken(GreaterToken)) {
EndToken = GreaterToken;
}
@@ -79,12 +77,21 @@ EditGenerator rewrite(RangeSelector Call, RangeSelector Builder,
"missing '>' token");
}
+ std::optional<Token> ArgStart = NextToken(GreaterToken);
+ if (!ArgStart || ArgStart->getKind() != clang::tok::l_paren) {
+ return llvm::make_error<llvm::StringError>(llvm::errc::invalid_argument,
+ "missing '(' token");
+ }
+ std::optional<Token> Arg = NextToken(ArgStart);
+ if (!Arg) {
+ return llvm::make_error<llvm::StringError>(llvm::errc::invalid_argument,
+ "unexpected end of file");
+ }
+ const bool HasArgs = Arg->getKind() != clang::tok::r_paren;
+
Expected<CharSourceRange> BuilderRange = Builder(Result);
if (!BuilderRange)
return BuilderRange.takeError();
- Expected<CharSourceRange> CallArgsRange = CallArgs(Result);
- if (!CallArgsRange)
- return CallArgsRange.takeError();
// Helper for concatting below.
auto GetText = [&](const CharSourceRange &Range) {
@@ -93,43 +100,42 @@ EditGenerator rewrite(RangeSelector Call, RangeSelector Builder,
Edit Replace;
Replace.Kind = EditKind::Range;
- Replace.Range = *CallRange;
- std::string CallArgsStr;
- // Only emit args if there are any.
- if (auto CallArgsText = GetText(*CallArgsRange).ltrim();
- !CallArgsText.rtrim().empty()) {
- CallArgsStr = llvm::formatv(", {}", CallArgsText);
+ Replace.Range.setBegin(CallRange->getBegin());
+ Replace.Range.setEnd(ArgStart->getEndLoc());
+ const Expr *BuilderExpr = Result.Nodes.getNodeAs<Expr>("builder");
+ std::string BuilderText = GetText(*BuilderRange).str();
+ if (BuilderExpr->getType()->isPointerType()) {
+ BuilderText = BuilderExpr->isImplicitCXXThis()
+ ? "*this"
+ : llvm::formatv("*{}", BuilderText).str();
}
- Replace.Replacement =
- llvm::formatv("{}::create({}{})",
- GetText(CharSourceRange::getTokenRange(
- LessToken->getEndLoc(), EndToken->getLastLoc())),
- GetText(*BuilderRange), CallArgsStr);
+ const StringRef OpType = GetText(CharSourceRange::getTokenRange(
+ LessToken->getEndLoc(), EndToken->getLastLoc()));
+ Replace.Replacement = llvm::formatv("{}::create({}{}", OpType, BuilderText,
+ HasArgs ? ", " : "");
return SmallVector<Edit, 1>({Replace});
};
}
-RewriteRuleWith<std::string> useNewMlirOpBuilderCheckRule() {
+static RewriteRuleWith<std::string> useNewMlirOpBuilderCheckRule() {
Stencil Message = cat("use 'OpType::create(builder, ...)' instead of "
"'builder.create<OpType>(...)'");
// Match a create call on an OpBuilder.
+ auto BuilderType = cxxRecordDecl(isSameOrDerivedFrom("::mlir::OpBuilder"));
ast_matchers::internal::Matcher<Stmt> Base =
cxxMemberCallExpr(
- on(expr(hasType(
- cxxRecordDecl(isSameOrDerivedFrom("::mlir::OpBuilder"))))
+ on(expr(anyOf(hasType(BuilderType), hasType(pointsTo(BuilderType))))
.bind("builder")),
- callee(cxxMethodDecl(hasTemplateArgument(0, templateArgument()))),
- callee(cxxMethodDecl(hasName("create"))))
+ callee(cxxMethodDecl(hasTemplateArgument(0, templateArgument()),
+ hasName("create"))))
.bind("call");
return applyFirst(
// Attempt rewrite given an lvalue builder, else just warn.
{makeRule(cxxMemberCallExpr(unless(on(cxxTemporaryObjectExpr())), Base),
- rewrite(node("call"), node("builder"), callArgs("call")),
- Message),
+ rewrite(node("call"), node("builder")), Message),
makeRule(Base, noopEdit(node("call")), Message)});
}
-} // namespace
UseNewMlirOpBuilderCheck::UseNewMlirOpBuilderCheck(StringRef Name,
ClangTidyContext *Context)
diff --git a/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp b/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp
index 415852d..1d27064 100644
--- a/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp
+++ b/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp
@@ -43,12 +43,6 @@ struct OptionEnumMapping<misc::UseInternalLinkageCheck::FixModeKind> {
namespace clang::tidy::misc {
-namespace {
-
-AST_MATCHER(Decl, isFirstDecl) { return Node.isFirstDecl(); }
-
-AST_MATCHER(FunctionDecl, hasBody) { return Node.hasBody(); }
-
static bool isInMainFile(SourceLocation L, SourceManager &SM,
const FileExtensionsSet &HeaderFileExtensions) {
for (;;) {
@@ -65,6 +59,12 @@ static bool isInMainFile(SourceLocation L, SourceManager &SM,
}
}
+namespace {
+
+AST_MATCHER(Decl, isFirstDecl) { return Node.isFirstDecl(); }
+
+AST_MATCHER(FunctionDecl, hasBody) { return Node.hasBody(); }
+
AST_MATCHER_P(Decl, isAllRedeclsInMainFile, FileExtensionsSet,
HeaderFileExtensions) {
return llvm::all_of(Node.redecls(), [&](const Decl *D) {
diff --git a/clang-tools-extra/clang-tidy/modernize/AvoidCArraysCheck.cpp b/clang-tools-extra/clang-tidy/modernize/AvoidCArraysCheck.cpp
index 9290019..71d89d3 100644
--- a/clang-tools-extra/clang-tidy/modernize/AvoidCArraysCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/AvoidCArraysCheck.cpp
@@ -15,6 +15,14 @@ using namespace clang::ast_matchers;
namespace clang::tidy::modernize {
+template <typename TargetType, typename NodeType>
+static const TargetType *getAs(const NodeType *Node) {
+ if constexpr (std::is_same_v<NodeType, clang::DynTypedNode>)
+ return Node->template get<TargetType>();
+ else
+ return llvm::dyn_cast<TargetType>(Node);
+}
+
namespace {
AST_MATCHER(clang::TypeLoc, hasValidBeginLoc) {
@@ -39,14 +47,6 @@ AST_MATCHER(clang::ParmVarDecl, isArgvOfMain) {
return FD ? FD->isMain() : false;
}
-template <typename TargetType, typename NodeType>
-const TargetType *getAs(const NodeType *Node) {
- if constexpr (std::is_same_v<NodeType, clang::DynTypedNode>)
- return Node->template get<TargetType>();
- else
- return llvm::dyn_cast<TargetType>(Node);
-}
-
AST_MATCHER(clang::TypeLoc, isWithinImplicitTemplateInstantiation) {
const auto IsImplicitTemplateInstantiation = [](const auto *Node) {
const auto IsImplicitInstantiation = [](const auto *Node) {
diff --git a/clang-tools-extra/clang-tidy/modernize/UseAutoCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseAutoCheck.cpp
index 01796a6..084349b 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseAutoCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/UseAutoCheck.cpp
@@ -20,14 +20,13 @@ using namespace clang::ast_matchers;
using namespace clang::ast_matchers::internal;
namespace clang::tidy::modernize {
-namespace {
-const char IteratorDeclStmtId[] = "iterator_decl";
-const char DeclWithNewId[] = "decl_new";
-const char DeclWithCastId[] = "decl_cast";
-const char DeclWithTemplateCastId[] = "decl_template";
+static const char IteratorDeclStmtId[] = "iterator_decl";
+static const char DeclWithNewId[] = "decl_new";
+static const char DeclWithCastId[] = "decl_cast";
+static const char DeclWithTemplateCastId[] = "decl_template";
-size_t getTypeNameLength(bool RemoveStars, StringRef Text) {
+static size_t getTypeNameLength(bool RemoveStars, StringRef Text) {
enum CharType { Space, Alpha, Punctuation };
CharType LastChar = Space, BeforeSpace = Punctuation;
size_t NumChars = 0;
@@ -54,6 +53,7 @@ size_t getTypeNameLength(bool RemoveStars, StringRef Text) {
return NumChars;
}
+namespace {
/// Matches variable declarations that have explicit initializers that
/// are not initializer lists.
///
@@ -65,7 +65,7 @@ size_t getTypeNameLength(bool RemoveStars, StringRef Text) {
/// MyType C;
/// \endcode
///
-/// varDecl(hasWrittenNonListInitializer()) maches \c I and \c A but not \c B
+/// varDecl(hasWrittenNonListInitializer()) matches \c I and \c A but not \c B
/// or \c C.
AST_MATCHER(VarDecl, hasWrittenNonListInitializer) {
const Expr *Init = Node.getAnyInitializer();
@@ -108,6 +108,15 @@ AST_MATCHER_P(QualType, isSugarFor, Matcher<QualType>, SugarMatcher) {
}
}
+/// Matches declaration reference or member expressions with explicit template
+/// arguments.
+AST_POLYMORPHIC_MATCHER(hasExplicitTemplateArgs,
+ AST_POLYMORPHIC_SUPPORTED_TYPES(DeclRefExpr,
+ MemberExpr)) {
+ return Node.hasExplicitTemplateArgs();
+}
+} // namespace
+
/// Matches named declarations that have one of the standard iterator
/// names: iterator, reverse_iterator, const_iterator, const_reverse_iterator.
///
@@ -118,7 +127,7 @@ AST_MATCHER_P(QualType, isSugarFor, Matcher<QualType>, SugarMatcher) {
/// \endcode
///
/// namedDecl(hasStdIteratorName()) matches \c I and \c CI.
-Matcher<NamedDecl> hasStdIteratorName() {
+static Matcher<NamedDecl> hasStdIteratorName() {
static const StringRef IteratorNames[] = {"iterator", "reverse_iterator",
"const_iterator",
"const_reverse_iterator"};
@@ -137,7 +146,7 @@ Matcher<NamedDecl> hasStdIteratorName() {
///
/// recordDecl(hasStdContainerName()) matches \c vector and \c forward_list
/// but not \c my_vec.
-Matcher<NamedDecl> hasStdContainerName() {
+static Matcher<NamedDecl> hasStdContainerName() {
static StringRef ContainerNames[] = {"array", "deque",
"forward_list", "list",
"vector",
@@ -154,17 +163,9 @@ Matcher<NamedDecl> hasStdContainerName() {
return hasAnyName(ContainerNames);
}
-/// Matches declaration reference or member expressions with explicit template
-/// arguments.
-AST_POLYMORPHIC_MATCHER(hasExplicitTemplateArgs,
- AST_POLYMORPHIC_SUPPORTED_TYPES(DeclRefExpr,
- MemberExpr)) {
- return Node.hasExplicitTemplateArgs();
-}
-
/// Returns a DeclarationMatcher that matches standard iterators nested
/// inside records with a standard container name.
-DeclarationMatcher standardIterator() {
+static DeclarationMatcher standardIterator() {
return decl(
namedDecl(hasStdIteratorName()),
hasDeclContext(recordDecl(hasStdContainerName(), isInStdNamespace())));
@@ -172,19 +173,19 @@ DeclarationMatcher standardIterator() {
/// Returns a TypeMatcher that matches typedefs for standard iterators
/// inside records with a standard container name.
-TypeMatcher typedefIterator() {
+static TypeMatcher typedefIterator() {
return typedefType(hasDeclaration(standardIterator()));
}
/// Returns a TypeMatcher that matches records named for standard
/// iterators nested inside records named for standard containers.
-TypeMatcher nestedIterator() {
+static TypeMatcher nestedIterator() {
return recordType(hasDeclaration(standardIterator()));
}
/// Returns a TypeMatcher that matches types declared with using
/// declarations and which name standard iterators for standard containers.
-TypeMatcher iteratorFromUsingDeclaration() {
+static TypeMatcher iteratorFromUsingDeclaration() {
auto HasIteratorDecl = hasDeclaration(namedDecl(hasStdIteratorName()));
// Unwrap the nested name specifier to test for one of the standard
// containers.
@@ -198,7 +199,7 @@ TypeMatcher iteratorFromUsingDeclaration() {
/// This matcher returns declaration statements that contain variable
/// declarations with written non-list initializer for standard iterators.
-StatementMatcher makeIteratorDeclMatcher() {
+static StatementMatcher makeIteratorDeclMatcher() {
return declStmt(unless(has(
varDecl(anyOf(unless(hasWrittenNonListInitializer()),
unless(hasType(isSugarFor(anyOf(
@@ -207,7 +208,7 @@ StatementMatcher makeIteratorDeclMatcher() {
.bind(IteratorDeclStmtId);
}
-StatementMatcher makeDeclWithNewMatcher() {
+static StatementMatcher makeDeclWithNewMatcher() {
return declStmt(
unless(has(varDecl(anyOf(
unless(hasInitializer(ignoringParenImpCasts(cxxNewExpr()))),
@@ -225,13 +226,13 @@ StatementMatcher makeDeclWithNewMatcher() {
.bind(DeclWithNewId);
}
-StatementMatcher makeDeclWithCastMatcher() {
+static StatementMatcher makeDeclWithCastMatcher() {
return declStmt(
unless(has(varDecl(unless(hasInitializer(explicitCastExpr()))))))
.bind(DeclWithCastId);
}
-StatementMatcher makeDeclWithTemplateCastMatcher() {
+static StatementMatcher makeDeclWithTemplateCastMatcher() {
auto ST =
substTemplateTypeParmType(hasReplacementType(equalsBoundNode("arg")));
@@ -252,7 +253,7 @@ StatementMatcher makeDeclWithTemplateCastMatcher() {
.bind(DeclWithTemplateCastId);
}
-StatementMatcher makeCombinedMatcher() {
+static StatementMatcher makeCombinedMatcher() {
return declStmt(
// At least one varDecl should be a child of the declStmt to ensure
// it's a declaration list and avoid matching other declarations,
@@ -265,8 +266,6 @@ StatementMatcher makeCombinedMatcher() {
makeDeclWithCastMatcher(), makeDeclWithTemplateCastMatcher()));
}
-} // namespace
-
UseAutoCheck::UseAutoCheck(StringRef Name, ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
MinTypeNameLength(Options.get("MinTypeNameLength", 5)),
diff --git a/clang-tools-extra/clang-tidy/modernize/UseDesignatedInitializersCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseDesignatedInitializersCheck.cpp
index cc7c2d1..c1094b1 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseDesignatedInitializersCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/UseDesignatedInitializersCheck.cpp
@@ -40,6 +40,12 @@ static constexpr char StrictCppStandardComplianceName[] =
"StrictCppStandardCompliance";
static constexpr bool StrictCppStandardComplianceDefault = true;
+static unsigned getNumberOfDesignated(const InitListExpr *SyntacticInitList) {
+ return llvm::count_if(*SyntacticInitList, [](auto *InitExpr) {
+ return isa<DesignatedInitExpr>(InitExpr);
+ });
+}
+
namespace {
struct Designators {
@@ -74,12 +80,6 @@ private:
}
};
-unsigned getNumberOfDesignated(const InitListExpr *SyntacticInitList) {
- return llvm::count_if(*SyntacticInitList, [](auto *InitExpr) {
- return isa<DesignatedInitExpr>(InitExpr);
- });
-}
-
AST_MATCHER(CXXRecordDecl, isAggregate) {
return Node.hasDefinition() && Node.isAggregate();
}
diff --git a/clang-tools-extra/clang-tidy/modernize/UseEmplaceCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseEmplaceCheck.cpp
index ade0085..e585dd1 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseEmplaceCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/UseEmplaceCheck.cpp
@@ -81,41 +81,44 @@ AST_MATCHER(CXXMemberCallExpr, hasSameNumArgsAsDeclNumParams) {
AST_MATCHER(DeclRefExpr, hasExplicitTemplateArgs) {
return Node.hasExplicitTemplateArgs();
}
+} // namespace
// Helper Matcher which applies the given QualType Matcher either directly or by
// resolving a pointer type to its pointee. Used to match v.push_back() as well
// as p->push_back().
-auto hasTypeOrPointeeType(
+static auto hasTypeOrPointeeType(
const ast_matchers::internal::Matcher<QualType> &TypeMatcher) {
return anyOf(hasType(TypeMatcher),
hasType(pointerType(pointee(TypeMatcher))));
}
// Matches if the node has canonical type matching any of the given names.
-auto hasWantedType(llvm::ArrayRef<StringRef> TypeNames) {
+static auto hasWantedType(llvm::ArrayRef<StringRef> TypeNames) {
return hasCanonicalType(hasDeclaration(cxxRecordDecl(hasAnyName(TypeNames))));
}
// Matches member call expressions of the named method on the listed container
// types.
-auto cxxMemberCallExprOnContainer(StringRef MethodName,
- llvm::ArrayRef<StringRef> ContainerNames) {
+static auto
+cxxMemberCallExprOnContainer(StringRef MethodName,
+ llvm::ArrayRef<StringRef> ContainerNames) {
return cxxMemberCallExpr(
hasDeclaration(functionDecl(hasName(MethodName))),
on(hasTypeOrPointeeType(hasWantedType(ContainerNames))));
}
-const auto DefaultContainersWithPushBack =
+static const auto DefaultContainersWithPushBack =
"::std::vector; ::std::list; ::std::deque";
-const auto DefaultContainersWithPush =
+static const auto DefaultContainersWithPush =
"::std::stack; ::std::queue; ::std::priority_queue";
-const auto DefaultContainersWithPushFront =
+static const auto DefaultContainersWithPushFront =
"::std::forward_list; ::std::list; ::std::deque";
-const auto DefaultSmartPointers =
+static const auto DefaultSmartPointers =
"::std::shared_ptr; ::std::unique_ptr; ::std::auto_ptr; ::std::weak_ptr";
-const auto DefaultTupleTypes = "::std::pair; ::std::tuple";
-const auto DefaultTupleMakeFunctions = "::std::make_pair; ::std::make_tuple";
-const auto DefaultEmplacyFunctions =
+static const auto DefaultTupleTypes = "::std::pair; ::std::tuple";
+static const auto DefaultTupleMakeFunctions =
+ "::std::make_pair; ::std::make_tuple";
+static const auto DefaultEmplacyFunctions =
"vector::emplace_back; vector::emplace;"
"deque::emplace; deque::emplace_front; deque::emplace_back;"
"forward_list::emplace_after; forward_list::emplace_front;"
@@ -129,7 +132,6 @@ const auto DefaultEmplacyFunctions =
"unordered_multiset::emplace; unordered_multiset::emplace_hint;"
"unordered_multimap::emplace; unordered_multimap::emplace_hint;"
"stack::emplace; queue::emplace; priority_queue::emplace";
-} // namespace
UseEmplaceCheck::UseEmplaceCheck(StringRef Name, ClangTidyContext *Context)
: ClangTidyCheck(Name, Context), IgnoreImplicitConstructors(Options.get(
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index 6f6da57..4cf8574 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -29,6 +29,8 @@ AST_MATCHER(Stmt, isMacroExpansion) {
AST_MATCHER(Stmt, isC23) { return Finder->getASTContext().getLangOpts().C23; }
+// Preserve same name as AST_MATCHER(isNULLMacroExpansion)
+// NOLINTNEXTLINE(llvm-prefer-static-over-anonymous-namespace)
bool isNULLMacroExpansion(const Stmt *Statement, ASTContext &Context) {
SourceManager &SM = Context.getSourceManager();
const LangOptions &LO = Context.getLangOpts();
diff --git a/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp b/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
index fd4320e..706dd67 100644
--- a/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
+++ b/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
@@ -44,10 +44,9 @@ ExceptionAnalyzer::ExceptionInfo &ExceptionAnalyzer::ExceptionInfo::merge(
}
// FIXME: This could be ported to clang later.
-namespace {
-bool isUnambiguousPublicBaseClass(const Type *DerivedType,
- const Type *BaseType) {
+static bool isUnambiguousPublicBaseClass(const Type *DerivedType,
+ const Type *BaseType) {
const auto *DerivedClass =
DerivedType->getCanonicalTypeUnqualified()->getAsCXXRecordDecl();
const auto *BaseClass =
@@ -78,11 +77,11 @@ bool isUnambiguousPublicBaseClass(const Type *DerivedType,
IsPublicBaseClass;
}
-inline bool isPointerOrPointerToMember(const Type *T) {
+static bool isPointerOrPointerToMember(const Type *T) {
return T->isPointerType() || T->isMemberPointerType();
}
-std::optional<QualType> getPointeeOrArrayElementQualType(QualType T) {
+static std::optional<QualType> getPointeeOrArrayElementQualType(QualType T) {
if (T->isAnyPointerType() || T->isMemberPointerType())
return T->getPointeeType();
@@ -92,7 +91,7 @@ std::optional<QualType> getPointeeOrArrayElementQualType(QualType T) {
return std::nullopt;
}
-bool isBaseOf(const Type *DerivedType, const Type *BaseType) {
+static bool isBaseOf(const Type *DerivedType, const Type *BaseType) {
const auto *DerivedClass = DerivedType->getAsCXXRecordDecl();
const auto *BaseClass = BaseType->getAsCXXRecordDecl();
if (!DerivedClass || !BaseClass)
@@ -103,12 +102,12 @@ bool isBaseOf(const Type *DerivedType, const Type *BaseType) {
}
// Check if T1 is more or Equally qualified than T2.
-bool moreOrEquallyQualified(QualType T1, QualType T2) {
+static bool moreOrEquallyQualified(QualType T1, QualType T2) {
return T1.getQualifiers().isStrictSupersetOf(T2.getQualifiers()) ||
T1.getQualifiers() == T2.getQualifiers();
}
-bool isStandardPointerConvertible(QualType From, QualType To) {
+static bool isStandardPointerConvertible(QualType From, QualType To) {
assert((From->isPointerType() || From->isMemberPointerType()) &&
(To->isPointerType() || To->isMemberPointerType()) &&
"Pointer conversion should be performed on pointer types only.");
@@ -150,7 +149,7 @@ bool isStandardPointerConvertible(QualType From, QualType To) {
return false;
}
-bool isFunctionPointerConvertible(QualType From, QualType To) {
+static bool isFunctionPointerConvertible(QualType From, QualType To) {
if (!From->isFunctionPointerType() && !From->isFunctionType() &&
!From->isMemberFunctionPointerType())
return false;
@@ -192,8 +191,8 @@ bool isFunctionPointerConvertible(QualType From, QualType To) {
// from the C rules.
//
// The function should only be called in C++ mode.
-bool isQualificationConvertiblePointer(QualType From, QualType To,
- LangOptions LangOpts) {
+static bool isQualificationConvertiblePointer(QualType From, QualType To,
+ LangOptions LangOpts) {
// [N4659 7.5 (1)]
// A cv-decomposition of a type T is a sequence of cv_i and P_i such that T is
@@ -320,7 +319,6 @@ bool isQualificationConvertiblePointer(QualType From, QualType To,
return From.getTypePtr() == To.getTypePtr();
}
-} // namespace
static bool canThrow(const FunctionDecl *Func) {
// consteval specifies that every call to the function must produce a
diff --git a/clang-tools-extra/clangd/Selection.cpp b/clang-tools-extra/clangd/Selection.cpp
index 06165df..faa00d2 100644
--- a/clang-tools-extra/clangd/Selection.cpp
+++ b/clang-tools-extra/clangd/Selection.cpp
@@ -958,6 +958,18 @@ private:
claimRange(SourceRange(FTL.getLParenLoc(), FTL.getEndLoc()), Result);
return;
}
+ if (auto ATL = TL->getAs<AttributedTypeLoc>()) {
+ // For attributed function types like `int foo() [[attr]]`, the
+ // AttributedTypeLoc's range includes the function name. We want to
+ // allow the function name to be associated with the FunctionDecl
+ // rather than the AttributedTypeLoc, so we only claim the attribute
+ // range itself.
+ if (ATL.getModifiedLoc().getAs<FunctionTypeLoc>()) {
+ // Only claim the attribute's source range, not the whole type.
+ claimRange(ATL.getLocalSourceRange(), Result);
+ return;
+ }
+ }
}
claimRange(getSourceRange(N), Result);
}
diff --git a/clang-tools-extra/clangd/refactor/tweaks/OverridePureVirtuals.cpp b/clang-tools-extra/clangd/refactor/tweaks/OverridePureVirtuals.cpp
index 16febec..b557066 100644
--- a/clang-tools-extra/clangd/refactor/tweaks/OverridePureVirtuals.cpp
+++ b/clang-tools-extra/clangd/refactor/tweaks/OverridePureVirtuals.cpp
@@ -79,7 +79,7 @@
#include "clang/AST/ASTContext.h"
#include "clang/AST/DeclCXX.h"
-#include "clang/AST/Type.h"
+#include "clang/AST/TypeBase.h"
#include "clang/AST/TypeLoc.h"
#include "clang/Basic/LLVM.h"
#include "clang/Basic/SourceLocation.h"
@@ -116,7 +116,8 @@ std::string removePureVirtualSyntax(const std::string &MethodDecl,
DeclString += Tk.text();
if (Tk.Kind != tok::l_paren && Next.Kind != tok::comma &&
- Next.Kind != tok::r_paren && Next.Kind != tok::l_paren)
+ Next.Kind != tok::r_paren && Next.Kind != tok::l_paren &&
+ Tk.Kind != tok::coloncolon && Next.Kind != tok::coloncolon)
DeclString += ' ';
}
// Trim the last whitespace.
diff --git a/clang-tools-extra/clangd/unittests/SelectionTests.cpp b/clang-tools-extra/clangd/unittests/SelectionTests.cpp
index 3df19d8..63c0403 100644
--- a/clang-tools-extra/clangd/unittests/SelectionTests.cpp
+++ b/clang-tools-extra/clangd/unittests/SelectionTests.cpp
@@ -311,6 +311,19 @@ TEST(SelectionTest, CommonAncestor) {
{"[[void foo^()]];", "FunctionProtoTypeLoc"},
{"[[^void foo^()]];", "FunctionDecl"},
{"[[void ^foo()]];", "FunctionDecl"},
+ // Tricky case: with function attributes, the AttributedTypeLoc's range
+ // includes the function name, but we want the name to be associated with
+ // the CXXMethodDecl.
+ {"struct X { [[const int* ^Get() const <:[clang::lifetimebound]:> "
+ "{return nullptr;}]]; };",
+ "CXXMethodDecl"},
+ // When the cursor is on the attribute itself, we should select the
+ // AttributedTypeLoc. Note: Due to a bug or deliberate quirk in the AST
+ // modeling of AttributedTypeLoc, its range ends at the attribute name
+ // token, not including the closing brackets ":>:>".
+ {"struct X { const [[int* Foo() const <:<:clang::life^timebound]]:>:> "
+ "{return nullptr;}; };",
+ "AttributedTypeLoc"},
// Tricky case: two VarDecls share a specifier.
{"[[int ^a]], b;", "VarDecl"},
{"[[int a, ^b]];", "VarDecl"},
diff --git a/clang-tools-extra/clangd/unittests/tweaks/OverridePureVirtualsTests.cpp b/clang-tools-extra/clangd/unittests/tweaks/OverridePureVirtualsTests.cpp
index b7dcbee..72095ab 100644
--- a/clang-tools-extra/clangd/unittests/tweaks/OverridePureVirtualsTests.cpp
+++ b/clang-tools-extra/clangd/unittests/tweaks/OverridePureVirtualsTests.cpp
@@ -715,6 +715,45 @@ public:
EXPECT_EQ(Expected, Applied) << "Applied result:\n" << Applied;
}
+TEST_F(OverridePureVirtualsTests, QualifiedNames) {
+ constexpr auto Before = R"cpp(
+namespace foo { struct S{}; namespace bar { struct S2{}; } }
+
+class B {
+public:
+ virtual foo::S foo(int var = 0) = 0;
+ virtual foo::bar::S2 bar(int var = 0) = 0;
+};
+
+class ^D : public B {};
+)cpp";
+
+ constexpr auto Expected = R"cpp(
+namespace foo { struct S{}; namespace bar { struct S2{}; } }
+
+class B {
+public:
+ virtual foo::S foo(int var = 0) = 0;
+ virtual foo::bar::S2 bar(int var = 0) = 0;
+};
+
+class D : public B {
+public:
+ foo::S foo(int var = 0) override {
+ // TODO: Implement this pure virtual method.
+ static_assert(false, "Method `foo` is not implemented.");
+ }
+
+ foo::bar::S2 bar(int var = 0) override {
+ // TODO: Implement this pure virtual method.
+ static_assert(false, "Method `bar` is not implemented.");
+ }
+};
+)cpp";
+ auto Applied = apply(Before);
+ EXPECT_EQ(Expected, Applied) << "Applied result:\n" << Applied;
+}
+
} // namespace
} // namespace clangd
} // namespace clang
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 6701bf2..26f00e9 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -184,17 +184,17 @@ Improvements to clang-tidy
New checks
^^^^^^^^^^
+- New :doc:`bugprone-derived-method-shadowing-base-method
+ <clang-tidy/checks/bugprone/derived-method-shadowing-base-method>` check.
+
+ Finds derived class methods that shadow a (non-virtual) base class method.
+
- New :doc:`bugprone-invalid-enum-default-initialization
<clang-tidy/checks/bugprone/invalid-enum-default-initialization>` check.
Detects default initialization (to 0) of variables with ``enum`` type where
the enum has no enumerator with value of 0.
-- New :doc:`bugprone-derived-method-shadowing-base-method
- <clang-tidy/checks/bugprone/derived-method-shadowing-base-method>` check.
-
- Finds derived class methods that shadow a (non-virtual) base class method.
-
- New :doc:`cppcoreguidelines-pro-bounds-avoid-unchecked-container-access
<clang-tidy/checks/cppcoreguidelines/pro-bounds-avoid-unchecked-container-access>`
check.
@@ -264,6 +264,16 @@ New check aliases
<clang-tidy/checks/bugprone/throwing-static-initialization>`
keeping initial check as an alias to the new one.
+- Renamed :doc:`cert-mem57-cpp <clang-tidy/checks/cert/mem57-cpp>` to
+ :doc:`bugprone-default-operator-new-on-overaligned-type
+ <clang-tidy/checks/bugprone/default-operator-new-on-overaligned-type>`
+ keeping initial check as an alias to the new one.
+
+- Renamed :doc:`cert-oop57-cpp <clang-tidy/checks/cert/oop57-cpp>` to
+ :doc:`bugprone-raw-memory-call-on-non-trivial-type
+ <clang-tidy/checks/bugprone/raw-memory-call-on-non-trivial-type>`
+ keeping initial check as an alias to the new one.
+
Changes in existing checks
^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -367,9 +377,10 @@ Changes in existing checks
- Improved :doc:`misc-const-correctness
<clang-tidy/checks/misc/const-correctness>` check to avoid false
- positives when pointers is transferred to non-const references
+ positives when pointers is transferred to non-const references
and avoid false positives of function pointer and fix false
- positives on return of non-const pointer.
+ positives on return of non-const pointer and fix false positives on
+ pointer-to-member operator.
- Improved :doc:`misc-header-include-cycle
<clang-tidy/checks/misc/header-include-cycle>` check performance.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/bugprone/default-operator-new-on-overaligned-type.rst b/clang-tools-extra/docs/clang-tidy/checks/bugprone/default-operator-new-on-overaligned-type.rst
new file mode 100644
index 0000000..c991812
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/bugprone/default-operator-new-on-overaligned-type.rst
@@ -0,0 +1,20 @@
+.. title:: clang-tidy - bugprone-default-operator-new-on-overaligned-type
+
+bugprone-default-operator-new-on-overaligned-type
+=================================================
+
+Flags uses of default ``operator new`` where the type has extended
+alignment (an alignment greater than the fundamental alignment).
+
+The default ``operator new`` is guaranteed to provide the correct alignment
+if the requested alignment is less or equal to the fundamental alignment.
+Only cases are detected (by design) where the ``operator new`` is not
+user-defined and is not a placement new (the reason is that in these cases we
+assume that the user provided the correct memory allocation).
+
+References
+----------
+
+This check corresponds to the CERT C++ Coding Standard rule
+`MEM57-CPP. Avoid using default operator new for over-aligned types
+<https://wiki.sei.cmu.edu/confluence/display/cplusplus/MEM57-CPP.+Avoid+using+default+operator+new+for+over-aligned+types>`_.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/bugprone/raw-memory-call-on-non-trivial-type.rst b/clang-tools-extra/docs/clang-tidy/checks/bugprone/raw-memory-call-on-non-trivial-type.rst
new file mode 100644
index 0000000..0ce7f80
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/bugprone/raw-memory-call-on-non-trivial-type.rst
@@ -0,0 +1,35 @@
+.. title:: clang-tidy - bugprone-raw-memory-call-on-non-trivial-type
+
+bugprone-raw-memory-call-on-non-trivial-type
+============================================
+
+Flags use of the C standard library functions ``memset``, ``memcpy`` and
+``memcmp`` and similar derivatives on non-trivial types.
+
+The check will detect the following functions: ``memset``, ``std::memset``,
+``std::memcpy``, ``memcpy``, ``std::memmove``, ``memmove``, ``std::strcpy``,
+``strcpy``, ``memccpy``, ``stpncpy``, ``strncpy``, ``std::memcmp``, ``memcmp``,
+``std::strcmp``, ``strcmp``, ``strncmp``.
+
+Options
+-------
+
+.. option:: MemSetNames
+
+ Specify extra functions to flag that act similarly to ``memset``. Specify
+ names in a semicolon-delimited list. Default is an empty string.
+
+.. option:: MemCpyNames
+
+ Specify extra functions to flag that act similarly to ``memcpy``. Specify
+ names in a semicolon-delimited list. Default is an empty string.
+
+.. option:: MemCmpNames
+
+ Specify extra functions to flag that act similarly to ``memcmp``. Specify
+ names in a semicolon-delimited list. Default is an empty string.
+
+This check corresponds to the CERT C++ Coding Standard rule
+`OOP57-CPP. Prefer special member functions and overloaded operators to C
+Standard Library functions
+<https://wiki.sei.cmu.edu/confluence/display/cplusplus/OOP57-CPP.+Prefer+special+member+functions+and+overloaded+operators+to+C+Standard+Library+functions>`_.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/cert/mem57-cpp.rst b/clang-tools-extra/docs/clang-tidy/checks/cert/mem57-cpp.rst
index 135cfb8..cc0c729 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/cert/mem57-cpp.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/cert/mem57-cpp.rst
@@ -3,13 +3,9 @@
cert-mem57-cpp
==============
-This check flags uses of default ``operator new`` where the type has extended
-alignment (an alignment greater than the fundamental alignment). (The default
-``operator new`` is guaranteed to provide the correct alignment if the
-requested alignment is less or equal to the fundamental alignment).
-Only cases are detected (by design) where the ``operator new`` is not
-user-defined and is not a placement new (the reason is that in these cases we
-assume that the user provided the correct memory allocation).
+The `cert-mem57-cpp` is an aliaes, please see
+`bugprone-default-operator-new-on-overaligned-type <../bugprone/default-operator-new-on-overaligned-type>`_
+for more information.
This check corresponds to the CERT C++ Coding Standard rule
`MEM57-CPP. Avoid using default operator new for over-aligned types
diff --git a/clang-tools-extra/docs/clang-tidy/checks/cert/oop57-cpp.rst b/clang-tools-extra/docs/clang-tidy/checks/cert/oop57-cpp.rst
index 4787abf..414f788 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/cert/oop57-cpp.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/cert/oop57-cpp.rst
@@ -1,38 +1,13 @@
.. title:: clang-tidy - cert-oop57-cpp
+.. meta::
+ :http-equiv=refresh: 5;URL=../bugprone/raw-memory-call-on-non-trivial-type.html
cert-oop57-cpp
==============
- Flags use of the `C` standard library functions ``memset``, ``memcpy`` and
- ``memcmp`` and similar derivatives on non-trivial types.
-
-Options
--------
-
-.. option:: MemSetNames
-
- Specify extra functions to flag that act similarly to ``memset``.
- Specify names in a semicolon delimited list.
- Default is an empty string.
- The check will detect the following functions:
- `memset`, `std::memset`.
-
-.. option:: MemCpyNames
-
- Specify extra functions to flag that act similarly to ``memcpy``.
- Specify names in a semicolon delimited list.
- Default is an empty string.
- The check will detect the following functions:
- `std::memcpy`, `memcpy`, `std::memmove`, `memmove`, `std::strcpy`,
- `strcpy`, `memccpy`, `stpncpy`, `strncpy`.
-
-.. option:: MemCmpNames
-
- Specify extra functions to flag that act similarly to ``memcmp``.
- Specify names in a semicolon delimited list.
- Default is an empty string.
- The check will detect the following functions:
- `std::memcmp`, `memcmp`, `std::strcmp`, `strcmp`, `strncmp`.
+The `cert-oop57-cpp` check is an alias, please see
+`bugprone-raw-memory-call-on-non-trivial-type <../bugprone/raw-memory-call-on-non-trivial-type.html>`_
+for more information.
This check corresponds to the CERT C++ Coding Standard rule
`OOP57-CPP. Prefer special member functions and overloaded operators to C
diff --git a/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines/pro-bounds-avoid-unchecked-container-access.rst b/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines/pro-bounds-avoid-unchecked-container-access.rst
index 556d902..1ecdcdb 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines/pro-bounds-avoid-unchecked-container-access.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines/pro-bounds-avoid-unchecked-container-access.rst
@@ -39,8 +39,8 @@ Options
.. option:: ExcludeClasses
- Semicolon-delimited list of class names for overwriting the default
- exclusion list. The default is:
+ Semicolon-separated list of regular expressions matching class names that
+ overwrites the default exclusion list. The default is:
`::std::map;::std::unordered_map;::std::flat_map`.
.. option:: FixMode
diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst
index d3c89e4..e14ac71 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/list.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst
@@ -92,6 +92,7 @@ Clang-Tidy Checks
:doc:`bugprone-copy-constructor-init <bugprone/copy-constructor-init>`, "Yes"
:doc:`bugprone-crtp-constructor-accessibility <bugprone/crtp-constructor-accessibility>`, "Yes"
:doc:`bugprone-dangling-handle <bugprone/dangling-handle>`,
+ :doc:`bugprone-default-operator-new-on-overaligned-type <bugprone/default-operator-new-on-overaligned-type>`,
:doc:`bugprone-derived-method-shadowing-base-method <bugprone/derived-method-shadowing-base-method>`,
:doc:`bugprone-dynamic-static-initializers <bugprone/dynamic-static-initializers>`,
:doc:`bugprone-easily-swappable-parameters <bugprone/easily-swappable-parameters>`,
@@ -129,6 +130,7 @@ Clang-Tidy Checks
:doc:`bugprone-parent-virtual-call <bugprone/parent-virtual-call>`, "Yes"
:doc:`bugprone-pointer-arithmetic-on-polymorphic-object <bugprone/pointer-arithmetic-on-polymorphic-object>`,
:doc:`bugprone-posix-return <bugprone/posix-return>`, "Yes"
+ :doc:`bugprone-raw-memory-call-on-non-trivial-type <bugprone/raw-memory-call-on-non-trivial-type>`,
:doc:`bugprone-redundant-branch-condition <bugprone/redundant-branch-condition>`, "Yes"
:doc:`bugprone-reserved-identifier <bugprone/reserved-identifier>`, "Yes"
:doc:`bugprone-return-const-ref-from-parameter <bugprone/return-const-ref-from-parameter>`,
@@ -177,10 +179,8 @@ Clang-Tidy Checks
:doc:`cert-err33-c <cert/err33-c>`,
:doc:`cert-err60-cpp <cert/err60-cpp>`,
:doc:`cert-flp30-c <cert/flp30-c>`,
- :doc:`cert-mem57-cpp <cert/mem57-cpp>`,
:doc:`cert-msc50-cpp <cert/msc50-cpp>`,
:doc:`cert-msc51-cpp <cert/msc51-cpp>`,
- :doc:`cert-oop57-cpp <cert/oop57-cpp>`,
:doc:`cert-oop58-cpp <cert/oop58-cpp>`,
:doc:`concurrency-mt-unsafe <concurrency/mt-unsafe>`,
:doc:`concurrency-thread-canceltype-asynchronous <concurrency/thread-canceltype-asynchronous>`,
@@ -442,8 +442,8 @@ Check aliases
:doc:`cert-dcl51-cpp <cert/dcl51-cpp>`, :doc:`bugprone-reserved-identifier <bugprone/reserved-identifier>`, "Yes"
:doc:`cert-dcl54-cpp <cert/dcl54-cpp>`, :doc:`misc-new-delete-overloads <misc/new-delete-overloads>`,
:doc:`cert-dcl59-cpp <cert/dcl59-cpp>`, :doc:`google-build-namespaces <google/build-namespaces>`,
- :doc:`cert-err09-cpp <cert/err09-cpp>`, :doc:`misc-throw-by-value-catch-by-reference <misc/throw-by-value-catch-by-reference>`,
:doc:`cert-env33-c <cert/env33-c>`, :doc:`bugprone-command-processor <bugprone/command-processor>`,
+ :doc:`cert-err09-cpp <cert/err09-cpp>`, :doc:`misc-throw-by-value-catch-by-reference <misc/throw-by-value-catch-by-reference>`,
:doc:`cert-err34-c <cert/err34-c>`, :doc:`bugprone-unchecked-string-to-number-conversion <bugprone/unchecked-string-to-number-conversion>`,
:doc:`cert-err52-cpp <cert/err52-cpp>`, :doc:`modernize-avoid-setjmp-longjmp <modernize/avoid-setjmp-longjmp>`,
:doc:`cert-err58-cpp <cert/err58-cpp>`, :doc:`bugprone-throwing-static-initialization <bugprone/throwing-static-initialization>`,
@@ -452,6 +452,7 @@ Check aliases
:doc:`cert-fio38-c <cert/fio38-c>`, :doc:`misc-non-copyable-objects <misc/non-copyable-objects>`,
:doc:`cert-flp37-c <cert/flp37-c>`, :doc:`bugprone-suspicious-memory-comparison <bugprone/suspicious-memory-comparison>`,
:doc:`cert-int09-c <cert/int09-c>`, :doc:`readability-enum-initial-value <readability/enum-initial-value>`, "Yes"
+ :doc:`cert-mem57-cpp <cert/mem57-cpp>`, :doc:`bugprone-default-operator-new-on-overaligned-type <bugprone/default-operator-new-on-overaligned-type>`,
:doc:`cert-msc24-c <cert/msc24-c>`, :doc:`bugprone-unsafe-functions <bugprone/unsafe-functions>`,
:doc:`cert-msc30-c <cert/msc30-c>`, :doc:`cert-msc50-cpp <cert/msc50-cpp>`,
:doc:`cert-msc32-c <cert/msc32-c>`, :doc:`cert-msc51-cpp <cert/msc51-cpp>`,
@@ -459,6 +460,7 @@ Check aliases
:doc:`cert-msc54-cpp <cert/msc54-cpp>`, :doc:`bugprone-signal-handler <bugprone/signal-handler>`,
:doc:`cert-oop11-cpp <cert/oop11-cpp>`, :doc:`performance-move-constructor-init <performance/move-constructor-init>`,
:doc:`cert-oop54-cpp <cert/oop54-cpp>`, :doc:`bugprone-unhandled-self-assignment <bugprone/unhandled-self-assignment>`,
+ :doc:`cert-oop57-cpp <cert/oop57-cpp>`, :doc:`bugprone-raw-memory-call-on-non-trivial-type <bugprone/raw-memory-call-on-non-trivial-type>`,
:doc:`cert-pos44-c <cert/pos44-c>`, :doc:`bugprone-bad-signal-to-kill-thread <bugprone/bad-signal-to-kill-thread>`,
:doc:`cert-pos47-c <cert/pos47-c>`, :doc:`concurrency-thread-canceltype-asynchronous <concurrency/thread-canceltype-asynchronous>`,
:doc:`cert-sig30-c <cert/sig30-c>`, :doc:`bugprone-signal-handler <bugprone/signal-handler>`,
diff --git a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-std-format.rst b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-std-format.rst
index cfa11d3..7038e7b 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-std-format.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-std-format.rst
@@ -62,12 +62,12 @@ Options
.. option:: StrFormatLikeFunctions
- A semicolon-separated list of (fully qualified) function names to
- replace, with the requirement that the first parameter contains the
- printf-style format string and the arguments to be formatted follow
- immediately afterwards. Qualified member function names are supported,
- but the replacement function name must be unqualified. The default value
- for this option is `absl::StrFormat`.
+ A semicolon-separated list of regular expressions matching the
+ (fully qualified) names of functions to replace, with the requirement that
+ the first parameter contains the printf-style format string and the
+ arguments to be formatted follow immediately afterwards. Qualified member
+ function names are supported, but the replacement function name must be
+ unqualified. The default value is `absl::StrFormat`.
.. option:: ReplacementFormatFunction
diff --git a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-std-print.rst b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-std-print.rst
index 0cf51e3..eb2159b 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-std-print.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-std-print.rst
@@ -122,25 +122,27 @@ Options
.. option:: PrintfLikeFunctions
- A semicolon-separated list of (fully qualified) function names to
- replace, with the requirement that the first parameter contains the
- printf-style format string and the arguments to be formatted follow
- immediately afterwards. Qualified member function names are supported,
- but the replacement function name must be unqualified. If neither this
- option nor `FprintfLikeFunctions` are set then the default value for
- this option is `printf; absl::PrintF`, otherwise it is empty.
+ A semicolon-separated list of regular expressions matching the
+ (fully qualified) names of functions to replace, with the requirement
+ that the first parameter contains the printf-style format string and the
+ arguments to be formatted follow immediately afterwards. Qualified member
+ function names are supported, but the replacement function name must be
+ unqualified. If neither this option nor `FprintfLikeFunctions` are set then
+ the default value is `printf; absl::PrintF`, otherwise it is the empty
+ string.
.. option:: FprintfLikeFunctions
- A semicolon-separated list of (fully qualified) function names to
- replace, with the requirement that the first parameter is retained, the
- second parameter contains the printf-style format string and the
- arguments to be formatted follow immediately afterwards. Qualified
- member function names are supported, but the replacement function name
- must be unqualified. If neither this option nor `PrintfLikeFunctions`
- are set then the default value for this option is `fprintf;
- absl::FPrintF`, otherwise it is empty.
+ A semicolon-separated list of regular expressions matching the
+ (fully qualified) names of functions to replace, with the requirement
+ that the first parameter is retained, the second parameter contains the
+ printf-style format string and the arguments to be formatted follow
+ immediately afterwards. Qualified member function names are supported,
+ but the replacement function name must be unqualified. If neither this
+ option nor `PrintfLikeFunctions` are set then the default value is
+ `fprintf;absl::FPrintF`, otherwise it is the empty string.
+
.. option:: ReplacementPrintFunction
diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability/container-size-empty.rst b/clang-tools-extra/docs/clang-tidy/checks/readability/container-size-empty.rst
index da6f770..cc012fd 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/readability/container-size-empty.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability/container-size-empty.rst
@@ -30,8 +30,8 @@ Options
.. option:: ExcludedComparisonTypes
- A semicolon-separated list of class names for which the check will ignore
- comparisons of objects with default-constructed objects of the same type.
- If a class is listed here, the check will not suggest using ``empty()``
- instead of such comparisons for objects of that class.
- Default value is: `::std::array`.
+ A semicolon-separated list of regular expressions matching class names for
+ which the check will ignore comparisons of objects with default-constructed
+ objects of the same type. If a class is listed here, the check will not
+ suggest using ``empty()`` instead of such comparisons for objects of that
+ class. Default value is: `::std::array`.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability/redundant-string-cstr.rst b/clang-tools-extra/docs/clang-tidy/checks/readability/redundant-string-cstr.rst
index 2789f9c..7b50777 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/readability/redundant-string-cstr.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability/redundant-string-cstr.rst
@@ -11,10 +11,10 @@ Options
.. option:: StringParameterFunctions
- A semicolon-separated list of (fully qualified) function/method/operator
- names, with the requirement that any parameter currently accepting a
- ``const char*`` input should also be able to accept ``std::string``
- inputs, or proper overload candidates that can do so should exist. This
- can be used to configure functions such as ``fmt::format``,
- ``spdlog::logger::info``, or wrappers around these and similar
- functions. The default value is the empty string.
+ A semicolon-separated list of regular expressions matching the
+ (fully qualified) names of function/method/operator, with the requirement
+ that any parameter currently accepting a ``const char*`` input should also
+ be able to accept ``std::string`` inputs, or proper overload candidates that
+ can do so should exist. This can be used to configure functions such as
+ ``fmt::format``, ``spdlog::logger::info``, or wrappers around these and
+ similar functions. The default value is the empty string.
diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/default-operator-new-on-overaligned-type-cpp17.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/default-operator-new-on-overaligned-type-cpp17.cpp
new file mode 100644
index 0000000..b05108c
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/default-operator-new-on-overaligned-type-cpp17.cpp
@@ -0,0 +1,12 @@
+// RUN: %check_clang_tidy %s -std=c++14 bugprone-default-operator-new-on-overaligned-type %t
+// RUN: clang-tidy -checks='-*,bugprone-default-operator-new-on-overaligned-type' --extra-arg=-Wno-unused-variable --warnings-as-errors='*' %s -- -std=c++17 -faligned-allocation
+// RUN: clang-tidy -checks='-*,bugprone-default-operator-new-on-overaligned-type' --extra-arg=-Wno-unused-variable --warnings-as-errors='*' %s -- -std=c++17 -faligned-allocation
+
+struct alignas(128) Vector {
+ char Elems[128];
+};
+
+void f() {
+ auto *V1 = new Vector; // CHECK-MESSAGES: warning: allocation function returns a pointer with alignment {{[0-9]+}} but the over-aligned type being allocated requires alignment 128 [bugprone-default-operator-new-on-overaligned-type]
+ auto *V1_Arr = new Vector[2]; // CHECK-MESSAGES: warning: allocation function returns a pointer with alignment {{[0-9]+}} but the over-aligned type being allocated requires alignment 128 [bugprone-default-operator-new-on-overaligned-type]
+}
diff --git a/clang-tools-extra/test/clang-tidy/checkers/cert/mem57-cpp.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/default-operator-new-on-overaligned-type.cpp
index e0300e3..379d8a2 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/cert/mem57-cpp.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/default-operator-new-on-overaligned-type.cpp
@@ -1,4 +1,4 @@
-// RUN: %check_clang_tidy %s -std=c++14 cert-mem57-cpp %t
+// RUN: %check_clang_tidy %s -std=c++14 bugprone-default-operator-new-on-overaligned-type %t
namespace std {
typedef __typeof(sizeof(int)) size_t;
@@ -30,10 +30,10 @@ struct alignas(8) Vector4 {
void f() {
auto *V1 = new Vector1;
- // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: allocation function returns a pointer with alignment {{[0-9]+}} but the over-aligned type being allocated requires alignment 128 [cert-mem57-cpp]
+ // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: allocation function returns a pointer with alignment {{[0-9]+}} but the over-aligned type being allocated requires alignment 128 [bugprone-default-operator-new-on-overaligned-type]
auto *V2 = new Vector2;
auto *V3 = new Vector3;
auto *V4 = new Vector4;
auto *V1_Arr = new Vector1[2];
- // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: allocation function returns a pointer with alignment {{[0-9]+}} but the over-aligned type being allocated requires alignment 128 [cert-mem57-cpp]
+ // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: allocation function returns a pointer with alignment {{[0-9]+}} but the over-aligned type being allocated requires alignment 128 [bugprone-default-operator-new-on-overaligned-type]
}
diff --git a/clang-tools-extra/test/clang-tidy/checkers/cert/oop57-cpp.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/raw-memory-call-on-non-trivial-type.cpp
index e34315f..41a86ff 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/cert/oop57-cpp.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/raw-memory-call-on-non-trivial-type.cpp
@@ -1,8 +1,8 @@
-// RUN: %check_clang_tidy %s cert-oop57-cpp %t -- \
+// RUN: %check_clang_tidy %s bugprone-raw-memory-call-on-non-trivial-type %t -- \
// RUN: -config='{CheckOptions: \
-// RUN: {cert-oop57-cpp.MemSetNames: mymemset, \
-// RUN: cert-oop57-cpp.MemCpyNames: mymemcpy, \
-// RUN: cert-oop57-cpp.MemCmpNames: mymemcmp}}' \
+// RUN: {bugprone-raw-memory-call-on-non-trivial-type.MemSetNames: mymemset, \
+// RUN: bugprone-raw-memory-call-on-non-trivial-type.MemCpyNames: mymemcpy, \
+// RUN: bugprone-raw-memory-call-on-non-trivial-type.MemCmpNames: mymemcmp}}' \
// RUN: --
void mymemset(void *, unsigned char, decltype(sizeof(int)));
diff --git a/clang-tools-extra/test/clang-tidy/checkers/cert/mem57-cpp-cpp17.cpp b/clang-tools-extra/test/clang-tidy/checkers/cert/mem57-cpp-cpp17.cpp
deleted file mode 100644
index 38ffcbd..0000000
--- a/clang-tools-extra/test/clang-tidy/checkers/cert/mem57-cpp-cpp17.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-// RUN: %check_clang_tidy %s -std=c++14 cert-mem57-cpp %t
-// RUN: clang-tidy -checks='-*,cert-mem57-cpp' --extra-arg=-Wno-unused-variable --warnings-as-errors='*' %s -- -std=c++17 -faligned-allocation
-// RUN: clang-tidy -checks='-*,cert-mem57-cpp' --extra-arg=-Wno-unused-variable --warnings-as-errors='*' %s -- -std=c++17 -faligned-allocation
-
-struct alignas(128) Vector {
- char Elems[128];
-};
-
-void f() {
- auto *V1 = new Vector; // CHECK-MESSAGES: warning: allocation function returns a pointer with alignment {{[0-9]+}} but the over-aligned type being allocated requires alignment 128 [cert-mem57-cpp]
- auto *V1_Arr = new Vector[2]; // CHECK-MESSAGES: warning: allocation function returns a pointer with alignment {{[0-9]+}} but the over-aligned type being allocated requires alignment 128 [cert-mem57-cpp]
-}
diff --git a/clang-tools-extra/test/clang-tidy/checkers/llvm/use-new-mlir-op-builder.cpp b/clang-tools-extra/test/clang-tidy/checkers/llvm/use-new-mlir-op-builder.cpp
index b57eab0..c4a1d8d 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/llvm/use-new-mlir-op-builder.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/llvm/use-new-mlir-op-builder.cpp
@@ -2,6 +2,7 @@
namespace mlir {
class Location {};
+class Value {};
class OpBuilder {
public:
template <typename OpTy, typename... Args>
@@ -28,6 +29,13 @@ struct NamedOp {
static NamedOp create(OpBuilder &builder, Location location, const char* name) {
return NamedOp(name);
}
+ Value getResult() { return Value(); }
+};
+struct OperandOp {
+ OperandOp(Value val) {}
+ static OperandOp create(OpBuilder &builder, Location location, Value val) {
+ return OperandOp(val);
+ }
};
} // namespace mlir
@@ -40,6 +48,22 @@ void g(mlir::OpBuilder &b) {
b.create<T>(b.getUnknownLoc(), "gaz");
}
+class CustomBuilder : public mlir::ImplicitLocOpBuilder {
+public:
+ mlir::NamedOp f(const char *name) {
+ // CHECK-MESSAGES: :[[@LINE+2]]:12: warning: use 'OpType::create(builder, ...)'
+ // CHECK-FIXES: return mlir::NamedOp::create(*this, name);
+ return create<mlir::NamedOp>(name);
+ }
+
+ mlir::NamedOp g(const char *name) {
+ using mlir::NamedOp;
+ // CHECK-MESSAGES: :[[@LINE+2]]:12: warning: use 'OpType::create(builder, ...)'
+ // CHECK-FIXES: return NamedOp::create(*this, name);
+ return create<NamedOp>(name);
+ }
+};
+
void f() {
mlir::OpBuilder builder;
// CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder]
@@ -47,15 +71,18 @@ void f() {
builder.create<mlir:: ModuleOp>(builder.getUnknownLoc());
using mlir::NamedOp;
+ using mlir::OperandOp;
+
// CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder]
// CHECK-FIXES: NamedOp::create(builder, builder.getUnknownLoc(), "baz");
builder.create<NamedOp>(builder.getUnknownLoc(), "baz");
- // CHECK-MESSAGES: :[[@LINE+3]]:3: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder]
- // CHECK-FIXES: NamedOp::create(builder, builder.getUnknownLoc(),
- // CHECK-FIXES: "caz");
+ // CHECK-MESSAGES: :[[@LINE+4]]:3: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder]
+ // CHECK-FIXES: NamedOp::create(builder,
+ // CHECK-FIXES: builder.getUnknownLoc(),
+ // CHECK-FIXES: "caz");
builder.
- create<NamedOp>(
+ create<NamedOp> (
builder.getUnknownLoc(),
"caz");
@@ -66,10 +93,26 @@ void f() {
mlir::ImplicitLocOpBuilder ib;
// CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder]
- // CHECK-FIXES: mlir::ModuleOp::create(ib);
+ // CHECK-FIXES: mlir::ModuleOp::create(ib );
ib.create<mlir::ModuleOp>( );
// CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder]
// CHECK-FIXES: mlir::OpBuilder().create<mlir::ModuleOp>(builder.getUnknownLoc());
mlir::OpBuilder().create<mlir::ModuleOp>(builder.getUnknownLoc());
+
+ auto *p = &builder;
+ // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use 'OpType::create(builder, ...)'
+ // CHECK-FIXES: NamedOp::create(*p, builder.getUnknownLoc(), "eaz");
+ p->create<NamedOp>(builder.getUnknownLoc(), "eaz");
+
+ CustomBuilder cb;
+ cb.f("faz");
+ cb.g("gaz");
+
+ // CHECK-FIXES: OperandOp::create(builder, builder.getUnknownLoc(),
+ // CHECK-FIXES-NEXT: NamedOp::create(builder, builder.getUnknownLoc(), "haz").getResult());
+ // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder]
+ // CHECK-MESSAGES: :[[@LINE+2]]:5: warning: use 'OpType::create(builder, ...)' instead of 'builder.create<OpType>(...)' [llvm-use-new-mlir-op-builder]
+ builder.create<OperandOp>(builder.getUnknownLoc(),
+ builder.create<NamedOp>(builder.getUnknownLoc(), "haz").getResult());
}
diff --git a/clang-tools-extra/test/pp-trace/pp-trace-include.cpp b/clang-tools-extra/test/pp-trace/pp-trace-include.cpp
index ea9896e..fccbd9b 100644
--- a/clang-tools-extra/test/pp-trace/pp-trace-include.cpp
+++ b/clang-tools-extra/test/pp-trace/pp-trace-include.cpp
@@ -39,7 +39,6 @@
// CHECK-NEXT: Reason: EnterFile
// CHECK-NEXT: FileType: C_User
// CHECK-NEXT: PrevFID: (invalid)
-// CHECK: - Callback: MacroDefined
// CHECK: - Callback: FileChanged
// CHECK-NEXT: Loc: "<built-in>:1:1"
// CHECK-NEXT: Reason: ExitFile
diff --git a/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp b/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp
index 7c2a231..5bd38e0 100644
--- a/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp
+++ b/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp
@@ -40,7 +40,6 @@ X
// CHECK-NEXT: MacroNameTok: __STDC_EMBED_EMPTY__
// CHECK-NEXT: MacroDirective: MD_Define
// CHECK: - Callback: MacroDefined
-// CHECK: - Callback: MacroDefined
// CHECK-NEXT: MacroNameTok: MACRO
// CHECK-NEXT: MacroDirective: MD_Define
// CHECK-NEXT: - Callback: MacroExpands
diff --git a/clang/docs/LanguageExtensions.rst b/clang/docs/LanguageExtensions.rst
index 495f2ab..baa0bbb 100644
--- a/clang/docs/LanguageExtensions.rst
+++ b/clang/docs/LanguageExtensions.rst
@@ -385,7 +385,9 @@ Builtin Macros
``__COUNTER__``
Defined to an integer value that starts at zero and is incremented each time
- the ``__COUNTER__`` macro is expanded.
+ the ``__COUNTER__`` macro is expanded. This is a standard feature in C2y but
+ is an extension in earlier language modes and in C++. This macro can only be
+ expanded 2147483647 times at most.
``__INCLUDE_LEVEL__``
Defined to an integral value that is the include depth of the file currently
@@ -1821,6 +1823,7 @@ Octal literals prefixed with ``0o`` or ``0O`` C
``_Countof`` (N3369, N3469) C2y C89
``_Generic`` with a type operand (N3260) C2y C89, C++
``++``/``--`` on ``_Complex`` value (N3259) C2y C89, C++
+``__COUNTER__`` (N3457) C2y C89, C++
============================================= ================================ ============= =============
Builtin type aliases
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 92fc938..cd27239 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -196,6 +196,11 @@ C2y Feature Support
function or variable within an extern inline function is no longer a
constraint per `WG14 N3622 <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3622.txt>`_.
- Clang now supports `N3355 <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3355.htm>`_ Named Loops.
+- Clang's implementation of ``__COUNTER__`` was updated to conform to
+ `WG14 N3457 <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3457.htm>`_.
+ This includes adding pedantic warnings for the feature being an extension in
+ other language modes as well as an error when the counter is expanded more
+ than 2147483647 times.
C23 Feature Support
^^^^^^^^^^^^^^^^^^^
@@ -350,7 +355,7 @@ Improvements to Clang's diagnostics
potential misaligned members get processed before they can get discarded.
(#GH144729)
-- Clang now emits dignostic with correct message in case of assigning to const reference captured in lambda. (#GH105647)
+- Clang now emits a diagnostic with the correct message in case of assigning to const reference captured in lambda. (#GH105647)
- Fixed false positive in ``-Wmissing-noreturn`` diagnostic when it was requiring the usage of
``[[noreturn]]`` on lambdas before C++23 (#GH154493).
@@ -390,6 +395,9 @@ Improvements to Clang's diagnostics
that were previously incorrectly accepted in case of other irrelevant
conditions are now consistently diagnosed, identical to C++ mode.
+- Clang now emits a diagnostic in case `vector_size` or `ext_vector_type`
+ attributes are used with a negative size (#GH165463).
+
Improvements to Clang's time-trace
----------------------------------
@@ -466,7 +474,7 @@ Bug Fixes to C++ Support
casts that are guaranteed to fail (#GH137518).
- Fix bug rejecting partial specialization of variable templates with auto NTTPs (#GH118190).
- Fix a crash if errors "member of anonymous [...] redeclares" and
- "intializing multiple members of union" coincide (#GH149985).
+ "initializing multiple members of union" coincide (#GH149985).
- Fix a crash when using ``explicit(bool)`` in pre-C++11 language modes. (#GH152729)
- Fix the parsing of variadic member functions when the ellipis immediately follows a default argument.(#GH153445)
- Fixed a bug that caused ``this`` captured by value in a lambda with a dependent explicit object parameter to not be
diff --git a/clang/include/clang/AST/APNumericStorage.h b/clang/include/clang/AST/APNumericStorage.h
index e1948a5..0442408 100644
--- a/clang/include/clang/AST/APNumericStorage.h
+++ b/clang/include/clang/AST/APNumericStorage.h
@@ -41,9 +41,8 @@ protected:
llvm::APInt getIntValue() const {
unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
if (NumWords > 1)
- return llvm::APInt(BitWidth, NumWords, pVal);
- else
- return llvm::APInt(BitWidth, VAL);
+ return llvm::APInt(BitWidth, llvm::ArrayRef(pVal, NumWords));
+ return llvm::APInt(BitWidth, VAL);
}
void setIntValue(const ASTContext &C, const llvm::APInt &Val);
};
diff --git a/clang/include/clang/AST/AbstractBasicReader.h b/clang/include/clang/AST/AbstractBasicReader.h
index 0d187eb4..064a342 100644
--- a/clang/include/clang/AST/AbstractBasicReader.h
+++ b/clang/include/clang/AST/AbstractBasicReader.h
@@ -173,7 +173,7 @@ public:
llvm::SmallVector<uint64_t, 4> data;
for (uint32_t i = 0; i != numWords; ++i)
data.push_back(asImpl().readUInt64());
- return llvm::APInt(bitWidth, numWords, &data[0]);
+ return llvm::APInt(bitWidth, data);
}
llvm::FixedPointSemantics readFixedPointSemantics() {
diff --git a/clang/include/clang/Basic/DebugOptions.def b/clang/include/clang/Basic/DebugOptions.def
index a768b12..ea3636f 100644
--- a/clang/include/clang/Basic/DebugOptions.def
+++ b/clang/include/clang/Basic/DebugOptions.def
@@ -46,6 +46,8 @@ ENUM_DEBUGOPT(EmitDwarfUnwind, EmitDwarfUnwindType, 2,
DEBUGOPT(NoDwarfDirectoryAsm , 1, 0, Benign) ///< Set when -fno-dwarf-directory-asm
///< is enabled.
+DEBUGOPT(Dwarf2CFIAsm, 1, 0, NotCompatible) ///< Set when -fdwarf2-cfi-asm is enabled.
+
DEBUGOPT(NoInlineLineTables, 1, 0, Benign) ///< Whether debug info should contain
///< inline line tables.
diff --git a/clang/include/clang/Basic/DiagnosticLexKinds.td b/clang/include/clang/Basic/DiagnosticLexKinds.td
index c7fe6e1d..4171872 100644
--- a/clang/include/clang/Basic/DiagnosticLexKinds.td
+++ b/clang/include/clang/Basic/DiagnosticLexKinds.td
@@ -90,6 +90,14 @@ def err_unterminated___pragma : Error<"missing terminating ')' character">;
def err_conflict_marker : Error<"version control conflict marker in file">;
+def err_counter_overflow : Error<
+ "'__COUNTER__' value cannot exceed 2'147'483'647">;
+def ext_counter : Extension<
+ "'__COUNTER__' is a C2y extension">, InGroup<C2y>;
+def warn_counter : Warning<
+ "'__COUNTER__' is incompatible with standards before C2y">,
+ InGroup<CPre2yCompat>, DefaultIgnore;
+
def err_raw_delim_too_long : Error<
"raw string delimiter longer than 16 characters"
"; use PREFIX( )PREFIX to delimit raw string">;
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 4e369be..fa50953 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -3510,6 +3510,8 @@ def err_init_method_bad_return_type : Error<
"init methods must return an object pointer type, not %0">;
def err_attribute_invalid_size : Error<
"vector size not an integral multiple of component size">;
+def err_attribute_vec_negative_size
+ : Error<"vector must have non-negative size">;
def err_attribute_zero_size : Error<"zero %0 size">;
def err_attribute_size_too_large : Error<"%0 size too large">;
def err_typecheck_sve_rvv_ambiguous : Error<
diff --git a/clang/include/clang/Basic/riscv_sifive_vector.td b/clang/include/clang/Basic/riscv_sifive_vector.td
index 89e644a..0371279 100644
--- a/clang/include/clang/Basic/riscv_sifive_vector.td
+++ b/clang/include/clang/Basic/riscv_sifive_vector.td
@@ -121,6 +121,13 @@ multiclass RVVVQMACCQOQBuiltinSet<list<list<string>> suffixes_prototypes> {
defm NAME : RVVOutOp1Op2BuiltinSet<NAME, "s", suffixes_prototypes>;
}
+multiclass RVVVFEXPBuiltinSet<list<list<string>> suffixes_prototypes, string type_range> {
+ let UnMaskedPolicyScheme = HasPassthruOperand,
+ OverloadedName = NAME,
+ Log2LMUL = [-2, -1, 0, 1, 2, 3] in
+ defm NAME : RVVOutBuiltinSet<NAME, type_range, suffixes_prototypes>;
+}
+
multiclass RVVVFNRCLIPBuiltinSet<string suffix, string prototype, string type_range> {
let Log2LMUL = [-3, -2, -1, 0, 1, 2],
Name = NAME,
@@ -145,6 +152,26 @@ let UnMaskedPolicyScheme = HasPolicyOperand in
defm sf_vqmaccsu_4x8x4 : RVVVQMACCQOQBuiltinSet<[["", "w", "ww(FixedSEW:8)Sv(FixedSEW:8)Uv"]]>;
}
+let RequiredFeatures = ["xsfvfbfexp16e"] in {
+ defm sf_vfexp : RVVVFEXPBuiltinSet<[["v", "v", "vv"]], "y">;
+}
+
+let RequiredFeatures = ["xsfvfexp16e"] in {
+ defm sf_vfexp : RVVVFEXPBuiltinSet<[["v", "v", "vv"]], "x">;
+}
+
+let RequiredFeatures = ["xsfvfexp32e"] in {
+ defm sf_vfexp : RVVVFEXPBuiltinSet<[["v", "v", "vv"]], "f">;
+}
+
+let RequiredFeatures = ["xsfvfexpa"] in {
+ defm sf_vfexpa : RVVVFEXPBuiltinSet<[["v", "v", "vv"]], "xf">;
+}
+
+let RequiredFeatures = ["xsfvfexpa64e"] in {
+ defm sf_vfexpa : RVVVFEXPBuiltinSet<[["v", "v", "vv"]], "d">;
+}
+
let UnMaskedPolicyScheme = HasPolicyOperand in
let RequiredFeatures = ["xsfvfwmaccqqq"] in
defm sf_vfwmacc_4x4x4 : RVVVFWMACCBuiltinSet<[["", "Fw", "FwFwSvv"]]>;
diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td
index 2b361ed..dc56db1 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIROps.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td
@@ -4171,6 +4171,16 @@ def CIR_ATanOp : CIR_UnaryFPToFPBuiltinOp<"atan", "ATanOp"> {
}];
}
+def CIR_CeilOp : CIR_UnaryFPToFPBuiltinOp<"ceil", "FCeilOp"> {
+ let summary = "Computes the ceiling of the specified value";
+ let description = [{
+ `cir.ceil` computes the ceiling of a given value and returns a result
+ of the same type.
+
+ Floating-point exceptions are ignored, and it does not set `errno`.
+ }];
+}
+
def CIR_CosOp : CIR_UnaryFPToFPBuiltinOp<"cos", "CosOp"> {
let summary = "Computes the floating-point cosine value";
let description = [{
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index 6e1c942..5cf3327 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -741,6 +741,7 @@ def gcc_toolchain : Joined<["--"], "gcc-toolchain=">, Flags<[NoXarchOption]>,
"Specify a directory where Flang can find 'lib{,32,64}/gcc{,-cross}/$triple/$version'. "
"Flang will use the GCC installation with the largest version">;
def gcc_triple_EQ : Joined<["--"], "gcc-triple=">,
+ Visibility<[ClangOption, FlangOption]>,
HelpText<"Search for the GCC installation with the specified triple.">;
def CC : Flag<["-"], "CC">, Visibility<[ClangOption, CC1Option]>,
Group<Preprocessor_Group>,
@@ -2154,8 +2155,12 @@ defm dollars_in_identifiers : BoolFOption<"dollars-in-identifiers",
PosFlag<SetTrue, [], [ClangOption], "Allow">,
NegFlag<SetFalse, [], [ClangOption], "Disallow">,
BothFlags<[], [ClangOption, CC1Option], " '$' in identifiers">>;
-def fdwarf2_cfi_asm : Flag<["-"], "fdwarf2-cfi-asm">, Group<clang_ignored_f_Group>;
-def fno_dwarf2_cfi_asm : Flag<["-"], "fno-dwarf2-cfi-asm">, Group<clang_ignored_f_Group>;
+
+defm dwarf2_cfi_asm
+ : BoolFOption<"dwarf2-cfi-asm", CodeGenOpts<"Dwarf2CFIAsm">, DefaultFalse,
+ PosFlag<SetTrue, [], [ClangOption, CC1Option]>,
+ NegFlag<SetFalse>>;
+
defm dwarf_directory_asm : BoolFOption<"dwarf-directory-asm",
CodeGenOpts<"NoDwarfDirectoryAsm">, DefaultFalse,
NegFlag<SetTrue, [], [ClangOption, CC1Option]>,
@@ -8445,6 +8450,10 @@ def aligned_alloc_unavailable : Flag<["-"], "faligned-alloc-unavailable">,
MarshallingInfoFlag<LangOpts<"AlignedAllocationUnavailable">>,
ShouldParseIf<faligned_allocation.KeyPath>;
+def finitial_counter_value_EQ : Joined<["-"], "finitial-counter-value=">,
+ HelpText<"Sets the initial value for __COUNTER__, defaults to 0.">,
+ MarshallingInfoInt<PreprocessorOpts<"InitialCounterValue">, "0">;
+
} // let Visibility = [CC1Option]
//===----------------------------------------------------------------------===//
diff --git a/clang/include/clang/Lex/PPEmbedParameters.h b/clang/include/clang/Lex/PPEmbedParameters.h
index c4fb8d0..41a6966 100644
--- a/clang/include/clang/Lex/PPEmbedParameters.h
+++ b/clang/include/clang/Lex/PPEmbedParameters.h
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
//
-// Defines all of the preprocessor directive parmeters for #embed
+// Defines all of the preprocessor directive parameters for #embed
//
//===----------------------------------------------------------------------===//
diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h
index 3975484..4120022 100644
--- a/clang/include/clang/Lex/Preprocessor.h
+++ b/clang/include/clang/Lex/Preprocessor.h
@@ -226,7 +226,7 @@ class Preprocessor {
LangOptions::FPEvalMethodKind::FEM_UnsetOnCommandLine;
// Next __COUNTER__ value, starts at 0.
- unsigned CounterValue = 0;
+ uint32_t CounterValue = 0;
enum {
/// Maximum depth of \#includes.
@@ -2421,8 +2421,8 @@ public:
bool SawDateOrTime() const {
return DATELoc != SourceLocation() || TIMELoc != SourceLocation();
}
- unsigned getCounterValue() const { return CounterValue; }
- void setCounterValue(unsigned V) { CounterValue = V; }
+ uint32_t getCounterValue() const { return CounterValue; }
+ void setCounterValue(uint32_t V) { CounterValue = V; }
LangOptions::FPEvalMethodKind getCurrentFPEvalMethod() const {
assert(CurrentFPEvalMethod != LangOptions::FEM_UnsetOnCommandLine &&
diff --git a/clang/include/clang/Lex/PreprocessorOptions.h b/clang/include/clang/Lex/PreprocessorOptions.h
index d4c4e1c..1c2f6e7 100644
--- a/clang/include/clang/Lex/PreprocessorOptions.h
+++ b/clang/include/clang/Lex/PreprocessorOptions.h
@@ -198,6 +198,10 @@ public:
/// If set, the UNIX timestamp specified by SOURCE_DATE_EPOCH.
std::optional<uint64_t> SourceDateEpoch;
+ /// The initial value for __COUNTER__; typically is zero but can be set via a
+ /// -cc1 flag for testing purposes.
+ uint32_t InitialCounterValue = 0;
+
public:
PreprocessorOptions() : PrecompiledPreambleBytes(0, false) {}
diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h
index af856a80..4ca45a1 100644
--- a/clang/include/clang/Serialization/ASTReader.h
+++ b/clang/include/clang/Serialization/ASTReader.h
@@ -220,8 +220,8 @@ public:
}
/// Receives __COUNTER__ value.
- virtual void ReadCounter(const serialization::ModuleFile &M,
- unsigned Value) {}
+ virtual void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) {
+ }
/// This is called for each AST file loaded.
virtual void visitModuleFile(StringRef Filename,
@@ -312,7 +312,7 @@ public:
bool Complain,
std::string &SuggestedPredefines) override;
- void ReadCounter(const serialization::ModuleFile &M, unsigned Value) override;
+ void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override;
bool needsInputFileVisitation() override;
bool needsSystemInputFileVisitation() override;
void visitModuleFile(StringRef Filename,
@@ -352,7 +352,7 @@ public:
StringRef ModuleFilename,
StringRef SpecificModuleCachePath,
bool Complain) override;
- void ReadCounter(const serialization::ModuleFile &M, unsigned Value) override;
+ void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override;
};
/// ASTReaderListenter implementation to set SuggestedPredefines of
diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h
index 4aee165..66da799 100644
--- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h
+++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h
@@ -372,12 +372,10 @@ public:
ProgramPoint getProgramPoint(bool IsPreVisit = false,
const ProgramPointTag *Tag = nullptr) const;
- /// Returns a new state with all argument regions invalidated.
- ///
- /// This accepts an alternate state in case some processing has already
- /// occurred.
+ /// Invalidates the regions (arguments, globals, special regions like 'this')
+ /// that may have been written by this call, returning the updated state.
ProgramStateRef invalidateRegions(unsigned BlockCount,
- ProgramStateRef Orig = nullptr) const;
+ ProgramStateRef State) const;
using FrameBindingTy = std::pair<SVal, SVal>;
using BindingsTy = SmallVectorImpl<FrameBindingTy>;
diff --git a/clang/lib/AST/ByteCode/Floating.h b/clang/lib/AST/ByteCode/Floating.h
index 659892e..cc918dc 100644
--- a/clang/lib/AST/ByteCode/Floating.h
+++ b/clang/lib/AST/ByteCode/Floating.h
@@ -45,7 +45,8 @@ private:
if (singleWord())
return APFloat(getSemantics(), APInt(BitWidth, Val));
unsigned NumWords = numWords();
- return APFloat(getSemantics(), APInt(BitWidth, NumWords, Memory));
+ return APFloat(getSemantics(),
+ APInt(BitWidth, llvm::ArrayRef(Memory, NumWords)));
}
public:
diff --git a/clang/lib/AST/ByteCode/IntegralAP.h b/clang/lib/AST/ByteCode/IntegralAP.h
index 6683db9..b11e6ee 100644
--- a/clang/lib/AST/ByteCode/IntegralAP.h
+++ b/clang/lib/AST/ByteCode/IntegralAP.h
@@ -63,7 +63,7 @@ public:
if (singleWord())
return APInt(BitWidth, Val, Signed);
unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
- return llvm::APInt(BitWidth, NumWords, Memory);
+ return llvm::APInt(BitWidth, llvm::ArrayRef(Memory, NumWords));
}
public:
diff --git a/clang/lib/Analysis/ExprMutationAnalyzer.cpp b/clang/lib/Analysis/ExprMutationAnalyzer.cpp
index 75b17c54..54c30c0 100644
--- a/clang/lib/Analysis/ExprMutationAnalyzer.cpp
+++ b/clang/lib/Analysis/ExprMutationAnalyzer.cpp
@@ -746,11 +746,14 @@ ExprMutationAnalyzer::Analyzer::findPointeeMemberMutation(const Expr *Exp) {
Stm, Context));
if (MemberCallExpr)
return MemberCallExpr;
- const auto Matches =
- match(stmt(forEachDescendant(
- memberExpr(hasObjectExpression(canResolveToExprPointee(Exp)))
- .bind(NodeID<Expr>::value))),
- Stm, Context);
+ const auto Matches = match(
+ stmt(forEachDescendant(
+ expr(anyOf(memberExpr(
+ hasObjectExpression(canResolveToExprPointee(Exp))),
+ binaryOperator(hasOperatorName("->*"),
+ hasLHS(canResolveToExprPointee(Exp)))))
+ .bind(NodeID<Expr>::value))),
+ Stm, Context);
return findExprMutation(Matches);
}
diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp
index 938c648..97aa0f2 100644
--- a/clang/lib/Basic/SourceManager.cpp
+++ b/clang/lib/Basic/SourceManager.cpp
@@ -907,19 +907,23 @@ getExpansionLocSlowCase(SourceLocation Loc) const {
SourceLocation SourceManager::getSpellingLocSlowCase(SourceLocation Loc) const {
do {
- FileIDAndOffset LocInfo = getDecomposedLoc(Loc);
- Loc = getSLocEntry(LocInfo.first).getExpansion().getSpellingLoc();
- Loc = Loc.getLocWithOffset(LocInfo.second);
+ const SLocEntry &Entry = getSLocEntry(getFileID(Loc));
+ Loc = Entry.getExpansion().getSpellingLoc().getLocWithOffset(
+ Loc.getOffset() - Entry.getOffset());
} while (!Loc.isFileID());
return Loc;
}
SourceLocation SourceManager::getFileLocSlowCase(SourceLocation Loc) const {
do {
- if (isMacroArgExpansion(Loc))
- Loc = getImmediateSpellingLoc(Loc);
- else
- Loc = getImmediateExpansionRange(Loc).getBegin();
+ const SLocEntry &Entry = getSLocEntry(getFileID(Loc));
+ const ExpansionInfo &ExpInfo = Entry.getExpansion();
+ if (ExpInfo.isMacroArgExpansion()) {
+ Loc = ExpInfo.getSpellingLoc().getLocWithOffset(Loc.getOffset() -
+ Entry.getOffset());
+ } else {
+ Loc = ExpInfo.getExpansionLocStart();
+ }
} while (!Loc.isFileID());
return Loc;
}
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
index e35100f..d9b9e3b 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
@@ -211,6 +211,17 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl &gd, unsigned builtinID,
assert(!cir::MissingFeatures::fastMathFlags());
return emitUnaryMaybeConstrainedFPBuiltin<cir::CosOp>(*this, *e);
+ case Builtin::BIceil:
+ case Builtin::BIceilf:
+ case Builtin::BIceill:
+ case Builtin::BI__builtin_ceil:
+ case Builtin::BI__builtin_ceilf:
+ case Builtin::BI__builtin_ceilf16:
+ case Builtin::BI__builtin_ceill:
+ case Builtin::BI__builtin_ceilf128:
+ assert(!cir::MissingFeatures::fastMathFlags());
+ return emitUnaryMaybeConstrainedFPBuiltin<cir::CeilOp>(*this, *e);
+
case Builtin::BIfabs:
case Builtin::BIfabsf:
case Builtin::BIfabsl:
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index 5a6193f..d941082 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -1336,6 +1336,14 @@ mlir::LogicalResult CIRToLLVMATanOpLowering::matchAndRewrite(
return mlir::success();
}
+mlir::LogicalResult CIRToLLVMCeilOpLowering::matchAndRewrite(
+ cir::CeilOp op, OpAdaptor adaptor,
+ mlir::ConversionPatternRewriter &rewriter) const {
+ mlir::Type resTy = typeConverter->convertType(op.getType());
+ rewriter.replaceOpWithNewOp<mlir::LLVM::FCeilOp>(op, resTy, adaptor.getSrc());
+ return mlir::success();
+}
+
mlir::LogicalResult CIRToLLVMAllocaOpLowering::matchAndRewrite(
cir::AllocaOp op, OpAdaptor adaptor,
mlir::ConversionPatternRewriter &rewriter) const {
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 0fea57b..af5be95 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -3331,18 +3331,18 @@ static void emitUsed(CodeGenModule &CGM, StringRef Name,
if (List.empty())
return;
+ llvm::PointerType *UnqualPtr =
+ llvm::PointerType::getUnqual(CGM.getLLVMContext());
+
// Convert List to what ConstantArray needs.
SmallVector<llvm::Constant*, 8> UsedArray;
UsedArray.resize(List.size());
for (unsigned i = 0, e = List.size(); i != e; ++i) {
- UsedArray[i] =
- llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
- cast<llvm::Constant>(&*List[i]), CGM.Int8PtrTy);
+ UsedArray[i] = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
+ cast<llvm::Constant>(&*List[i]), UnqualPtr);
}
- if (UsedArray.empty())
- return;
- llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.Int8PtrTy, UsedArray.size());
+ llvm::ArrayType *ATy = llvm::ArrayType::get(UnqualPtr, UsedArray.size());
auto *GV = new llvm::GlobalVariable(
CGM.getModule(), ATy, false, llvm::GlobalValue::AppendingLinkage,
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index d3ab6f1..30d3e52 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -7879,10 +7879,13 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
!TC.getTriple().isAndroid() && TC.useIntegratedAs()))
CmdArgs.push_back("-faddrsig");
- if ((Triple.isOSBinFormatELF() || Triple.isOSBinFormatMachO()) &&
+ const bool HasDefaultDwarf2CFIASM =
+ (Triple.isOSBinFormatELF() || Triple.isOSBinFormatMachO()) &&
(EH || UnwindTables || AsyncUnwindTables ||
- DebugInfoKind != llvm::codegenoptions::NoDebugInfo))
- CmdArgs.push_back("-D__GCC_HAVE_DWARF2_CFI_ASM=1");
+ DebugInfoKind != llvm::codegenoptions::NoDebugInfo);
+ if (Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
+ options::OPT_fno_dwarf2_cfi_asm, HasDefaultDwarf2CFIASM))
+ CmdArgs.push_back("-fdwarf2-cfi-asm");
if (Arg *A = Args.getLastArg(options::OPT_fsymbol_partition_EQ)) {
std::string Str = A->getAsString(Args);
diff --git a/clang/lib/Format/FormatTokenLexer.cpp b/clang/lib/Format/FormatTokenLexer.cpp
index ab32938..a9ea5ec 100644
--- a/clang/lib/Format/FormatTokenLexer.cpp
+++ b/clang/lib/Format/FormatTokenLexer.cpp
@@ -318,14 +318,21 @@ void FormatTokenLexer::tryMergePreviousTokens() {
{tok::equal, tok::greater},
{tok::star, tok::greater},
{tok::pipeequal, tok::greater},
- {tok::pipe, tok::arrow},
- {tok::hash, tok::minus, tok::hash},
- {tok::hash, tok::equal, tok::hash}},
+ {tok::pipe, tok::arrow}},
TT_BinaryOperator) ||
Tokens.back()->is(tok::arrow)) {
Tokens.back()->ForcedPrecedence = prec::Comma;
return;
}
+ if (Tokens.size() >= 3 &&
+ Tokens[Tokens.size() - 3]->is(Keywords.kw_verilogHash) &&
+ Tokens[Tokens.size() - 2]->isOneOf(tok::minus, tok::equal) &&
+ Tokens[Tokens.size() - 1]->is(Keywords.kw_verilogHash) &&
+ tryMergeTokens(3, TT_BinaryOperator)) {
+ Tokens.back()->setFinalizedType(TT_BinaryOperator);
+ Tokens.back()->ForcedPrecedence = prec::Comma;
+ return;
+ }
} else if (Style.isTableGen()) {
// TableGen's Multi line string starts with [{
if (tryMergeTokens({tok::l_square, tok::l_brace},
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index 8e227da..cb41756c 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -358,11 +358,11 @@ private:
Contexts.back().IsExpression = false;
} else if (OpeningParen.Previous &&
(OpeningParen.Previous->isOneOf(
- tok::kw_static_assert, tok::kw_noexcept, tok::kw_explicit,
- tok::kw_while, tok::l_paren, tok::comma, TT_CastRParen,
+ tok::kw_noexcept, tok::kw_explicit, tok::kw_while,
+ tok::l_paren, tok::comma, TT_CastRParen,
TT_BinaryOperator) ||
OpeningParen.Previous->isIf())) {
- // static_assert, if and while usually contain expressions.
+ // if and while usually contain expressions.
Contexts.back().IsExpression = true;
} else if (Style.isJavaScript() && OpeningParen.Previous &&
(OpeningParen.Previous->is(Keywords.kw_function) ||
@@ -454,6 +454,11 @@ private:
if (StartsObjCSelector)
OpeningParen.setType(TT_ObjCSelector);
+ const bool IsStaticAssert =
+ PrevNonComment && PrevNonComment->is(tok::kw_static_assert);
+ if (IsStaticAssert)
+ Contexts.back().InStaticAssertFirstArgument = true;
+
// MightBeFunctionType and ProbablyFunctionType are used for
// function pointer and reference types as well as Objective-C
// block types:
@@ -583,8 +588,12 @@ private:
}
// When we discover a 'new', we set CanBeExpression to 'false' in order to
// parse the type correctly. Reset that after a comma.
- if (CurrentToken->is(tok::comma))
- Contexts.back().CanBeExpression = true;
+ if (CurrentToken->is(tok::comma)) {
+ if (IsStaticAssert)
+ Contexts.back().InStaticAssertFirstArgument = false;
+ else
+ Contexts.back().CanBeExpression = true;
+ }
if (Style.isTableGen()) {
if (CurrentToken->is(tok::comma)) {
@@ -2144,6 +2153,7 @@ private:
bool CaretFound = false;
bool InCpp11AttributeSpecifier = false;
bool InCSharpAttributeSpecifier = false;
+ bool InStaticAssertFirstArgument = false;
bool VerilogAssignmentFound = false;
// Whether the braces may mean concatenation instead of structure or array
// literal.
@@ -2440,7 +2450,8 @@ private:
} else if (Current.isPointerOrReference()) {
Current.setType(determineStarAmpUsage(
Current,
- Contexts.back().CanBeExpression && Contexts.back().IsExpression,
+ (Contexts.back().CanBeExpression && Contexts.back().IsExpression) ||
+ Contexts.back().InStaticAssertFirstArgument,
Contexts.back().ContextType == Context::TemplateArgument));
} else if (Current.isOneOf(tok::minus, tok::plus, tok::caret) ||
(Style.isVerilog() && Current.is(tok::pipe))) {
diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp
index 6cc7094..1169acb 100644
--- a/clang/lib/Frontend/ASTUnit.cpp
+++ b/clang/lib/Frontend/ASTUnit.cpp
@@ -518,14 +518,14 @@ class ASTInfoCollector : public ASTReaderListener {
LangOptions &LangOpts;
CodeGenOptions &CodeGenOpts;
TargetOptions &TargetOpts;
- unsigned &Counter;
+ uint32_t &Counter;
public:
ASTInfoCollector(HeaderSearchOptions &HSOpts,
std::string &SpecificModuleCachePath,
PreprocessorOptions &PPOpts, LangOptions &LangOpts,
CodeGenOptions &CodeGenOpts, TargetOptions &TargetOpts,
- unsigned &Counter)
+ uint32_t &Counter)
: HSOpts(HSOpts), SpecificModuleCachePath(SpecificModuleCachePath),
PPOpts(PPOpts), LangOpts(LangOpts), CodeGenOpts(CodeGenOpts),
TargetOpts(TargetOpts), Counter(Counter) {}
@@ -577,7 +577,7 @@ public:
}
void ReadCounter(const serialization::ModuleFile &M,
- unsigned NewCounter) override {
+ uint32_t NewCounter) override {
Counter = NewCounter;
}
};
diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp
index 8602be1..b88d9f8 100644
--- a/clang/lib/Frontend/InitPreprocessor.cpp
+++ b/clang/lib/Frontend/InitPreprocessor.cpp
@@ -1516,6 +1516,9 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
if (LangOpts.PointerAuthIntrinsics)
Builder.defineMacro("__PTRAUTH__");
+ if (CGOpts.Dwarf2CFIAsm)
+ Builder.defineMacro("__GCC_HAVE_DWARF2_CFI_ASM");
+
// Get other target #defines.
TI.getTargetDefines(LangOpts, Builder);
}
@@ -1542,6 +1545,9 @@ void clang::InitializePreprocessor(Preprocessor &PP,
llvm::raw_string_ostream Predefines(PredefineBuffer);
MacroBuilder Builder(Predefines);
+ // Ensure that the initial value of __COUNTER__ is hooked up.
+ PP.setCounterValue(InitOpts.InitialCounterValue);
+
// Emit line markers for various builtin sections of the file. The 3 here
// marks <built-in> as being a system header, which suppresses warnings when
// the same macro is defined multiple times.
diff --git a/clang/lib/Frontend/TextDiagnostic.cpp b/clang/lib/Frontend/TextDiagnostic.cpp
index aea3e72..1003218 100644
--- a/clang/lib/Frontend/TextDiagnostic.cpp
+++ b/clang/lib/Frontend/TextDiagnostic.cpp
@@ -349,14 +349,13 @@ private:
/// When the source code line we want to print is too long for
/// the terminal, select the "interesting" region.
-static void selectInterestingSourceRegion(std::string &SourceLine,
- std::string &CaretLine,
- std::string &FixItInsertionLine,
- Columns NonGutterColumns,
- const SourceColumnMap &Map) {
- Columns CaretColumns = Columns(CaretLine.size());
- Columns FixItColumns =
- Columns(llvm::sys::locale::columnWidth(FixItInsertionLine));
+static void selectInterestingSourceRegion(
+ std::string &SourceLine, std::string &CaretLine,
+ std::string &FixItInsertionLine, Columns NonGutterColumns,
+ const SourceColumnMap &Map,
+ SmallVectorImpl<clang::TextDiagnostic::StyleRange> &Styles) {
+ Columns CaretColumns = CaretLine.size();
+ Columns FixItColumns = llvm::sys::locale::columnWidth(FixItInsertionLine);
Columns MaxColumns =
std::max({Map.columns().V, CaretColumns.V, FixItColumns.V});
// if the number of columns is less than the desired number we're done
@@ -369,13 +368,11 @@ static void selectInterestingSourceRegion(std::string &SourceLine,
// Find the slice that we need to display the full caret line
// correctly.
Columns CaretStart = 0, CaretEnd = CaretLine.size();
- for (; CaretStart != CaretEnd; CaretStart = CaretStart.next())
- if (!isWhitespace(CaretLine[CaretStart.V]))
- break;
+ while (CaretStart != CaretEnd && isWhitespace(CaretLine[CaretStart.V]))
+ CaretStart = CaretStart.next();
- for (; CaretEnd != CaretStart; CaretEnd = CaretEnd.prev())
- if (!isWhitespace(CaretLine[CaretEnd.V - 1]))
- break;
+ while (CaretEnd != CaretStart && isWhitespace(CaretLine[CaretEnd.V]))
+ CaretEnd = CaretEnd.prev();
// caret has already been inserted into CaretLine so the above whitespace
// check is guaranteed to include the caret
@@ -516,13 +513,45 @@ static void selectInterestingSourceRegion(std::string &SourceLine,
assert(FrontColumnsRemoved + ColumnsKept + BackColumnsRemoved >
NonGutterColumns);
+ // Since we've modified the SourceLine, we also need to adjust the line's
+ // highlighting information. In particular, if we've removed
+ // from the front of the line, we need to move the style ranges to the
+ // left and remove unneeded ranges.
+ // Note in particular that variables like CaretEnd are defined in the
+ // CaretLine, which only contains ASCII, while the style ranges are defined in
+ // the source line, where we have to care for the byte-index != column-index
+ // case.
+ Bytes BytesRemoved =
+ FrontColumnsRemoved > FrontEllipse.size()
+ ? (Map.columnToByte(FrontColumnsRemoved) - Bytes(FrontEllipse.size()))
+ : 0;
+ Bytes CodeEnd =
+ CaretEnd < Map.columns() ? Map.columnToByte(CaretEnd.V) : CaretEnd.V;
+ for (TextDiagnostic::StyleRange &R : Styles) {
+ // Remove style ranges before and after the new truncated snippet.
+ if (R.Start >= static_cast<unsigned>(CodeEnd.V) ||
+ R.End < static_cast<unsigned>(BytesRemoved.V)) {
+ R.Start = R.End = std::numeric_limits<int>::max();
+ continue;
+ }
+ // Move them left. (Note that this can wrap R.Start, but that doesn't
+ // matter).
+ R.Start -= BytesRemoved.V;
+ R.End -= BytesRemoved.V;
+
+ // Don't leak into the ellipse at the end.
+ if (R.Start < static_cast<unsigned>(CodeEnd.V) &&
+ R.End > static_cast<unsigned>(CodeEnd.V))
+ R.End = CodeEnd.V + 1; // R.End is inclusive.
+ }
+
// The line needs some truncation, and we'd prefer to keep the front
// if possible, so remove the back
if (BackColumnsRemoved > Columns(BackEllipse.size()))
SourceLine.replace(SourceEnd.V, std::string::npos, BackEllipse);
// If that's enough then we're done
- if (FrontColumnsRemoved + ColumnsKept <= Columns(NonGutterColumns))
+ if (FrontColumnsRemoved + ColumnsKept <= NonGutterColumns)
return;
// Otherwise remove the front as well
@@ -1391,6 +1420,11 @@ void TextDiagnostic::emitSnippetAndCaret(
OS.indent(MaxLineNoDisplayWidth + 2) << "| ";
};
+ Columns MessageLength = DiagOpts.MessageLength;
+ // If we don't have enough columns available, just abort now.
+ if (MessageLength != 0 && MessageLength <= Columns(MaxLineNoDisplayWidth + 4))
+ return;
+
// Prepare source highlighting information for the lines we're about to
// emit, starting from the first line.
std::unique_ptr<SmallVector<StyleRange>[]> SourceStyles =
@@ -1450,10 +1484,14 @@ void TextDiagnostic::emitSnippetAndCaret(
// If the source line is too long for our terminal, select only the
// "interesting" source region within that line.
- Columns MessageLength = DiagOpts.MessageLength;
- if (MessageLength.V != 0)
+ if (MessageLength != 0) {
+ Columns NonGutterColumns = MessageLength;
+ if (MaxLineNoDisplayWidth != 0)
+ NonGutterColumns -= Columns(MaxLineNoDisplayWidth + 4);
selectInterestingSourceRegion(SourceLine, CaretLine, FixItInsertionLine,
- MessageLength, SourceColMap);
+ NonGutterColumns, SourceColMap,
+ SourceStyles[LineNo - Lines.first]);
+ }
// If we are in -fdiagnostics-print-source-range-info mode, we are trying
// to produce easily machine parsable output. Add a space before the
@@ -1508,7 +1546,7 @@ void TextDiagnostic::emitSnippet(StringRef SourceLine,
// Print the source line one character at a time.
bool PrintReversed = false;
std::optional<llvm::raw_ostream::Colors> CurrentColor;
- size_t I = 0;
+ size_t I = 0; // Bytes.
while (I < SourceLine.size()) {
auto [Str, WasPrintable] =
printableTextForNextCharacter(SourceLine, &I, DiagOpts.TabStop);
diff --git a/clang/lib/Headers/hvx_hexagon_protos.h b/clang/lib/Headers/hvx_hexagon_protos.h
index fd120a5..19309a4 100644
--- a/clang/lib/Headers/hvx_hexagon_protos.h
+++ b/clang/lib/Headers/hvx_hexagon_protos.h
@@ -5605,6 +5605,399 @@
__BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vsub_hf_f8)(Vu, Vv)
#endif /* __HEXAGON_ARCH___ >= 79 */
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.qf16=vabs(Vu32.hf)
+ C Intrinsic Prototype: HVX_Vector Q6_Vqf16_vabs_Vhf(HVX_Vector Vu)
+ Instruction Type: CVI_VS
+ Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Vqf16_vabs_Vhf(Vu) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vabs_qf16_hf)(Vu)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.qf16=vabs(Vu32.qf16)
+ C Intrinsic Prototype: HVX_Vector Q6_Vqf16_vabs_Vqf16(HVX_Vector Vu)
+ Instruction Type: CVI_VS
+ Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Vqf16_vabs_Vqf16(Vu) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vabs_qf16_qf16)(Vu)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.qf32=vabs(Vu32.qf32)
+ C Intrinsic Prototype: HVX_Vector Q6_Vqf32_vabs_Vqf32(HVX_Vector Vu)
+ Instruction Type: CVI_VS
+ Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Vqf32_vabs_Vqf32(Vu) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vabs_qf32_qf32)(Vu)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.qf32=vabs(Vu32.sf)
+ C Intrinsic Prototype: HVX_Vector Q6_Vqf32_vabs_Vsf(HVX_Vector Vu)
+ Instruction Type: CVI_VS
+ Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Vqf32_vabs_Vsf(Vu) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vabs_qf32_sf)(Vu)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32=valign4(Vu32,Vv32,Rt8)
+ C Intrinsic Prototype: HVX_Vector Q6_V_valign4_VVR(HVX_Vector Vu, HVX_Vector
+ Vv, Word32 Rt) Instruction Type: CVI_VA Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_V_valign4_VVR(Vu, Vv, Rt) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_valign4)(Vu, Vv, Rt)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.bf=Vuu32.qf32
+ C Intrinsic Prototype: HVX_Vector Q6_Vbf_equals_Wqf32(HVX_VectorPair Vuu)
+ Instruction Type: CVI_VS
+ Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Vbf_equals_Wqf32(Vuu) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vconv_bf_qf32)(Vuu)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.f8=Vu32.qf16
+ C Intrinsic Prototype: HVX_Vector Q6_V_equals_Vqf16(HVX_Vector Vu)
+ Instruction Type: CVI_VS
+ Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_V_equals_Vqf16(Vu) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vconv_f8_qf16)(Vu)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.h=Vu32.hf:rnd
+ C Intrinsic Prototype: HVX_Vector Q6_Vh_equals_Vhf_rnd(HVX_Vector Vu)
+ Instruction Type: CVI_VS
+ Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Vh_equals_Vhf_rnd(Vu) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vconv_h_hf_rnd)(Vu)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vdd32.qf16=Vu32.f8
+ C Intrinsic Prototype: HVX_VectorPair Q6_Wqf16_equals_V(HVX_Vector Vu)
+ Instruction Type: CVI_VP_VS
+ Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Wqf16_equals_V(Vu) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vconv_qf16_f8)(Vu)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.qf16=Vu32.hf
+ C Intrinsic Prototype: HVX_Vector Q6_Vqf16_equals_Vhf(HVX_Vector Vu)
+ Instruction Type: CVI_VS
+ Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Vqf16_equals_Vhf(Vu) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vconv_qf16_hf)(Vu)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.qf16=Vu32.qf16
+ C Intrinsic Prototype: HVX_Vector Q6_Vqf16_equals_Vqf16(HVX_Vector Vu)
+ Instruction Type: CVI_VS
+ Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Vqf16_equals_Vqf16(Vu) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vconv_qf16_qf16)(Vu)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.qf32=Vu32.qf32
+ C Intrinsic Prototype: HVX_Vector Q6_Vqf32_equals_Vqf32(HVX_Vector Vu)
+ Instruction Type: CVI_VS
+ Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Vqf32_equals_Vqf32(Vu) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vconv_qf32_qf32)(Vu)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.qf32=Vu32.sf
+ C Intrinsic Prototype: HVX_Vector Q6_Vqf32_equals_Vsf(HVX_Vector Vu)
+ Instruction Type: CVI_VS
+ Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Vqf32_equals_Vsf(Vu) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vconv_qf32_sf)(Vu)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Qd4=vcmp.eq(Vu32.hf,Vv32.hf)
+ C Intrinsic Prototype: HVX_VectorPred Q6_Q_vcmp_eq_VhfVhf(HVX_Vector Vu,
+ HVX_Vector Vv) Instruction Type: CVI_VA Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Q_vcmp_eq_VhfVhf(Vu, Vv) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vandqrt)( \
+ (__BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_veqhf)(Vu, Vv)), -1)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Qx4&=vcmp.eq(Vu32.hf,Vv32.hf)
+ C Intrinsic Prototype: HVX_VectorPred Q6_Q_vcmp_eqand_QVhfVhf(HVX_VectorPred
+ Qx, HVX_Vector Vu, HVX_Vector Vv) Instruction Type: CVI_VA Execution
+ Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Q_vcmp_eqand_QVhfVhf(Qx, Vu, Vv) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vandqrt)( \
+ (__BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_veqhf_and)( \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vandvrt)((Qx), -1), Vu, \
+ Vv)), \
+ -1)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Qx4|=vcmp.eq(Vu32.hf,Vv32.hf)
+ C Intrinsic Prototype: HVX_VectorPred Q6_Q_vcmp_eqor_QVhfVhf(HVX_VectorPred
+ Qx, HVX_Vector Vu, HVX_Vector Vv) Instruction Type: CVI_VA Execution
+ Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Q_vcmp_eqor_QVhfVhf(Qx, Vu, Vv) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vandqrt)( \
+ (__BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_veqhf_or)( \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vandvrt)((Qx), -1), Vu, \
+ Vv)), \
+ -1)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Qx4^=vcmp.eq(Vu32.hf,Vv32.hf)
+ C Intrinsic Prototype: HVX_VectorPred Q6_Q_vcmp_eqxacc_QVhfVhf(HVX_VectorPred
+ Qx, HVX_Vector Vu, HVX_Vector Vv) Instruction Type: CVI_VA Execution
+ Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Q_vcmp_eqxacc_QVhfVhf(Qx, Vu, Vv) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vandqrt)( \
+ (__BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_veqhf_xor)( \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vandvrt)((Qx), -1), Vu, \
+ Vv)), \
+ -1)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Qd4=vcmp.eq(Vu32.sf,Vv32.sf)
+ C Intrinsic Prototype: HVX_VectorPred Q6_Q_vcmp_eq_VsfVsf(HVX_Vector Vu,
+ HVX_Vector Vv) Instruction Type: CVI_VA Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Q_vcmp_eq_VsfVsf(Vu, Vv) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vandqrt)( \
+ (__BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_veqsf)(Vu, Vv)), -1)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Qx4&=vcmp.eq(Vu32.sf,Vv32.sf)
+ C Intrinsic Prototype: HVX_VectorPred Q6_Q_vcmp_eqand_QVsfVsf(HVX_VectorPred
+ Qx, HVX_Vector Vu, HVX_Vector Vv) Instruction Type: CVI_VA Execution
+ Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Q_vcmp_eqand_QVsfVsf(Qx, Vu, Vv) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vandqrt)( \
+ (__BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_veqsf_and)( \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vandvrt)((Qx), -1), Vu, \
+ Vv)), \
+ -1)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Qx4|=vcmp.eq(Vu32.sf,Vv32.sf)
+ C Intrinsic Prototype: HVX_VectorPred Q6_Q_vcmp_eqor_QVsfVsf(HVX_VectorPred
+ Qx, HVX_Vector Vu, HVX_Vector Vv) Instruction Type: CVI_VA Execution
+ Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Q_vcmp_eqor_QVsfVsf(Qx, Vu, Vv) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vandqrt)( \
+ (__BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_veqsf_or)( \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vandvrt)((Qx), -1), Vu, \
+ Vv)), \
+ -1)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Qx4^=vcmp.eq(Vu32.sf,Vv32.sf)
+ C Intrinsic Prototype: HVX_VectorPred Q6_Q_vcmp_eqxacc_QVsfVsf(HVX_VectorPred
+ Qx, HVX_Vector Vu, HVX_Vector Vv) Instruction Type: CVI_VA Execution
+ Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Q_vcmp_eqxacc_QVsfVsf(Qx, Vu, Vv) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vandqrt)( \
+ (__BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_veqsf_xor)( \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vandvrt)((Qx), -1), Vu, \
+ Vv)), \
+ -1)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.w=vilog2(Vu32.hf)
+ C Intrinsic Prototype: HVX_Vector Q6_Vw_vilog2_Vhf(HVX_Vector Vu)
+ Instruction Type: CVI_VS
+ Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Vw_vilog2_Vhf(Vu) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vilog2_hf)(Vu)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.w=vilog2(Vu32.qf16)
+ C Intrinsic Prototype: HVX_Vector Q6_Vw_vilog2_Vqf16(HVX_Vector Vu)
+ Instruction Type: CVI_VS
+ Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Vw_vilog2_Vqf16(Vu) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vilog2_qf16)(Vu)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.w=vilog2(Vu32.qf32)
+ C Intrinsic Prototype: HVX_Vector Q6_Vw_vilog2_Vqf32(HVX_Vector Vu)
+ Instruction Type: CVI_VS
+ Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Vw_vilog2_Vqf32(Vu) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vilog2_qf32)(Vu)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.w=vilog2(Vu32.sf)
+ C Intrinsic Prototype: HVX_Vector Q6_Vw_vilog2_Vsf(HVX_Vector Vu)
+ Instruction Type: CVI_VS
+ Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Vw_vilog2_Vsf(Vu) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vilog2_sf)(Vu)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.qf16=vneg(Vu32.hf)
+ C Intrinsic Prototype: HVX_Vector Q6_Vqf16_vneg_Vhf(HVX_Vector Vu)
+ Instruction Type: CVI_VS
+ Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Vqf16_vneg_Vhf(Vu) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vneg_qf16_hf)(Vu)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.qf16=vneg(Vu32.qf16)
+ C Intrinsic Prototype: HVX_Vector Q6_Vqf16_vneg_Vqf16(HVX_Vector Vu)
+ Instruction Type: CVI_VS
+ Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Vqf16_vneg_Vqf16(Vu) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vneg_qf16_qf16)(Vu)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.qf32=vneg(Vu32.qf32)
+ C Intrinsic Prototype: HVX_Vector Q6_Vqf32_vneg_Vqf32(HVX_Vector Vu)
+ Instruction Type: CVI_VS
+ Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Vqf32_vneg_Vqf32(Vu) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vneg_qf32_qf32)(Vu)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.qf32=vneg(Vu32.sf)
+ C Intrinsic Prototype: HVX_Vector Q6_Vqf32_vneg_Vsf(HVX_Vector Vu)
+ Instruction Type: CVI_VS
+ Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Vqf32_vneg_Vsf(Vu) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vneg_qf32_sf)(Vu)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.qf16=vsub(Vu32.hf,Vv32.qf16)
+ C Intrinsic Prototype: HVX_Vector Q6_Vqf16_vsub_VhfVqf16(HVX_Vector Vu,
+ HVX_Vector Vv) Instruction Type: CVI_VS Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Vqf16_vsub_VhfVqf16(Vu, Vv) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vsub_hf_mix)(Vu, Vv)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
+#if __HVX_ARCH__ >= 81
+/* ==========================================================================
+ Assembly Syntax: Vd32.qf32=vsub(Vu32.sf,Vv32.qf32)
+ C Intrinsic Prototype: HVX_Vector Q6_Vqf32_vsub_VsfVqf32(HVX_Vector Vu,
+ HVX_Vector Vv) Instruction Type: CVI_VS Execution Slots: SLOT0123
+ ========================================================================== */
+
+#define Q6_Vqf32_vsub_VsfVqf32(Vu, Vv) \
+ __BUILTIN_VECTOR_WRAP(__builtin_HEXAGON_V6_vsub_sf_mix)(Vu, Vv)
+#endif /* __HEXAGON_ARCH___ >= 81 */
+
#endif /* __HVX__ */
#endif
diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp
index dd80ae5..5efa4b5 100644
--- a/clang/lib/Lex/PPMacroExpansion.cpp
+++ b/clang/lib/Lex/PPMacroExpansion.cpp
@@ -1735,7 +1735,19 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) {
Diag(getLastFPEvalPragmaLocation(), diag::note_pragma_entered_here);
}
} else if (II == Ident__COUNTER__) {
- // __COUNTER__ expands to a simple numeric value.
+ Diag(Tok.getLocation(),
+ getLangOpts().C2y ? diag::warn_counter : diag::ext_counter);
+ // __COUNTER__ expands to a simple numeric value that must be less than
+ // 2147483647.
+ constexpr uint32_t MaxPosValue = std::numeric_limits<int32_t>::max();
+ if (CounterValue > MaxPosValue) {
+ Diag(Tok.getLocation(), diag::err_counter_overflow);
+ // Retain the maximal value so we don't issue conversion-related
+ // diagnostics by overflowing into a long long. While this does produce
+ // a duplicate value, there's no way to ignore this error so there's no
+ // translation anyway.
+ CounterValue = MaxPosValue;
+ }
OS << CounterValue++;
Tok.setKind(tok::numeric_constant);
} else if (II == Ident__has_feature) {
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index 280b3c9..682fd25 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -2358,6 +2358,11 @@ QualType Sema::BuildVectorType(QualType CurType, Expr *SizeExpr,
return QualType();
}
+ if (VecSize->isNegative()) {
+ Diag(SizeExpr->getExprLoc(), diag::err_attribute_vec_negative_size);
+ return QualType();
+ }
+
if (CurType->isDependentType())
return Context.getDependentVectorType(CurType, SizeExpr, AttrLoc,
VectorKind::Generic);
@@ -2427,6 +2432,11 @@ QualType Sema::BuildExtVectorType(QualType T, Expr *ArraySize,
return QualType();
}
+ if (vecSize->isNegative()) {
+ Diag(ArraySize->getExprLoc(), diag::err_attribute_vec_negative_size);
+ return QualType();
+ }
+
if (!vecSize->isIntN(32)) {
Diag(AttrLoc, diag::err_attribute_size_too_large)
<< ArraySize->getSourceRange() << "vector";
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index e3106f8d..d552821 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -225,7 +225,7 @@ bool ChainedASTReaderListener::ReadPreprocessorOptions(
}
void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M,
- unsigned Value) {
+ uint32_t Value) {
First->ReadCounter(M, Value);
Second->ReadCounter(M, Value);
}
@@ -973,7 +973,7 @@ bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
PP.getPreprocessorOpts());
}
-void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
+void PCHValidator::ReadCounter(const ModuleFile &M, uint32_t Value) {
PP.setCounterValue(Value);
}
diff --git a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
index 70baab5..ec7ef23 100644
--- a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
@@ -6,41 +6,45 @@
//
//===----------------------------------------------------------------------===//
//
-// This file defines a variety of memory management related checkers, such as
+// This file defines checkers that report memory management errors such as
// leak, double free, and use-after-free.
//
-// The following checkers are defined here:
+// The logic for modeling memory allocations is implemented in the checker
+// family which is called 'MallocChecker' for historical reasons. (This name is
+// inaccurate, something like 'DynamicMemory' would be more precise.)
//
-// * MallocChecker
-// Despite its name, it models all sorts of memory allocations and
-// de- or reallocation, including but not limited to malloc, free,
-// relloc, new, delete. It also reports on a variety of memory misuse
-// errors.
-// Many other checkers interact very closely with this checker, in fact,
-// most are merely options to this one. Other checkers may register
-// MallocChecker, but do not enable MallocChecker's reports (more details
-// to follow around its field, ChecksEnabled).
-// It also has a boolean "Optimistic" checker option, which if set to true
-// will cause the checker to model user defined memory management related
-// functions annotated via the attribute ownership_takes, ownership_holds
-// and ownership_returns.
+// The reports produced by this backend are exposed through several frontends:
+// * MallocChecker: reports all misuse of dynamic memory allocated by
+// malloc, related functions (like calloc, realloc etc.) and the functions
+// annotated by ownership_returns. (Here the name "MallocChecker" is
+// reasonably accurate; don't confuse this checker frontend with the whole
+// misnamed family.)
+// * NewDeleteChecker: reports most misuse (anything but memory leaks) of
+// memory managed by the C++ operators new and new[].
+// * NewDeleteLeaksChecker: reports leaks of dynamic memory allocated by
+// the C++ operators new and new[].
+// * MismatchedDeallocatorChecker: reports situations where the allocation
+// and deallocation is mismatched, e.g. memory allocated via malloc is
+// passed to operator delete.
+// * InnerPointerChecker: reports use of pointers to the internal buffer of
+// a std::string instance after operations that invalidate them.
+// * TaintedAllocChecker: reports situations where the size argument of a
+// memory allocation function or array new operator is tainted (i.e. comes
+// from an untrusted source and can be controlled by an attacker).
//
-// * NewDeleteChecker
-// Enables the modeling of new, new[], delete, delete[] in MallocChecker,
-// and checks for related double-free and use-after-free errors.
+// In addition to these frontends this file also defines the registration
+// functions for "unix.DynamicMemoryModeling". This registers the callbacks of
+// the checker family MallocChecker without enabling any of the frontends and
+// and handle two checker options which are attached to this "modeling
+// checker" because they affect multiple checker frontends.
//
-// * NewDeleteLeaksChecker
-// Checks for leaks related to new, new[], delete, delete[].
-// Depends on NewDeleteChecker.
-//
-// * MismatchedDeallocatorChecker
-// Enables checking whether memory is deallocated with the corresponding
-// allocation function in MallocChecker, such as malloc() allocated
-// regions are only freed by free(), new by delete, new[] by delete[].
-//
-// InnerPointerChecker interacts very closely with MallocChecker, but unlike
-// the above checkers, it has it's own file, hence the many InnerPointerChecker
-// related headers and non-static functions.
+// Note that what the users see as the checker "cplusplus.InnerPointer" is a
+// combination of the frontend InnerPointerChecker (within this family) which
+// emits the bug reports and a separate checker class (also named
+// InnerPointerChecker) which is defined in InnerPointerChecker.cpp and does a
+// significant part of the modeling. This cooperation is enabled by several
+// non-static helper functions that are defined within this translation unit
+// and used in InnerPointerChecker.cpp.
//
//===----------------------------------------------------------------------===//
diff --git a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
index 62460cc..d04c827 100644
--- a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
+++ b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
@@ -230,13 +230,11 @@ static void findPtrToConstParams(llvm::SmallSet<unsigned, 4> &PreserveArgs,
}
ProgramStateRef CallEvent::invalidateRegions(unsigned BlockCount,
- ProgramStateRef Orig) const {
- ProgramStateRef Result = (Orig ? Orig : getState());
-
+ ProgramStateRef State) const {
// Don't invalidate anything if the callee is marked pure/const.
- if (const Decl *callee = getDecl())
- if (callee->hasAttr<PureAttr>() || callee->hasAttr<ConstAttr>())
- return Result;
+ if (const Decl *Callee = getDecl())
+ if (Callee->hasAttr<PureAttr>() || Callee->hasAttr<ConstAttr>())
+ return State;
SmallVector<SVal, 8> ValuesToInvalidate;
RegionAndSymbolInvalidationTraits ETraits;
@@ -278,10 +276,10 @@ ProgramStateRef CallEvent::invalidateRegions(unsigned BlockCount,
// Invalidate designated regions using the batch invalidation API.
// NOTE: Even if RegionsToInvalidate is empty, we may still invalidate
// global variables.
- return Result->invalidateRegions(ValuesToInvalidate, getCFGElementRef(),
- BlockCount, getLocationContext(),
- /*CausedByPointerEscape*/ true,
- /*Symbols=*/nullptr, this, &ETraits);
+ return State->invalidateRegions(ValuesToInvalidate, getCFGElementRef(),
+ BlockCount, getLocationContext(),
+ /*CausedByPointerEscape*/ true,
+ /*Symbols=*/nullptr, this, &ETraits);
}
ProgramPoint CallEvent::getProgramPoint(bool IsPreVisit,
diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp
index 75d7e26..00e3ef8 100644
--- a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp
+++ b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp
@@ -1013,7 +1013,7 @@ void ExprEngine::VisitCXXNewExpr(const CXXNewExpr *CNE, ExplodedNode *Pred,
// FIXME: Once we figure out how we want allocators to work,
// we should be using the usual pre-/(default-)eval-/post-call checkers
// here.
- State = Call->invalidateRegions(blockCount);
+ State = Call->invalidateRegions(blockCount, State);
if (!State)
return;
diff --git a/clang/test/AST/ByteCode/cxx11.cpp b/clang/test/AST/ByteCode/cxx11.cpp
index 427d3a1..e283a7b 100644
--- a/clang/test/AST/ByteCode/cxx11.cpp
+++ b/clang/test/AST/ByteCode/cxx11.cpp
@@ -374,7 +374,7 @@ namespace GH150709 {
namespace DiscardedAddrLabel {
void foo(void) {
L:
- *&&L; // both-error {{indirection not permitted}} \
+ *&&L; // both-error {{indirection not permitted on operand of type 'void *'}} \
// both-warning {{expression result unused}}
}
}
diff --git a/clang/test/C/C2y/n3457.c b/clang/test/C/C2y/n3457.c
new file mode 100644
index 0000000..d71a3f3
--- /dev/null
+++ b/clang/test/C/C2y/n3457.c
@@ -0,0 +1,38 @@
+// RUN: %clang_cc1 -verify=ext -std=c23 -pedantic %s
+// RUN: %clang_cc1 -verify=ext -pedantic -x c++ %s
+// RUN: %clang_cc1 -verify=pre -std=c2y -pedantic -Wpre-c2y-compat %s
+
+/* WG14 N3457: Clang 22
+ * The __COUNTER__ predefined macro
+ *
+ * This predefined macro was supported as an extension in earlier versions of
+ * Clang, but the required diagnostics for the limits were not added until 22.
+ */
+
+// Ensure that __COUNTER__ starts from 0.
+static_assert(__COUNTER__ == 0); /* ext-warning {{'__COUNTER__' is a C2y extension}}
+ pre-warning {{'__COUNTER__' is incompatible with standards before C2y}}
+ */
+
+// Ensure that the produced value can be used with token concatenation.
+#define CAT_IMPL(a, b) a ## b
+#define CAT(a, b) CAT_IMPL(a, b)
+#define NAME_WITH_COUNTER(a) CAT(a, __COUNTER__)
+void test() {
+ // Because this is the 2nd expansion, this defines test1.
+ int NAME_WITH_COUNTER(test); /* ext-warning {{'__COUNTER__' is a C2y extension}}
+ pre-warning {{'__COUNTER__' is incompatible with standards before C2y}}
+ */
+ int other_test = test1; // Ok
+}
+
+// Ensure that __COUNTER__ increments each time you mention it.
+static_assert(__COUNTER__ == 2); /* ext-warning {{'__COUNTER__' is a C2y extension}}
+ pre-warning {{'__COUNTER__' is incompatible with standards before C2y}}
+ */
+static_assert(__COUNTER__ == 3); /* ext-warning {{'__COUNTER__' is a C2y extension}}
+ pre-warning {{'__COUNTER__' is incompatible with standards before C2y}}
+ */
+static_assert(__COUNTER__ == 4); /* ext-warning {{'__COUNTER__' is a C2y extension}}
+ pre-warning {{'__COUNTER__' is incompatible with standards before C2y}}
+ */
diff --git a/clang/test/C/C2y/n3457_1.c b/clang/test/C/C2y/n3457_1.c
new file mode 100644
index 0000000..76c5a0b
--- /dev/null
+++ b/clang/test/C/C2y/n3457_1.c
@@ -0,0 +1,20 @@
+// RUN: %clang_cc1 -verify -std=c2y -finitial-counter-value=2147483646 %s
+
+// The value produced needs to be a type that's representable with a signed
+// long. However, the actual type it expands to does *not* need to be forced to
+// be signed long because that would generally mean suffixing the value with L,
+// which would be very surprising for folks using this to generate unique ids.
+// We'll test this by ensuring the largest value can be expanded properly and
+// an assertion that signed long is always at least four bytes wide (which is
+// what's required to represent that maximal value).
+//
+// So we set the initial counter value to 2147483646, we'll validate that,
+// increment it once to get to the maximal value and ensure there's no
+// diagnostic, then increment again to ensure we get the constraint violation.
+
+static_assert(__COUNTER__ == 2147483646); // Test and increment
+static_assert(__COUNTER__ == 2147483647); // Test and increment
+
+// This one should fail.
+signed long i = __COUNTER__; // expected-error {{'__COUNTER__' value cannot exceed 2'147'483'647}}
+
diff --git a/clang/test/C/C2y/n3457_2.c b/clang/test/C/C2y/n3457_2.c
new file mode 100644
index 0000000..018c8f4
--- /dev/null
+++ b/clang/test/C/C2y/n3457_2.c
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -verify=good -std=c2y -finitial-counter-value=2147483648 %s
+// RUN: %clang_cc1 -verify -std=c2y -finitial-counter-value=2147483648 -DEXPAND_IT %s
+// good-no-diagnostics
+
+// This sets the intial __COUNTER__ value to something that's too big. Setting
+// the value too large is fine. Expanding to a too-large value is not.
+#ifdef EXPAND_IT
+ // This one should fail.
+ signed long i = __COUNTER__; // expected-error {{'__COUNTER__' value cannot exceed 2'147'483'647}}
+#endif
diff --git a/clang/test/CIR/CodeGen/builtins-floating-point.c b/clang/test/CIR/CodeGen/builtins-floating-point.c
index 193cc172..8bdc43c 100644
--- a/clang/test/CIR/CodeGen/builtins-floating-point.c
+++ b/clang/test/CIR/CodeGen/builtins-floating-point.c
@@ -7,14 +7,21 @@
float cosf(float f) {
return __builtin_cosf(f);
- // CHECK: %{{.*}} = cir.cos {{.*}} : !cir.float
+ // CIR: %{{.*}} = cir.cos %{{.*}} : !cir.float
// LLVM: %{{.*}} = call float @llvm.cos.f32(float %{{.*}})
// OGCG: %{{.*}} = call float @llvm.cos.f32(float %{{.*}})
}
double cos(double f) {
return __builtin_cos(f);
- // CIR: {{.+}} = cir.cos {{.+}} : !cir.double
+ // CIR: %{{.*}} = cir.cos %{{.*}} : !cir.double
// LLVM: %{{.*}} = call double @llvm.cos.f64(double %{{.*}})
// OGCG: %{{.*}} = call double @llvm.cos.f64(double %{{.*}})
}
+
+float ceil(float f) {
+ return __builtin_ceilf(f);
+ // CIR: %{{.*}} = cir.ceil %{{.*}} : !cir.float
+ // LLVM: %{{.*}} = call float @llvm.ceil.f32(float %{{.*}})
+ // OGCG: %{{.*}} = call float @llvm.ceil.f32(float %{{.*}})
+}
diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_16.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_16.c
new file mode 100644
index 0000000..a0d5845
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_16.c
@@ -0,0 +1,131 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zvfh \
+// RUN: -target-feature +xsfvfexp16e -disable-O0-optnone \
+// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
+// RUN: FileCheck --check-prefix=CHECK-RV64 %s
+
+#include <sifive_vector.h>
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4(
+// CHECK-RV64-SAME: <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.nxv1f16.i64(<vscale x 1 x half> poison, <vscale x 1 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexp_v_f16mf4(vfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16mf4(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2(
+// CHECK-RV64-SAME: <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.nxv2f16.i64(<vscale x 2 x half> poison, <vscale x 2 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexp_v_f16mf2(vfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16mf2(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1(
+// CHECK-RV64-SAME: <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.nxv4f16.i64(<vscale x 4 x half> poison, <vscale x 4 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexp_v_f16m1(vfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m1(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2(
+// CHECK-RV64-SAME: <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.nxv8f16.i64(<vscale x 8 x half> poison, <vscale x 8 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexp_v_f16m2(vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m2(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4(
+// CHECK-RV64-SAME: <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.nxv16f16.i64(<vscale x 16 x half> poison, <vscale x 16 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexp_v_f16m4(vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m4(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8(
+// CHECK-RV64-SAME: <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.nxv32f16.i64(<vscale x 32 x half> poison, <vscale x 32 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexp_v_f16m8(vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m8(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4_m(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.mask.nxv1f16.i64(<vscale x 1 x half> poison, <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexp_v_f16mf4_m(vbool64_t vm, vfloat16mf4_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_v_f16mf4_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_m(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.mask.nxv2f16.i64(<vscale x 2 x half> poison, <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexp_v_f16mf2_m(vbool32_t vm, vfloat16mf2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_v_f16mf2_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_m(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.mask.nxv4f16.i64(<vscale x 4 x half> poison, <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexp_v_f16m1_m(vbool16_t vm, vfloat16m1_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_v_f16m1_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_m(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.mask.nxv8f16.i64(<vscale x 8 x half> poison, <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexp_v_f16m2_m(vbool8_t vm, vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m2_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_m(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.mask.nxv16f16.i64(<vscale x 16 x half> poison, <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexp_v_f16m4_m(vbool4_t vm, vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m4_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_m(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.mask.nxv32f16.i64(<vscale x 32 x half> poison, <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexp_v_f16m8_m(vbool2_t vm, vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m8_m(vm, vs2, vl);
+}
diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_32.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_32.c
new file mode 100644
index 0000000..25d0991
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_32.c
@@ -0,0 +1,111 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zve32f \
+// RUN: -target-feature +xsfvfexp32e -disable-O0-optnone \
+// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
+// RUN: FileCheck --check-prefix=CHECK-RV64 %s
+
+#include <sifive_vector.h>
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2(
+// CHECK-RV64-SAME: <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.nxv1f32.i64(<vscale x 1 x float> poison, <vscale x 1 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexp_v_f32mf2(vfloat32mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32mf2(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1(
+// CHECK-RV64-SAME: <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.nxv2f32.i64(<vscale x 2 x float> poison, <vscale x 2 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexp_v_f32m1(vfloat32m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m1(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2(
+// CHECK-RV64-SAME: <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.nxv4f32.i64(<vscale x 4 x float> poison, <vscale x 4 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexp_v_f32m2(vfloat32m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m2(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4(
+// CHECK-RV64-SAME: <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.nxv8f32.i64(<vscale x 8 x float> poison, <vscale x 8 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexp_v_f32m4(vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m4(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8(
+// CHECK-RV64-SAME: <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.nxv16f32.i64(<vscale x 16 x float> poison, <vscale x 16 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexp_v_f32m8(vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m8(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_m(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.mask.nxv1f32.i64(<vscale x 1 x float> poison, <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexp_v_f32mf2_m(vbool64_t vm, vfloat32mf2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_v_f32mf2_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_m(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.mask.nxv2f32.i64(<vscale x 2 x float> poison, <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexp_v_f32m1_m(vbool32_t vm, vfloat32m1_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_v_f32m1_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_m(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.mask.nxv4f32.i64(<vscale x 4 x float> poison, <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexp_v_f32m2_m(vbool16_t vm, vfloat32m2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_v_f32m2_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_m(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.mask.nxv8f32.i64(<vscale x 8 x float> poison, <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexp_v_f32m4_m(vbool8_t vm, vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m4_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_m(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.mask.nxv16f32.i64(<vscale x 16 x float> poison, <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexp_v_f32m8_m(vbool4_t vm, vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m8_m(vm, vs2, vl);
+}
diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_bf.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_bf.c
new file mode 100644
index 0000000..9fc332a
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_bf.c
@@ -0,0 +1,135 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zve32f \
+// RUN: -target-feature +zvfbfmin -target-feature +xsfvfbfexp16e -disable-O0-optnone \
+// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
+// RUN: FileCheck --check-prefix=CHECK-RV64 %s
+
+#include <sifive_vector.h>
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4(
+// CHECK-RV64-SAME: <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.nxv1bf16.i64(<vscale x 1 x bfloat> poison, <vscale x 1 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x bfloat> [[TMP0]]
+//
+vbfloat16mf4_t test_sf_vfexp_v_bf16mf4(vbfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16mf4(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2(
+// CHECK-RV64-SAME: <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.nxv2bf16.i64(<vscale x 2 x bfloat> poison, <vscale x 2 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x bfloat> [[TMP0]]
+//
+vbfloat16mf2_t test_sf_vfexp_v_bf16mf2(vbfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16mf2(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1(
+// CHECK-RV64-SAME: <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.nxv4bf16.i64(<vscale x 4 x bfloat> poison, <vscale x 4 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x bfloat> [[TMP0]]
+//
+vbfloat16m1_t test_sf_vfexp_v_bf16m1(vbfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m1(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2(
+// CHECK-RV64-SAME: <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.nxv8bf16.i64(<vscale x 8 x bfloat> poison, <vscale x 8 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x bfloat> [[TMP0]]
+//
+vbfloat16m2_t test_sf_vfexp_v_bf16m2(vbfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m2(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4(
+// CHECK-RV64-SAME: <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.nxv16bf16.i64(<vscale x 16 x bfloat> poison, <vscale x 16 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 16 x bfloat> [[TMP0]]
+//
+vbfloat16m4_t test_sf_vfexp_v_bf16m4(vbfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m4(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8(
+// CHECK-RV64-SAME: <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.nxv32bf16.i64(<vscale x 32 x bfloat> poison, <vscale x 32 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 32 x bfloat> [[TMP0]]
+//
+vbfloat16m8_t test_sf_vfexp_v_bf16m8(vbfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m8(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4_m(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv1bf16.i64(<vscale x 1 x bfloat> poison, <vscale x 1 x bfloat> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 1 x bfloat> [[TMP0]]
+//
+vbfloat16mf4_t test_sf_vfexp_v_bf16mf4_m(vbool64_t vm, vbfloat16mf4_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_v_bf16mf4_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2_m(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv2bf16.i64(<vscale x 2 x bfloat> poison, <vscale x 2 x bfloat> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 2 x bfloat> [[TMP0]]
+//
+vbfloat16mf2_t test_sf_vfexp_v_bf16mf2_m(vbool32_t vm, vbfloat16mf2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_v_bf16mf2_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1_m(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv4bf16.i64(<vscale x 4 x bfloat> poison, <vscale x 4 x bfloat> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 4 x bfloat> [[TMP0]]
+//
+vbfloat16m1_t test_sf_vfexp_v_bf16m1_m(vbool16_t vm, vbfloat16m1_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m1_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2_m(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv8bf16.i64(<vscale x 8 x bfloat> poison, <vscale x 8 x bfloat> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 8 x bfloat> [[TMP0]]
+//
+vbfloat16m2_t test_sf_vfexp_v_bf16m2_m(vbool8_t vm, vbfloat16m2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m2_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4_m(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv16bf16.i64(<vscale x 16 x bfloat> poison, <vscale x 16 x bfloat> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 16 x bfloat> [[TMP0]]
+//
+vbfloat16m4_t test_sf_vfexp_v_bf16m4_m(vbool4_t vm, vbfloat16m4_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m4_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8_m(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv32bf16.i64(<vscale x 32 x bfloat> poison, <vscale x 32 x bfloat> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 32 x bfloat> [[TMP0]]
+//
+vbfloat16m8_t test_sf_vfexp_v_bf16m8_m(vbool2_t vm, vbfloat16m8_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m8_m(vm, vs2, vl);
+}
+
diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexpa_v.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexpa_v.c
new file mode 100644
index 0000000..67a9220
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexpa_v.c
@@ -0,0 +1,234 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64f -target-feature +zvfh \
+// RUN: -target-feature +xsfvfexpa -disable-O0-optnone \
+// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
+// RUN: FileCheck --check-prefix=CHECK-RV64 %s
+
+#include <sifive_vector.h>
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4(
+// CHECK-RV64-SAME: <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.nxv1f16.i64(<vscale x 1 x half> poison, <vscale x 1 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexpa_v_f16mf4(vfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16mf4(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2(
+// CHECK-RV64-SAME: <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.nxv2f16.i64(<vscale x 2 x half> poison, <vscale x 2 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexpa_v_f16mf2(vfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16mf2(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1(
+// CHECK-RV64-SAME: <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.nxv4f16.i64(<vscale x 4 x half> poison, <vscale x 4 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexpa_v_f16m1(vfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m1(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2(
+// CHECK-RV64-SAME: <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.nxv8f16.i64(<vscale x 8 x half> poison, <vscale x 8 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexpa_v_f16m2(vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m2(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4(
+// CHECK-RV64-SAME: <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.nxv16f16.i64(<vscale x 16 x half> poison, <vscale x 16 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexpa_v_f16m4(vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m4(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8(
+// CHECK-RV64-SAME: <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.nxv32f16.i64(<vscale x 32 x half> poison, <vscale x 32 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexpa_v_f16m8(vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m8(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2(
+// CHECK-RV64-SAME: <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.nxv1f32.i64(<vscale x 1 x float> poison, <vscale x 1 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexpa_v_f32mf2(vfloat32mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32mf2(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1(
+// CHECK-RV64-SAME: <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.nxv2f32.i64(<vscale x 2 x float> poison, <vscale x 2 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexpa_v_f32m1(vfloat32m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m1(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2(
+// CHECK-RV64-SAME: <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.nxv4f32.i64(<vscale x 4 x float> poison, <vscale x 4 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexpa_v_f32m2(vfloat32m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m2(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4(
+// CHECK-RV64-SAME: <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.nxv8f32.i64(<vscale x 8 x float> poison, <vscale x 8 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexpa_v_f32m4(vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m4(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8(
+// CHECK-RV64-SAME: <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.nxv16f32.i64(<vscale x 16 x float> poison, <vscale x 16 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexpa_v_f32m8(vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m8(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4_m(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.mask.nxv1f16.i64(<vscale x 1 x half> poison, <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexpa_v_f16mf4_m(vbool64_t vm, vfloat16mf4_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_v_f16mf4_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2_m(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.mask.nxv2f16.i64(<vscale x 2 x half> poison, <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexpa_v_f16mf2_m(vbool32_t vm, vfloat16mf2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_v_f16mf2_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1_m(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.mask.nxv4f16.i64(<vscale x 4 x half> poison, <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexpa_v_f16m1_m(vbool16_t vm, vfloat16m1_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m1_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2_m(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.mask.nxv8f16.i64(<vscale x 8 x half> poison, <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexpa_v_f16m2_m(vbool8_t vm, vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m2_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4_m(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.mask.nxv16f16.i64(<vscale x 16 x half> poison, <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexpa_v_f16m4_m(vbool4_t vm, vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m4_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8_m(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.mask.nxv32f16.i64(<vscale x 32 x half> poison, <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexpa_v_f16m8_m(vbool2_t vm, vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m8_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2_m(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.mask.nxv1f32.i64(<vscale x 1 x float> poison, <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexpa_v_f32mf2_m(vbool64_t vm, vfloat32mf2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_v_f32mf2_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1_m(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.mask.nxv2f32.i64(<vscale x 2 x float> poison, <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexpa_v_f32m1_m(vbool32_t vm, vfloat32m1_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m1_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2_m(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.mask.nxv4f32.i64(<vscale x 4 x float> poison, <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexpa_v_f32m2_m(vbool16_t vm, vfloat32m2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m2_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4_m(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.mask.nxv8f32.i64(<vscale x 8 x float> poison, <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexpa_v_f32m4_m(vbool8_t vm, vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m4_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8_m(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.mask.nxv16f32.i64(<vscale x 16 x float> poison, <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexpa_v_f32m8_m(vbool4_t vm, vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m8_m(vm, vs2, vl);
+}
diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexpa_v_64.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexpa_v_64.c
new file mode 100644
index 0000000..fd6f82d
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexpa_v_64.c
@@ -0,0 +1,90 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64 -target-feature +xsfvfexpa64e \
+// RUN: -disable-O0-optnone -emit-llvm %s -o - | opt -S -passes=mem2reg | \
+// RUN: FileCheck --check-prefix=CHECK-RV64 %s
+
+#include <sifive_vector.h>
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1(
+// CHECK-RV64-SAME: <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.nxv1f64.i64(<vscale x 1 x double> poison, <vscale x 1 x double> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]]
+//
+vfloat64m1_t test_sf_vfexpa_v_f64m1(vfloat64m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m1(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2(
+// CHECK-RV64-SAME: <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.nxv2f64.i64(<vscale x 2 x double> poison, <vscale x 2 x double> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]]
+//
+vfloat64m2_t test_sf_vfexpa_v_f64m2(vfloat64m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m2(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4(
+// CHECK-RV64-SAME: <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.nxv4f64.i64(<vscale x 4 x double> poison, <vscale x 4 x double> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]]
+//
+vfloat64m4_t test_sf_vfexpa_v_f64m4(vfloat64m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m4(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8(
+// CHECK-RV64-SAME: <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.nxv8f64.i64(<vscale x 8 x double> poison, <vscale x 8 x double> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]]
+//
+vfloat64m8_t test_sf_vfexpa_v_f64m8(vfloat64m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m8(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1_m(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.mask.nxv1f64.i64(<vscale x 1 x double> poison, <vscale x 1 x double> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]]
+//
+vfloat64m1_t test_sf_vfexpa_v_f64m1_m(vbool64_t vm, vfloat64m1_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m1_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2_m(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.mask.nxv2f64.i64(<vscale x 2 x double> poison, <vscale x 2 x double> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]]
+//
+vfloat64m2_t test_sf_vfexpa_v_f64m2_m(vbool32_t vm, vfloat64m2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m2_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4_m(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.mask.nxv4f64.i64(<vscale x 4 x double> poison, <vscale x 4 x double> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]]
+//
+vfloat64m4_t test_sf_vfexpa_v_f64m4_m(vbool16_t vm, vfloat64m4_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m4_m(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8_m(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.mask.nxv8f64.i64(<vscale x 8 x double> poison, <vscale x 8 x double> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]]
+//
+vfloat64m8_t test_sf_vfexpa_v_f64m8_m(vbool8_t vm, vfloat64m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m8_m(vm, vs2, vl);
+}
diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_16.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_16.c
new file mode 100644
index 0000000..0e769ed
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_16.c
@@ -0,0 +1,131 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zvfh \
+// RUN: -target-feature +xsfvfexp16e -disable-O0-optnone \
+// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
+// RUN: FileCheck --check-prefix=CHECK-RV64 %s
+
+#include <sifive_vector.h>
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4(
+// CHECK-RV64-SAME: <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.nxv1f16.i64(<vscale x 1 x half> poison, <vscale x 1 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexp_v_f16mf4(vfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2(
+// CHECK-RV64-SAME: <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.nxv2f16.i64(<vscale x 2 x half> poison, <vscale x 2 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexp_v_f16mf2(vfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1(
+// CHECK-RV64-SAME: <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.nxv4f16.i64(<vscale x 4 x half> poison, <vscale x 4 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexp_v_f16m1(vfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2(
+// CHECK-RV64-SAME: <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.nxv8f16.i64(<vscale x 8 x half> poison, <vscale x 8 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexp_v_f16m2(vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4(
+// CHECK-RV64-SAME: <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.nxv16f16.i64(<vscale x 16 x half> poison, <vscale x 16 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexp_v_f16m4(vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8(
+// CHECK-RV64-SAME: <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.nxv32f16.i64(<vscale x 32 x half> poison, <vscale x 32 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexp_v_f16m8(vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4_m(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.mask.nxv1f16.i64(<vscale x 1 x half> poison, <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexp_v_f16mf4_m(vbool64_t vm, vfloat16mf4_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_m(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.mask.nxv2f16.i64(<vscale x 2 x half> poison, <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexp_v_f16mf2_m(vbool32_t vm, vfloat16mf2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_m(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.mask.nxv4f16.i64(<vscale x 4 x half> poison, <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexp_v_f16m1_m(vbool16_t vm, vfloat16m1_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_m(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.mask.nxv8f16.i64(<vscale x 8 x half> poison, <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexp_v_f16m2_m(vbool8_t vm, vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_m(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.mask.nxv16f16.i64(<vscale x 16 x half> poison, <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexp_v_f16m4_m(vbool4_t vm, vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_m(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.mask.nxv32f16.i64(<vscale x 32 x half> poison, <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexp_v_f16m8_m(vbool2_t vm, vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vm, vs2, vl);
+}
diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_32.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_32.c
new file mode 100644
index 0000000..3df1eaa
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_32.c
@@ -0,0 +1,111 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zve32f \
+// RUN: -target-feature +xsfvfexp32e -disable-O0-optnone \
+// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
+// RUN: FileCheck --check-prefix=CHECK-RV64 %s
+
+#include <sifive_vector.h>
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2(
+// CHECK-RV64-SAME: <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.nxv1f32.i64(<vscale x 1 x float> poison, <vscale x 1 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexp_v_f32mf2(vfloat32mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1(
+// CHECK-RV64-SAME: <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.nxv2f32.i64(<vscale x 2 x float> poison, <vscale x 2 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexp_v_f32m1(vfloat32m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2(
+// CHECK-RV64-SAME: <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.nxv4f32.i64(<vscale x 4 x float> poison, <vscale x 4 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexp_v_f32m2(vfloat32m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4(
+// CHECK-RV64-SAME: <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.nxv8f32.i64(<vscale x 8 x float> poison, <vscale x 8 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexp_v_f32m4(vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8(
+// CHECK-RV64-SAME: <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.nxv16f32.i64(<vscale x 16 x float> poison, <vscale x 16 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexp_v_f32m8(vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_m(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.mask.nxv1f32.i64(<vscale x 1 x float> poison, <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexp_v_f32mf2_m(vbool64_t vm, vfloat32mf2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_m(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.mask.nxv2f32.i64(<vscale x 2 x float> poison, <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexp_v_f32m1_m(vbool32_t vm, vfloat32m1_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_m(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.mask.nxv4f32.i64(<vscale x 4 x float> poison, <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexp_v_f32m2_m(vbool16_t vm, vfloat32m2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_m(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.mask.nxv8f32.i64(<vscale x 8 x float> poison, <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexp_v_f32m4_m(vbool8_t vm, vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_m(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.mask.nxv16f32.i64(<vscale x 16 x float> poison, <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexp_v_f32m8_m(vbool4_t vm, vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vm, vs2, vl);
+}
diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_bf.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_bf.c
new file mode 100644
index 0000000..6179dbe
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_bf.c
@@ -0,0 +1,134 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zve32f \
+// RUN: -target-feature +zvfbfmin -target-feature +xsfvfbfexp16e -disable-O0-optnone \
+// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
+// RUN: FileCheck --check-prefix=CHECK-RV64 %s
+
+#include <sifive_vector.h>
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4(
+// CHECK-RV64-SAME: <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.nxv1bf16.i64(<vscale x 1 x bfloat> poison, <vscale x 1 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x bfloat> [[TMP0]]
+//
+vbfloat16mf4_t test_sf_vfexp_v_bf16mf4(vbfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2(
+// CHECK-RV64-SAME: <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.nxv2bf16.i64(<vscale x 2 x bfloat> poison, <vscale x 2 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x bfloat> [[TMP0]]
+//
+vbfloat16mf2_t test_sf_vfexp_v_bf16mf2(vbfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1(
+// CHECK-RV64-SAME: <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.nxv4bf16.i64(<vscale x 4 x bfloat> poison, <vscale x 4 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x bfloat> [[TMP0]]
+//
+vbfloat16m1_t test_sf_vfexp_v_bf16m1(vbfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2(
+// CHECK-RV64-SAME: <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.nxv8bf16.i64(<vscale x 8 x bfloat> poison, <vscale x 8 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x bfloat> [[TMP0]]
+//
+vbfloat16m2_t test_sf_vfexp_v_bf16m2(vbfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4(
+// CHECK-RV64-SAME: <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.nxv16bf16.i64(<vscale x 16 x bfloat> poison, <vscale x 16 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 16 x bfloat> [[TMP0]]
+//
+vbfloat16m4_t test_sf_vfexp_v_bf16m4(vbfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8(
+// CHECK-RV64-SAME: <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.nxv32bf16.i64(<vscale x 32 x bfloat> poison, <vscale x 32 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 32 x bfloat> [[TMP0]]
+//
+vbfloat16m8_t test_sf_vfexp_v_bf16m8(vbfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4_m(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv1bf16.i64(<vscale x 1 x bfloat> poison, <vscale x 1 x bfloat> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 1 x bfloat> [[TMP0]]
+//
+vbfloat16mf4_t test_sf_vfexp_v_bf16mf4_m(vbool64_t vm, vbfloat16mf4_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2_m(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv2bf16.i64(<vscale x 2 x bfloat> poison, <vscale x 2 x bfloat> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 2 x bfloat> [[TMP0]]
+//
+vbfloat16mf2_t test_sf_vfexp_v_bf16mf2_m(vbool32_t vm, vbfloat16mf2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1_m(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv4bf16.i64(<vscale x 4 x bfloat> poison, <vscale x 4 x bfloat> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 4 x bfloat> [[TMP0]]
+//
+vbfloat16m1_t test_sf_vfexp_v_bf16m1_m(vbool16_t vm, vbfloat16m1_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2_m(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv8bf16.i64(<vscale x 8 x bfloat> poison, <vscale x 8 x bfloat> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 8 x bfloat> [[TMP0]]
+//
+vbfloat16m2_t test_sf_vfexp_v_bf16m2_m(vbool8_t vm, vbfloat16m2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4_m(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv16bf16.i64(<vscale x 16 x bfloat> poison, <vscale x 16 x bfloat> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 16 x bfloat> [[TMP0]]
+//
+vbfloat16m4_t test_sf_vfexp_v_bf16m4_m(vbool4_t vm, vbfloat16m4_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8_m(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv32bf16.i64(<vscale x 32 x bfloat> poison, <vscale x 32 x bfloat> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 32 x bfloat> [[TMP0]]
+//
+vbfloat16m8_t test_sf_vfexp_v_bf16m8_m(vbool2_t vm, vbfloat16m8_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp(vm, vs2, vl);
+}
diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexpa_v.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexpa_v.c
new file mode 100644
index 0000000..1ddbb0b
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexpa_v.c
@@ -0,0 +1,234 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64f -target-feature +zvfh \
+// RUN: -target-feature +xsfvfexpa -disable-O0-optnone \
+// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
+// RUN: FileCheck --check-prefix=CHECK-RV64 %s
+
+#include <sifive_vector.h>
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4(
+// CHECK-RV64-SAME: <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.nxv1f16.i64(<vscale x 1 x half> poison, <vscale x 1 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexpa_v_f16mf4(vfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2(
+// CHECK-RV64-SAME: <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.nxv2f16.i64(<vscale x 2 x half> poison, <vscale x 2 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexpa_v_f16mf2(vfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1(
+// CHECK-RV64-SAME: <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.nxv4f16.i64(<vscale x 4 x half> poison, <vscale x 4 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexpa_v_f16m1(vfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2(
+// CHECK-RV64-SAME: <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.nxv8f16.i64(<vscale x 8 x half> poison, <vscale x 8 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexpa_v_f16m2(vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4(
+// CHECK-RV64-SAME: <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.nxv16f16.i64(<vscale x 16 x half> poison, <vscale x 16 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexpa_v_f16m4(vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8(
+// CHECK-RV64-SAME: <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.nxv32f16.i64(<vscale x 32 x half> poison, <vscale x 32 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexpa_v_f16m8(vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2(
+// CHECK-RV64-SAME: <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.nxv1f32.i64(<vscale x 1 x float> poison, <vscale x 1 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexpa_v_f32mf2(vfloat32mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1(
+// CHECK-RV64-SAME: <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.nxv2f32.i64(<vscale x 2 x float> poison, <vscale x 2 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexpa_v_f32m1(vfloat32m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2(
+// CHECK-RV64-SAME: <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.nxv4f32.i64(<vscale x 4 x float> poison, <vscale x 4 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexpa_v_f32m2(vfloat32m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4(
+// CHECK-RV64-SAME: <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.nxv8f32.i64(<vscale x 8 x float> poison, <vscale x 8 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexpa_v_f32m4(vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8(
+// CHECK-RV64-SAME: <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.nxv16f32.i64(<vscale x 16 x float> poison, <vscale x 16 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexpa_v_f32m8(vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4_m(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.mask.nxv1f16.i64(<vscale x 1 x half> poison, <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexpa_v_f16mf4_m(vbool64_t vm, vfloat16mf4_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2_m(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.mask.nxv2f16.i64(<vscale x 2 x half> poison, <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexpa_v_f16mf2_m(vbool32_t vm, vfloat16mf2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1_m(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.mask.nxv4f16.i64(<vscale x 4 x half> poison, <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexpa_v_f16m1_m(vbool16_t vm, vfloat16m1_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2_m(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.mask.nxv8f16.i64(<vscale x 8 x half> poison, <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexpa_v_f16m2_m(vbool8_t vm, vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4_m(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.mask.nxv16f16.i64(<vscale x 16 x half> poison, <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexpa_v_f16m4_m(vbool4_t vm, vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8_m(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.mask.nxv32f16.i64(<vscale x 32 x half> poison, <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexpa_v_f16m8_m(vbool2_t vm, vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2_m(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.mask.nxv1f32.i64(<vscale x 1 x float> poison, <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexpa_v_f32mf2_m(vbool64_t vm, vfloat32mf2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1_m(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.mask.nxv2f32.i64(<vscale x 2 x float> poison, <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexpa_v_f32m1_m(vbool32_t vm, vfloat32m1_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2_m(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.mask.nxv4f32.i64(<vscale x 4 x float> poison, <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexpa_v_f32m2_m(vbool16_t vm, vfloat32m2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4_m(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.mask.nxv8f32.i64(<vscale x 8 x float> poison, <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexpa_v_f32m4_m(vbool8_t vm, vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8_m(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.mask.nxv16f32.i64(<vscale x 16 x float> poison, <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexpa_v_f32m8_m(vbool4_t vm, vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vm, vs2, vl);
+}
diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexpa_v_64.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexpa_v_64.c
new file mode 100644
index 0000000..165879a
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexpa_v_64.c
@@ -0,0 +1,90 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64 -target-feature +xsfvfexpa64e \
+// RUN: -disable-O0-optnone -emit-llvm %s -o - | opt -S -passes=mem2reg | \
+// RUN: FileCheck --check-prefix=CHECK-RV64 %s
+
+#include <sifive_vector.h>
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1(
+// CHECK-RV64-SAME: <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.nxv1f64.i64(<vscale x 1 x double> poison, <vscale x 1 x double> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]]
+//
+vfloat64m1_t test_sf_vfexpa_v_f64m1(vfloat64m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2(
+// CHECK-RV64-SAME: <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.nxv2f64.i64(<vscale x 2 x double> poison, <vscale x 2 x double> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]]
+//
+vfloat64m2_t test_sf_vfexpa_v_f64m2(vfloat64m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4(
+// CHECK-RV64-SAME: <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.nxv4f64.i64(<vscale x 4 x double> poison, <vscale x 4 x double> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]]
+//
+vfloat64m4_t test_sf_vfexpa_v_f64m4(vfloat64m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8(
+// CHECK-RV64-SAME: <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.nxv8f64.i64(<vscale x 8 x double> poison, <vscale x 8 x double> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]]
+//
+vfloat64m8_t test_sf_vfexpa_v_f64m8(vfloat64m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1_m(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.mask.nxv1f64.i64(<vscale x 1 x double> poison, <vscale x 1 x double> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]]
+//
+vfloat64m1_t test_sf_vfexpa_v_f64m1_m(vbool64_t vm, vfloat64m1_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2_m(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.mask.nxv2f64.i64(<vscale x 2 x double> poison, <vscale x 2 x double> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]]
+//
+vfloat64m2_t test_sf_vfexpa_v_f64m2_m(vbool32_t vm, vfloat64m2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4_m(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.mask.nxv4f64.i64(<vscale x 4 x double> poison, <vscale x 4 x double> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]]
+//
+vfloat64m4_t test_sf_vfexpa_v_f64m4_m(vbool16_t vm, vfloat64m4_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa(vm, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8_m(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.mask.nxv8f64.i64(<vscale x 8 x double> poison, <vscale x 8 x double> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3)
+// CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]]
+//
+vfloat64m8_t test_sf_vfexpa_v_f64m8_m(vbool8_t vm, vfloat64m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa(vm, vs2, vl);
+}
diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_16.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_16.c
new file mode 100644
index 0000000..aed6d87
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_16.c
@@ -0,0 +1,248 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zvfh \
+// RUN: -target-feature +xsfvfexp16e -disable-O0-optnone \
+// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
+// RUN: FileCheck --check-prefix=CHECK-RV64 %s
+
+#include <sifive_vector.h>
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4_tu(
+// CHECK-RV64-SAME: <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexp_v_f16mf4_tu(vfloat16mf4_t vd, vfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16mf4_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_tu(
+// CHECK-RV64-SAME: <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexp_v_f16mf2_tu(vfloat16mf2_t vd, vfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16mf2_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_tu(
+// CHECK-RV64-SAME: <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexp_v_f16m1_tu(vfloat16m1_t vd, vfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m1_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_tu(
+// CHECK-RV64-SAME: <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexp_v_f16m2_tu(vfloat16m2_t vd, vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m2_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_tu(
+// CHECK-RV64-SAME: <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexp_v_f16m4_tu(vfloat16m4_t vd, vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m4_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_tu(
+// CHECK-RV64-SAME: <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexp_v_f16m8_tu(vfloat16m8_t vd, vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m8_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4_tum(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexp_v_f16mf4_tum(vbool64_t vm, vfloat16mf4_t vd, vfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16mf4_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_tum(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexp_v_f16mf2_tum(vbool32_t vm, vfloat16mf2_t vd, vfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16mf2_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_tum(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexp_v_f16m1_tum(vbool16_t vm, vfloat16m1_t vd, vfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m1_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_tum(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexp_v_f16m2_tum(vbool8_t vm, vfloat16m2_t vd, vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m2_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_tum(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexp_v_f16m4_tum(vbool4_t vm, vfloat16m4_t vd, vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m4_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_tum(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexp_v_f16m8_tum(vbool2_t vm, vfloat16m8_t vd, vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m8_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4_tumu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexp_v_f16mf4_tumu(vbool64_t vm, vfloat16mf4_t vd, vfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16mf4_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_tumu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexp_v_f16mf2_tumu(vbool32_t vm, vfloat16mf2_t vd, vfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16mf2_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_tumu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexp_v_f16m1_tumu(vbool16_t vm, vfloat16m1_t vd, vfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m1_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_tumu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexp_v_f16m2_tumu(vbool8_t vm, vfloat16m2_t vd, vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m2_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_tumu(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexp_v_f16m4_tumu(vbool4_t vm, vfloat16m4_t vd, vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m4_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_tumu(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexp_v_f16m8_tumu(vbool2_t vm, vfloat16m8_t vd, vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m8_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4_mu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexp_v_f16mf4_mu(vbool64_t vm, vfloat16mf4_t vd, vfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16mf4_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_mu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexp_v_f16mf2_mu(vbool32_t vm, vfloat16mf2_t vd, vfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16mf2_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_mu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexp_v_f16m1_mu(vbool16_t vm, vfloat16m1_t vd, vfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m1_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_mu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexp_v_f16m2_mu(vbool8_t vm, vfloat16m2_t vd, vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m2_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_mu(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexp_v_f16m4_mu(vbool4_t vm, vfloat16m4_t vd, vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m4_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_mu(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexp_v_f16m8_mu(vbool2_t vm, vfloat16m8_t vd, vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f16m8_mu(vm, vd, vs2, vl);
+}
diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_32.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_32.c
new file mode 100644
index 0000000..374f324
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_32.c
@@ -0,0 +1,208 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zve32f \
+// RUN: -target-feature +xsfvfexp32e -disable-O0-optnone \
+// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
+// RUN: FileCheck --check-prefix=CHECK-RV64 %s
+
+#include <sifive_vector.h>
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_tu(
+// CHECK-RV64-SAME: <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexp_v_f32mf2_tu(vfloat32mf2_t vd, vfloat32mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32mf2_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_tu(
+// CHECK-RV64-SAME: <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexp_v_f32m1_tu(vfloat32m1_t vd, vfloat32m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m1_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_tu(
+// CHECK-RV64-SAME: <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexp_v_f32m2_tu(vfloat32m2_t vd, vfloat32m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m2_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_tu(
+// CHECK-RV64-SAME: <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexp_v_f32m4_tu(vfloat32m4_t vd, vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m4_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_tu(
+// CHECK-RV64-SAME: <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexp_v_f32m8_tu(vfloat32m8_t vd, vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m8_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_tum(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexp_v_f32mf2_tum(vbool64_t vm, vfloat32mf2_t vd, vfloat32mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32mf2_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_tum(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexp_v_f32m1_tum(vbool32_t vm, vfloat32m1_t vd, vfloat32m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m1_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_tum(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexp_v_f32m2_tum(vbool16_t vm, vfloat32m2_t vd, vfloat32m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m2_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_tum(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexp_v_f32m4_tum(vbool8_t vm, vfloat32m4_t vd, vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m4_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_tum(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexp_v_f32m8_tum(vbool4_t vm, vfloat32m8_t vd, vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m8_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_tumu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexp_v_f32mf2_tumu(vbool64_t vm, vfloat32mf2_t vd, vfloat32mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32mf2_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_tumu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexp_v_f32m1_tumu(vbool32_t vm, vfloat32m1_t vd, vfloat32m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m1_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_tumu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexp_v_f32m2_tumu(vbool16_t vm, vfloat32m2_t vd, vfloat32m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m2_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_tumu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexp_v_f32m4_tumu(vbool8_t vm, vfloat32m4_t vd, vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m4_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_tumu(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexp_v_f32m8_tumu(vbool4_t vm, vfloat32m8_t vd, vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m8_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_mu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexp_v_f32mf2_mu(vbool64_t vm, vfloat32mf2_t vd, vfloat32mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32mf2_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_mu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexp_v_f32m1_mu(vbool32_t vm, vfloat32m1_t vd, vfloat32m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m1_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_mu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexp_v_f32m2_mu(vbool16_t vm, vfloat32m2_t vd, vfloat32m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m2_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_mu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexp_v_f32m4_mu(vbool8_t vm, vfloat32m4_t vd, vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m4_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_mu(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexp_v_f32m8_mu(vbool4_t vm, vfloat32m8_t vd, vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_f32m8_mu(vm, vd, vs2, vl);
+}
diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_bf.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_bf.c
new file mode 100644
index 0000000..aec0b9f
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_bf.c
@@ -0,0 +1,248 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zve32f \
+// RUN: -target-feature +zvfbfmin -target-feature +xsfvfbfexp16e -disable-O0-optnone \
+// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
+// RUN: FileCheck --check-prefix=CHECK-RV64 %s
+
+#include <sifive_vector.h>
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4_tu(
+// CHECK-RV64-SAME: <vscale x 1 x bfloat> [[VD:%.*]], <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.nxv1bf16.i64(<vscale x 1 x bfloat> [[VD]], <vscale x 1 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x bfloat> [[TMP0]]
+//
+vbfloat16mf4_t test_sf_vfexp_v_bf16mf4_tu(vbfloat16mf4_t vd, vbfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16mf4_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2_tu(
+// CHECK-RV64-SAME: <vscale x 2 x bfloat> [[VD:%.*]], <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.nxv2bf16.i64(<vscale x 2 x bfloat> [[VD]], <vscale x 2 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x bfloat> [[TMP0]]
+//
+vbfloat16mf2_t test_sf_vfexp_v_bf16mf2_tu(vbfloat16mf2_t vd, vbfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16mf2_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1_tu(
+// CHECK-RV64-SAME: <vscale x 4 x bfloat> [[VD:%.*]], <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.nxv4bf16.i64(<vscale x 4 x bfloat> [[VD]], <vscale x 4 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x bfloat> [[TMP0]]
+//
+vbfloat16m1_t test_sf_vfexp_v_bf16m1_tu(vbfloat16m1_t vd, vbfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m1_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2_tu(
+// CHECK-RV64-SAME: <vscale x 8 x bfloat> [[VD:%.*]], <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.nxv8bf16.i64(<vscale x 8 x bfloat> [[VD]], <vscale x 8 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x bfloat> [[TMP0]]
+//
+vbfloat16m2_t test_sf_vfexp_v_bf16m2_tu(vbfloat16m2_t vd, vbfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m2_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4_tu(
+// CHECK-RV64-SAME: <vscale x 16 x bfloat> [[VD:%.*]], <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.nxv16bf16.i64(<vscale x 16 x bfloat> [[VD]], <vscale x 16 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 16 x bfloat> [[TMP0]]
+//
+vbfloat16m4_t test_sf_vfexp_v_bf16m4_tu(vbfloat16m4_t vd, vbfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m4_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8_tu(
+// CHECK-RV64-SAME: <vscale x 32 x bfloat> [[VD:%.*]], <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.nxv32bf16.i64(<vscale x 32 x bfloat> [[VD]], <vscale x 32 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 32 x bfloat> [[TMP0]]
+//
+vbfloat16m8_t test_sf_vfexp_v_bf16m8_tu(vbfloat16m8_t vd, vbfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m8_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4_tum(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x bfloat> [[VD:%.*]], <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv1bf16.i64(<vscale x 1 x bfloat> [[VD]], <vscale x 1 x bfloat> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 1 x bfloat> [[TMP0]]
+//
+vbfloat16mf4_t test_sf_vfexp_v_bf16mf4_tum(vbool64_t vm, vbfloat16mf4_t vd, vbfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16mf4_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2_tum(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x bfloat> [[VD:%.*]], <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv2bf16.i64(<vscale x 2 x bfloat> [[VD]], <vscale x 2 x bfloat> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 2 x bfloat> [[TMP0]]
+//
+vbfloat16mf2_t test_sf_vfexp_v_bf16mf2_tum(vbool32_t vm, vbfloat16mf2_t vd, vbfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16mf2_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1_tum(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x bfloat> [[VD:%.*]], <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv4bf16.i64(<vscale x 4 x bfloat> [[VD]], <vscale x 4 x bfloat> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 4 x bfloat> [[TMP0]]
+//
+vbfloat16m1_t test_sf_vfexp_v_bf16m1_tum(vbool16_t vm, vbfloat16m1_t vd, vbfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m1_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2_tum(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x bfloat> [[VD:%.*]], <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv8bf16.i64(<vscale x 8 x bfloat> [[VD]], <vscale x 8 x bfloat> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 8 x bfloat> [[TMP0]]
+//
+vbfloat16m2_t test_sf_vfexp_v_bf16m2_tum(vbool8_t vm, vbfloat16m2_t vd, vbfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m2_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4_tum(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x bfloat> [[VD:%.*]], <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv16bf16.i64(<vscale x 16 x bfloat> [[VD]], <vscale x 16 x bfloat> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 16 x bfloat> [[TMP0]]
+//
+vbfloat16m4_t test_sf_vfexp_v_bf16m4_tum(vbool4_t vm, vbfloat16m4_t vd, vbfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m4_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8_tum(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x bfloat> [[VD:%.*]], <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv32bf16.i64(<vscale x 32 x bfloat> [[VD]], <vscale x 32 x bfloat> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 32 x bfloat> [[TMP0]]
+//
+vbfloat16m8_t test_sf_vfexp_v_bf16m8_tum(vbool2_t vm, vbfloat16m8_t vd, vbfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m8_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4_tumu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x bfloat> [[VD:%.*]], <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv1bf16.i64(<vscale x 1 x bfloat> [[VD]], <vscale x 1 x bfloat> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 1 x bfloat> [[TMP0]]
+//
+vbfloat16mf4_t test_sf_vfexp_v_bf16mf4_tumu(vbool64_t vm, vbfloat16mf4_t vd, vbfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16mf4_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2_tumu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x bfloat> [[VD:%.*]], <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv2bf16.i64(<vscale x 2 x bfloat> [[VD]], <vscale x 2 x bfloat> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 2 x bfloat> [[TMP0]]
+//
+vbfloat16mf2_t test_sf_vfexp_v_bf16mf2_tumu(vbool32_t vm, vbfloat16mf2_t vd, vbfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16mf2_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1_tumu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x bfloat> [[VD:%.*]], <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv4bf16.i64(<vscale x 4 x bfloat> [[VD]], <vscale x 4 x bfloat> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 4 x bfloat> [[TMP0]]
+//
+vbfloat16m1_t test_sf_vfexp_v_bf16m1_tumu(vbool16_t vm, vbfloat16m1_t vd, vbfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m1_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2_tumu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x bfloat> [[VD:%.*]], <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv8bf16.i64(<vscale x 8 x bfloat> [[VD]], <vscale x 8 x bfloat> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 8 x bfloat> [[TMP0]]
+//
+vbfloat16m2_t test_sf_vfexp_v_bf16m2_tumu(vbool8_t vm, vbfloat16m2_t vd, vbfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m2_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4_tumu(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x bfloat> [[VD:%.*]], <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv16bf16.i64(<vscale x 16 x bfloat> [[VD]], <vscale x 16 x bfloat> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 16 x bfloat> [[TMP0]]
+//
+vbfloat16m4_t test_sf_vfexp_v_bf16m4_tumu(vbool4_t vm, vbfloat16m4_t vd, vbfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m4_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8_tumu(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x bfloat> [[VD:%.*]], <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv32bf16.i64(<vscale x 32 x bfloat> [[VD]], <vscale x 32 x bfloat> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 32 x bfloat> [[TMP0]]
+//
+vbfloat16m8_t test_sf_vfexp_v_bf16m8_tumu(vbool2_t vm, vbfloat16m8_t vd, vbfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m8_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4_mu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x bfloat> [[VD:%.*]], <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv1bf16.i64(<vscale x 1 x bfloat> [[VD]], <vscale x 1 x bfloat> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 1 x bfloat> [[TMP0]]
+//
+vbfloat16mf4_t test_sf_vfexp_v_bf16mf4_mu(vbool64_t vm, vbfloat16mf4_t vd, vbfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16mf4_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2_mu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x bfloat> [[VD:%.*]], <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv2bf16.i64(<vscale x 2 x bfloat> [[VD]], <vscale x 2 x bfloat> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 2 x bfloat> [[TMP0]]
+//
+vbfloat16mf2_t test_sf_vfexp_v_bf16mf2_mu(vbool32_t vm, vbfloat16mf2_t vd, vbfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16mf2_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1_mu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x bfloat> [[VD:%.*]], <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv4bf16.i64(<vscale x 4 x bfloat> [[VD]], <vscale x 4 x bfloat> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 4 x bfloat> [[TMP0]]
+//
+vbfloat16m1_t test_sf_vfexp_v_bf16m1_mu(vbool16_t vm, vbfloat16m1_t vd, vbfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m1_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2_mu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x bfloat> [[VD:%.*]], <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv8bf16.i64(<vscale x 8 x bfloat> [[VD]], <vscale x 8 x bfloat> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 8 x bfloat> [[TMP0]]
+//
+vbfloat16m2_t test_sf_vfexp_v_bf16m2_mu(vbool8_t vm, vbfloat16m2_t vd, vbfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m2_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4_mu(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x bfloat> [[VD:%.*]], <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv16bf16.i64(<vscale x 16 x bfloat> [[VD]], <vscale x 16 x bfloat> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 16 x bfloat> [[TMP0]]
+//
+vbfloat16m4_t test_sf_vfexp_v_bf16m4_mu(vbool4_t vm, vbfloat16m4_t vd, vbfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m4_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8_mu(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x bfloat> [[VD:%.*]], <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv32bf16.i64(<vscale x 32 x bfloat> [[VD]], <vscale x 32 x bfloat> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 32 x bfloat> [[TMP0]]
+//
+vbfloat16m8_t test_sf_vfexp_v_bf16m8_mu(vbool2_t vm, vbfloat16m8_t vd, vbfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_v_bf16m8_mu(vm, vd, vs2, vl);
+}
diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexpa_v.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexpa_v.c
new file mode 100644
index 0000000..b687026
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexpa_v.c
@@ -0,0 +1,448 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64f -target-feature +zvfh \
+// RUN: -target-feature +xsfvfexpa -disable-O0-optnone \
+// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
+// RUN: FileCheck --check-prefix=CHECK-RV64 %s
+
+#include <sifive_vector.h>
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4_tu(
+// CHECK-RV64-SAME: <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexpa_v_f16mf4_tu(vfloat16mf4_t vd, vfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16mf4_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2_tu(
+// CHECK-RV64-SAME: <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexpa_v_f16mf2_tu(vfloat16mf2_t vd, vfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16mf2_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1_tu(
+// CHECK-RV64-SAME: <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexpa_v_f16m1_tu(vfloat16m1_t vd, vfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m1_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2_tu(
+// CHECK-RV64-SAME: <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexpa_v_f16m2_tu(vfloat16m2_t vd, vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m2_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4_tu(
+// CHECK-RV64-SAME: <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexpa_v_f16m4_tu(vfloat16m4_t vd, vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m4_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8_tu(
+// CHECK-RV64-SAME: <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexpa_v_f16m8_tu(vfloat16m8_t vd, vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m8_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2_tu(
+// CHECK-RV64-SAME: <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexpa_v_f32mf2_tu(vfloat32mf2_t vd, vfloat32mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32mf2_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1_tu(
+// CHECK-RV64-SAME: <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexpa_v_f32m1_tu(vfloat32m1_t vd, vfloat32m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m1_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2_tu(
+// CHECK-RV64-SAME: <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexpa_v_f32m2_tu(vfloat32m2_t vd, vfloat32m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m2_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4_tu(
+// CHECK-RV64-SAME: <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexpa_v_f32m4_tu(vfloat32m4_t vd, vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m4_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8_tu(
+// CHECK-RV64-SAME: <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexpa_v_f32m8_tu(vfloat32m8_t vd, vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m8_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4_tum(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexpa_v_f16mf4_tum(vbool64_t vm, vfloat16mf4_t vd, vfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16mf4_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2_tum(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexpa_v_f16mf2_tum(vbool32_t vm, vfloat16mf2_t vd, vfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16mf2_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1_tum(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexpa_v_f16m1_tum(vbool16_t vm, vfloat16m1_t vd, vfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m1_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2_tum(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexpa_v_f16m2_tum(vbool8_t vm, vfloat16m2_t vd, vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m2_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4_tum(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexpa_v_f16m4_tum(vbool4_t vm, vfloat16m4_t vd, vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m4_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8_tum(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexpa_v_f16m8_tum(vbool2_t vm, vfloat16m8_t vd, vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m8_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2_tum(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexpa_v_f32mf2_tum(vbool64_t vm, vfloat32mf2_t vd, vfloat32mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32mf2_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1_tum(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexpa_v_f32m1_tum(vbool32_t vm, vfloat32m1_t vd, vfloat32m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m1_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2_tum(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexpa_v_f32m2_tum(vbool16_t vm, vfloat32m2_t vd, vfloat32m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m2_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4_tum(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexpa_v_f32m4_tum(vbool8_t vm, vfloat32m4_t vd, vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m4_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8_tum(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexpa_v_f32m8_tum(vbool4_t vm, vfloat32m8_t vd, vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m8_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4_tumu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexpa_v_f16mf4_tumu(vbool64_t vm, vfloat16mf4_t vd, vfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16mf4_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2_tumu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexpa_v_f16mf2_tumu(vbool32_t vm, vfloat16mf2_t vd, vfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16mf2_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1_tumu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexpa_v_f16m1_tumu(vbool16_t vm, vfloat16m1_t vd, vfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m1_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2_tumu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexpa_v_f16m2_tumu(vbool8_t vm, vfloat16m2_t vd, vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m2_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4_tumu(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexpa_v_f16m4_tumu(vbool4_t vm, vfloat16m4_t vd, vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m4_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8_tumu(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexpa_v_f16m8_tumu(vbool2_t vm, vfloat16m8_t vd, vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m8_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2_tumu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexpa_v_f32mf2_tumu(vbool64_t vm, vfloat32mf2_t vd, vfloat32mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32mf2_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1_tumu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexpa_v_f32m1_tumu(vbool32_t vm, vfloat32m1_t vd, vfloat32m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m1_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2_tumu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexpa_v_f32m2_tumu(vbool16_t vm, vfloat32m2_t vd, vfloat32m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m2_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4_tumu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexpa_v_f32m4_tumu(vbool8_t vm, vfloat32m4_t vd, vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m4_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8_tumu(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexpa_v_f32m8_tumu(vbool4_t vm, vfloat32m8_t vd, vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m8_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4_mu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexpa_v_f16mf4_mu(vbool64_t vm, vfloat16mf4_t vd, vfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16mf4_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2_mu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexpa_v_f16mf2_mu(vbool32_t vm, vfloat16mf2_t vd, vfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16mf2_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1_mu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexpa_v_f16m1_mu(vbool16_t vm, vfloat16m1_t vd, vfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m1_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2_mu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexpa_v_f16m2_mu(vbool8_t vm, vfloat16m2_t vd, vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m2_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4_mu(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexpa_v_f16m4_mu(vbool4_t vm, vfloat16m4_t vd, vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m4_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8_mu(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexpa_v_f16m8_mu(vbool2_t vm, vfloat16m8_t vd, vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f16m8_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2_mu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexpa_v_f32mf2_mu(vbool64_t vm, vfloat32mf2_t vd, vfloat32mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32mf2_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1_mu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexpa_v_f32m1_mu(vbool32_t vm, vfloat32m1_t vd, vfloat32m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m1_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2_mu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexpa_v_f32m2_mu(vbool16_t vm, vfloat32m2_t vd, vfloat32m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m2_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4_mu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexpa_v_f32m4_mu(vbool8_t vm, vfloat32m4_t vd, vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m4_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8_mu(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexpa_v_f32m8_mu(vbool4_t vm, vfloat32m8_t vd, vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f32m8_mu(vm, vd, vs2, vl);
+}
diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexpa_v_64.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexpa_v_64.c
new file mode 100644
index 0000000..8638dc2
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexpa_v_64.c
@@ -0,0 +1,167 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64 -target-feature +xsfvfexpa64e \
+// RUN: -disable-O0-optnone -emit-llvm %s -o - | opt -S -passes=mem2reg | \
+// RUN: FileCheck --check-prefix=CHECK-RV64 %s
+
+#include <sifive_vector.h>
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1_tu(
+// CHECK-RV64-SAME: <vscale x 1 x double> [[VD:%.*]], <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.nxv1f64.i64(<vscale x 1 x double> [[VD]], <vscale x 1 x double> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]]
+//
+vfloat64m1_t test_sf_vfexpa_v_f64m1_tu(vfloat64m1_t vd, vfloat64m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m1_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2_tu(
+// CHECK-RV64-SAME: <vscale x 2 x double> [[VD:%.*]], <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.nxv2f64.i64(<vscale x 2 x double> [[VD]], <vscale x 2 x double> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]]
+//
+vfloat64m2_t test_sf_vfexpa_v_f64m2_tu(vfloat64m2_t vd, vfloat64m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m2_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4_tu(
+// CHECK-RV64-SAME: <vscale x 4 x double> [[VD:%.*]], <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.nxv4f64.i64(<vscale x 4 x double> [[VD]], <vscale x 4 x double> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]]
+//
+vfloat64m4_t test_sf_vfexpa_v_f64m4_tu(vfloat64m4_t vd, vfloat64m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m4_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8_tu(
+// CHECK-RV64-SAME: <vscale x 8 x double> [[VD:%.*]], <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.nxv8f64.i64(<vscale x 8 x double> [[VD]], <vscale x 8 x double> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]]
+//
+vfloat64m8_t test_sf_vfexpa_v_f64m8_tu(vfloat64m8_t vd, vfloat64m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m8_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1_tum(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x double> [[VD:%.*]], <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.mask.nxv1f64.i64(<vscale x 1 x double> [[VD]], <vscale x 1 x double> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]]
+//
+vfloat64m1_t test_sf_vfexpa_v_f64m1_tum(vbool64_t vm, vfloat64m1_t vd, vfloat64m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m1_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2_tum(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x double> [[VD:%.*]], <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.mask.nxv2f64.i64(<vscale x 2 x double> [[VD]], <vscale x 2 x double> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]]
+//
+vfloat64m2_t test_sf_vfexpa_v_f64m2_tum(vbool32_t vm, vfloat64m2_t vd, vfloat64m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m2_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4_tum(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x double> [[VD:%.*]], <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.mask.nxv4f64.i64(<vscale x 4 x double> [[VD]], <vscale x 4 x double> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]]
+//
+vfloat64m4_t test_sf_vfexpa_v_f64m4_tum(vbool16_t vm, vfloat64m4_t vd, vfloat64m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m4_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8_tum(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x double> [[VD:%.*]], <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.mask.nxv8f64.i64(<vscale x 8 x double> [[VD]], <vscale x 8 x double> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]]
+//
+vfloat64m8_t test_sf_vfexpa_v_f64m8_tum(vbool8_t vm, vfloat64m8_t vd, vfloat64m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m8_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1_tumu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x double> [[VD:%.*]], <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.mask.nxv1f64.i64(<vscale x 1 x double> [[VD]], <vscale x 1 x double> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]]
+//
+vfloat64m1_t test_sf_vfexpa_v_f64m1_tumu(vbool64_t vm, vfloat64m1_t vd, vfloat64m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m1_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2_tumu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x double> [[VD:%.*]], <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.mask.nxv2f64.i64(<vscale x 2 x double> [[VD]], <vscale x 2 x double> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]]
+//
+vfloat64m2_t test_sf_vfexpa_v_f64m2_tumu(vbool32_t vm, vfloat64m2_t vd, vfloat64m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m2_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4_tumu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x double> [[VD:%.*]], <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.mask.nxv4f64.i64(<vscale x 4 x double> [[VD]], <vscale x 4 x double> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]]
+//
+vfloat64m4_t test_sf_vfexpa_v_f64m4_tumu(vbool16_t vm, vfloat64m4_t vd, vfloat64m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m4_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8_tumu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x double> [[VD:%.*]], <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.mask.nxv8f64.i64(<vscale x 8 x double> [[VD]], <vscale x 8 x double> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]]
+//
+vfloat64m8_t test_sf_vfexpa_v_f64m8_tumu(vbool8_t vm, vfloat64m8_t vd, vfloat64m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m8_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1_mu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x double> [[VD:%.*]], <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.mask.nxv1f64.i64(<vscale x 1 x double> [[VD]], <vscale x 1 x double> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]]
+//
+vfloat64m1_t test_sf_vfexpa_v_f64m1_mu(vbool64_t vm, vfloat64m1_t vd, vfloat64m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m1_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2_mu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x double> [[VD:%.*]], <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.mask.nxv2f64.i64(<vscale x 2 x double> [[VD]], <vscale x 2 x double> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]]
+//
+vfloat64m2_t test_sf_vfexpa_v_f64m2_mu(vbool32_t vm, vfloat64m2_t vd, vfloat64m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m2_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4_mu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x double> [[VD:%.*]], <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.mask.nxv4f64.i64(<vscale x 4 x double> [[VD]], <vscale x 4 x double> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]]
+//
+vfloat64m4_t test_sf_vfexpa_v_f64m4_mu(vbool16_t vm, vfloat64m4_t vd, vfloat64m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m4_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8_mu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x double> [[VD:%.*]], <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.mask.nxv8f64.i64(<vscale x 8 x double> [[VD]], <vscale x 8 x double> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]]
+//
+vfloat64m8_t test_sf_vfexpa_v_f64m8_mu(vbool8_t vm, vfloat64m8_t vd, vfloat64m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_v_f64m8_mu(vm, vd, vs2, vl);
+}
diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_16.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_16.c
new file mode 100644
index 0000000..4ceeb7b
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_16.c
@@ -0,0 +1,261 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zvfh \
+// RUN: -target-feature +xsfvfexp16e -disable-O0-optnone \
+// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
+// RUN: FileCheck --check-prefix=CHECK-RV64 %s
+
+#include <sifive_vector.h>
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_tu(
+// CHECK-RV64-SAME: <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexp_v_f16mf2_tu(vfloat16mf2_t vd, vfloat16mf2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_tu(
+// CHECK-RV64-SAME: <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexp_v_f16m1_tu(vfloat16m1_t vd, vfloat16m1_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_tu(
+// CHECK-RV64-SAME: <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexp_v_f16m2_tu(vfloat16m2_t vd, vfloat16m2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_tu(
+// CHECK-RV64-SAME: <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexp_v_f16m4_tu(vfloat16m4_t vd, vfloat16m4_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_tu(
+// CHECK-RV64-SAME: <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexp_v_f16m8_tu(vfloat16m8_t vd, vfloat16m8_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4_tum(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexp_v_f16mf4_tum(vbool64_t vm, vfloat16mf4_t vd,
+ vfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_tum(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexp_v_f16mf2_tum(vbool32_t vm, vfloat16mf2_t vd,
+ vfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_tum(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexp_v_f16m1_tum(vbool16_t vm, vfloat16m1_t vd,
+ vfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_tum(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexp_v_f16m2_tum(vbool8_t vm, vfloat16m2_t vd,
+ vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_tum(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexp_v_f16m4_tum(vbool4_t vm, vfloat16m4_t vd,
+ vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_tum(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexp_v_f16m8_tum(vbool2_t vm, vfloat16m8_t vd,
+ vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4_tumu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexp_v_f16mf4_tumu(vbool64_t vm, vfloat16mf4_t vd,
+ vfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_tumu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexp_v_f16mf2_tumu(vbool32_t vm, vfloat16mf2_t vd,
+ vfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_tumu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexp_v_f16m1_tumu(vbool16_t vm, vfloat16m1_t vd,
+ vfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_tumu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexp_v_f16m2_tumu(vbool8_t vm, vfloat16m2_t vd,
+ vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_tumu(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexp_v_f16m4_tumu(vbool4_t vm, vfloat16m4_t vd,
+ vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_tumu(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexp_v_f16m8_tumu(vbool2_t vm, vfloat16m8_t vd,
+ vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4_mu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexp_v_f16mf4_mu(vbool64_t vm, vfloat16mf4_t vd,
+ vfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_mu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexp_v_f16mf2_mu(vbool32_t vm, vfloat16mf2_t vd,
+ vfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_mu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexp_v_f16m1_mu(vbool16_t vm, vfloat16m1_t vd,
+ vfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_mu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexp_v_f16m2_mu(vbool8_t vm, vfloat16m2_t vd,
+ vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_mu(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexp_v_f16m4_mu(vbool4_t vm, vfloat16m4_t vd,
+ vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_mu(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexp_v_f16m8_mu(vbool2_t vm, vfloat16m8_t vd,
+ vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_mu(vm, vd, vs2, vl);
+}
diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_32.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_32.c
new file mode 100644
index 0000000..e08d6c5b
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_32.c
@@ -0,0 +1,228 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zve32f \
+// RUN: -target-feature +xsfvfexp32e -disable-O0-optnone \
+// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
+// RUN: FileCheck --check-prefix=CHECK-RV64 %s
+
+#include <sifive_vector.h>
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_tu(
+// CHECK-RV64-SAME: <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexp_v_f32mf2_tu(vfloat32mf2_t vd, vfloat32mf2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_tu(
+// CHECK-RV64-SAME: <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexp_v_f32m1_tu(vfloat32m1_t vd, vfloat32m1_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_tu(
+// CHECK-RV64-SAME: <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexp_v_f32m2_tu(vfloat32m2_t vd, vfloat32m2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_tu(
+// CHECK-RV64-SAME: <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexp_v_f32m4_tu(vfloat32m4_t vd, vfloat32m4_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_tu(
+// CHECK-RV64-SAME: <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexp_v_f32m8_tu(vfloat32m8_t vd, vfloat32m8_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_tum(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexp_v_f32mf2_tum(vbool64_t vm, vfloat32mf2_t vd,
+ vfloat32mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_tum(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexp_v_f32m1_tum(vbool32_t vm, vfloat32m1_t vd,
+ vfloat32m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_tum(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexp_v_f32m2_tum(vbool16_t vm, vfloat32m2_t vd,
+ vfloat32m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_tum(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexp_v_f32m4_tum(vbool8_t vm, vfloat32m4_t vd,
+ vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_tum(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexp_v_f32m8_tum(vbool4_t vm, vfloat32m8_t vd,
+ vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_tumu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexp_v_f32mf2_tumu(vbool64_t vm, vfloat32mf2_t vd,
+ vfloat32mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_tumu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexp_v_f32m1_tumu(vbool32_t vm, vfloat32m1_t vd,
+ vfloat32m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_tumu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexp_v_f32m2_tumu(vbool16_t vm, vfloat32m2_t vd,
+ vfloat32m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_tumu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexp_v_f32m4_tumu(vbool8_t vm, vfloat32m4_t vd,
+ vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_tumu(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexp_v_f32m8_tumu(vbool4_t vm, vfloat32m8_t vd,
+ vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_mu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexp_v_f32mf2_mu(vbool64_t vm, vfloat32mf2_t vd,
+ vfloat32mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_mu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexp_v_f32m1_mu(vbool32_t vm, vfloat32m1_t vd,
+ vfloat32m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_mu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexp_v_f32m2_mu(vbool16_t vm, vfloat32m2_t vd,
+ vfloat32m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_mu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexp_v_f32m4_mu(vbool8_t vm, vfloat32m4_t vd,
+ vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_mu(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexp_v_f32m8_mu(vbool4_t vm, vfloat32m8_t vd,
+ vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_mu(vm, vd, vs2, vl);
+}
diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_bf.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_bf.c
new file mode 100644
index 0000000..14570d4
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_bf.c
@@ -0,0 +1,272 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zve32f \
+// RUN: -target-feature +zvfbfmin -target-feature +xsfvfbfexp16e -disable-O0-optnone \
+// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
+// RUN: FileCheck --check-prefix=CHECK-RV64 %s
+
+#include <sifive_vector.h>
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4_tu(
+// CHECK-RV64-SAME: <vscale x 1 x bfloat> [[VD:%.*]], <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.nxv1bf16.i64(<vscale x 1 x bfloat> [[VD]], <vscale x 1 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x bfloat> [[TMP0]]
+//
+vbfloat16mf4_t test_sf_vfexp_v_bf16mf4_tu(vbfloat16mf4_t vd, vbfloat16mf4_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2_tu(
+// CHECK-RV64-SAME: <vscale x 2 x bfloat> [[VD:%.*]], <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.nxv2bf16.i64(<vscale x 2 x bfloat> [[VD]], <vscale x 2 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x bfloat> [[TMP0]]
+//
+vbfloat16mf2_t test_sf_vfexp_v_bf16mf2_tu(vbfloat16mf2_t vd, vbfloat16mf2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1_tu(
+// CHECK-RV64-SAME: <vscale x 4 x bfloat> [[VD:%.*]], <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.nxv4bf16.i64(<vscale x 4 x bfloat> [[VD]], <vscale x 4 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x bfloat> [[TMP0]]
+//
+vbfloat16m1_t test_sf_vfexp_v_bf16m1_tu(vbfloat16m1_t vd, vbfloat16m1_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2_tu(
+// CHECK-RV64-SAME: <vscale x 8 x bfloat> [[VD:%.*]], <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.nxv8bf16.i64(<vscale x 8 x bfloat> [[VD]], <vscale x 8 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x bfloat> [[TMP0]]
+//
+vbfloat16m2_t test_sf_vfexp_v_bf16m2_tu(vbfloat16m2_t vd, vbfloat16m2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4_tu(
+// CHECK-RV64-SAME: <vscale x 16 x bfloat> [[VD:%.*]], <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.nxv16bf16.i64(<vscale x 16 x bfloat> [[VD]], <vscale x 16 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 16 x bfloat> [[TMP0]]
+//
+vbfloat16m4_t test_sf_vfexp_v_bf16m4_tu(vbfloat16m4_t vd, vbfloat16m4_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8_tu(
+// CHECK-RV64-SAME: <vscale x 32 x bfloat> [[VD:%.*]], <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.nxv32bf16.i64(<vscale x 32 x bfloat> [[VD]], <vscale x 32 x bfloat> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 32 x bfloat> [[TMP0]]
+//
+vbfloat16m8_t test_sf_vfexp_v_bf16m8_tu(vbfloat16m8_t vd, vbfloat16m8_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexp_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4_tum(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x bfloat> [[VD:%.*]], <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv1bf16.i64(<vscale x 1 x bfloat> [[VD]], <vscale x 1 x bfloat> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 1 x bfloat> [[TMP0]]
+//
+vbfloat16mf4_t test_sf_vfexp_v_bf16mf4_tum(vbool64_t vm, vbfloat16mf4_t vd,
+ vbfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2_tum(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x bfloat> [[VD:%.*]], <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv2bf16.i64(<vscale x 2 x bfloat> [[VD]], <vscale x 2 x bfloat> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 2 x bfloat> [[TMP0]]
+//
+vbfloat16mf2_t test_sf_vfexp_v_bf16mf2_tum(vbool32_t vm, vbfloat16mf2_t vd,
+ vbfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1_tum(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x bfloat> [[VD:%.*]], <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv4bf16.i64(<vscale x 4 x bfloat> [[VD]], <vscale x 4 x bfloat> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 4 x bfloat> [[TMP0]]
+//
+vbfloat16m1_t test_sf_vfexp_v_bf16m1_tum(vbool16_t vm, vbfloat16m1_t vd,
+ vbfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2_tum(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x bfloat> [[VD:%.*]], <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv8bf16.i64(<vscale x 8 x bfloat> [[VD]], <vscale x 8 x bfloat> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 8 x bfloat> [[TMP0]]
+//
+vbfloat16m2_t test_sf_vfexp_v_bf16m2_tum(vbool8_t vm, vbfloat16m2_t vd,
+ vbfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4_tum(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x bfloat> [[VD:%.*]], <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv16bf16.i64(<vscale x 16 x bfloat> [[VD]], <vscale x 16 x bfloat> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 16 x bfloat> [[TMP0]]
+//
+vbfloat16m4_t test_sf_vfexp_v_bf16m4_tum(vbool4_t vm, vbfloat16m4_t vd,
+ vbfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8_tum(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x bfloat> [[VD:%.*]], <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv32bf16.i64(<vscale x 32 x bfloat> [[VD]], <vscale x 32 x bfloat> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 32 x bfloat> [[TMP0]]
+//
+vbfloat16m8_t test_sf_vfexp_v_bf16m8_tum(vbool2_t vm, vbfloat16m8_t vd,
+ vbfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4_tumu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x bfloat> [[VD:%.*]], <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv1bf16.i64(<vscale x 1 x bfloat> [[VD]], <vscale x 1 x bfloat> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 1 x bfloat> [[TMP0]]
+//
+vbfloat16mf4_t test_sf_vfexp_v_bf16mf4_tumu(vbool64_t vm, vbfloat16mf4_t vd,
+ vbfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2_tumu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x bfloat> [[VD:%.*]], <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv2bf16.i64(<vscale x 2 x bfloat> [[VD]], <vscale x 2 x bfloat> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 2 x bfloat> [[TMP0]]
+//
+vbfloat16mf2_t test_sf_vfexp_v_bf16mf2_tumu(vbool32_t vm, vbfloat16mf2_t vd,
+ vbfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1_tumu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x bfloat> [[VD:%.*]], <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv4bf16.i64(<vscale x 4 x bfloat> [[VD]], <vscale x 4 x bfloat> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 4 x bfloat> [[TMP0]]
+//
+vbfloat16m1_t test_sf_vfexp_v_bf16m1_tumu(vbool16_t vm, vbfloat16m1_t vd,
+ vbfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2_tumu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x bfloat> [[VD:%.*]], <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv8bf16.i64(<vscale x 8 x bfloat> [[VD]], <vscale x 8 x bfloat> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 8 x bfloat> [[TMP0]]
+//
+vbfloat16m2_t test_sf_vfexp_v_bf16m2_tumu(vbool8_t vm, vbfloat16m2_t vd,
+ vbfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4_tumu(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x bfloat> [[VD:%.*]], <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv16bf16.i64(<vscale x 16 x bfloat> [[VD]], <vscale x 16 x bfloat> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 16 x bfloat> [[TMP0]]
+//
+vbfloat16m4_t test_sf_vfexp_v_bf16m4_tumu(vbool4_t vm, vbfloat16m4_t vd,
+ vbfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8_tumu(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x bfloat> [[VD:%.*]], <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv32bf16.i64(<vscale x 32 x bfloat> [[VD]], <vscale x 32 x bfloat> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 32 x bfloat> [[TMP0]]
+//
+vbfloat16m8_t test_sf_vfexp_v_bf16m8_tumu(vbool2_t vm, vbfloat16m8_t vd,
+ vbfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4_mu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x bfloat> [[VD:%.*]], <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv1bf16.i64(<vscale x 1 x bfloat> [[VD]], <vscale x 1 x bfloat> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 1 x bfloat> [[TMP0]]
+//
+vbfloat16mf4_t test_sf_vfexp_v_bf16mf4_mu(vbool64_t vm, vbfloat16mf4_t vd,
+ vbfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2_mu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x bfloat> [[VD:%.*]], <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv2bf16.i64(<vscale x 2 x bfloat> [[VD]], <vscale x 2 x bfloat> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 2 x bfloat> [[TMP0]]
+//
+vbfloat16mf2_t test_sf_vfexp_v_bf16mf2_mu(vbool32_t vm, vbfloat16mf2_t vd,
+ vbfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1_mu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x bfloat> [[VD:%.*]], <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv4bf16.i64(<vscale x 4 x bfloat> [[VD]], <vscale x 4 x bfloat> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 4 x bfloat> [[TMP0]]
+//
+vbfloat16m1_t test_sf_vfexp_v_bf16m1_mu(vbool16_t vm, vbfloat16m1_t vd,
+ vbfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2_mu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x bfloat> [[VD:%.*]], <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv8bf16.i64(<vscale x 8 x bfloat> [[VD]], <vscale x 8 x bfloat> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 8 x bfloat> [[TMP0]]
+//
+vbfloat16m2_t test_sf_vfexp_v_bf16m2_mu(vbool8_t vm, vbfloat16m2_t vd,
+ vbfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4_mu(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x bfloat> [[VD:%.*]], <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv16bf16.i64(<vscale x 16 x bfloat> [[VD]], <vscale x 16 x bfloat> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 16 x bfloat> [[TMP0]]
+//
+vbfloat16m4_t test_sf_vfexp_v_bf16m4_mu(vbool4_t vm, vbfloat16m4_t vd,
+ vbfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8_mu(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x bfloat> [[VD:%.*]], <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: [[ENTRY:.*:]]
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv32bf16.i64(<vscale x 32 x bfloat> [[VD]], <vscale x 32 x bfloat> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 32 x bfloat> [[TMP0]]
+//
+vbfloat16m8_t test_sf_vfexp_v_bf16m8_mu(vbool2_t vm, vbfloat16m8_t vd,
+ vbfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexp_mu(vm, vd, vs2, vl);
+}
diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexpa_v.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexpa_v.c
new file mode 100644
index 0000000..4ac5cfc
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexpa_v.c
@@ -0,0 +1,492 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64f -target-feature +zvfh \
+// RUN: -target-feature +xsfvfexpa -disable-O0-optnone \
+// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
+// RUN: FileCheck --check-prefix=CHECK-RV64 %s
+
+#include <sifive_vector.h>
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4_tu(
+// CHECK-RV64-SAME: <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexpa_v_f16mf4_tu(vfloat16mf4_t vd, vfloat16mf4_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2_tu(
+// CHECK-RV64-SAME: <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexpa_v_f16mf2_tu(vfloat16mf2_t vd, vfloat16mf2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1_tu(
+// CHECK-RV64-SAME: <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexpa_v_f16m1_tu(vfloat16m1_t vd, vfloat16m1_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2_tu(
+// CHECK-RV64-SAME: <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexpa_v_f16m2_tu(vfloat16m2_t vd, vfloat16m2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4_tu(
+// CHECK-RV64-SAME: <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexpa_v_f16m4_tu(vfloat16m4_t vd, vfloat16m4_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8_tu(
+// CHECK-RV64-SAME: <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexpa_v_f16m8_tu(vfloat16m8_t vd, vfloat16m8_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2_tu(
+// CHECK-RV64-SAME: <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexpa_v_f32mf2_tu(vfloat32mf2_t vd, vfloat32mf2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1_tu(
+// CHECK-RV64-SAME: <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexpa_v_f32m1_tu(vfloat32m1_t vd, vfloat32m1_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2_tu(
+// CHECK-RV64-SAME: <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexpa_v_f32m2_tu(vfloat32m2_t vd, vfloat32m2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4_tu(
+// CHECK-RV64-SAME: <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexpa_v_f32m4_tu(vfloat32m4_t vd, vfloat32m4_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8_tu(
+// CHECK-RV64-SAME: <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexpa_v_f32m8_tu(vfloat32m8_t vd, vfloat32m8_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4_tum(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexpa_v_f16mf4_tum(vbool64_t vm, vfloat16mf4_t vd,
+ vfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2_tum(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexpa_v_f16mf2_tum(vbool32_t vm, vfloat16mf2_t vd,
+ vfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1_tum(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexpa_v_f16m1_tum(vbool16_t vm, vfloat16m1_t vd,
+ vfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2_tum(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexpa_v_f16m2_tum(vbool8_t vm, vfloat16m2_t vd,
+ vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4_tum(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexpa_v_f16m4_tum(vbool4_t vm, vfloat16m4_t vd,
+ vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8_tum(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexpa_v_f16m8_tum(vbool2_t vm, vfloat16m8_t vd,
+ vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2_tum(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexpa_v_f32mf2_tum(vbool64_t vm, vfloat32mf2_t vd,
+ vfloat32mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1_tum(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexpa_v_f32m1_tum(vbool32_t vm, vfloat32m1_t vd,
+ vfloat32m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2_tum(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexpa_v_f32m2_tum(vbool16_t vm, vfloat32m2_t vd,
+ vfloat32m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4_tum(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexpa_v_f32m4_tum(vbool8_t vm, vfloat32m4_t vd,
+ vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8_tum(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexpa_v_f32m8_tum(vbool4_t vm, vfloat32m8_t vd,
+ vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4_tumu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexpa_v_f16mf4_tumu(vbool64_t vm, vfloat16mf4_t vd,
+ vfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2_tumu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexpa_v_f16mf2_tumu(vbool32_t vm, vfloat16mf2_t vd,
+ vfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1_tumu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexpa_v_f16m1_tumu(vbool16_t vm, vfloat16m1_t vd,
+ vfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2_tumu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexpa_v_f16m2_tumu(vbool8_t vm, vfloat16m2_t vd,
+ vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4_tumu(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexpa_v_f16m4_tumu(vbool4_t vm, vfloat16m4_t vd,
+ vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8_tumu(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexpa_v_f16m8_tumu(vbool2_t vm, vfloat16m8_t vd,
+ vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2_tumu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexpa_v_f32mf2_tumu(vbool64_t vm, vfloat32mf2_t vd,
+ vfloat32mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1_tumu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexpa_v_f32m1_tumu(vbool32_t vm, vfloat32m1_t vd,
+ vfloat32m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2_tumu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexpa_v_f32m2_tumu(vbool16_t vm, vfloat32m2_t vd,
+ vfloat32m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4_tumu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexpa_v_f32m4_tumu(vbool8_t vm, vfloat32m4_t vd,
+ vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8_tumu(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexpa_v_f32m8_tumu(vbool4_t vm, vfloat32m8_t vd,
+ vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4_mu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
+//
+vfloat16mf4_t test_sf_vfexpa_v_f16mf4_mu(vbool64_t vm, vfloat16mf4_t vd,
+ vfloat16mf4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2_mu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
+//
+vfloat16mf2_t test_sf_vfexpa_v_f16mf2_mu(vbool32_t vm, vfloat16mf2_t vd,
+ vfloat16mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1_mu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
+//
+vfloat16m1_t test_sf_vfexpa_v_f16m1_mu(vbool16_t vm, vfloat16m1_t vd,
+ vfloat16m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2_mu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
+//
+vfloat16m2_t test_sf_vfexpa_v_f16m2_mu(vbool8_t vm, vfloat16m2_t vd,
+ vfloat16m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4_mu(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
+//
+vfloat16m4_t test_sf_vfexpa_v_f16m4_mu(vbool4_t vm, vfloat16m4_t vd,
+ vfloat16m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8_mu(
+// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
+//
+vfloat16m8_t test_sf_vfexpa_v_f16m8_mu(vbool2_t vm, vfloat16m8_t vd,
+ vfloat16m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2_mu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
+//
+vfloat32mf2_t test_sf_vfexpa_v_f32mf2_mu(vbool64_t vm, vfloat32mf2_t vd,
+ vfloat32mf2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1_mu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
+//
+vfloat32m1_t test_sf_vfexpa_v_f32m1_mu(vbool32_t vm, vfloat32m1_t vd,
+ vfloat32m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2_mu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
+//
+vfloat32m2_t test_sf_vfexpa_v_f32m2_mu(vbool16_t vm, vfloat32m2_t vd,
+ vfloat32m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4_mu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
+//
+vfloat32m4_t test_sf_vfexpa_v_f32m4_mu(vbool8_t vm, vfloat32m4_t vd,
+ vfloat32m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8_mu(
+// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
+//
+vfloat32m8_t test_sf_vfexpa_v_f32m8_mu(vbool4_t vm, vfloat32m8_t vd,
+ vfloat32m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl);
+}
diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexpa_v_64.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexpa_v_64.c
new file mode 100644
index 0000000..d0faaee5
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexpa_v_64.c
@@ -0,0 +1,183 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4
+// REQUIRES: riscv-registered-target
+// RUN: %clang_cc1 -triple riscv64 -target-feature +xsfvfexpa64e \
+// RUN: -disable-O0-optnone -emit-llvm %s -o - | opt -S -passes=mem2reg | \
+// RUN: FileCheck --check-prefix=CHECK-RV64 %s
+
+#include <sifive_vector.h>
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1_tu(
+// CHECK-RV64-SAME: <vscale x 1 x double> [[VD:%.*]], <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.nxv1f64.i64(<vscale x 1 x double> [[VD]], <vscale x 1 x double> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]]
+//
+vfloat64m1_t test_sf_vfexpa_v_f64m1_tu(vfloat64m1_t vd, vfloat64m1_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2_tu(
+// CHECK-RV64-SAME: <vscale x 2 x double> [[VD:%.*]], <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.nxv2f64.i64(<vscale x 2 x double> [[VD]], <vscale x 2 x double> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]]
+//
+vfloat64m2_t test_sf_vfexpa_v_f64m2_tu(vfloat64m2_t vd, vfloat64m2_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4_tu(
+// CHECK-RV64-SAME: <vscale x 4 x double> [[VD:%.*]], <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.nxv4f64.i64(<vscale x 4 x double> [[VD]], <vscale x 4 x double> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]]
+//
+vfloat64m4_t test_sf_vfexpa_v_f64m4_tu(vfloat64m4_t vd, vfloat64m4_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8_tu(
+// CHECK-RV64-SAME: <vscale x 8 x double> [[VD:%.*]], <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.nxv8f64.i64(<vscale x 8 x double> [[VD]], <vscale x 8 x double> [[VS2]], i64 [[VL]])
+// CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]]
+//
+vfloat64m8_t test_sf_vfexpa_v_f64m8_tu(vfloat64m8_t vd, vfloat64m8_t vs2,
+ size_t vl) {
+ return __riscv_sf_vfexpa_tu(vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1_tum(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x double> [[VD:%.*]], <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.mask.nxv1f64.i64(<vscale x 1 x double> [[VD]], <vscale x 1 x double> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]]
+//
+vfloat64m1_t test_sf_vfexpa_v_f64m1_tum(vbool64_t vm, vfloat64m1_t vd,
+ vfloat64m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2_tum(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x double> [[VD:%.*]], <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.mask.nxv2f64.i64(<vscale x 2 x double> [[VD]], <vscale x 2 x double> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]]
+//
+vfloat64m2_t test_sf_vfexpa_v_f64m2_tum(vbool32_t vm, vfloat64m2_t vd,
+ vfloat64m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4_tum(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x double> [[VD:%.*]], <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.mask.nxv4f64.i64(<vscale x 4 x double> [[VD]], <vscale x 4 x double> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]]
+//
+vfloat64m4_t test_sf_vfexpa_v_f64m4_tum(vbool16_t vm, vfloat64m4_t vd,
+ vfloat64m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8_tum(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x double> [[VD:%.*]], <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.mask.nxv8f64.i64(<vscale x 8 x double> [[VD]], <vscale x 8 x double> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2)
+// CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]]
+//
+vfloat64m8_t test_sf_vfexpa_v_f64m8_tum(vbool8_t vm, vfloat64m8_t vd,
+ vfloat64m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1_tumu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x double> [[VD:%.*]], <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.mask.nxv1f64.i64(<vscale x 1 x double> [[VD]], <vscale x 1 x double> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]]
+//
+vfloat64m1_t test_sf_vfexpa_v_f64m1_tumu(vbool64_t vm, vfloat64m1_t vd,
+ vfloat64m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2_tumu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x double> [[VD:%.*]], <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.mask.nxv2f64.i64(<vscale x 2 x double> [[VD]], <vscale x 2 x double> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]]
+//
+vfloat64m2_t test_sf_vfexpa_v_f64m2_tumu(vbool32_t vm, vfloat64m2_t vd,
+ vfloat64m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4_tumu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x double> [[VD:%.*]], <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.mask.nxv4f64.i64(<vscale x 4 x double> [[VD]], <vscale x 4 x double> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]]
+//
+vfloat64m4_t test_sf_vfexpa_v_f64m4_tumu(vbool16_t vm, vfloat64m4_t vd,
+ vfloat64m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8_tumu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x double> [[VD:%.*]], <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.mask.nxv8f64.i64(<vscale x 8 x double> [[VD]], <vscale x 8 x double> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0)
+// CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]]
+//
+vfloat64m8_t test_sf_vfexpa_v_f64m8_tumu(vbool8_t vm, vfloat64m8_t vd,
+ vfloat64m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1_mu(
+// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x double> [[VD:%.*]], <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.mask.nxv1f64.i64(<vscale x 1 x double> [[VD]], <vscale x 1 x double> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]]
+//
+vfloat64m1_t test_sf_vfexpa_v_f64m1_mu(vbool64_t vm, vfloat64m1_t vd,
+ vfloat64m1_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2_mu(
+// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x double> [[VD:%.*]], <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.mask.nxv2f64.i64(<vscale x 2 x double> [[VD]], <vscale x 2 x double> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]]
+//
+vfloat64m2_t test_sf_vfexpa_v_f64m2_mu(vbool32_t vm, vfloat64m2_t vd,
+ vfloat64m2_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4_mu(
+// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x double> [[VD:%.*]], <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.mask.nxv4f64.i64(<vscale x 4 x double> [[VD]], <vscale x 4 x double> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]]
+//
+vfloat64m4_t test_sf_vfexpa_v_f64m4_mu(vbool16_t vm, vfloat64m4_t vd,
+ vfloat64m4_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl);
+}
+
+// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8_mu(
+// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x double> [[VD:%.*]], <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
+// CHECK-RV64-NEXT: entry:
+// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.mask.nxv8f64.i64(<vscale x 8 x double> [[VD]], <vscale x 8 x double> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1)
+// CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]]
+//
+vfloat64m8_t test_sf_vfexpa_v_f64m8_mu(vbool8_t vm, vfloat64m8_t vd,
+ vfloat64m8_t vs2, size_t vl) {
+ return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl);
+}
diff --git a/clang/test/CodeGen/SystemZ/builtins-systemz-zvector.c b/clang/test/CodeGen/SystemZ/builtins-systemz-zvector.c
index d5d15b4d..35fde87 100644
--- a/clang/test/CodeGen/SystemZ/builtins-systemz-zvector.c
+++ b/clang/test/CodeGen/SystemZ/builtins-systemz-zvector.c
@@ -3584,13 +3584,13 @@ void test_integer(void) {
// CHECK-ASM: vsrlb
vsc = vec_abs(vsc);
- // CHECK-ASM: vlcb
+ // CHECK-ASM: vlpb
vss = vec_abs(vss);
- // CHECK-ASM: vlch
+ // CHECK-ASM: vlph
vsi = vec_abs(vsi);
- // CHECK-ASM: vlcf
+ // CHECK-ASM: vlpf
vsl = vec_abs(vsl);
- // CHECK-ASM: vlcg
+ // CHECK-ASM: vlpg
vsc = vec_max(vsc, vsc);
// CHECK-ASM: vmxb
diff --git a/clang/test/CodeGen/SystemZ/builtins-systemz-zvector5.c b/clang/test/CodeGen/SystemZ/builtins-systemz-zvector5.c
index 6ee9e1e..cd0fafd 100644
--- a/clang/test/CodeGen/SystemZ/builtins-systemz-zvector5.c
+++ b/clang/test/CodeGen/SystemZ/builtins-systemz-zvector5.c
@@ -246,7 +246,7 @@ void test_integer(void) {
// CHECK-ASM: vctzq
vslll = vec_abs(vslll);
- // CHECK-ASM: vlcq
+ // CHECK-ASM: vlpq
vslll = vec_avg(vslll, vslll);
// CHECK: call i128 @llvm.s390.vavgq(i128 %{{.*}}, i128 %{{.*}})
diff --git a/clang/test/CodeGen/embed-bitcode-marker-with-nonzero-as.c b/clang/test/CodeGen/embed-bitcode-marker-with-nonzero-as.c
index df71188..8af9708 100644
--- a/clang/test/CodeGen/embed-bitcode-marker-with-nonzero-as.c
+++ b/clang/test/CodeGen/embed-bitcode-marker-with-nonzero-as.c
@@ -3,6 +3,6 @@
// CHECK: @llvm.embedded.module = private addrspace(1) constant [0 x i8] zeroinitializer, section ".llvmbc", align 1
// CHECK-NEXT: @llvm.cmdline = private addrspace(1) constant [{{[0-9]+}} x i8] c"{{.*}}", section ".llvmcmd", align 1
-// CHECK-NEXT: @llvm.compiler.used = appending addrspace(1) global [5 x ptr addrspace(4)] [ptr addrspace(4) addrspacecast (ptr addrspace(1) @foo.managed to ptr addrspace(4)), ptr addrspace(4) addrspacecast (ptr addrspace(1) @foo to ptr addrspace(4)), ptr addrspace(4) addrspacecast (ptr addrspace(1) @__hip_cuid_ to ptr addrspace(4)), ptr addrspace(4) addrspacecast (ptr addrspace(1) @llvm.embedded.module to ptr addrspace(4)), ptr addrspace(4) addrspacecast (ptr addrspace(1) @llvm.cmdline to ptr addrspace(4))], section "llvm.metadata"
+// CHECK-NEXT: @llvm.compiler.used = appending addrspace(1) global [5 x ptr] [ptr addrspacecast (ptr addrspace(1) @foo.managed to ptr), ptr addrspacecast (ptr addrspace(1) @foo to ptr), ptr addrspacecast (ptr addrspace(1) @__hip_cuid_ to ptr), ptr addrspacecast (ptr addrspace(1) @llvm.embedded.module to ptr), ptr addrspacecast (ptr addrspace(1) @llvm.cmdline to ptr)], section "llvm.metadata"
__attribute__((managed)) int foo = 42;
diff --git a/clang/test/CodeGen/llvm_compiler_used_elements_are_unqual.c b/clang/test/CodeGen/llvm_compiler_used_elements_are_unqual.c
new file mode 100644
index 0000000..b6550fb
--- /dev/null
+++ b/clang/test/CodeGen/llvm_compiler_used_elements_are_unqual.c
@@ -0,0 +1,64 @@
+// RUN: %clang_cc1 -x c -triple x86_64-- -emit-llvm -x c %s -o - \
+// RUN: | FileCheck %s --check-prefix=X86
+// RUN: %clang_cc1 -x c -triple amdgcn-amd-amdhsa -emit-llvm -x c %s -o - \
+// RUN: | FileCheck %s --check-prefix=AMDGCN
+// RUN: %clang_cc1 -x c -triple spirv64-- -emit-llvm -x c %s -o - \
+// RUN: | FileCheck %s --check-prefix=SPIRV
+// RUN: %clang_cc1 -x c -triple spirv64-amd-amdhsa -emit-llvm -x c %s -o - \
+// RUN: | FileCheck %s --check-prefix=SPIRV_AMD
+// RUN: %clang_cc1 -x cl -cl-std=CL1.2 -triple x86_64-- -emit-llvm -x c %s -o - \
+// RUN: | FileCheck %s --check-prefix=X86
+// RUN: %clang_cc1 -x cl -cl-std=CL1.2 -triple amdgcn-amd-amdhsa -emit-llvm -x c %s -o - \
+// RUN: | FileCheck %s --check-prefix=AMDGCN
+// RUN: %clang_cc1 -x cl -cl-std=CL1.2 -triple spirv64-- -emit-llvm -x c %s -o - \
+// RUN: | FileCheck %s --check-prefix=SPIRV_CL
+// RUN: %clang_cc1 -x cl -cl-std=CL1.2 -triple spirv64-amd-amdhsa -emit-llvm -x c %s -o - \
+// RUN: | FileCheck %s --check-prefix=SPIRV_AMD_CL
+// RUN: %clang_cc1 -x cl -cl-std=CL2.0 -triple x86_64-- -emit-llvm -x c %s -o - \
+// RUN: | FileCheck %s --check-prefix=X86
+// RUN: %clang_cc1 -x cl -cl-std=CL2.0 -triple amdgcn-amd-amdhsa -emit-llvm -x c %s -o - \
+// RUN: | FileCheck %s --check-prefix=AMDGCN
+// RUN: %clang_cc1 -x cl -cl-std=CL2.0 -triple spirv64-- -emit-llvm -x c %s -o - \
+// RUN: | FileCheck %s --check-prefix=SPIRV_CL
+// RUN: %clang_cc1 -x cl -cl-std=CL2.0 -triple spirv64-amd-amdhsa -emit-llvm -x c %s -o - \
+// RUN: | FileCheck %s --check-prefix=SPIRV_AMD_CL
+
+#ifndef __OPENCL_C_VERSION__
+#define __constant const
+#endif
+
+static __constant __attribute__((__used__)) int foo = 42;
+
+
+// X86: @foo = internal constant i32 42
+// X86: @llvm.compiler.used = appending global [2 x ptr] [ptr @foo, ptr @bar], section "llvm.metadata"
+//
+// AMDGCN: @foo = internal addrspace(4) constant i32 42
+// AMDGCN: @llvm.compiler.used = appending addrspace(1) global [2 x ptr] [ptr addrspacecast (ptr addrspace(4) @foo to ptr), ptr @bar], section "llvm.metadata"
+//
+// SPIRV: @foo = internal constant i32 42
+// SPIRV: @llvm.used = appending addrspace(1) global [2 x ptr] [ptr @foo, ptr @bar], section "llvm.metadata"
+//
+// SPIRV_CL: @foo = internal addrspace(2) constant i32 42
+// SPIRV_CL: @llvm.used = appending addrspace(1) global [2 x ptr] [ptr addrspacecast (ptr addrspace(2) @foo to ptr), ptr @bar], section "llvm.metadata"
+//
+// SPIRV_AMD: @foo = internal addrspace(1) constant i32 42
+// SPIRV_AMD: @llvm.used = appending addrspace(1) global [2 x ptr] [ptr addrspacecast (ptr addrspace(1) @foo to ptr), ptr addrspacecast (ptr addrspace(4) @bar to ptr)], section "llvm.metadata"
+//
+// SPIRV_AMD_CL: @foo = internal addrspace(2) constant i32 42
+// SPIRV_AMD_CL: @llvm.used = appending addrspace(1) global [2 x ptr] [ptr addrspacecast (ptr addrspace(2) @foo to ptr), ptr addrspacecast (ptr addrspace(4) @bar to ptr)], section "llvm.metadata"
+//
+// X86: define internal void @bar() #{{[0-9]}} {
+//
+// AMDGCN: define internal void @bar() #{{[0-9]}} {
+//
+// SPIRV: define internal spir_func void @bar() #{{[0-9]}} {
+//
+// SPIRV_CL: define internal spir_func void @bar() #{{[0-9]}} {
+//
+// SPIRV_AMD: define internal spir_func void @bar() addrspace(4) #{{[0-9]}} {
+//
+// SPIRV_AMD_CL: define internal spir_func void @bar() addrspace(4) #{{[0-9]}} {
+//
+static void __attribute__((__used__)) bar() {
+}
diff --git a/clang/test/DebugInfo/KeyInstructions/flag.cpp b/clang/test/DebugInfo/KeyInstructions/flag.cpp
index 6aeeed6..4a4a5c4 100644
--- a/clang/test/DebugInfo/KeyInstructions/flag.cpp
+++ b/clang/test/DebugInfo/KeyInstructions/flag.cpp
@@ -8,6 +8,9 @@
// KEY-INSTRUCTIONS: "-gkey-instructions"
// NO-KEY-INSTRUCTIONS-NOT: key-instructions
+
+// Only expect one dwarf related flag.
+// NO-DEBUG: -fdwarf2-cfi-asm
// NO-DEBUG-NOT: debug-info-kind
// NO-DEBUG-NOT: dwarf
diff --git a/clang/test/Frontend/diags-interesting-source-region-colors.cpp b/clang/test/Frontend/diags-interesting-source-region-colors.cpp
new file mode 100644
index 0000000..80db087
--- /dev/null
+++ b/clang/test/Frontend/diags-interesting-source-region-colors.cpp
@@ -0,0 +1,30 @@
+// RUN: not %clang_cc1 %s -fmessage-length=40 -fcolor-diagnostics -fno-show-source-location -Wunused-value -o - 2>&1 | FileCheck %s
+
+// REQUIRES: ansi-escape-sequences
+
+int main() {
+ 1 + + if;
+ // CHECK: expected expression
+ // CHECK-NEXT: ...+ [[MAGENTA:.\[0;34m]]if[[RESET:.\[0m]];
+
+ /*😂*/1 + + if;
+ // CHECK: expected expression
+ // CHECK-NEXT: ...+ [[MAGENTA:.\[0;34m]]if[[RESET:.\[0m]];
+
+ a + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
+ // CHECK: use of undeclared identifier
+ // CHECK-NEXT: a + [[GREEN:.\[0;32m]]1[[RESET]] + [[GREEN]]1[[RESET]] + [[GREEN]]1[[RESET]] + [[GREEN]]1[[RESET]] + [[GREEN]]1[[RESET]] ...
+
+
+ /*😂😂😂*/ a + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
+ // CHECK: use of undeclared identifier
+ // CHECK-NEXT: [[YELLOW:.\[0;33m]]/*😂😂😂*/[[RESET]] a + [[GREEN:.\[0;32m]]1[[RESET]] + [[GREEN]]1[[RESET]] ...
+
+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+ // CHECK: [[GREEN:.\[0;32m]]"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"[[RESET]];
+
+ "😂xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+ // CHECK: [[GREEN:.\[0;32m]]"😂xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"[[RESET]];
+}
+
+
diff --git a/clang/test/Preprocessor/unwind-tables.c b/clang/test/Preprocessor/unwind-tables.c
index 0a863d7..5ff990d 100644
--- a/clang/test/Preprocessor/unwind-tables.c
+++ b/clang/test/Preprocessor/unwind-tables.c
@@ -1,11 +1,13 @@
// RUN: %clang %s -dM -E -target x86_64-windows | FileCheck %s --check-prefix=NO
// RUN: %clang %s -dM -E -target x86_64 -fno-asynchronous-unwind-tables | FileCheck %s --check-prefix=NO
+// RUN: %clang %s -dM -E -target x86_64 -fno-dwarf2-cfi-asm | FileCheck %s --check-prefix=NO
// RUN: %clang %s -dM -E -target x86_64 | FileCheck %s
// RUN: %clang %s -dM -E -target x86_64 -funwind-tables -fno-asynchronous-unwind-tables -g | FileCheck %s
// RUN: %clang %s -dM -E -target aarch64-apple-darwin | FileCheck %s
// RUN: %clang %s -dM -E -target x86_64 -fno-asynchronous-unwind-tables -g | FileCheck %s
// RUN: %clang %s -dM -E -target x86_64 -fno-asynchronous-unwind-tables -fexceptions | FileCheck %s
+// RUN: %clang %s -dM -E -target x86_64-windows -fdwarf2-cfi-asm | FileCheck %s
// NO-NOT: #define __GCC_HAVE_DWARF2_CFI_ASM
// CHECK: #define __GCC_HAVE_DWARF2_CFI_ASM 1
diff --git a/clang/test/SemaCXX/vector.cpp b/clang/test/SemaCXX/vector.cpp
index 808bdb6..06195f0 100644
--- a/clang/test/SemaCXX/vector.cpp
+++ b/clang/test/SemaCXX/vector.cpp
@@ -786,3 +786,16 @@ const long long e = *0; // expected-error {{indirection requires pointer operand
double f = a - e; // expected-error {{cannot initialize a variable of type 'double' with an rvalue of type '__attribute__((__vector_size__(1 * sizeof(double)))) double' (vector of 1 'double' value)}}
int h = c - e; // expected-error {{cannot initialize a variable of type 'int' with an rvalue of type '__attribute__((__vector_size__(1 * sizeof(long)))) long' (vector of 1 'long' value)}}
}
+
+typedef int v_neg_size __attribute__((vector_size(-8))); // expected-error{{vector must have non-negative size}}
+typedef int v_neg_size_2 __attribute__((vector_size(-1 * 8))); // expected-error{{vector must have non-negative size}}
+typedef int v_ext_neg_size __attribute__((ext_vector_type(-8))); // expected-error{{vector must have non-negative size}}
+typedef int v_ext_neg_size2 __attribute__((ext_vector_type(-1 * 8))); // expected-error{{vector must have non-negative size}}
+
+
+#if __cplusplus >= 201103L
+
+template <int N> using templated_v_size = int __attribute__((vector_size(N))); // expected-error{{vector must have non-negative size}}
+templated_v_size<-8> templated_v_neg_size; //expected-note{{in instantiation of template type alias 'templated_v_size' requested here}}
+
+#endif
diff --git a/clang/tools/scan-build/bin/set-xcode-analyzer b/clang/tools/scan-build/bin/set-xcode-analyzer
index 8e4a579..5d98c0c 100755
--- a/clang/tools/scan-build/bin/set-xcode-analyzer
+++ b/clang/tools/scan-build/bin/set-xcode-analyzer
@@ -5,10 +5,6 @@
# This one has the scripting bridge enabled.
import sys
-if sys.version_info < (3, 6):
- print "set-xcode-analyzer requires Python 3.6 or later"
- sys.exit(1)
-
import os
import subprocess
import re
@@ -18,7 +14,7 @@ import stat
from AppKit import *
def FindClangSpecs(path):
- print "(+) Searching for xcspec file in: ", path
+ print("(+) Searching for xcspec file in: ", path)
for root, dirs, files in os.walk(path):
for f in files:
if f.endswith(".xcspec") and f.startswith("Clang LLVM"):
@@ -49,14 +45,14 @@ def ModifySpec(path, isBuiltinAnalyzer, pathToChecker):
foundAnalyzer = False
t.write(line)
t.close()
- print "(+) processing:", path
+ print("(+) processing:", path)
try:
shutil.copy(t.name, path)
os.chmod(path, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH)
- except IOError, why:
- print " (-) Cannot update file:", why, "\n"
- except OSError, why:
- print " (-) Cannot update file:", why, "\n"
+ except IOError as why:
+ print(" (-) Cannot update file:", why, "\n")
+ except OSError as why:
+ print(" (-) Cannot update file:", why, "\n")
os.unlink(t.name)
def main():
@@ -75,7 +71,7 @@ def main():
# determine if Xcode is running
for x in NSWorkspace.sharedWorkspace().runningApplications():
if x.localizedName().find("Xcode") >= 0:
- print "(-) You must quit Xcode first before modifying its configuration files."
+ print("(-) You must quit Xcode first before modifying its configuration files.")
sys.exit(1)
isBuiltinAnalyzer = False
@@ -83,12 +79,12 @@ def main():
# Expand tildes.
path = os.path.expanduser(options.path)
if not path.endswith("clang"):
- print "(+) Using Clang bundled with checker build:", path
+ print("(+) Using Clang bundled with checker build:", path)
path = os.path.join(path, "bin", "clang");
else:
- print "(+) Using Clang located at:", path
+ print("(+) Using Clang located at:", path)
else:
- print "(+) Using the Clang bundled with Xcode"
+ print("(+) Using the Clang bundled with Xcode")
path = options.default
isBuiltinAnalyzer = True
@@ -108,7 +104,7 @@ def main():
ModifySpec(x, isBuiltinAnalyzer, path)
if not foundSpec:
- print "(-) No compiler configuration file was found. Xcode's analyzer has not been updated."
+ print("(-) No compiler configuration file was found. Xcode's analyzer has not been updated.")
if __name__ == '__main__':
main()
diff --git a/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp b/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp
index ef22960..8fc9a66d 100644
--- a/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp
+++ b/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp
@@ -2076,4 +2076,19 @@ TEST(ExprMutationAnalyzerTest, PointeeMutatedByReturn) {
}
}
+TEST(ExprMutationAnalyzerTest, PointeeMutatedByPointerToMemberOperator) {
+ // GH161913
+ const std::string Code = R"(
+ struct S { int i; };
+ void f(S s) {
+ S *x = &s;
+ (x->*(&S::i))++;
+ }
+ )";
+ auto AST = buildASTFromCodeWithArgs(Code, {"-Wno-everything"});
+ auto Results =
+ match(withEnclosingCompound(declRefTo("x")), AST->getASTContext());
+ EXPECT_TRUE(isPointeeMutated(Results, AST.get()));
+}
+
} // namespace clang
diff --git a/clang/unittests/Format/FormatTestComments.cpp b/clang/unittests/Format/FormatTestComments.cpp
index 399f835..d7b2257 100644
--- a/clang/unittests/Format/FormatTestComments.cpp
+++ b/clang/unittests/Format/FormatTestComments.cpp
@@ -106,24 +106,12 @@ TEST_F(FormatTestComments, UnderstandsSingleLineComments) {
" // line c\n"
" c\n"
"};",
- "enum A {\n"
- " // line a\n"
- " a,\n"
- " b, // line b\n"
- "\n"
- " // line c\n"
- " c\n"
- "};",
- Style20);
- verifyFormat("enum A {\n"
- " a, // line 1\n"
- " // line 2\n"
- "};",
- "enum A {\n"
- " a, // line 1\n"
- " // line 2\n"
- "};",
Style20);
+ verifyNoChange("enum A {\n"
+ " a, // line 1\n"
+ " // line 2\n"
+ "};",
+ Style20);
verifyFormat("enum A {\n"
" a, // line 1\n"
" // line 2\n"
@@ -133,17 +121,12 @@ TEST_F(FormatTestComments, UnderstandsSingleLineComments) {
" // line 2\n"
"};",
Style20);
- verifyFormat("enum A {\n"
- " a, // line 1\n"
- " // line 2\n"
- " b\n"
- "};",
- "enum A {\n"
- " a, // line 1\n"
- " // line 2\n"
- " b\n"
- "};",
- Style20);
+ verifyNoChange("enum A {\n"
+ " a, // line 1\n"
+ " // line 2\n"
+ " b\n"
+ "};",
+ Style20);
verifyFormat("enum A {\n"
" a, // line 1\n"
" // line 2\n"
@@ -487,12 +470,9 @@ TEST_F(FormatTestComments, AlignsBlockComments) {
" Don't try to outdent if there's not enough indentation.\n"
" */");
- verifyFormat("int i; /* Comment with empty...\n"
- " *\n"
- " * line. */",
- "int i; /* Comment with empty...\n"
- " *\n"
- " * line. */");
+ verifyNoChange("int i; /* Comment with empty...\n"
+ " *\n"
+ " * line. */");
verifyFormat("int foobar = 0; /* comment */\n"
"int bar = 0; /* multiline\n"
" comment 1 */\n"
@@ -555,8 +535,6 @@ TEST_F(FormatTestComments, CommentReflowingCanApplyOnlyToIndents) {
TEST_F(FormatTestComments, CorrectlyHandlesLengthOfBlockComments) {
verifyFormat("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
- " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */",
- "double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */");
verifyFormat(
"void ffffffffffff(\n"
@@ -680,17 +658,12 @@ TEST_F(FormatTestComments, SplitsLongCxxComments) {
verifyFormat("#define XXX // q w e r\n"
" // t y u i",
"#define XXX //q w e r t y u i", Style22);
- verifyFormat("{\n"
- " //\n"
- " //\\\n"
- " // long 1 2 3 4 5\n"
- "}",
- "{\n"
- " //\n"
- " //\\\n"
- " // long 1 2 3 4 5\n"
- "}",
- Style20);
+ verifyNoChange("{\n"
+ " //\n"
+ " //\\\n"
+ " // long 1 2 3 4 5\n"
+ "}",
+ Style20);
verifyFormat("{\n"
" //\n"
" //\\\n"
@@ -730,19 +703,13 @@ TEST_F(FormatTestComments, PreservesHangingIndentInCxxComments) {
}
TEST_F(FormatTestComments, DontSplitLineCommentsWithEscapedNewlines) {
- verifyFormat("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
- "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
- "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
- "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
- "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
- "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
- verifyFormat("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
- " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
- " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
- "int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
- " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
- " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
- getLLVMStyleWithColumns(50));
+ verifyNoChange("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
+ "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
+ "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
+ verifyNoChange("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
+ " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
+ " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+ getLLVMStyleWithColumns(50));
verifyFormat("double\n"
" a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
" // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
@@ -773,10 +740,8 @@ TEST_F(FormatTestComments, DontIntroduceMultilineComments) {
TEST_F(FormatTestComments, DontSplitLineCommentsWithPragmas) {
FormatStyle Pragmas = getLLVMStyleWithColumns(30);
Pragmas.CommentPragmas = "^ IWYU pragma:";
- verifyFormat("// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb",
- "// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb", Pragmas);
- verifyFormat("/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */",
- "/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */", Pragmas);
+ verifyFormat("// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb", Pragmas);
+ verifyFormat("/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */", Pragmas);
}
TEST_F(FormatTestComments, PriorityOfCommentBreaking) {
@@ -812,26 +777,17 @@ TEST_F(FormatTestComments, PriorityOfCommentBreaking) {
TEST_F(FormatTestComments, MultiLineCommentsInDefines) {
const auto Style17 = getLLVMStyleWithColumns(17);
- verifyFormat("#define A(x) /* \\\n"
- " a comment \\\n"
- " inside */ \\\n"
- " f();",
- "#define A(x) /* \\\n"
- " a comment \\\n"
- " inside */ \\\n"
- " f();",
- Style17);
- verifyFormat("#define A( \\\n"
- " x) /* \\\n"
- " a comment \\\n"
- " inside */ \\\n"
- " f();",
- "#define A( \\\n"
- " x) /* \\\n"
- " a comment \\\n"
- " inside */ \\\n"
- " f();",
- Style17);
+ verifyNoChange("#define A(x) /* \\\n"
+ " a comment \\\n"
+ " inside */ \\\n"
+ " f();",
+ Style17);
+ verifyNoChange("#define A( \\\n"
+ " x) /* \\\n"
+ " a comment \\\n"
+ " inside */ \\\n"
+ " f();",
+ Style17);
}
TEST_F(FormatTestComments, LineCommentsInMacrosDoNotGetEscapedNewlines) {
@@ -865,33 +821,20 @@ TEST_F(FormatTestComments, ParsesCommentsAdjacentToPPDirectives) {
TEST_F(FormatTestComments, KeepsLevelOfCommentBeforePPDirective) {
// Keep the current level if the comment was originally not aligned with
// the preprocessor directive.
- verifyFormat("void f() {\n"
- " int i;\n"
- " /* comment */\n"
- "#ifdef A\n"
- " int j;\n"
- "}",
- "void f() {\n"
- " int i;\n"
- " /* comment */\n"
- "#ifdef A\n"
- " int j;\n"
- "}");
+ verifyNoChange("void f() {\n"
+ " int i;\n"
+ " /* comment */\n"
+ "#ifdef A\n"
+ " int j;\n"
+ "}");
- verifyFormat("void f() {\n"
- " int i;\n"
- " /* comment */\n"
- "\n"
- "#ifdef A\n"
- " int j;\n"
- "}",
- "void f() {\n"
- " int i;\n"
- " /* comment */\n"
- "\n"
- "#ifdef A\n"
- " int j;\n"
- "}");
+ verifyNoChange("void f() {\n"
+ " int i;\n"
+ " /* comment */\n"
+ "\n"
+ "#ifdef A\n"
+ " int j;\n"
+ "}");
verifyFormat("int f(int i) {\n"
" if (true) {\n"
@@ -1060,18 +1003,12 @@ TEST_F(FormatTestComments, KeepsLevelOfCommentBeforePPDirective) {
// Align with the preprocessor directive if the comment was originally aligned
// with the preprocessor directive and there is no newline between the comment
// and the preprocessor directive.
- verifyFormat("void f() {\n"
- " int i;\n"
- "/* comment */\n"
- "#ifdef A\n"
- " int j;\n"
- "}",
- "void f() {\n"
- " int i;\n"
- "/* comment */\n"
- "#ifdef A\n"
- " int j;\n"
- "}");
+ verifyNoChange("void f() {\n"
+ " int i;\n"
+ "/* comment */\n"
+ "#ifdef A\n"
+ " int j;\n"
+ "}");
verifyFormat("int f(int i) {\n"
" if (true) {\n"
@@ -1245,13 +1182,10 @@ TEST_F(FormatTestComments, SplitsLongLinesInComments) {
" wherever_a_space_occurs \n"
" */",
Style20);
- verifyFormat("/*\n"
- " * This_comment_can_not_be_broken_into_lines\n"
- " */",
- "/*\n"
- " * This_comment_can_not_be_broken_into_lines\n"
- " */",
- Style20);
+ verifyNoChange("/*\n"
+ " * This_comment_can_not_be_broken_into_lines\n"
+ " */",
+ Style20);
verifyFormat("{\n"
" /*\n"
" This is another\n"
@@ -1445,17 +1379,12 @@ TEST_F(FormatTestComments, AlignsPPElseEndifComments) {
"int iiii; // CC\n"
"#endif // B",
Style20);
- verifyFormat("#if A\n"
- "#else // A1\n"
- " // A2\n"
- "int ii;\n"
- "#endif // B",
- "#if A\n"
- "#else // A1\n"
- " // A2\n"
- "int ii;\n"
- "#endif // B",
- Style20);
+ verifyNoChange("#if A\n"
+ "#else // A1\n"
+ " // A2\n"
+ "int ii;\n"
+ "#endif // B",
+ Style20);
}
TEST_F(FormatTestComments, CommentsInStaticInitializers) {
@@ -1528,10 +1457,6 @@ TEST_F(FormatTestComments, LineCommentsAfterRightBrace) {
verifyFormat("if (true) { // comment about branch\n"
" // comment about f\n"
" f();\n"
- "}",
- "if (true) { // comment about branch\n"
- " // comment about f\n"
- " f();\n"
"}");
verifyFormat("if (1) { // if line 1\n"
" // if line 2\n"
@@ -1582,6 +1507,7 @@ TEST_F(FormatTestComments, LineCommentsAfterRightBrace) {
TEST_F(FormatTestComments, ReflowsComments) {
const auto Style20 = getLLVMStyleWithColumns(20);
const auto Style22 = getLLVMStyleWithColumns(22);
+
// Break a long line and reflow with the full next line.
verifyFormat("// long long long\n"
"// long long",
@@ -2149,11 +2075,9 @@ TEST_F(FormatTestComments, ReflowsComments) {
Style20);
// Don't break or reflow comments on import lines.
- verifyFormat("#include \"t\" /* l l l\n"
- " * l */",
- "#include \"t\" /* l l l\n"
- " * l */",
- Style20);
+ verifyNoChange("#include \"t\" /* l l l\n"
+ " * l */",
+ Style20);
// Don't reflow between different trailing comment sections.
verifyFormat("int i; // long long\n"
@@ -2209,7 +2133,9 @@ TEST_F(FormatTestComments, ReflowsCommentsPrecise) {
"// some text that reflows\n"
"// into foo",
Style);
+
Style.ColumnLimit = 21;
+
// Given one more column, "// reflows into foo" does fit the limit, so we
// do not compress the whitespace.
verifyFormat("// some text that\n"
@@ -2228,6 +2154,7 @@ TEST_F(FormatTestComments, ReflowsCommentsPrecise) {
"// some text that reflows\n"
"// into1234567",
Style);
+
// Secondly, when the next line ends later, but the first word in that line
// is precisely one column over the limit, do not reflow.
verifyFormat("// some text that\n"
@@ -2240,6 +2167,7 @@ TEST_F(FormatTestComments, ReflowsCommentsPrecise) {
TEST_F(FormatTestComments, ReflowsCommentsWithExtraWhitespace) {
const auto Style16 = getLLVMStyleWithColumns(16);
+
// Baseline.
verifyFormat("// some text\n"
"// that re flows",
@@ -2546,37 +2474,23 @@ TEST_F(FormatTestComments, BlockComments) {
verifyFormat("void f(int * /* unused */) {}");
- verifyFormat("/*\n"
- " **\n"
- " */",
- "/*\n"
- " **\n"
- " */");
- verifyFormat("/*\n"
- " *q\n"
- " */",
- "/*\n"
- " *q\n"
- " */");
- verifyFormat("/*\n"
- " * q\n"
- " */",
- "/*\n"
- " * q\n"
- " */");
- verifyFormat("/*\n"
- " **/",
- "/*\n"
- " **/");
- verifyFormat("/*\n"
- " ***/",
- "/*\n"
- " ***/");
+ verifyNoChange("/*\n"
+ " **\n"
+ " */");
+ verifyNoChange("/*\n"
+ " *q\n"
+ " */");
+ verifyNoChange("/*\n"
+ " * q\n"
+ " */");
+ verifyNoChange("/*\n"
+ " **/");
+ verifyNoChange("/*\n"
+ " ***/");
}
TEST_F(FormatTestComments, BlockCommentsInMacros) {
const auto Style20 = getLLVMStyleWithColumns(20);
-
verifyFormat("#define A \\\n"
" { \\\n"
" /* one line */ \\\n"
@@ -2599,7 +2513,6 @@ TEST_F(FormatTestComments, BlockCommentsInMacros) {
TEST_F(FormatTestComments, BlockCommentsAtEndOfLine) {
const auto Style15 = getLLVMStyleWithColumns(15);
-
verifyFormat("a = {\n"
" 1111 /* */\n"
"};",
@@ -2774,11 +2687,6 @@ TEST_F(FormatTestComments, AlignTrailingComments) {
" // comment about a\n"
" int a;\n"
"};",
- "class A {\n"
- "public: // public comment\n"
- " // comment about a\n"
- " int a;\n"
- "};",
Style40);
verifyFormat("class A {\n"
"public: // public comment 1\n"
@@ -3106,41 +3014,26 @@ TEST_F(FormatTestComments, AlignTrailingCommentsLeave) {
FormatStyle Style = getLLVMStyle();
Style.AlignTrailingComments.Kind = FormatStyle::TCAS_Leave;
- verifyFormat("int a;// do not touch\n"
- "int b; // any comments\n"
- "int c; // comment\n"
- "int d; // comment",
- "int a;// do not touch\n"
- "int b; // any comments\n"
- "int c; // comment\n"
- "int d; // comment",
- Style);
+ verifyNoChange("int a;// do not touch\n"
+ "int b; // any comments\n"
+ "int c; // comment\n"
+ "int d; // comment",
+ Style);
- verifyFormat("int a; // do not touch\n"
- "int b; // any comments\n"
- "int c; // comment\n"
- "int d;// comment",
- "int a; // do not touch\n"
- "int b; // any comments\n"
- "int c; // comment\n"
- "int d;// comment",
- Style);
+ verifyNoChange("int a; // do not touch\n"
+ "int b; // any comments\n"
+ "int c; // comment\n"
+ "int d;// comment",
+ Style);
- verifyFormat("// do not touch\n"
- "int a; // any comments\n"
- "\n"
- " // comment\n"
- "// comment\n"
- "\n"
- "// comment",
- "// do not touch\n"
- "int a; // any comments\n"
- "\n"
- " // comment\n"
- "// comment\n"
- "\n"
- "// comment",
- Style);
+ verifyNoChange("// do not touch\n"
+ "int a; // any comments\n"
+ "\n"
+ " // comment\n"
+ "// comment\n"
+ "\n"
+ "// comment",
+ Style);
verifyFormat("// do not touch\n"
"int a; // any comments\n"
@@ -3178,23 +3071,15 @@ TEST_F(FormatTestComments, AlignTrailingCommentsLeave) {
// Allow to keep 2 empty lines
Style.MaxEmptyLinesToKeep = 2;
- verifyFormat("// do not touch\n"
- "int a; // any comments\n"
- "\n"
- "\n"
- " // comment\n"
- "// comment\n"
- "\n"
- "// comment",
- "// do not touch\n"
- "int a; // any comments\n"
- "\n"
- "\n"
- " // comment\n"
- "// comment\n"
- "\n"
- "// comment",
- Style);
+ verifyNoChange("// do not touch\n"
+ "int a; // any comments\n"
+ "\n"
+ "\n"
+ " // comment\n"
+ "// comment\n"
+ "\n"
+ "// comment",
+ Style);
Style.MaxEmptyLinesToKeep = 1;
// Just format comments normally when leaving exceeds the column limit
@@ -3233,16 +3118,16 @@ TEST_F(FormatTestComments, DontAlignNamespaceComments) {
Style.NamespaceMacros.push_back("TESTSUITE");
Style.ShortNamespaceLines = 0;
- StringRef Input = "namespace A {\n"
- " TESTSUITE(B) {\n"
- " namespace C {\n"
- " namespace D { //\n"
- " } // namespace D\n"
- " std::string Foo = Bar; // Comment\n"
- " std::string BazString = Baz; // C2\n"
- " } // namespace C\n"
- " }\n"
- "} // NaMeSpAcE A";
+ constexpr StringRef Input("namespace A {\n"
+ " TESTSUITE(B) {\n"
+ " namespace C {\n"
+ " namespace D { //\n"
+ " } // namespace D\n"
+ " std::string Foo = Bar; // Comment\n"
+ " std::string BazString = Baz; // C2\n"
+ " } // namespace C\n"
+ " }\n"
+ "} // NaMeSpAcE A");
EXPECT_TRUE(Style.FixNamespaceComments);
EXPECT_EQ(Style.AlignTrailingComments.Kind, FormatStyle::TCAS_Always);
@@ -3326,21 +3211,21 @@ TEST_F(FormatTestComments, DontAlignNamespaceComments) {
Style.AlignTrailingComments.Kind = FormatStyle::TCAS_Always;
Style.FixNamespaceComments = true;
- Input = "namespace A {\n"
- " int Foo;\n"
- " int Bar;\n"
- "}\n"
- "// Comment";
+ constexpr StringRef Code("namespace A {\n"
+ " int Foo;\n"
+ " int Bar;\n"
+ "}\n"
+ "// Comment");
verifyFormat("namespace A {\n"
" int Foo;\n"
" int Bar;\n"
"} // namespace A\n"
"// Comment",
- Input, Style);
+ Code, Style);
Style.FixNamespaceComments = false;
- verifyFormat(Input, Style);
+ verifyFormat(Code, Style);
}
TEST_F(FormatTestComments, DontAlignOverScope) {
@@ -3498,10 +3383,8 @@ TEST_F(FormatTestComments, AlignsBlockCommentDecorations) {
" */",
"/*\n"
"*/");
- verifyFormat("/*\n"
- " */",
- "/*\n"
- " */");
+ verifyNoChange("/*\n"
+ " */");
verifyFormat("/*\n"
" */",
"/*\n"
@@ -3512,10 +3395,8 @@ TEST_F(FormatTestComments, AlignsBlockCommentDecorations) {
" * line */",
"/*\n"
"* line */");
- verifyFormat("/*\n"
- " * line */",
- "/*\n"
- " * line */");
+ verifyNoChange("/*\n"
+ " * line */");
verifyFormat("/*\n"
" * line */",
"/*\n"
@@ -3528,10 +3409,8 @@ TEST_F(FormatTestComments, AlignsBlockCommentDecorations) {
" * line */",
"/**\n"
"* line */");
- verifyFormat("/**\n"
- " * line */",
- "/**\n"
- " * line */");
+ verifyNoChange("/**\n"
+ " * line */");
verifyFormat("/**\n"
" * line */",
"/**\n"
@@ -3566,10 +3445,8 @@ TEST_F(FormatTestComments, AlignsBlockCommentDecorations) {
" */");
// Align two lines.
- verifyFormat("/* line 1\n"
- " * line 2 */",
- "/* line 1\n"
- " * line 2 */");
+ verifyNoChange("/* line 1\n"
+ " * line 2 */");
verifyFormat("/* line 1\n"
" * line 2 */",
"/* line 1\n"
@@ -3590,10 +3467,8 @@ TEST_F(FormatTestComments, AlignsBlockCommentDecorations) {
" * line 2 */",
"int i; /* line 1\n"
"* line 2 */");
- verifyFormat("int i; /* line 1\n"
- " * line 2 */",
- "int i; /* line 1\n"
- " * line 2 */");
+ verifyNoChange("int i; /* line 1\n"
+ " * line 2 */");
verifyFormat("int i; /* line 1\n"
" * line 2 */",
"int i; /* line 1\n"
@@ -3695,6 +3570,7 @@ TEST_F(FormatTestComments, NonTrailingBlockComments) {
TEST_F(FormatTestComments, PythonStyleComments) {
const auto ProtoStyle20 = getTextProtoStyleWithColumns(20);
+
// Keeps a space after '#'.
verifyFormat("# comment\n"
"key: value",
@@ -3798,8 +3674,6 @@ TEST_F(FormatTestComments, ReflowBackslashCrash) {
TEST_F(FormatTestComments, IndentsLongJavadocAnnotatedLines) {
FormatStyle Style = getGoogleStyle(FormatStyle::LK_Java);
Style.ColumnLimit = 60;
- FormatStyle Style20 = getGoogleStyle(FormatStyle::LK_Java);
- Style20.ColumnLimit = 20;
verifyFormat("/**\n"
" * @param x long long long long long long long long long\n"
" * long\n"
@@ -3827,6 +3701,10 @@ TEST_F(FormatTestComments, IndentsLongJavadocAnnotatedLines) {
"long long long long long long long long long long long\n"
" */",
Style);
+
+ FormatStyle Style20 = getGoogleStyle(FormatStyle::LK_Java);
+ Style20.ColumnLimit = 20;
+
verifyFormat("/**\n"
" * Sentence that\n"
" * should be broken.\n"
@@ -3895,7 +3773,6 @@ TEST_F(FormatTestComments, IndentsLongJavadocAnnotatedLines) {
}
TEST_F(FormatTestComments, SpaceAtLineCommentBegin) {
- FormatStyle Style = getLLVMStyle();
constexpr StringRef NoTextInComment(" // \n"
"\n"
"void foo() {// \n"
@@ -3907,8 +3784,9 @@ TEST_F(FormatTestComments, SpaceAtLineCommentBegin) {
"void foo() { //\n"
" //\n"
"}",
- NoTextInComment, Style);
+ NoTextInComment);
+ auto Style = getLLVMStyle();
Style.SpacesInLineCommentPrefix.Minimum = 0;
verifyFormat("//#comment", Style);
verifyFormat("//\n"
@@ -3927,7 +3805,6 @@ TEST_F(FormatTestComments, SpaceAtLineCommentBegin) {
"}",
NoTextInComment, Style);
- Style = getLLVMStyle();
constexpr StringRef Code(
"//Free comment without space\n"
"\n"
@@ -4216,8 +4093,9 @@ TEST_F(FormatTestComments, SpaceAtLineCommentBegin) {
"// vv will only move\n"
"// } if the line above does");
- verifyFormat(Code2, Code, Style);
+ verifyFormat(Code2, Code);
+ Style = getLLVMStyle();
Style.SpacesInLineCommentPrefix = {0, 0};
verifyFormat("//#comment", "// #comment", Style);
verifyFormat(Code3, Code, Style);
@@ -4226,12 +4104,12 @@ TEST_F(FormatTestComments, SpaceAtLineCommentBegin) {
verifyFormat(Code4, Code, Style);
Style = getLLVMStyleWithColumns(20);
- StringRef WrapCode = "//Lorem ipsum dolor sit amet\n"
- "\n"
- "// Lorem ipsum dolor sit amet\n"
- "\n"
- "void f() {//Hello World\n"
- "}";
+ constexpr StringRef WrapCode("//Lorem ipsum dolor sit amet\n"
+ "\n"
+ "// Lorem ipsum dolor sit amet\n"
+ "\n"
+ "void f() {//Hello World\n"
+ "}");
verifyFormat("// Lorem ipsum dolor\n"
"// sit amet\n"
@@ -4506,20 +4384,20 @@ TEST_F(FormatTestComments, SplitCommentIntroducers) {
}
TEST_F(FormatTestComments, LineCommentsOnStartOfFunctionCall) {
- auto Style = getLLVMStyle();
-
- EXPECT_EQ(Style.Cpp11BracedListStyle, FormatStyle::BLS_AlignFirstComment);
verifyFormat("Type name{// Comment\n"
- " value};",
- Style);
+ " value};");
+ auto Style = getLLVMStyle();
+ EXPECT_EQ(Style.Cpp11BracedListStyle, FormatStyle::BLS_AlignFirstComment);
Style.Cpp11BracedListStyle = FormatStyle::BLS_Block;
+
verifyFormat("Type name{ // Comment\n"
" value\n"
"};",
Style);
Style.Cpp11BracedListStyle = FormatStyle::BLS_FunctionCall;
+
verifyFormat("Type name{ // Comment\n"
" value};",
Style);
diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp
index c046142..815c79e 100644
--- a/clang/unittests/Format/TokenAnnotatorTest.cpp
+++ b/clang/unittests/Format/TokenAnnotatorTest.cpp
@@ -799,6 +799,30 @@ TEST_F(TokenAnnotatorTest, UnderstandsTemplateTemplateParameters) {
EXPECT_TOKEN(Tokens[23], tok::identifier, TT_ClassHeadName);
}
+TEST_F(TokenAnnotatorTest, UnderstandsCommonCppTemplates) {
+ auto Tokens =
+ annotate("static_assert(std::conditional_t<A || B, C, D>::value);");
+ ASSERT_EQ(Tokens.size(), 19u) << Tokens;
+ EXPECT_TOKEN(Tokens[5], tok::less, TT_TemplateOpener);
+ EXPECT_TOKEN(Tokens[13], tok::greater, TT_TemplateCloser);
+
+ Tokens =
+ annotate("static_assert(std::conditional<A || B, C, D>::type::value);");
+ ASSERT_EQ(Tokens.size(), 21u) << Tokens;
+ EXPECT_TOKEN(Tokens[5], tok::less, TT_TemplateOpener);
+ EXPECT_TOKEN(Tokens[13], tok::greater, TT_TemplateCloser);
+
+ Tokens = annotate("static_assert(fancy_v<A || B>);");
+ ASSERT_EQ(Tokens.size(), 11u) << Tokens;
+ EXPECT_TOKEN(Tokens[3], tok::less, TT_TemplateOpener);
+ EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser);
+
+ Tokens = annotate("static_assert(fancy<A || B>::value);");
+ ASSERT_EQ(Tokens.size(), 13u) << Tokens;
+ EXPECT_TOKEN(Tokens[3], tok::less, TT_TemplateOpener);
+ EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser);
+}
+
TEST_F(TokenAnnotatorTest, UnderstandsWhitespaceSensitiveMacros) {
FormatStyle Style = getLLVMStyle();
Style.WhitespaceSensitiveMacros.push_back("FOO");
@@ -2686,6 +2710,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsVerilogOperators) {
// precedence.
std::pair<prec::Level, std::string> JoinedBinary[] = {
{prec::Comma, "->"}, {prec::Comma, "<->"},
+ {prec::Comma, "#-#"}, {prec::Comma, "#=#"},
{prec::Assignment, "+="}, {prec::Assignment, "-="},
{prec::Assignment, "*="}, {prec::Assignment, "/="},
{prec::Assignment, "%="}, {prec::Assignment, "&="},
diff --git a/clang/www/c_status.html b/clang/www/c_status.html
index b803962..80a52f7 100644
--- a/clang/www/c_status.html
+++ b/clang/www/c_status.html
@@ -329,7 +329,7 @@ conformance.</p>
<tr>
<td>The __COUNTER__ predefined macro</td>
<td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3457.htm">N3457</a></td>
- <td class="unknown" align="center">Unknown</td>
+ <td class="unreleased" align="center">Clang 22</td>
</tr>
<tr>
<td>Chasing Ghosts I: constant expressions v2</td>
diff --git a/clang/www/cxx_dr_status.html b/clang/www/cxx_dr_status.html
index 0312c9d..e9fadb2 100755
--- a/clang/www/cxx_dr_status.html
+++ b/clang/www/cxx_dr_status.html
@@ -40,2843 +40,3314 @@
<p>This page tracks which C++ defect reports are implemented within Clang.</p>
-<table width="689" border="1" cellspacing="0">
+<table width="892" border="1" cellspacing="0">
<tr>
<th>Number</th>
+ <th>Section</th>
<th>Status</th>
<th>Issue title</th>
<th>Available in Clang?</th>
</tr>
<tr id="1">
<td><a href="https://cplusplus.github.io/CWG/issues/1.html">1</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>TC1</td>
<td>What if two using-declarations refer to the same function but the declarations introduce different default-arguments?</td>
<td class="none" align="center">No</td>
</tr>
<tr class="open" id="2">
<td><a href="https://cplusplus.github.io/CWG/issues/2.html">2</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.res">temp.dep.res</a>]</td>
<td>drafting</td>
<td>How can dependent names be used in member declarations that appear outside of the class template definition?</td>
<td align="center">Not resolved</td>
</tr>
<tr id="3">
<td><a href="https://cplusplus.github.io/CWG/issues/3.html">3</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>NAD</td>
<td>The template compilation model rules render some explicit specialization declarations not visible during instantiation</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="4">
<td><a href="https://cplusplus.github.io/CWG/issues/4.html">4</a></td>
+ <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>
<td>CD1</td>
<td>Does extern "C" affect the linkage of function names with internal linkage?</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="5">
<td><a href="https://cplusplus.github.io/CWG/issues/5.html">5</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>CD1</td>
<td>CV-qualifiers and type conversions</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="6">
<td><a href="https://cplusplus.github.io/CWG/issues/6.html">6</a></td>
+ <td>[<a href="https://wg21.link/class.copy.elision">class.copy.elision</a>]</td>
<td>NAD</td>
<td>Should the optimization that allows a class object to alias another object also allow the case of a parameter in an inline function to alias its argument?</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="7">
<td><a href="https://cplusplus.github.io/CWG/issues/7.html">7</a></td>
+ <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>
<td>NAD</td>
<td>Can a class with a private virtual base class be derived from?</td>
<td class="full" align="center">Clang 3.4</td>
</tr>
<tr id="8">
<td><a href="https://cplusplus.github.io/CWG/issues/8.html">8</a></td>
+ <td>[<a href="https://wg21.link/class.access">class.access</a>]</td>
<td>CD1</td>
<td>Access to template arguments used in a function return type and in the nested name specifier</td>
<td class="full" align="center">Duplicate of <a href="#45">45</a></td>
</tr>
<tr id="9">
<td><a href="https://cplusplus.github.io/CWG/issues/9.html">9</a></td>
+ <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>
<td>CD1</td>
<td>Clarification of access to base class members</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="10">
<td><a href="https://cplusplus.github.io/CWG/issues/10.html">10</a></td>
+ <td>[<a href="https://wg21.link/class.access.nest">class.access.nest</a>]</td>
<td>CD1</td>
<td>Can a nested class access its own class name as a qualified name if it is a private member of the enclosing class?</td>
<td class="full" align="center">Duplicate of <a href="#45">45</a></td>
</tr>
<tr id="11">
<td><a href="https://cplusplus.github.io/CWG/issues/11.html">11</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>CD1</td>
<td>How do the keywords typename/template interact with using-declarations?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="12">
<td><a href="https://cplusplus.github.io/CWG/issues/12.html">12</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>dup</td>
<td>Default arguments on different declarations for the same function and the Koenig lookup</td>
<td class="full-superseded" align="center">Superseded by <a href="#239">239</a></td>
</tr>
<tr id="13">
<td><a href="https://cplusplus.github.io/CWG/issues/13.html">13</a></td>
+ <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>
<td>NAD</td>
<td>extern "C" for Parameters of Function Templates</td>
<td class="none" align="center">No</td>
</tr>
<tr id="14">
<td><a href="https://cplusplus.github.io/CWG/issues/14.html">14</a></td>
+ <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>
<td>NAD</td>
<td>extern "C" functions and declarations in different namespaces</td>
<td class="full" align="center">Clang 3.4</td>
</tr>
<tr id="15">
<td><a href="https://cplusplus.github.io/CWG/issues/15.html">15</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>dup</td>
<td>Default arguments for parameters of function templates</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="16">
<td><a href="https://cplusplus.github.io/CWG/issues/16.html">16</a></td>
+ <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>
<td>CD1</td>
<td>Access to members of indirect private base classes</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="17">
<td><a href="https://cplusplus.github.io/CWG/issues/17.html">17</a></td>
+ <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>
<td>NAD</td>
<td>Footnote 99 should discuss the naming class when describing members that can be accessed from friends</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="18">
<td><a href="https://cplusplus.github.io/CWG/issues/18.html">18</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>NAD</td>
<td>f(TYPE) where TYPE is void should be allowed</td>
<td class="full-superseded" align="center">Superseded by <a href="#577">577</a></td>
</tr>
<tr id="19">
<td><a href="https://cplusplus.github.io/CWG/issues/19.html">19</a></td>
+ <td>[<a href="https://wg21.link/class.protected">class.protected</a>]</td>
<td>NAD</td>
<td>Clarify protected member access</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="20">
<td><a href="https://cplusplus.github.io/CWG/issues/20.html">20</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>TC1</td>
<td>Some clarifications needed for 12.8 para 15</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="21">
<td><a href="https://cplusplus.github.io/CWG/issues/21.html">21</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>TC1</td>
<td>Can a default argument for a template parameter appear in a friend declaration?</td>
<td class="full" align="center">Clang 3.4</td>
</tr>
<tr id="22">
<td><a href="https://cplusplus.github.io/CWG/issues/22.html">22</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.res">temp.dep.res</a>]</td>
<td>TC1</td>
<td>Template parameter with a default argument that refers to itself</td>
<td class="full-superseded" align="center">Superseded by <a href="#481">481</a></td>
</tr>
<tr id="23">
<td><a href="https://cplusplus.github.io/CWG/issues/23.html">23</a></td>
+ <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>
<td>NAD</td>
<td>Some questions regarding partial ordering of function templates</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="24">
<td><a href="https://cplusplus.github.io/CWG/issues/24.html">24</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>TC1</td>
<td>Errors in examples in 14.7.3</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="25">
<td><a href="https://cplusplus.github.io/CWG/issues/25.html">25</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>TC1</td>
<td>Exception specifications and pointers to members</td>
<td class="full" align="center">Clang 4</td>
</tr>
<tr id="26">
<td><a href="https://cplusplus.github.io/CWG/issues/26.html">26</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>NAD</td>
<td>Copy constructors and default arguments</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="27">
<td><a href="https://cplusplus.github.io/CWG/issues/27.html">27</a></td>
+ <td>[<a href="https://wg21.link/over.built">over.built</a>]</td>
<td>NAD</td>
<td>Overload ambiguities for builtin ?: prototypes</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="28">
<td><a href="https://cplusplus.github.io/CWG/issues/28.html">28</a></td>
+ <td>[<a href="https://wg21.link/basic.start.dynamic">basic.start.dynamic</a>]</td>
<td>CD1</td>
<td>'exit', 'signal' and static object destruction</td>
<td class="na" align="center">N/A (Library DR)</td>
</tr>
<tr id="29">
<td><a href="https://cplusplus.github.io/CWG/issues/29.html">29</a></td>
+ <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>
<td>CD1</td>
<td>Linkage of locally declared functions</td>
<td class="full" align="center">Clang 3.4</td>
</tr>
<tr id="30">
<td><a href="https://cplusplus.github.io/CWG/issues/30.html">30</a></td>
+ <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>
<td>TC1</td>
<td>Valid uses of "<TT>::template</TT>"</td>
<td class="full-superseded" align="center">Superseded by <a href="#468">468</a> (C++11 onwards)</td>
</tr>
<tr id="31">
<td><a href="https://cplusplus.github.io/CWG/issues/31.html">31</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>NAD</td>
<td>Looking up new/delete</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="32">
<td><a href="https://cplusplus.github.io/CWG/issues/32.html">32</a></td>
+ <td>[<a href="https://wg21.link/temp">temp</a>]</td>
<td>TC1</td>
<td>Clarification of explicit instantiation of non-exported templates</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="33">
<td><a href="https://cplusplus.github.io/CWG/issues/33.html">33</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>TC1</td>
<td>Argument dependent lookup and overloaded functions</td>
<td class="full" align="center">Clang 9</td>
</tr>
<tr id="34">
<td><a href="https://cplusplus.github.io/CWG/issues/34.html">34</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>NAD</td>
<td>Argument dependent lookup and points of instantiation</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="35">
<td><a href="https://cplusplus.github.io/CWG/issues/35.html">35</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>TC1</td>
<td>Definition of default-initialization</td>
<td class="full" align="center">Duplicate of <a href="#178">178</a></td>
</tr>
<tr id="36">
<td><a href="https://cplusplus.github.io/CWG/issues/36.html">36</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>CD6</td>
<td><I>using-declaration</I>s in multiple-declaration contexts</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="37">
<td><a href="https://cplusplus.github.io/CWG/issues/37.html">37</a></td>
+ <td>[<a href="https://wg21.link/except.uncaught">except.uncaught</a>]</td>
<td>NAD</td>
<td>When is uncaught_exception() true?</td>
<td class="unknown-superseded" align="center">Superseded by <a href="#475">475</a></td>
</tr>
<tr id="38">
<td><a href="https://cplusplus.github.io/CWG/issues/38.html">38</a></td>
+ <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>
<td>TC1</td>
<td>Explicit template arguments and operator functions</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="39">
<td><a href="https://cplusplus.github.io/CWG/issues/39.html">39</a></td>
+ <td>[<a href="https://wg21.link/class.member.lookup">class.member.lookup</a>]</td>
<td>CD1</td>
<td>Conflicting ambiguity rules</td>
<td class="none" align="center">No</td>
</tr>
<tr id="40">
<td><a href="https://cplusplus.github.io/CWG/issues/40.html">40</a></td>
+ <td>[<a href="https://wg21.link/dcl.meaning">dcl.meaning</a>]</td>
<td>TC1</td>
<td>Syntax of <I>declarator-id</I></td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="41">
<td><a href="https://cplusplus.github.io/CWG/issues/41.html">41</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>
<td>TC1</td>
<td>Clarification of lookup of names after declarator-id</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="42">
<td><a href="https://cplusplus.github.io/CWG/issues/42.html">42</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.class">basic.scope.class</a>]</td>
<td>NAD</td>
<td>Redefining names from base classes</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="43">
<td><a href="https://cplusplus.github.io/CWG/issues/43.html">43</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>TC1</td>
<td>Copying base classes (PODs) using memcpy</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="44">
<td><a href="https://cplusplus.github.io/CWG/issues/44.html">44</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>CD1</td>
<td>Member specializations</td>
<td class="partial-superseded" align="center">Superseded by <a href="#727">727</a></td>
</tr>
<tr id="45">
<td><a href="https://cplusplus.github.io/CWG/issues/45.html">45</a></td>
+ <td>[<a href="https://wg21.link/class.access.nest">class.access.nest</a>]</td>
<td>CD1</td>
<td>Access to nested classes</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="46">
<td><a href="https://cplusplus.github.io/CWG/issues/46.html">46</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>NAD</td>
<td>Explicit instantiation of member templates</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="47">
<td><a href="https://cplusplus.github.io/CWG/issues/47.html">47</a></td>
+ <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>
<td>NAD</td>
<td>Template friend issues</td>
<td class="full-superseded" align="center">Superseded by <a href="#329">329</a></td>
</tr>
<tr id="48">
<td><a href="https://cplusplus.github.io/CWG/issues/48.html">48</a></td>
+ <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>
<td>TC1</td>
<td>Definitions of unused static members</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="49">
<td><a href="https://cplusplus.github.io/CWG/issues/49.html">49</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>TC1</td>
<td>Restriction on non-type, non-value template arguments</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="50">
<td><a href="https://cplusplus.github.io/CWG/issues/50.html">50</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>NAD</td>
<td>Converting pointer to incomplete type to same type</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="51">
<td><a href="https://cplusplus.github.io/CWG/issues/51.html">51</a></td>
+ <td>[<a href="https://wg21.link/over.match.best">over.match.best</a>]</td>
<td>TC1</td>
<td>Overloading and user-defined conversions</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="52">
<td><a href="https://cplusplus.github.io/CWG/issues/52.html">52</a></td>
+ <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>
<td>TC1</td>
<td>Non-static members, member selection and access checking</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="53">
<td><a href="https://cplusplus.github.io/CWG/issues/53.html">53</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>TC1</td>
<td>Lvalue-to-rvalue conversion before certain static_casts</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="54">
<td><a href="https://cplusplus.github.io/CWG/issues/54.html">54</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>CD1</td>
<td>Static_cast from private base to derived class</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="55">
<td><a href="https://cplusplus.github.io/CWG/issues/55.html">55</a></td>
+ <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>
<td>NAD</td>
<td>Adding/subtracting pointer and enumeration value</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="56">
<td><a href="https://cplusplus.github.io/CWG/issues/56.html">56</a></td>
+ <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>
<td>TC1</td>
<td>Redeclaring typedefs within classes</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr class="open" id="57">
<td><a href="https://cplusplus.github.io/CWG/issues/57.html">57</a></td>
+ <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>
<td>open</td>
<td>Empty unions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="58">
<td><a href="https://cplusplus.github.io/CWG/issues/58.html">58</a></td>
+ <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>
<td>CD1</td>
<td>Signedness of bit fields of enum type</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="59">
<td><a href="https://cplusplus.github.io/CWG/issues/59.html">59</a></td>
+ <td>[<a href="https://wg21.link/over.match.copy">over.match.copy</a>]</td>
<td>TC1</td>
<td>Clarification of overloading and UDC to reference type</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="60">
<td><a href="https://cplusplus.github.io/CWG/issues/60.html">60</a></td>
+ <td>[<a href="https://wg21.link/over.ics.ref">over.ics.ref</a>]</td>
<td>CD1</td>
<td>Reference binding and valid conversion sequences</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="61">
<td><a href="https://cplusplus.github.io/CWG/issues/61.html">61</a></td>
+ <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>
<td>NAD</td>
<td>Address of static member function "<TT>&amp;p-&gt;f</TT>"</td>
<td class="full" align="center">Clang 3.4</td>
</tr>
<tr id="62">
<td><a href="https://cplusplus.github.io/CWG/issues/62.html">62</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.type">temp.arg.type</a>]</td>
<td>CD1</td>
<td>Unnamed members of classes used as type parameters</td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="63">
<td><a href="https://cplusplus.github.io/CWG/issues/63.html">63</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>CD1</td>
<td>Class instantiation from pointer conversion to void*, null and self</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="64">
<td><a href="https://cplusplus.github.io/CWG/issues/64.html">64</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>TC1</td>
<td>Partial ordering to disambiguate explicit specialization</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="65">
<td><a href="https://cplusplus.github.io/CWG/issues/65.html">65</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>TC1</td>
<td>Typo in default argument example</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="66">
<td><a href="https://cplusplus.github.io/CWG/issues/66.html">66</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>NAD</td>
<td>Visibility of default args vs overloads added after using-declaration</td>
<td class="none" align="center">No</td>
</tr>
<tr id="67">
<td><a href="https://cplusplus.github.io/CWG/issues/67.html">67</a></td>
+ <td>[<a href="https://wg21.link/class.static">class.static</a>]</td>
<td>TC1</td>
<td>Evaluation of left side of object-expression</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="68">
<td><a href="https://cplusplus.github.io/CWG/issues/68.html">68</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.elab">dcl.type.elab</a>]</td>
<td>TC1</td>
<td>Grammar does not allow "friend class A&lt;int&gt;;"</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="69">
<td><a href="https://cplusplus.github.io/CWG/issues/69.html">69</a></td>
+ <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>
<td>TC1</td>
<td>Storage class specifiers on template declarations</td>
<td class="full" align="center">Clang 9</td>
</tr>
<tr id="70">
<td><a href="https://cplusplus.github.io/CWG/issues/70.html">70</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>CD1</td>
<td>Is an array bound a nondeduced context?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="71">
<td><a href="https://cplusplus.github.io/CWG/issues/71.html">71</a></td>
+ <td>[<a href="https://wg21.link/expr">expr</a>]</td>
<td>NAD</td>
<td>Incorrect cross reference</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="72">
<td><a href="https://cplusplus.github.io/CWG/issues/72.html">72</a></td>
+ <td>[<a href="https://wg21.link/temp">temp</a>]</td>
<td>dup</td>
<td>Linkage and storage class specifiers for templates</td>
<td class="full" align="center">Duplicate of <a href="#69">69</a></td>
</tr>
<tr id="73">
<td><a href="https://cplusplus.github.io/CWG/issues/73.html">73</a></td>
+ <td>[<a href="https://wg21.link/expr.eq">expr.eq</a>]</td>
<td>TC1</td>
<td>Pointer equality</td>
<td class="full-superseded" align="center">Superseded by <a href="#1652">1652</a></td>
</tr>
<tr id="74">
<td><a href="https://cplusplus.github.io/CWG/issues/74.html">74</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>TC1</td>
<td>Enumeration value in direct-new-declarator</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="75">
<td><a href="https://cplusplus.github.io/CWG/issues/75.html">75</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>TC1</td>
<td>In-class initialized members must be const</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="76">
<td><a href="https://cplusplus.github.io/CWG/issues/76.html">76</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.cv">dcl.type.cv</a>]</td>
<td>TC1</td>
<td>Are const volatile variables considered "constant expressions"?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="77">
<td><a href="https://cplusplus.github.io/CWG/issues/77.html">77</a></td>
+ <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>
<td>CD1</td>
<td>The definition of friend does not allow nested classes to be friends</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="78">
<td><a href="https://cplusplus.github.io/CWG/issues/78.html">78</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>CD1</td>
<td>Section 8.5 paragraph 9 should state it only applies to non-static objects</td>
<td class="none" align="center">Superseded by <a href="#????">????</a></td>
</tr>
<tr id="79">
<td><a href="https://cplusplus.github.io/CWG/issues/79.html">79</a></td>
+ <td>[<a href="https://wg21.link/new.delete.placement">new.delete.placement</a>]</td>
<td>dup</td>
<td>Alignment and placement new</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="80">
<td><a href="https://cplusplus.github.io/CWG/issues/80.html">80</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>TC1</td>
<td>Class members with same name as class</td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="81">
<td><a href="https://cplusplus.github.io/CWG/issues/81.html">81</a></td>
+ <td>[<a href="https://wg21.link/diff">diff</a>]</td>
<td>NAD</td>
<td>Null pointers and C compatibility</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="82">
<td><a href="https://cplusplus.github.io/CWG/issues/82.html">82</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>dup</td>
<td>Definition of "using" a constant expression</td>
<td class="full" align="center">Duplicate of <a href="#48">48</a></td>
</tr>
<tr id="83">
<td><a href="https://cplusplus.github.io/CWG/issues/83.html">83</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>TC1</td>
<td>Overloading and deprecated conversion of string literal</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="84">
<td><a href="https://cplusplus.github.io/CWG/issues/84.html">84</a></td>
+ <td>[<a href="https://wg21.link/over.best.ics">over.best.ics</a>]</td>
<td>TC1</td>
<td>Overloading and conversion loophole used by <TT>auto_ptr</TT></td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="85">
<td><a href="https://cplusplus.github.io/CWG/issues/85.html">85</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.elab">basic.lookup.elab</a>]</td>
<td>TC1</td>
<td>Redeclaration of member class</td>
<td class="full" align="center">Clang 3.4</td>
</tr>
<tr id="86">
<td><a href="https://cplusplus.github.io/CWG/issues/86.html">86</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>CD1</td>
<td>Lifetime of temporaries in query expressions</td>
<td class="full" align="center">Duplicate of <a href="#446">446</a></td>
</tr>
<tr id="87">
<td><a href="https://cplusplus.github.io/CWG/issues/87.html">87</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>CD1</td>
<td>Exception specifications on function parameters</td>
<td class="none" align="center">No</td>
</tr>
<tr id="88">
<td><a href="https://cplusplus.github.io/CWG/issues/88.html">88</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>NAD</td>
<td>Specialization of member constant templates</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="89">
<td><a href="https://cplusplus.github.io/CWG/issues/89.html">89</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>TC1</td>
<td>Object lifetime does not account for reference rebinding</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="90">
<td><a href="https://cplusplus.github.io/CWG/issues/90.html">90</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>TC1</td>
<td>Should the enclosing class be an "associated class" too?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="91">
<td><a href="https://cplusplus.github.io/CWG/issues/91.html">91</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>NAD</td>
<td>A union's associated types should include the union itself</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="92">
<td><a href="https://cplusplus.github.io/CWG/issues/92.html">92</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>CD4</td>
<td>Should <I>exception-specification</I>s be part of the type system?</td>
<td class="full" align="center">Clang 4 (C++17 onwards)</td>
</tr>
<tr id="93">
<td><a href="https://cplusplus.github.io/CWG/issues/93.html">93</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>TC1</td>
<td>Missing word in 3.8 <U>basic.life</U> paragraph 2</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="94">
<td><a href="https://cplusplus.github.io/CWG/issues/94.html">94</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>TC1</td>
<td>Inconsistencies in the descriptions of constant expressions</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="95">
<td><a href="https://cplusplus.github.io/CWG/issues/95.html">95</a></td>
+ <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>
<td>NAD</td>
<td>Elaborated type specifiers referencing names declared in friend decls</td>
<td class="full" align="center">Clang 3.3</td>
</tr>
<tr id="96">
<td><a href="https://cplusplus.github.io/CWG/issues/96.html">96</a></td>
+ <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>
<td>C++11</td>
<td>Syntactic disambiguation using the <TT>template</TT> keyword</td>
<td class="na" align="center">Superseded by <a href="https://wg21.link/P1787">P1787</a></td>
</tr>
<tr id="97">
<td><a href="https://cplusplus.github.io/CWG/issues/97.html">97</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>NAD</td>
<td>Use of bool constants in integral constant expressions</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="98">
<td><a href="https://cplusplus.github.io/CWG/issues/98.html">98</a></td>
+ <td>[<a href="https://wg21.link/except">except</a>]</td>
<td>TC1</td>
<td>Branching into try block</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="99">
<td><a href="https://cplusplus.github.io/CWG/issues/99.html">99</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>NAD</td>
<td>Partial ordering, references and cv-qualifiers</td>
<td class="full-superseded" align="center">Superseded by <a href="#214">214</a></td>
</tr>
<tr id="100">
<td><a href="https://cplusplus.github.io/CWG/issues/100.html">100</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>
<td>TC1</td>
<td>Clarify why string literals are not allowed as template arguments</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="101">
<td><a href="https://cplusplus.github.io/CWG/issues/101.html">101</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>TC1</td>
<td>Redeclaration of extern "C" names via using-declarations</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="102">
<td><a href="https://cplusplus.github.io/CWG/issues/102.html">102</a></td>
+ <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>
<td>NAD</td>
<td>Operator lookup rules do not work well with parts of the library</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="103">
<td><a href="https://cplusplus.github.io/CWG/issues/103.html">103</a></td>
+ <td>[<a href="https://wg21.link/namespace.udir">namespace.udir</a>]</td>
<td>TC1</td>
<td>Is it <I>extended-namespace-definition</I> or <I>extension-namespace-definition</I> ?</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="104">
<td><a href="https://cplusplus.github.io/CWG/issues/104.html">104</a></td>
+ <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>
<td>NAD</td>
<td>Destroying the exception temp when no handler is found</td>
<td class="na" align="center">N/A (Library DR)</td>
</tr>
<tr id="105">
<td><a href="https://cplusplus.github.io/CWG/issues/105.html">105</a></td>
+ <td>[<a href="https://wg21.link/temp">temp</a>]</td>
<td>TC1</td>
<td>Meaning of "template function"</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="106">
<td><a href="https://cplusplus.github.io/CWG/issues/106.html">106</a></td>
+ <td>[<a href="https://wg21.link/unknown">unknown</a>]</td>
<td>CD1</td>
<td>Creating references to references during template deduction/instantiation</td>
<td class="full-superseded" align="center">Superseded by <a href="#540">540</a></td>
</tr>
<tr id="107">
<td><a href="https://cplusplus.github.io/CWG/issues/107.html">107</a></td>
+ <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>
<td>NAD</td>
<td>Linkage of operator functions</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="108">
<td><a href="https://cplusplus.github.io/CWG/issues/108.html">108</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>TC1</td>
<td>Are classes nested in templates dependent?</td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="109">
<td><a href="https://cplusplus.github.io/CWG/issues/109.html">109</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>NAD</td>
<td>Allowing <TT>::template</TT> in <I>using-declaration</I>s</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="110">
<td><a href="https://cplusplus.github.io/CWG/issues/110.html">110</a></td>
+ <td>[<a href="https://wg21.link/temp">temp</a>]</td>
<td>CD6</td>
<td>Can template functions and classes be declared in the same scope?</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="111">
<td><a href="https://cplusplus.github.io/CWG/issues/111.html">111</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>NAD</td>
<td>Copy constructors and cv-qualifiers</td>
<td class="full" align="center">Duplicate of <a href="#535">535</a></td>
</tr>
<tr id="112">
<td><a href="https://cplusplus.github.io/CWG/issues/112.html">112</a></td>
+ <td>[<a href="https://wg21.link/dcl.array">dcl.array</a>]</td>
<td>CD1</td>
<td>Array types and cv-qualifiers</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="113">
<td><a href="https://cplusplus.github.io/CWG/issues/113.html">113</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>CD1</td>
<td>Visibility of called function</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="114">
<td><a href="https://cplusplus.github.io/CWG/issues/114.html">114</a></td>
+ <td>[<a href="https://wg21.link/temp.mem">temp.mem</a>]</td>
<td>NAD</td>
<td>Virtual overriding by template member function specializations</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="115">
<td><a href="https://cplusplus.github.io/CWG/issues/115.html">115</a></td>
+ <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>
<td>CD1</td>
<td>Address of template-id</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="116">
<td><a href="https://cplusplus.github.io/CWG/issues/116.html">116</a></td>
+ <td>[<a href="https://wg21.link/temp.over.link">temp.over.link</a>]</td>
<td>TC1</td>
<td>Equivalent and functionally-equivalent function templates</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="117">
<td><a href="https://cplusplus.github.io/CWG/issues/117.html">117</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>NAD</td>
<td>Timing of destruction of temporaries</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="118">
<td><a href="https://cplusplus.github.io/CWG/issues/118.html">118</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>CD1</td>
<td>Calls via pointers to virtual member functions</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="119">
<td><a href="https://cplusplus.github.io/CWG/issues/119.html">119</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>CD1</td>
<td>Object lifetime and aggregate initialization</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="120">
<td><a href="https://cplusplus.github.io/CWG/issues/120.html">120</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>TC1</td>
<td>Nonexistent non-terminal <I>qualified-name</I></td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="121">
<td><a href="https://cplusplus.github.io/CWG/issues/121.html">121</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>TC1</td>
<td>Dependent type names with non-dependent <I>nested-name-specifier</I>s</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="122">
<td><a href="https://cplusplus.github.io/CWG/issues/122.html">122</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>
<td>CD1</td>
<td><I>template-id</I>s as <I>unqualified-id</I>s</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="123">
<td><a href="https://cplusplus.github.io/CWG/issues/123.html">123</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>
<td>TC1</td>
<td>Bad cross-reference</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="124">
<td><a href="https://cplusplus.github.io/CWG/issues/124.html">124</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>CD1</td>
<td>Lifetime of temporaries in default initialization of class arrays</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="125">
<td><a href="https://cplusplus.github.io/CWG/issues/125.html">125</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>
<td>CD1</td>
<td>Ambiguity in <TT>friend</TT> declaration syntax</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="126">
<td><a href="https://cplusplus.github.io/CWG/issues/126.html">126</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>TC1</td>
<td>Exception specifications and <TT>const</TT></td>
<td class="partial" align="center">Partial</td>
</tr>
<tr id="127">
<td><a href="https://cplusplus.github.io/CWG/issues/127.html">127</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>TC1</td>
<td>Ambiguity in description of matching deallocation function</td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="128">
<td><a href="https://cplusplus.github.io/CWG/issues/128.html">128</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>TC1</td>
<td>Casting between enum types</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="129">
<td><a href="https://cplusplus.github.io/CWG/issues/129.html">129</a></td>
+ <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>
<td>CD3</td>
<td>Stability of uninitialized auto variables</td>
<td class="full" align="center">Duplicate of <a href="#616">616</a></td>
</tr>
<tr id="130">
<td><a href="https://cplusplus.github.io/CWG/issues/130.html">130</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>NAD</td>
<td>Sequence points and <I>new-expression</I>s</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="131">
<td><a href="https://cplusplus.github.io/CWG/issues/131.html">131</a></td>
+ <td>[<a href="https://wg21.link/extendid">extendid</a>]</td>
<td>TC1</td>
<td>Typo in Lao characters</td>
<td class="na" align="center">Superseded by <a href="https://wg21.link/P1949">P1949</a></td>
</tr>
<tr id="132">
<td><a href="https://cplusplus.github.io/CWG/issues/132.html">132</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>NAD</td>
<td>Local types and linkage</td>
<td class="none" align="center">No</td>
</tr>
<tr id="133">
<td><a href="https://cplusplus.github.io/CWG/issues/133.html">133</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>dup</td>
<td>Exception specifications and checking</td>
<td class="none" align="center">Duplicate of <a href="#87">87</a></td>
</tr>
<tr id="134">
<td><a href="https://cplusplus.github.io/CWG/issues/134.html">134</a></td>
+ <td>[<a href="https://wg21.link/temp">temp</a>]</td>
<td>TC1</td>
<td>Template classes and <I>declarator-id</I>s</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="135">
<td><a href="https://cplusplus.github.io/CWG/issues/135.html">135</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>TC1</td>
<td>Class type in in-class member function definitions</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="136">
<td><a href="https://cplusplus.github.io/CWG/issues/136.html">136</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>CD1</td>
<td>Default arguments and friend declarations</td>
<td class="full" align="center">Clang 3.4</td>
</tr>
<tr id="137">
<td><a href="https://cplusplus.github.io/CWG/issues/137.html">137</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>TC1</td>
<td><TT>static_cast</TT> of <I>cv</I> <TT>void*</TT></td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="138">
<td><a href="https://cplusplus.github.io/CWG/issues/138.html">138</a></td>
+ <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>
<td>CD6</td>
<td>Friend declaration name lookup</td>
<td class="partial" align="center">Partial</td>
</tr>
<tr id="139">
<td><a href="https://cplusplus.github.io/CWG/issues/139.html">139</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>
<td>CD1</td>
<td>Error in <TT>friend</TT> lookup example</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="140">
<td><a href="https://cplusplus.github.io/CWG/issues/140.html">140</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>CD1</td>
<td>Agreement of parameter declarations</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="141">
<td><a href="https://cplusplus.github.io/CWG/issues/141.html">141</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>
<td>CD1</td>
<td>Non-member function templates in member access expressions</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="142">
<td><a href="https://cplusplus.github.io/CWG/issues/142.html">142</a></td>
+ <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>
<td>TC1</td>
<td>Injection-related errors in access example</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="143">
<td><a href="https://cplusplus.github.io/CWG/issues/143.html">143</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>CD1</td>
<td>Friends and Koenig lookup</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr class="open" id="144">
<td><a href="https://cplusplus.github.io/CWG/issues/144.html">144</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.elab">dcl.type.elab</a>]</td>
<td>open</td>
<td>Position of <TT>friend</TT> specifier</td>
<td align="center">Not resolved</td>
</tr>
<tr id="145">
<td><a href="https://cplusplus.github.io/CWG/issues/145.html">145</a></td>
+ <td>[<a href="https://wg21.link/depr.impldec">depr.impldec</a>]</td>
<td>TC1</td>
<td>Deprecation of prefix <TT>++</TT></td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr class="open" id="146">
<td><a href="https://cplusplus.github.io/CWG/issues/146.html">146</a></td>
+ <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>
<td>open</td>
<td>Floating-point zero</td>
<td align="center">Not resolved</td>
</tr>
<tr id="147">
<td><a href="https://cplusplus.github.io/CWG/issues/147.html">147</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>
<td>TC1</td>
<td>Naming the constructor</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="148">
<td><a href="https://cplusplus.github.io/CWG/issues/148.html">148</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>TC1</td>
<td>POD classes and pointers to members</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="149">
<td><a href="https://cplusplus.github.io/CWG/issues/149.html">149</a></td>
+ <td>[<a href="https://wg21.link/conv.ptr">conv.ptr</a>]</td>
<td>TC1</td>
<td>Accessibility and ambiguity</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="150">
<td><a href="https://cplusplus.github.io/CWG/issues/150.html">150</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.template">temp.arg.template</a>]</td>
<td>C++17</td>
<td>Template template parameters and default arguments</td>
<td class="full" align="center">Clang 19</td>
</tr>
<tr id="151">
<td><a href="https://cplusplus.github.io/CWG/issues/151.html">151</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>TC1</td>
<td>Terminology of zero-initialization</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="152">
<td><a href="https://cplusplus.github.io/CWG/issues/152.html">152</a></td>
+ <td>[<a href="https://wg21.link/class.conv.ctor">class.conv.ctor</a>]</td>
<td>TC1</td>
<td><TT>explicit</TT> copy constructors</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="153">
<td><a href="https://cplusplus.github.io/CWG/issues/153.html">153</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>TC1</td>
<td>Misleading wording (rank of conversion)</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="154">
<td><a href="https://cplusplus.github.io/CWG/issues/154.html">154</a></td>
+ <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>
<td>NAD</td>
<td>Anonymous unions in unnamed namespaces</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="155">
<td><a href="https://cplusplus.github.io/CWG/issues/155.html">155</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>dup</td>
<td>Brace initializer for scalar</td>
<td class="full" align="center">Duplicate of <a href="#632">632</a></td>
</tr>
<tr id="156">
<td><a href="https://cplusplus.github.io/CWG/issues/156.html">156</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>
<td>NAD</td>
<td>Name lookup for conversion functions</td>
<td class="partial-superseded" align="center">Superseded by <a href="#1111">1111</a></td>
</tr>
<tr class="open" id="157">
<td><a href="https://cplusplus.github.io/CWG/issues/157.html">157</a></td>
+ <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>
<td>open</td>
<td>Omitted typedef declarator</td>
<td align="center">Not resolved</td>
</tr>
<tr id="158">
<td><a href="https://cplusplus.github.io/CWG/issues/158.html">158</a></td>
+ <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>
<td>CD1</td>
<td>Aliasing and qualification conversions</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="159">
<td><a href="https://cplusplus.github.io/CWG/issues/159.html">159</a></td>
+ <td>[<a href="https://wg21.link/dcl.meaning">dcl.meaning</a>]</td>
<td>TC1</td>
<td>Namespace qualification in declarators</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="160">
<td><a href="https://cplusplus.github.io/CWG/issues/160.html">160</a></td>
+ <td>[<a href="https://wg21.link/dcl.ambig.res">dcl.ambig.res</a>]</td>
<td>CD1</td>
<td>Missing <TT>std::</TT> qualification</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="161">
<td><a href="https://cplusplus.github.io/CWG/issues/161.html">161</a></td>
+ <td>[<a href="https://wg21.link/class.protected">class.protected</a>]</td>
<td>TC1</td>
<td>Access to protected nested type</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="162">
<td><a href="https://cplusplus.github.io/CWG/issues/162.html">162</a></td>
+ <td>[<a href="https://wg21.link/over.match.call">over.match.call</a>]</td>
<td>CD1</td>
<td>(<TT>&amp;C::f)()</TT> with nonstatic members</td>
<td class="full" align="center">Clang 19</td>
</tr>
<tr id="163">
<td><a href="https://cplusplus.github.io/CWG/issues/163.html">163</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>TC1</td>
<td>Description of subaggregate initializer</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="164">
<td><a href="https://cplusplus.github.io/CWG/issues/164.html">164</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>TC1</td>
<td>Overlap between Koenig and normal lookup</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="165">
<td><a href="https://cplusplus.github.io/CWG/issues/165.html">165</a></td>
+ <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>
<td>NAD</td>
<td>Definitions of friends and block-scope externs</td>
<td class="none" align="center">No</td>
</tr>
<tr id="166">
<td><a href="https://cplusplus.github.io/CWG/issues/166.html">166</a></td>
+ <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>
<td>TC1</td>
<td>Friend declarations of <I>template-id</I>s</td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="167">
<td><a href="https://cplusplus.github.io/CWG/issues/167.html">167</a></td>
+ <td>[<a href="https://wg21.link/depr.static">depr.static</a>]</td>
<td>NAD</td>
<td>Deprecating static functions</td>
<td class="unknown-superseded" align="center">Superseded by <a href="#1012">1012</a></td>
</tr>
<tr id="168">
<td><a href="https://cplusplus.github.io/CWG/issues/168.html">168</a></td>
+ <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>
<td>NAD</td>
<td>C linkage for static member functions</td>
<td class="none" align="center">No</td>
</tr>
<tr id="169">
<td><a href="https://cplusplus.github.io/CWG/issues/169.html">169</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>NAD</td>
<td><I>template-id</I>s in <I>using-declaration</I>s</td>
<td class="full" align="center">Clang 3.4</td>
</tr>
<tr id="170">
<td><a href="https://cplusplus.github.io/CWG/issues/170.html">170</a></td>
+ <td>[<a href="https://wg21.link/conv.mem">conv.mem</a>]</td>
<td>CD7</td>
<td>Pointer-to-member conversions</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="171">
<td><a href="https://cplusplus.github.io/CWG/issues/171.html">171</a></td>
+ <td>[<a href="https://wg21.link/basic.namespace">basic.namespace</a>]</td>
<td>TC1</td>
<td>Global namespace scope</td>
<td class="full" align="center">Clang 3.4</td>
</tr>
<tr id="172">
<td><a href="https://cplusplus.github.io/CWG/issues/172.html">172</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>CD1</td>
<td>Unsigned int as underlying type of enum</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="173">
<td><a href="https://cplusplus.github.io/CWG/issues/173.html">173</a></td>
+ <td>[<a href="https://wg21.link/lex.charset">lex.charset</a>]</td>
<td>TC1</td>
<td>Constraints on execution character set</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="174">
<td><a href="https://cplusplus.github.io/CWG/issues/174.html">174</a></td>
+ <td>[<a href="https://wg21.link/depr.static">depr.static</a>]</td>
<td>NAD</td>
<td>Undeprecating global static</td>
<td class="unknown-superseded" align="center">Superseded by <a href="#1012">1012</a></td>
</tr>
<tr id="175">
<td><a href="https://cplusplus.github.io/CWG/issues/175.html">175</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>CD1</td>
<td>Class name injection and base name access</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="176">
<td><a href="https://cplusplus.github.io/CWG/issues/176.html">176</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>TC1</td>
<td>Name injection and templates</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="177">
<td><a href="https://cplusplus.github.io/CWG/issues/177.html">177</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>CD1</td>
<td>Lvalues vs rvalues in copy-initialization</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="178">
<td><a href="https://cplusplus.github.io/CWG/issues/178.html">178</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>TC1</td>
<td>More on value-initialization</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="179">
<td><a href="https://cplusplus.github.io/CWG/issues/179.html">179</a></td>
+ <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>
<td>TC1</td>
<td>Function pointers and subtraction</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="180">
<td><a href="https://cplusplus.github.io/CWG/issues/180.html">180</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>CD1</td>
<td><TT>typename</TT> and elaborated types</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="181">
<td><a href="https://cplusplus.github.io/CWG/issues/181.html">181</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>TC1</td>
<td>Errors in template <I>template-parameter</I> example</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="182">
<td><a href="https://cplusplus.github.io/CWG/issues/182.html">182</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>NAD</td>
<td>Access checking on explicit specializations</td>
<td class="full" align="center">Clang 14</td>
</tr>
<tr id="183">
<td><a href="https://cplusplus.github.io/CWG/issues/183.html">183</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>TC1</td>
<td><TT>typename</TT> in explicit specializations</td>
<td class="full-superseded" align="center">Superseded by <a href="#382">382</a></td>
</tr>
<tr id="184">
<td><a href="https://cplusplus.github.io/CWG/issues/184.html">184</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>CD1</td>
<td>Default arguments in template <I>template-parameter</I>s</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="185">
<td><a href="https://cplusplus.github.io/CWG/issues/185.html">185</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>TC1</td>
<td>"Named" temporaries and copy elision</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr class="open" id="186">
<td><a href="https://cplusplus.github.io/CWG/issues/186.html">186</a></td>
+ <td>[<a href="https://wg21.link/temp.local">temp.local</a>]</td>
<td>open</td>
<td>Name hiding and template <I>template-parameter</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr id="187">
<td><a href="https://cplusplus.github.io/CWG/issues/187.html">187</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>TC1</td>
<td>Scope of template parameter names</td>
<td class="full-superseded" align="center">Superseded by <a href="#481">481</a></td>
</tr>
<tr id="188">
<td><a href="https://cplusplus.github.io/CWG/issues/188.html">188</a></td>
+ <td>[<a href="https://wg21.link/expr.comma">expr.comma</a>]</td>
<td>TC1</td>
<td>Comma operator and rvalue conversion</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr class="open" id="189">
<td><a href="https://cplusplus.github.io/CWG/issues/189.html">189</a></td>
+ <td>[<a href="https://wg21.link/lex.operators">lex.operators</a>]</td>
<td>open</td>
<td>Definition of <I>operator</I> and <I>punctuator</I></td>
<td align="center">Not resolved</td>
</tr>
<tr id="190">
<td><a href="https://cplusplus.github.io/CWG/issues/190.html">190</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>TC1</td>
<td>Layout-compatible POD-struct types</td>
<td class="full" align="center">Clang 19</td>
</tr>
<tr id="191">
<td><a href="https://cplusplus.github.io/CWG/issues/191.html">191</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>
<td>CD6</td>
<td>Name lookup does not handle complex nesting</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="192">
<td><a href="https://cplusplus.github.io/CWG/issues/192.html">192</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>
<td>NAD</td>
<td>Name lookup in parameters</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="193">
<td><a href="https://cplusplus.github.io/CWG/issues/193.html">193</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>TC1</td>
<td>Order of destruction of local automatics of destructor</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="194">
<td><a href="https://cplusplus.github.io/CWG/issues/194.html">194</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>TC1</td>
<td>Identifying constructors</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="195">
<td><a href="https://cplusplus.github.io/CWG/issues/195.html">195</a></td>
+ <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>
<td>CD1</td>
<td>Converting between function and object pointers</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr class="open" id="196">
<td><a href="https://cplusplus.github.io/CWG/issues/196.html">196</a></td>
+ <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>
<td>open</td>
<td>Arguments to deallocation functions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="197">
<td><a href="https://cplusplus.github.io/CWG/issues/197.html">197</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.candidate">temp.dep.candidate</a>]</td>
<td>CD1</td>
<td>Issues with two-stage lookup of dependent names</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="198">
<td><a href="https://cplusplus.github.io/CWG/issues/198.html">198</a></td>
+ <td>[<a href="https://wg21.link/class.local">class.local</a>]</td>
<td>CD1</td>
<td>Definition of "use" in local and nested classes</td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="199">
<td><a href="https://cplusplus.github.io/CWG/issues/199.html">199</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>CD1</td>
<td>Order of destruction of temporaries</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="200">
<td><a href="https://cplusplus.github.io/CWG/issues/200.html">200</a></td>
+ <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>
<td>dup</td>
<td>Partial ordering and explicit arguments</td>
<td class="full" align="center">Duplicate of <a href="#214">214</a></td>
</tr>
<tr id="201">
<td><a href="https://cplusplus.github.io/CWG/issues/201.html">201</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>CD1</td>
<td>Order of destruction of temporaries in initializers</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="202">
<td><a href="https://cplusplus.github.io/CWG/issues/202.html">202</a></td>
+ <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>
<td>TC1</td>
<td>Use of overloaded function name</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="203">
<td><a href="https://cplusplus.github.io/CWG/issues/203.html">203</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>
<td>NAD</td>
<td>Type of address-of-member expression</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="204">
<td><a href="https://cplusplus.github.io/CWG/issues/204.html">204</a></td>
+ <td>[<a href="https://wg21.link/temp">temp</a>]</td>
<td>CD1</td>
<td>Exported class templates</td>
<td class="full-superseded" align="center">Superseded by <a href="#820">820</a></td>
</tr>
<tr class="open" id="205">
<td><a href="https://cplusplus.github.io/CWG/issues/205.html">205</a></td>
+ <td>[<a href="https://wg21.link/temp">temp</a>]</td>
<td>drafting</td>
<td>Templates and static data members</td>
<td align="center">Not resolved</td>
</tr>
<tr id="206">
<td><a href="https://cplusplus.github.io/CWG/issues/206.html">206</a></td>
+ <td>[<a href="https://wg21.link/temp.nondep">temp.nondep</a>]</td>
<td>TC1</td>
<td>Semantic constraints on non-dependent names</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="207">
<td><a href="https://cplusplus.github.io/CWG/issues/207.html">207</a></td>
+ <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>
<td>CD1</td>
<td><I>using-declaration</I>s and protected access</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="208">
<td><a href="https://cplusplus.github.io/CWG/issues/208.html">208</a></td>
+ <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>
<td>CD1</td>
<td>Rethrowing exceptions in nested handlers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="209">
<td><a href="https://cplusplus.github.io/CWG/issues/209.html">209</a></td>
+ <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>
<td>NAD</td>
- <td>Must friend declaration names be
-accessible?</td>
+ <td>Must friend declaration names be accessible?</td>
<td class="full" align="center">Clang 3.2</td>
</tr>
<tr id="210">
<td><a href="https://cplusplus.github.io/CWG/issues/210.html">210</a></td>
+ <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>
<td>TC1</td>
<td>What is the type matched by an exception handler?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="211">
<td><a href="https://cplusplus.github.io/CWG/issues/211.html">211</a></td>
+ <td>[<a href="https://wg21.link/except">except</a>]</td>
<td>NAD</td>
<td>Constructors should not be allowed to return normally after an exception</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="212">
<td><a href="https://cplusplus.github.io/CWG/issues/212.html">212</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>CD4</td>
<td>Implicit instantiation is not described clearly enough</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="213">
<td><a href="https://cplusplus.github.io/CWG/issues/213.html">213</a></td>
+ <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>
<td>TC1</td>
<td>Lookup in dependent base classes</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="214">
<td><a href="https://cplusplus.github.io/CWG/issues/214.html">214</a></td>
+ <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>
<td>CD1</td>
<td>Partial ordering of function templates is underspecified</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="215">
<td><a href="https://cplusplus.github.io/CWG/issues/215.html">215</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>CD1</td>
<td>Template parameters are not allowed in <I>nested-name-specifier</I>s</td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="216">
<td><a href="https://cplusplus.github.io/CWG/issues/216.html">216</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>CD1</td>
<td>Linkage of nameless class-scope enumeration types</td>
<td class="none" align="center">No</td>
</tr>
<tr id="217">
<td><a href="https://cplusplus.github.io/CWG/issues/217.html">217</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>TC1</td>
<td>Default arguments for non-template member functions of class templates</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="218">
<td><a href="https://cplusplus.github.io/CWG/issues/218.html">218</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>CD1</td>
<td>Specification of Koenig lookup</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="219">
<td><a href="https://cplusplus.github.io/CWG/issues/219.html">219</a></td>
+ <td>[<a href="https://wg21.link/except.terminate">except.terminate</a>]</td>
<td>NAD</td>
<td>Cannot defend against destructors that throw exceptions</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="220">
<td><a href="https://cplusplus.github.io/CWG/issues/220.html">220</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic.deallocation">basic.stc.dynamic.deallocation</a>]</td>
<td>CD1</td>
<td>All deallocation functions should be required not to throw</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="221">
<td><a href="https://cplusplus.github.io/CWG/issues/221.html">221</a></td>
+ <td>[<a href="https://wg21.link/over.assign">over.assign</a>]</td>
<td>CD1</td>
<td>Must compound assignment operators be member functions?</td>
<td class="full" align="center">Clang 3.6</td>
</tr>
<tr id="222">
<td><a href="https://cplusplus.github.io/CWG/issues/222.html">222</a></td>
+ <td>[<a href="https://wg21.link/expr">expr</a>]</td>
<td>CD1</td>
<td>Sequence points and lvalue-returning operators</td>
<td class="full" align="center">Duplicate of <a href="#637">637</a></td>
</tr>
<tr id="223">
<td><a href="https://cplusplus.github.io/CWG/issues/223.html">223</a></td>
+ <td>[<a href="https://wg21.link/depr">depr</a>]</td>
<td>CD3</td>
<td>The meaning of deprecation</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="224">
<td><a href="https://cplusplus.github.io/CWG/issues/224.html">224</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>CD1</td>
<td>Definition of dependent names</td>
<td class="full" align="center">Clang 16</td>
</tr>
<tr id="225">
<td><a href="https://cplusplus.github.io/CWG/issues/225.html">225</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>NAD</td>
<td>Koenig lookup and fundamental types</td>
<td class="full" align="center">Yes</td>
</tr>
<tr id="226">
<td><a href="https://cplusplus.github.io/CWG/issues/226.html">226</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>CD1</td>
<td>Default template arguments for function templates</td>
<td class="none" align="center">No</td>
</tr>
<tr id="227">
<td><a href="https://cplusplus.github.io/CWG/issues/227.html">227</a></td>
+ <td>[<a href="https://wg21.link/stmt.select">stmt.select</a>]</td>
<td>TC1</td>
<td>How many scopes in an <TT>if</TT> statement?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="228">
<td><a href="https://cplusplus.github.io/CWG/issues/228.html">228</a></td>
+ <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>
<td>CD1</td>
<td>Use of <TT>template</TT> keyword with non-member templates</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="229">
<td><a href="https://cplusplus.github.io/CWG/issues/229.html">229</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>
<td>NAD</td>
<td>Partial specialization of function templates</td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="230">
<td><a href="https://cplusplus.github.io/CWG/issues/230.html">230</a></td>
+ <td>[<a href="https://wg21.link/class.abstract">class.abstract</a>]</td>
<td>NAD</td>
<td>Calls to pure virtual functions</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="231">
<td><a href="https://cplusplus.github.io/CWG/issues/231.html">231</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>
<td>NAD</td>
<td>Visibility of names after <I>using-directive</I>s</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="232">
<td><a href="https://cplusplus.github.io/CWG/issues/232.html">232</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>
<td>NAD</td>
<td>Is indirection through a null pointer undefined behavior?</td>
<td class="none" align="center">Duplicate of <a href="#2823">2823</a></td>
</tr>
<tr id="233">
<td><a href="https://cplusplus.github.io/CWG/issues/233.html">233</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>CD7</td>
<td>References vs pointers in UDC overload resolution</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="234">
<td><a href="https://cplusplus.github.io/CWG/issues/234.html">234</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>NAD</td>
<td>Reuse of base class subobjects</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="235">
<td><a href="https://cplusplus.github.io/CWG/issues/235.html">235</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>TC1</td>
<td>Assignment vs initialization</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="236">
<td><a href="https://cplusplus.github.io/CWG/issues/236.html">236</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>NAD</td>
<td>Explicit temporaries and integral constant expressions</td>
<td class="full" align="center">Clang 3.2</td>
</tr>
<tr id="237">
<td><a href="https://cplusplus.github.io/CWG/issues/237.html">237</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>CD1</td>
<td>Explicit instantiation and base class members</td>
<td class="full" align="center">Duplicate of <a href="#470">470</a></td>
</tr>
<tr id="238">
<td><a href="https://cplusplus.github.io/CWG/issues/238.html">238</a></td>
+ <td>[<a href="https://wg21.link/expr">expr</a>]</td>
<td>CD4</td>
<td>Precision and accuracy constraints on floating point</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="239">
<td><a href="https://cplusplus.github.io/CWG/issues/239.html">239</a></td>
+ <td>[<a href="https://wg21.link/over.call.func">over.call.func</a>]</td>
<td>CD1</td>
<td>Footnote 116 and Koenig lookup</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="240">
<td><a href="https://cplusplus.github.io/CWG/issues/240.html">240</a></td>
+ <td>[<a href="https://wg21.link/conv.lval">conv.lval</a>]</td>
<td>CD3</td>
<td>Uninitialized values and undefined behavior</td>
<td class="full" align="center">Duplicate of <a href="#616">616</a></td>
</tr>
<tr id="241">
<td><a href="https://cplusplus.github.io/CWG/issues/241.html">241</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.explicit">temp.arg.explicit</a>]</td>
<td>TC1</td>
<td>Error in example in 14.8.1</td>
<td class="full" align="center">Clang 9</td>
</tr>
<tr id="242">
<td><a href="https://cplusplus.github.io/CWG/issues/242.html">242</a></td>
+ <td>[<a href="https://wg21.link/expr.cast">expr.cast</a>]</td>
<td>CD4</td>
<td>Interpretation of old-style casts</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="243">
<td><a href="https://cplusplus.github.io/CWG/issues/243.html">243</a></td>
+ <td>[<a href="https://wg21.link/over.ics.user">over.ics.user</a>]</td>
<td>NAD</td>
<td>Weighting of conversion functions in direct-initialization</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="244">
<td><a href="https://cplusplus.github.io/CWG/issues/244.html">244</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>CD1</td>
<td>Destructor lookup</td>
<td class="full" align="center">Clang 11</td>
</tr>
<tr id="245">
<td><a href="https://cplusplus.github.io/CWG/issues/245.html">245</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.elab">basic.lookup.elab</a>]</td>
<td>CD1</td>
<td>Name lookup in <I>elaborated-type-specifier</I>s</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="246">
<td><a href="https://cplusplus.github.io/CWG/issues/246.html">246</a></td>
+ <td>[<a href="https://wg21.link/temp.arg">temp.arg</a>]</td>
<td>CD1</td>
<td>Jumps in <I>function-try-block</I> handlers</td>
<td class="full" align="center">Clang 3.2</td>
</tr>
<tr id="247">
<td><a href="https://cplusplus.github.io/CWG/issues/247.html">247</a></td>
+ <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>
<td>NAD</td>
<td>Pointer-to-member casts and function overload resolution</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="248">
<td><a href="https://cplusplus.github.io/CWG/issues/248.html">248</a></td>
+ <td>[<a href="https://wg21.link/extendid">extendid</a>]</td>
<td>C++11</td>
<td>Identifier characters</td>
<td class="na" align="center">Superseded by <a href="https://wg21.link/P1949">P1949</a></td>
</tr>
<tr id="249">
<td><a href="https://cplusplus.github.io/CWG/issues/249.html">249</a></td>
+ <td>[<a href="https://wg21.link/temp.mem.func">temp.mem.func</a>]</td>
<td>TC1</td>
<td>What is a member function template?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="250">
<td><a href="https://cplusplus.github.io/CWG/issues/250.html">250</a></td>
+ <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>
<td>TC1</td>
<td>Address of function template specialization with non-deduced template arguments</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr class="open" id="251">
<td><a href="https://cplusplus.github.io/CWG/issues/251.html">251</a></td>
+ <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>
<td>open</td>
<td>How many signed integer types are there?</td>
<td align="center">Not resolved</td>
</tr>
<tr id="252">
<td><a href="https://cplusplus.github.io/CWG/issues/252.html">252</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>CD1</td>
<td>Looking up deallocation functions in virtual destructors</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="253">
<td><a href="https://cplusplus.github.io/CWG/issues/253.html">253</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>C++17</td>
<td>Why must empty or fully-initialized const objects be initialized?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="254">
<td><a href="https://cplusplus.github.io/CWG/issues/254.html">254</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.elab">basic.lookup.elab</a>]</td>
<td>CD1</td>
<td>Definitional problems with <I>elaborated-type-specifier</I>s</td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="255">
<td><a href="https://cplusplus.github.io/CWG/issues/255.html">255</a></td>
+ <td>[<a href="https://wg21.link/class.free">class.free</a>]</td>
<td>CD6</td>
<td>Placement deallocation functions and lookup ambiguity</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="256">
<td><a href="https://cplusplus.github.io/CWG/issues/256.html">256</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD1</td>
<td>Overflow in size calculations</td>
<td class="unknown" align="center">Duplicate of <a href="#624">624</a></td>
</tr>
<tr id="257">
<td><a href="https://cplusplus.github.io/CWG/issues/257.html">257</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>CD2</td>
<td>Abstract base constructors and virtual base initialization</td>
<td class="full" align="center">Clang 3.4</td>
</tr>
<tr id="258">
<td><a href="https://cplusplus.github.io/CWG/issues/258.html">258</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>CD1</td>
<td><I>using-declaration</I>s and cv-qualifiers</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="259">
<td><a href="https://cplusplus.github.io/CWG/issues/259.html">259</a></td>
+ <td>[<a href="https://wg21.link/temp.spec">temp.spec</a>]</td>
<td>CD1</td>
<td>Restrictions on explicit specialization and instantiation</td>
<td class="full" align="center">Clang 4</td>
</tr>
<tr class="open" id="260">
<td><a href="https://cplusplus.github.io/CWG/issues/260.html">260</a></td>
+ <td>[<a href="https://wg21.link/over.built">over.built</a>]</td>
<td>open</td>
<td>User-defined conversions and built-in <TT>operator=</TT></td>
<td align="center">Not resolved</td>
</tr>
<tr id="261">
<td><a href="https://cplusplus.github.io/CWG/issues/261.html">261</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD1</td>
<td>When is a deallocation function "used?"</td>
<td class="none" align="center">No</td>
</tr>
<tr id="262">
<td><a href="https://cplusplus.github.io/CWG/issues/262.html">262</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>CD1</td>
<td>Default arguments and ellipsis</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="263">
<td><a href="https://cplusplus.github.io/CWG/issues/263.html">263</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>CD1</td>
<td>Can a constructor be declared a friend?</td>
<td class="full" align="center">Clang 3.3</td>
</tr>
<tr class="open" id="264">
<td><a href="https://cplusplus.github.io/CWG/issues/264.html">264</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.explicit">temp.arg.explicit</a>]</td>
<td>open</td>
<td>Unusable template constructors and conversion functions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="265">
<td><a href="https://cplusplus.github.io/CWG/issues/265.html">265</a></td>
+ <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>
<td>dup</td>
<td>Destructors, exceptions, and deallocation</td>
<td class="unknown" align="center">Duplicate of <a href="#353">353</a></td>
</tr>
<tr id="266">
<td><a href="https://cplusplus.github.io/CWG/issues/266.html">266</a></td>
+ <td>[<a href="https://wg21.link/gram">gram</a>]</td>
<td>NAD</td>
<td>No grammar sentence symbol</td>
<td class="na" align="center">N/A</td>
</tr>
<tr class="open" id="267">
<td><a href="https://cplusplus.github.io/CWG/issues/267.html">267</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>open</td>
<td>Alignment requirement for <I>new-expression</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="268">
<td><a href="https://cplusplus.github.io/CWG/issues/268.html">268</a></td>
+ <td>[<a href="https://wg21.link/cpp.rescan">cpp.rescan</a>]</td>
<td>open</td>
<td>Macro name suppression in rescanned replacement text</td>
<td align="center">Not resolved</td>
</tr>
<tr id="269">
<td><a href="https://cplusplus.github.io/CWG/issues/269.html">269</a></td>
+ <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>
<td>NAD</td>
- <td>Order of initialization of multiply-defined static data members
-of class templates</td>
+ <td>Order of initialization of multiply-defined static data members of class templates</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="270">
<td><a href="https://cplusplus.github.io/CWG/issues/270.html">270</a></td>
+ <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>
<td>CD1</td>
<td>Order of initialization of static data members of class templates</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="271">
<td><a href="https://cplusplus.github.io/CWG/issues/271.html">271</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>CD6</td>
<td>Explicit instantiation and template argument deduction</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="272">
<td><a href="https://cplusplus.github.io/CWG/issues/272.html">272</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>CD1</td>
<td>Explicit destructor invocation and <I>qualified-id</I>s</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="273">
<td><a href="https://cplusplus.github.io/CWG/issues/273.html">273</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>CD1</td>
<td>POD classes and <TT>operator&amp;()</TT></td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="274">
<td><a href="https://cplusplus.github.io/CWG/issues/274.html">274</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>CD1</td>
<td>Cv-qualification and char-alias access to out-of-lifetime objects</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="275">
<td><a href="https://cplusplus.github.io/CWG/issues/275.html">275</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>CD1</td>
<td>Explicit instantiation/specialization and <I>using-directive</I>s</td>
<td class="none" align="center">No</td>
</tr>
<tr id="276">
<td><a href="https://cplusplus.github.io/CWG/issues/276.html">276</a></td>
+ <td>[<a href="https://wg21.link/stmt.jump">stmt.jump</a>]</td>
<td>CD1</td>
<td>Order of destruction of parameters and temporaries</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="277">
<td><a href="https://cplusplus.github.io/CWG/issues/277.html">277</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>CD1</td>
<td>Zero-initialization of pointers</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="278">
<td><a href="https://cplusplus.github.io/CWG/issues/278.html">278</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>NAD</td>
<td>External linkage and nameless entities</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="279">
<td><a href="https://cplusplus.github.io/CWG/issues/279.html">279</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>CD6</td>
<td>Correspondence of "names for linkage purposes"</td>
<td class="none" align="center">No</td>
</tr>
<tr id="280">
<td><a href="https://cplusplus.github.io/CWG/issues/280.html">280</a></td>
+ <td>[<a href="https://wg21.link/over.call.object">over.call.object</a>]</td>
<td>CD1</td>
<td>Access and surrogate call functions</td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="281">
<td><a href="https://cplusplus.github.io/CWG/issues/281.html">281</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.spec">dcl.fct.spec</a>]</td>
<td>CD1</td>
<td><TT>inline</TT> specifier in <TT>friend</TT> declarations</td>
<td class="none" align="center">No</td>
</tr>
<tr class="open" id="282">
<td><a href="https://cplusplus.github.io/CWG/issues/282.html">282</a></td>
+ <td>[<a href="https://wg21.link/expr.typeid">expr.typeid</a>]</td>
<td>open</td>
<td>Namespace for <TT>extended_type_info</TT></td>
<td align="center">Not resolved</td>
</tr>
<tr id="283">
<td><a href="https://cplusplus.github.io/CWG/issues/283.html">283</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>
<td>CD1</td>
<td>Template <I>type-parameter</I>s are not syntactically <I>type-name</I>s</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="284">
<td><a href="https://cplusplus.github.io/CWG/issues/284.html">284</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>CD1</td>
<td><I>qualified-id</I>s in class declarations</td>
<td class="none" align="center">No</td>
</tr>
<tr id="285">
<td><a href="https://cplusplus.github.io/CWG/issues/285.html">285</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>NAD</td>
<td>Identifying a function template being specialized</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="286">
<td><a href="https://cplusplus.github.io/CWG/issues/286.html">286</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>
<td>CD1</td>
<td>Incorrect example in partial specialization</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr class="open" id="287">
<td><a href="https://cplusplus.github.io/CWG/issues/287.html">287</a></td>
+ <td>[<a href="https://wg21.link/temp.point">temp.point</a>]</td>
<td>drafting</td>
<td>Order dependencies in template instantiation</td>
<td align="center">Not resolved</td>
</tr>
<tr id="288">
<td><a href="https://cplusplus.github.io/CWG/issues/288.html">288</a></td>
+ <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>
<td>CD1</td>
<td>Misuse of "static type" in describing pointers</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="289">
<td><a href="https://cplusplus.github.io/CWG/issues/289.html">289</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD1</td>
<td>Incomplete list of contexts requiring a complete type</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="290">
<td><a href="https://cplusplus.github.io/CWG/issues/290.html">290</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>NAD</td>
<td>Should memcpy be allowed into a POD with a const member?</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="291">
<td><a href="https://cplusplus.github.io/CWG/issues/291.html">291</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>CD1</td>
<td>Overload resolution needed when binding reference to class rvalue</td>
<td class="full" align="center">Duplicate of <a href="#391">391</a></td>
</tr>
<tr id="292">
<td><a href="https://cplusplus.github.io/CWG/issues/292.html">292</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD3</td>
<td>Deallocation on exception in <TT>new</TT> before arguments evaluated</td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr class="open" id="293">
<td><a href="https://cplusplus.github.io/CWG/issues/293.html">293</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>open</td>
<td>Syntax of explicit instantiation/specialization too permissive</td>
<td align="center">Not resolved</td>
</tr>
<tr id="294">
<td><a href="https://cplusplus.github.io/CWG/issues/294.html">294</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>NAD</td>
<td>Can <TT>static_cast</TT> drop exception specifications?</td>
<td class="none" align="center">No</td>
</tr>
<tr id="295">
<td><a href="https://cplusplus.github.io/CWG/issues/295.html">295</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>CD1</td>
<td>cv-qualifiers on function types</td>
<td class="full" align="center">Clang 3.7</td>
</tr>
<tr id="296">
<td><a href="https://cplusplus.github.io/CWG/issues/296.html">296</a></td>
+ <td>[<a href="https://wg21.link/class.conv.fct">class.conv.fct</a>]</td>
<td>CD1</td>
<td>Can conversion functions be static?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="297">
<td><a href="https://cplusplus.github.io/CWG/issues/297.html">297</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>NAD</td>
<td>Which template does an explicit specialization specialize?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="298">
<td><a href="https://cplusplus.github.io/CWG/issues/298.html">298</a></td>
+ <td>[<a href="https://wg21.link/class.qual">class.qual</a>]</td>
<td>CD1</td>
<td><TT>T::x</TT> when <TT>T</TT> is cv-qualified</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="299">
<td><a href="https://cplusplus.github.io/CWG/issues/299.html">299</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD1</td>
<td>Conversion on array bound expression in <TT>new</TT></td>
<td class="full" align="center">Clang 2.8 (C++11 onwards)</td>
</tr>
<tr id="300">
<td><a href="https://cplusplus.github.io/CWG/issues/300.html">300</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>CD1</td>
<td>References to functions in template argument deduction</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="301">
<td><a href="https://cplusplus.github.io/CWG/issues/301.html">301</a></td>
+ <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>
<td>CD1</td>
<td>Syntax for <I>template-name</I></td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="302">
<td><a href="https://cplusplus.github.io/CWG/issues/302.html">302</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>CD1</td>
<td>Value-initialization and generation of default constructor</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="303">
<td><a href="https://cplusplus.github.io/CWG/issues/303.html">303</a></td>
+ <td>[<a href="https://wg21.link/conv.prom">conv.prom</a>]</td>
<td>NAD</td>
<td>Integral promotions on bit-fields</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="304">
<td><a href="https://cplusplus.github.io/CWG/issues/304.html">304</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>TC1</td>
<td>Value-initialization of a reference</td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="305">
<td><a href="https://cplusplus.github.io/CWG/issues/305.html">305</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>
<td>CD1</td>
<td>Name lookup in destructor call</td>
<td class="none" align="center">No</td>
</tr>
<tr id="306">
<td><a href="https://cplusplus.github.io/CWG/issues/306.html">306</a></td>
+ <td>[<a href="https://wg21.link/class.member.lookup">class.member.lookup</a>]</td>
<td>CD1</td>
<td>Ambiguity by class name injection</td>
<td class="none" align="center">Duplicate of <a href="#39">39</a></td>
</tr>
<tr id="307">
<td><a href="https://cplusplus.github.io/CWG/issues/307.html">307</a></td>
+ <td>[<a href="https://wg21.link/class.cdtor">class.cdtor</a>]</td>
<td>NAD</td>
<td>Initialization of a virtual base class subobject</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="308">
<td><a href="https://cplusplus.github.io/CWG/issues/308.html">308</a></td>
+ <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>
<td>NAD</td>
<td>Catching exceptions with ambiguous base classes</td>
<td class="full" align="center">Clang 3.7</td>
</tr>
<tr id="309">
<td><a href="https://cplusplus.github.io/CWG/issues/309.html">309</a></td>
+ <td>[<a href="https://wg21.link/basic.pre">basic.pre</a>]</td>
<td>CD1</td>
<td>Linkage of entities whose names are not simply identifiers, in introduction</td>
<td class="full" align="center">Duplicate of <a href="#485">485</a></td>
</tr>
<tr class="open" id="310">
<td><a href="https://cplusplus.github.io/CWG/issues/310.html">310</a></td>
+ <td>[<a href="https://wg21.link/temp.over.link">temp.over.link</a>]</td>
<td>open</td>
<td>Can function templates differing only in parameter cv-qualifiers be overloaded?</td>
<td align="center">Not resolved</td>
</tr>
<tr id="311">
<td><a href="https://cplusplus.github.io/CWG/issues/311.html">311</a></td>
+ <td>[<a href="https://wg21.link/namespace.def">namespace.def</a>]</td>
<td>NAD</td>
<td>Using qualified name to reopen nested namespace</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="312">
<td><a href="https://cplusplus.github.io/CWG/issues/312.html">312</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic.deallocation">basic.stc.dynamic.deallocation</a>]</td>
<td>CD3</td>
<td>&#8220;use&#8221; of invalid pointer value not defined</td>
<td class="full" align="center">Duplicate of <a href="#616">616</a></td>
</tr>
<tr id="313">
<td><a href="https://cplusplus.github.io/CWG/issues/313.html">313</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>dup</td>
<td>Class with single conversion function to integral as array size in <TT>new</TT></td>
<td class="full" align="center">Duplicate of <a href="#299">299</a> (C++11 onwards)</td>
</tr>
<tr id="314">
<td><a href="https://cplusplus.github.io/CWG/issues/314.html">314</a></td>
+ <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>
<td>C++17</td>
<td><TT>template</TT> in base class specifier</td>
<td class="none" align="center">No</td>
</tr>
<tr id="315">
<td><a href="https://cplusplus.github.io/CWG/issues/315.html">315</a></td>
+ <td>[<a href="https://wg21.link/class.static.mfct">class.static.mfct</a>]</td>
<td>NAD</td>
<td>Is call of static member function through null pointer undefined?</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="316">
<td><a href="https://cplusplus.github.io/CWG/issues/316.html">316</a></td>
+ <td>[<a href="https://wg21.link/temp.local">temp.local</a>]</td>
<td>NAD</td>
<td>Injected-class-name of template used as template template parameter</td>
<td class="full-superseded" align="center">Superseded by <a href="#1004">1004</a></td>
</tr>
<tr id="317">
<td><a href="https://cplusplus.github.io/CWG/issues/317.html">317</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.spec">dcl.fct.spec</a>]</td>
<td>CD1</td>
<td>Can a function be declared inline after it has been called?</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="318">
<td><a href="https://cplusplus.github.io/CWG/issues/318.html">318</a></td>
+ <td>[<a href="https://wg21.link/class.qual">class.qual</a>]</td>
<td>CD1</td>
<td><TT>struct A::A</TT> should not name the constructor of <TT>A</TT></td>
<td class="full-superseded" align="center">Superseded by <a href="#1310">1310</a></td>
</tr>
<tr id="319">
<td><a href="https://cplusplus.github.io/CWG/issues/319.html">319</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>CD1</td>
<td>Use of names without linkage in declaring entities with linkage</td>
<td class="none" align="center">No</td>
</tr>
<tr id="320">
<td><a href="https://cplusplus.github.io/CWG/issues/320.html">320</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>CD1</td>
<td>Question on copy constructor elision example</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="321">
<td><a href="https://cplusplus.github.io/CWG/issues/321.html">321</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>dup</td>
<td>Associated classes and namespaces for argument-dependent lookup</td>
<td class="full" align="center">Duplicate of <a href="#557">557</a></td>
</tr>
<tr id="322">
<td><a href="https://cplusplus.github.io/CWG/issues/322.html">322</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.conv">temp.deduct.conv</a>]</td>
<td>CD1</td>
<td>Deduction of reference conversions</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="323">
<td><a href="https://cplusplus.github.io/CWG/issues/323.html">323</a></td>
+ <td>[<a href="https://wg21.link/temp">temp</a>]</td>
<td>CD1</td>
<td>Where must <TT>export</TT> appear?</td>
<td class="full-superseded" align="center">Superseded by <a href="#820">820</a></td>
</tr>
<tr id="324">
<td><a href="https://cplusplus.github.io/CWG/issues/324.html">324</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>
<td>CD1</td>
<td>Can "<TT>&amp;</TT>" be applied to assignment to bit-field?</td>
<td class="full" align="center">Clang 3.6</td>
</tr>
<tr class="open" id="325">
<td><a href="https://cplusplus.github.io/CWG/issues/325.html">325</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>open</td>
<td>When are default arguments parsed?</td>
<td align="center">Not resolved</td>
</tr>
<tr id="326">
<td><a href="https://cplusplus.github.io/CWG/issues/326.html">326</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>CD1</td>
<td>Wording for definition of trivial constructor</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="327">
<td><a href="https://cplusplus.github.io/CWG/issues/327.html">327</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>CD1</td>
<td>Use of "structure" without definition</td>
<td class="na" align="center">Duplicate of <a href="#538">538</a></td>
</tr>
<tr id="328">
<td><a href="https://cplusplus.github.io/CWG/issues/328.html">328</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>CD1</td>
<td>Missing requirement that class member types be complete</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="329">
<td><a href="https://cplusplus.github.io/CWG/issues/329.html">329</a></td>
+ <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>
<td>CD1</td>
<td>Evaluation of friends of templates</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="330">
<td><a href="https://cplusplus.github.io/CWG/issues/330.html">330</a></td>
+ <td>[<a href="https://wg21.link/conv.qual">conv.qual</a>]</td>
<td>CD4</td>
<td>Qualification conversions and pointers to arrays of pointers</td>
<td class="full" align="center">Clang 7</td>
</tr>
<tr id="331">
<td><a href="https://cplusplus.github.io/CWG/issues/331.html">331</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>CD1</td>
<td>Allowed copy constructor signatures</td>
<td class="full" align="center">Clang 11</td>
</tr>
<tr id="332">
<td><a href="https://cplusplus.github.io/CWG/issues/332.html">332</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>CD3</td>
<td>cv-qualified <TT>void</TT> parameter types</td>
<td class="full" align="center">Duplicate of <a href="#577">577</a></td>
</tr>
<tr id="333">
<td><a href="https://cplusplus.github.io/CWG/issues/333.html">333</a></td>
+ <td>[<a href="https://wg21.link/dcl.ambig.res">dcl.ambig.res</a>]</td>
<td>NAD</td>
<td>Ambiguous use of "declaration" in disambiguation section</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="334">
<td><a href="https://cplusplus.github.io/CWG/issues/334.html">334</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>
<td>NAD</td>
<td>Is a comma-expression dependent if its first operand is?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="335">
<td><a href="https://cplusplus.github.io/CWG/issues/335.html">335</a></td>
+ <td>[<a href="https://wg21.link/temp">temp</a>]</td>
<td>CD1</td>
<td>Allowing <TT>export</TT> on template members of nontemplate classes</td>
<td class="full-superseded" align="center">Superseded by <a href="#820">820</a></td>
</tr>
<tr id="336">
<td><a href="https://cplusplus.github.io/CWG/issues/336.html">336</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>CD1</td>
<td>Explicit specialization examples are still incorrect</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="337">
<td><a href="https://cplusplus.github.io/CWG/issues/337.html">337</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>CD1</td>
<td>Attempt to create array of abtract type should cause deduction to fail</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="338">
<td><a href="https://cplusplus.github.io/CWG/issues/338.html">338</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>CD6</td>
<td>Enumerator name with linkage used as class name in other translation unit</td>
<td class="partial" align="center">Duplicate of <a href="#1884">1884</a></td>
</tr>
<tr id="339">
<td><a href="https://cplusplus.github.io/CWG/issues/339.html">339</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD1</td>
<td>Overload resolution in operand of <TT>sizeof</TT> in constant expression</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="340">
<td><a href="https://cplusplus.github.io/CWG/issues/340.html">340</a></td>
+ <td>[<a href="https://wg21.link/dcl.ambig.res">dcl.ambig.res</a>]</td>
<td>NAD</td>
<td>Unclear wording in disambiguation section</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="341">
<td><a href="https://cplusplus.github.io/CWG/issues/341.html">341</a></td>
+ <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>
<td>C++11</td>
<td><TT>extern "C"</TT> namespace member function versus global variable</td>
<td class="unknown-superseded" align="center">Superseded by <a href="#1708">1708</a></td>
</tr>
<tr id="342">
<td><a href="https://cplusplus.github.io/CWG/issues/342.html">342</a></td>
+ <td>[<a href="https://wg21.link/expr.unary">expr.unary</a>]</td>
<td>CD3</td>
<td>Terminology: "indirection" versus "dereference"</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="343">
<td><a href="https://cplusplus.github.io/CWG/issues/343.html">343</a></td>
+ <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>
<td>C++17</td>
<td>Make <TT>template</TT> optional in contexts that require a type</td>
<td class="none" align="center">No</td>
</tr>
<tr id="344">
<td><a href="https://cplusplus.github.io/CWG/issues/344.html">344</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>CD3</td>
<td>Naming destructors</td>
<td class="unknown" align="center">Duplicate of <a href="#1435">1435</a></td>
</tr>
<tr id="345">
<td><a href="https://cplusplus.github.io/CWG/issues/345.html">345</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>CD1</td>
<td>Misleading comment on example in templates chapter</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="346">
<td><a href="https://cplusplus.github.io/CWG/issues/346.html">346</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>NAD</td>
<td>Typo in 15.4</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="347">
<td><a href="https://cplusplus.github.io/CWG/issues/347.html">347</a></td>
+ <td>[<a href="https://wg21.link/class.nest">class.nest</a>]</td>
<td>NAD</td>
<td>Use of derived class name in defining base class nested class</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="348">
<td><a href="https://cplusplus.github.io/CWG/issues/348.html">348</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic.deallocation">basic.stc.dynamic.deallocation</a>]</td>
<td>CD1</td>
<td><TT>delete</TT> and user-written deallocation functions</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="349">
<td><a href="https://cplusplus.github.io/CWG/issues/349.html">349</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.conv">temp.deduct.conv</a>]</td>
<td>CD1</td>
<td>Template argument deduction for conversion functions and qualification conversions</td>
<td class="none" align="center">No</td>
</tr>
<tr class="open" id="350">
<td><a href="https://cplusplus.github.io/CWG/issues/350.html">350</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>open</td>
<td><TT>signed char</TT> underlying representation for objects</td>
<td align="center">Not resolved</td>
</tr>
<tr id="351">
<td><a href="https://cplusplus.github.io/CWG/issues/351.html">351</a></td>
+ <td>[<a href="https://wg21.link/expr">expr</a>]</td>
<td>CD1</td>
<td>Sequence point error: unspecified or undefined?</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="352">
<td><a href="https://cplusplus.github.io/CWG/issues/352.html">352</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>CD1</td>
<td>Nondeduced contexts</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="353">
<td><a href="https://cplusplus.github.io/CWG/issues/353.html">353</a></td>
+ <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>
<td>CD1</td>
<td>Is deallocation routine called if destructor throws exception in delete?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="354">
<td><a href="https://cplusplus.github.io/CWG/issues/354.html">354</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>
<td>CD1</td>
<td>Null as nontype template argument</td>
<td class="full" align="center">Clang 3.1 (C++11 onwards)</td>
</tr>
<tr id="355">
<td><a href="https://cplusplus.github.io/CWG/issues/355.html">355</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>C++11</td>
<td>Global-scope <TT>::</TT> in <I>nested-name-specifier</I></td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="356">
<td><a href="https://cplusplus.github.io/CWG/issues/356.html">356</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>NAD</td>
<td>Wording of behavior of generated copy constructor for scalar members</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="357">
<td><a href="https://cplusplus.github.io/CWG/issues/357.html">357</a></td>
+ <td>[<a href="https://wg21.link/intro.defs">intro.defs</a>]</td>
<td>CD1</td>
<td>Definition of signature should include name</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="358">
<td><a href="https://cplusplus.github.io/CWG/issues/358.html">358</a></td>
+ <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>
<td>NAD</td>
<td>Namespaces and extern "C"</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="359">
<td><a href="https://cplusplus.github.io/CWG/issues/359.html">359</a></td>
+ <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>
<td>NAD</td>
<td>Type definition in anonymous union</td>
<td class="full" align="center">Clang 3.3</td>
</tr>
<tr id="360">
<td><a href="https://cplusplus.github.io/CWG/issues/360.html">360</a></td>
+ <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>
<td>CD6</td>
<td>Using-declaration that reduces access</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr class="open" id="361">
<td><a href="https://cplusplus.github.io/CWG/issues/361.html">361</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>open</td>
<td>Forward reference to default argument</td>
<td align="center">Not resolved</td>
</tr>
<tr id="362">
<td><a href="https://cplusplus.github.io/CWG/issues/362.html">362</a></td>
+ <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>
<td>CD1</td>
<td>Order of initialization in instantiation units</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="363">
<td><a href="https://cplusplus.github.io/CWG/issues/363.html">363</a></td>
+ <td>[<a href="https://wg21.link/class.expl.init">class.expl.init</a>]</td>
<td>NAD</td>
<td>Initialization of class from self</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="364">
<td><a href="https://cplusplus.github.io/CWG/issues/364.html">364</a></td>
+ <td>[<a href="https://wg21.link/over.call.func">over.call.func</a>]</td>
<td>CD1</td>
<td>Calling overloaded function with static in set, with no object</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr class="open" id="365">
<td><a href="https://cplusplus.github.io/CWG/issues/365.html">365</a></td>
+ <td>[<a href="https://wg21.link/basic.stc">basic.stc</a>]</td>
<td>open</td>
<td>Storage duration and temporaries</td>
<td align="center">Not resolved</td>
</tr>
<tr id="366">
<td><a href="https://cplusplus.github.io/CWG/issues/366.html">366</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD1</td>
<td>String literal allowed in integral constant expression?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="367">
<td><a href="https://cplusplus.github.io/CWG/issues/367.html">367</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD1</td>
<td><TT>throw</TT> operator allowed in constant expression?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="368">
<td><a href="https://cplusplus.github.io/CWG/issues/368.html">368</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>CD1</td>
<td>Uses of non-type parameters that should cause deduction to fail</td>
<td class="full" align="center">Clang 3.6</td>
</tr>
<tr class="open" id="369">
<td><a href="https://cplusplus.github.io/CWG/issues/369.html">369</a></td>
+ <td>[<a href="https://wg21.link/lex.pptoken">lex.pptoken</a>]</td>
<td>open</td>
<td>Are <TT>new</TT>/<TT>delete</TT> identifiers or <I>preprocessing-op-or-punc</I>?</td>
<td align="center">Not resolved</td>
</tr>
<tr id="370">
<td><a href="https://cplusplus.github.io/CWG/issues/370.html">370</a></td>
+ <td>[<a href="https://wg21.link/cpp.include">cpp.include</a>]</td>
<td>CD1</td>
<td>Can <TT>#include &lt;...&gt;</TT> form be used other than for standard C++ headers?</td>
<td class="na" align="center">N/A</td>
</tr>
<tr class="open" id="371">
<td><a href="https://cplusplus.github.io/CWG/issues/371.html">371</a></td>
+ <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>
<td>open</td>
<td>Interleaving of constructor calls</td>
<td align="center">Not resolved</td>
</tr>
<tr id="372">
<td><a href="https://cplusplus.github.io/CWG/issues/372.html">372</a></td>
+ <td>[<a href="https://wg21.link/temp.arg">temp.arg</a>]</td>
<td>CD1</td>
<td>Is access granted by base class specifiers available in following base class specifiers?</td>
<td class="none" align="center">No</td>
</tr>
<tr id="373">
<td><a href="https://cplusplus.github.io/CWG/issues/373.html">373</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.udir">basic.lookup.udir</a>]</td>
<td>C++11</td>
<td>Lookup on namespace qualified name in using-directive</td>
<td class="full" align="center">Clang 5</td>
</tr>
<tr id="374">
<td><a href="https://cplusplus.github.io/CWG/issues/374.html">374</a></td>
+ <td>[<a href="https://wg21.link/dcl.meaning">dcl.meaning</a>]</td>
<td>CD2</td>
<td>Can explicit specialization outside namespace use qualified name?</td>
<td class="full" align="center">Clang 7</td>
</tr>
<tr id="375">
<td><a href="https://cplusplus.github.io/CWG/issues/375.html">375</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>dup</td>
<td>Confusing example on lookup with <TT>typename</TT></td>
<td class="full" align="center">Duplicate of <a href="#345">345</a></td>
</tr>
<tr id="376">
<td><a href="https://cplusplus.github.io/CWG/issues/376.html">376</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.spec">dcl.fct.spec</a>]</td>
<td>NAD</td>
<td>Class "definition" versus class "declaration"</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="377">
<td><a href="https://cplusplus.github.io/CWG/issues/377.html">377</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>CD1</td>
<td>Enum whose enumerators will not fit in any integral type</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="378">
<td><a href="https://cplusplus.github.io/CWG/issues/378.html">378</a></td>
+ <td>[<a href="https://wg21.link/stmt.jump">stmt.jump</a>]</td>
<td>CD1</td>
<td>Wording that says temporaries are declared</td>
<td class="na" align="center">Duplicate of <a href="#276">276</a></td>
</tr>
<tr id="379">
<td><a href="https://cplusplus.github.io/CWG/issues/379.html">379</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>CD1</td>
<td>Change "class declaration" to "class definition"</td>
<td class="na" align="center">N/A</td>
</tr>
<tr class="open" id="380">
<td><a href="https://cplusplus.github.io/CWG/issues/380.html">380</a></td>
+ <td>[<a href="https://wg21.link/class.member.lookup">class.member.lookup</a>]</td>
<td>open</td>
<td>Definition of "ambiguous base class" missing</td>
<td align="center">Not resolved</td>
</tr>
<tr id="381">
<td><a href="https://cplusplus.github.io/CWG/issues/381.html">381</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>
<td>CD1</td>
<td>Incorrect example of base class member lookup</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="382">
<td><a href="https://cplusplus.github.io/CWG/issues/382.html">382</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>CD1</td>
<td>Allow <TT>typename</TT> outside of templates</td>
<td class="full" align="center">Clang 2.7 (C++11 onwards)</td>
</tr>
<tr id="383">
<td><a href="https://cplusplus.github.io/CWG/issues/383.html">383</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>CD1</td>
<td>Is a class with a declared but not defined destructor a POD?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="384">
<td><a href="https://cplusplus.github.io/CWG/issues/384.html">384</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>NAD</td>
<td>Argument-dependent lookup and operator functions</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="385">
<td><a href="https://cplusplus.github.io/CWG/issues/385.html">385</a></td>
+ <td>[<a href="https://wg21.link/class.protected">class.protected</a>]</td>
<td>CD1</td>
<td>How does protected member check of 11.5 interact with using-declarations?</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="386">
<td><a href="https://cplusplus.github.io/CWG/issues/386.html">386</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>CD6</td>
<td>Friend declaration of name brought in by <I>using-declaration</I></td>
<td class="none" align="center">No</td>
</tr>
<tr id="387">
<td><a href="https://cplusplus.github.io/CWG/issues/387.html">387</a></td>
+ <td>[<a href="https://wg21.link/temp.inject">temp.inject</a>]</td>
<td>CD1</td>
<td>Errors in example in 14.6.5</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="388">
<td><a href="https://cplusplus.github.io/CWG/issues/388.html">388</a></td>
+ <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>
<td>CD3</td>
<td>Catching base<TT>*&amp;</TT> from a throw of derived<TT>*</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="389">
<td><a href="https://cplusplus.github.io/CWG/issues/389.html">389</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>CD1</td>
<td>Unnamed types in entities with linkage</td>
<td class="none" align="center">No</td>
</tr>
<tr id="390">
<td><a href="https://cplusplus.github.io/CWG/issues/390.html">390</a></td>
+ <td>[<a href="https://wg21.link/class.abstract">class.abstract</a>]</td>
<td>CD1</td>
<td>Pure virtual must be defined when implicitly called</td>
<td class="full" align="center">Clang 3.3</td>
</tr>
<tr id="391">
<td><a href="https://cplusplus.github.io/CWG/issues/391.html">391</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>CD1</td>
<td>Require direct binding of short-lived references to rvalues</td>
<td class="full" align="center">Clang 2.8 (C++11 onwards)</td>
</tr>
<tr id="392">
<td><a href="https://cplusplus.github.io/CWG/issues/392.html">392</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>CD1</td>
<td>Use of full expression lvalue before temporary destruction</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="393">
<td><a href="https://cplusplus.github.io/CWG/issues/393.html">393</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>CD4</td>
<td>Pointer to array of unknown bound in template argument list in parameter</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="394">
<td><a href="https://cplusplus.github.io/CWG/issues/394.html">394</a></td>
+ <td>[<a href="https://wg21.link/cpp.pre">cpp.pre</a>]</td>
<td>CD1</td>
<td><I>identifier-list</I> is never defined</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="395">
<td><a href="https://cplusplus.github.io/CWG/issues/395.html">395</a></td>
+ <td>[<a href="https://wg21.link/class.conv.fct">class.conv.fct</a>]</td>
<td>NAD</td>
<td>Conversion operator template syntax</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="396">
<td><a href="https://cplusplus.github.io/CWG/issues/396.html">396</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.spec">dcl.fct.spec</a>]</td>
<td>CD1</td>
<td>Misleading note regarding use of <TT>auto</TT> for disambiguation</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="397">
<td><a href="https://cplusplus.github.io/CWG/issues/397.html">397</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.spec">dcl.fct.spec</a>]</td>
<td>CD1</td>
<td>Same address for string literals from default arguments in inline functions?</td>
<td class="unknown-superseded" align="center">Superseded by <a href="#1823">1823</a></td>
</tr>
<tr id="398">
<td><a href="https://cplusplus.github.io/CWG/issues/398.html">398</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>CD1</td>
<td>Ambiguous wording on naming a type in deduction</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="399">
<td><a href="https://cplusplus.github.io/CWG/issues/399.html">399</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>CD6</td>
<td>Destructor lookup redux</td>
<td class="full" align="center">Clang 11</td>
</tr>
<tr id="400">
<td><a href="https://cplusplus.github.io/CWG/issues/400.html">400</a></td>
+ <td>[<a href="https://wg21.link/namespace.qual">namespace.qual</a>]</td>
<td>CD1</td>
<td>Using-declarations and the "struct hack"</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="401">
<td><a href="https://cplusplus.github.io/CWG/issues/401.html">401</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>CD1</td>
<td>When is access for template parameter default arguments checked?</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr class="open" id="402">
<td><a href="https://cplusplus.github.io/CWG/issues/402.html">402</a></td>
+ <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>
<td>open</td>
<td>More on partial ordering of function templates</td>
<td align="center">Not resolved</td>
</tr>
<tr id="403">
<td><a href="https://cplusplus.github.io/CWG/issues/403.html">403</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>CD1</td>
<td>Reference to a type as a <I>template-id</I></td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="404">
<td><a href="https://cplusplus.github.io/CWG/issues/404.html">404</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>CD1</td>
<td>Unclear reference to construction with non-trivial constructor</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="405">
<td><a href="https://cplusplus.github.io/CWG/issues/405.html">405</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>
<td>CD6</td>
<td>Unqualified function name lookup</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="406">
<td><a href="https://cplusplus.github.io/CWG/issues/406.html">406</a></td>
+ <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>
<td>CD1</td>
<td>Static data member in class with name for linkage purposes</td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="407">
<td><a href="https://cplusplus.github.io/CWG/issues/407.html">407</a></td>
+ <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>
<td>C++11</td>
<td>Named class with associated typedef: two names or one?</td>
<td class="full" align="center">Clang 3.8</td>
</tr>
<tr id="408">
<td><a href="https://cplusplus.github.io/CWG/issues/408.html">408</a></td>
+ <td>[<a href="https://wg21.link/temp.static">temp.static</a>]</td>
<td>CD2</td>
<td>sizeof applied to unknown-bound array static data member of template</td>
<td class="full" align="center">Clang 3.4</td>
</tr>
<tr id="409">
<td><a href="https://cplusplus.github.io/CWG/issues/409.html">409</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>CD1</td>
<td>Obsolete paragraph missed by changes for issue 224</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="410">
<td><a href="https://cplusplus.github.io/CWG/issues/410.html">410</a></td>
+ <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>
<td>CD1</td>
<td>Paragraph missed in changes for issue 166</td>
<td class="none" align="center">No</td>
</tr>
<tr id="411">
<td><a href="https://cplusplus.github.io/CWG/issues/411.html">411</a></td>
+ <td>[<a href="https://wg21.link/lex.string">lex.string</a>]</td>
<td>CD6</td>
<td>Use of universal-character-name in character versus string literals</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="412">
<td><a href="https://cplusplus.github.io/CWG/issues/412.html">412</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.spec">dcl.fct.spec</a>]</td>
<td>NAD</td>
<td>Can a replacement allocation function be inline?</td>
<td class="full" align="center">Clang 3.4</td>
</tr>
<tr id="413">
<td><a href="https://cplusplus.github.io/CWG/issues/413.html">413</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>CD1</td>
<td>Definition of "empty class"</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="414">
<td><a href="https://cplusplus.github.io/CWG/issues/414.html">414</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>
<td>CD1</td>
<td>Multiple types found on destructor lookup</td>
<td class="none" align="center">Duplicate of <a href="#305">305</a></td>
</tr>
<tr id="415">
<td><a href="https://cplusplus.github.io/CWG/issues/415.html">415</a></td>
+ <td>[<a href="https://wg21.link/temp.over">temp.over</a>]</td>
<td>CD1</td>
<td>Template deduction does not cause instantiation</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="416">
<td><a href="https://cplusplus.github.io/CWG/issues/416.html">416</a></td>
+ <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>
<td>CD1</td>
<td>Class must be complete to allow operator lookup?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="417">
<td><a href="https://cplusplus.github.io/CWG/issues/417.html">417</a></td>
+ <td>[<a href="https://wg21.link/class.name">class.name</a>]</td>
<td>CD1</td>
<td>Using derived-class qualified name in out-of-class nested class definition</td>
<td class="none" align="center">No</td>
</tr>
<tr id="418">
<td><a href="https://cplusplus.github.io/CWG/issues/418.html">418</a></td>
+ <td>[<a href="https://wg21.link/over.match.best">over.match.best</a>]</td>
<td>CD6</td>
<td>Imperfect wording on error on multiple default arguments on a called function</td>
<td class="none" align="center">No</td>
</tr>
<tr class="open" id="419">
<td><a href="https://cplusplus.github.io/CWG/issues/419.html">419</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>open</td>
<td>Can cast to virtual base class be done on partially-constructed object?</td>
<td align="center">Not resolved</td>
</tr>
<tr id="420">
<td><a href="https://cplusplus.github.io/CWG/issues/420.html">420</a></td>
+ <td>[<a href="https://wg21.link/over.ref">over.ref</a>]</td>
<td>CD1</td>
<td>postfixexpression-&gt;scalar_type_dtor() inconsistent</td>
<td class="full" align="center">Clang 9</td>
</tr>
<tr id="421">
<td><a href="https://cplusplus.github.io/CWG/issues/421.html">421</a></td>
+ <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>
<td>CD1</td>
<td>Is rvalue.field an rvalue?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="422">
<td><a href="https://cplusplus.github.io/CWG/issues/422.html">422</a></td>
+ <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>
<td>NAD</td>
<td>Is a typedef redeclaration allowed with a template type that might be the same?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="423">
<td><a href="https://cplusplus.github.io/CWG/issues/423.html">423</a></td>
+ <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>
<td>NAD</td>
<td>Can a conversion be done on the left operand of a compound assignment?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="424">
<td><a href="https://cplusplus.github.io/CWG/issues/424.html">424</a></td>
+ <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>
<td>CD1</td>
<td>Wording problem with issue 56 resolution on redeclaring typedefs in class scope</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="425">
<td><a href="https://cplusplus.github.io/CWG/issues/425.html">425</a></td>
+ <td>[<a href="https://wg21.link/over.built">over.built</a>]</td>
<td>CD1</td>
<td>Set of candidates for overloaded built-in operator with float operand</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="426">
<td><a href="https://cplusplus.github.io/CWG/issues/426.html">426</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>C++17</td>
<td>Identically-named variables, one internally and one externally linked, allowed?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="427">
<td><a href="https://cplusplus.github.io/CWG/issues/427.html">427</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>CD1</td>
<td><TT>static_cast</TT> ambiguity: conversion versus cast to derived</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="428">
<td><a href="https://cplusplus.github.io/CWG/issues/428.html">428</a></td>
+ <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>
<td>CD1</td>
<td>Mention of expression with reference type</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="429">
<td><a href="https://cplusplus.github.io/CWG/issues/429.html">429</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD1</td>
<td>Matching deallocation function chosen based on syntax or signature?</td>
<td class="full" align="center">Clang 2.8 (C++11 onwards)</td>
</tr>
<tr id="430">
<td><a href="https://cplusplus.github.io/CWG/issues/430.html">430</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>CD1</td>
<td>Ordering of expression evaluation in initializer list</td>
<td class="full" align="center">Clang 2.7 (C++11 onwards)</td>
</tr>
<tr id="431">
<td><a href="https://cplusplus.github.io/CWG/issues/431.html">431</a></td>
+ <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>
<td>C++11</td>
<td>Defect in wording in 14.2</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="432">
<td><a href="https://cplusplus.github.io/CWG/issues/432.html">432</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.class">basic.scope.class</a>]</td>
<td>CD1</td>
<td>Is injected class name visible in base class specifier list?</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="433">
<td><a href="https://cplusplus.github.io/CWG/issues/433.html">433</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.pdecl">basic.scope.pdecl</a>]</td>
<td>CD1</td>
<td>Do elaborated type specifiers in templates inject into enclosing namespace scope?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="434">
<td><a href="https://cplusplus.github.io/CWG/issues/434.html">434</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>NAD</td>
<td>Unclear suppression of standard conversions while binding reference to lvalue</td>
<td class="full-superseded" align="center">Superseded by <a href="#2352">2352</a></td>
</tr>
<tr id="435">
<td><a href="https://cplusplus.github.io/CWG/issues/435.html">435</a></td>
+ <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>
<td>NAD</td>
<td>Change "declararation or definition" to "declaration"</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="436">
<td><a href="https://cplusplus.github.io/CWG/issues/436.html">436</a></td>
+ <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>
<td>CD1</td>
<td>Problem in example in 9.6 paragraph 4</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="437">
<td><a href="https://cplusplus.github.io/CWG/issues/437.html">437</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>CD1</td>
<td>Is type of class allowed in member function exception specification?</td>
<td class="full-superseded-superseded" align="center">Superseded by <a href="#1308">1308</a></td>
</tr>
<tr id="438">
<td><a href="https://cplusplus.github.io/CWG/issues/438.html">438</a></td>
+ <td>[<a href="https://wg21.link/expr">expr</a>]</td>
<td>CD2</td>
<td>Possible flaw in wording for multiple accesses to object between sequence points</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="439">
<td><a href="https://cplusplus.github.io/CWG/issues/439.html">439</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>CD1</td>
<td>Guarantees on casting pointer back to cv-qualified version of original type</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="440">
<td><a href="https://cplusplus.github.io/CWG/issues/440.html">440</a></td>
+ <td>[<a href="https://wg21.link/temp.arg">temp.arg</a>]</td>
<td>NAD</td>
<td>Allow implicit pointer-to-member conversion on nontype template argument</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="441">
<td><a href="https://cplusplus.github.io/CWG/issues/441.html">441</a></td>
+ <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>
<td>CD1</td>
<td>Ordering of static reference initialization</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="442">
<td><a href="https://cplusplus.github.io/CWG/issues/442.html">442</a></td>
+ <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>
<td>CD1</td>
<td>Incorrect use of null pointer constant in description of delete operator</td>
<td class="na-superseded" align="center">Superseded by <a href="#348">348</a></td>
</tr>
<tr id="443">
<td><a href="https://cplusplus.github.io/CWG/issues/443.html">443</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>CD1</td>
<td>Wording nit in description of lifetime of temporaries</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="444">
<td><a href="https://cplusplus.github.io/CWG/issues/444.html">444</a></td>
+ <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>
<td>NAD</td>
<td>Overriding and the generated copy assignment operator</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="445">
<td><a href="https://cplusplus.github.io/CWG/issues/445.html">445</a></td>
+ <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>
<td>NAD</td>
<td>Wording issue on friend declarations</td>
<td class="full" align="center">Clang 3.2</td>
</tr>
<tr id="446">
<td><a href="https://cplusplus.github.io/CWG/issues/446.html">446</a></td>
+ <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>
<td>CD1</td>
<td>Does an lvalue-to-rvalue conversion on the "?" operator produce a temporary?</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="447">
<td><a href="https://cplusplus.github.io/CWG/issues/447.html">447</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>
<td>CD1</td>
<td>Is offsetof type-dependent?</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="448">
<td><a href="https://cplusplus.github.io/CWG/issues/448.html">448</a></td>
+ <td>[<a href="https://wg21.link/temp.local">temp.local</a>]</td>
<td>C++11</td>
<td>Set of template functions in call with dependent explicit argument</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="449">
<td><a href="https://cplusplus.github.io/CWG/issues/449.html">449</a></td>
+ <td>[<a href="https://wg21.link/intro.defs">intro.defs</a>]</td>
<td>NAD</td>
<td>Consistency in use of hyphen with names of "non" entities</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="450">
<td><a href="https://cplusplus.github.io/CWG/issues/450.html">450</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>CD1</td>
<td>Binding a reference to const to a cv-qualified array rvalue</td>
<td class="full" align="center">Clang 3.2</td>
</tr>
<tr id="451">
<td><a href="https://cplusplus.github.io/CWG/issues/451.html">451</a></td>
+ <td>[<a href="https://wg21.link/expr">expr</a>]</td>
<td>CD1</td>
<td>Expressions with invalid results and ill-formedness</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="452">
<td><a href="https://cplusplus.github.io/CWG/issues/452.html">452</a></td>
+ <td>[<a href="https://wg21.link/class.this">class.this</a>]</td>
<td>CD1</td>
<td>Wording nit on description of <TT>this</TT></td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="453">
<td><a href="https://cplusplus.github.io/CWG/issues/453.html">453</a></td>
+ <td>[<a href="https://wg21.link/dcl.ref">dcl.ref</a>]</td>
<td>CD7</td>
<td>References may only bind to &#8220;valid&#8221; objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="454">
<td><a href="https://cplusplus.github.io/CWG/issues/454.html">454</a></td>
+ <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>
<td>CD1</td>
<td>When is a definition of a static data member required?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="455">
<td><a href="https://cplusplus.github.io/CWG/issues/455.html">455</a></td>
+ <td>[<a href="https://wg21.link/over.match.best">over.match.best</a>]</td>
<td>NAD</td>
<td>Partial ordering and non-deduced arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="456">
<td><a href="https://cplusplus.github.io/CWG/issues/456.html">456</a></td>
+ <td>[<a href="https://wg21.link/conv.ptr">conv.ptr</a>]</td>
<td>NAD</td>
<td>Is initialized const int or const bool variable a null pointer constant?</td>
<td class="full" align="center">Clang 3.4</td>
</tr>
<tr id="457">
<td><a href="https://cplusplus.github.io/CWG/issues/457.html">457</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD1</td>
<td>Wording nit on use of const variables in constant expressions</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="458">
<td><a href="https://cplusplus.github.io/CWG/issues/458.html">458</a></td>
+ <td>[<a href="https://wg21.link/temp.local">temp.local</a>]</td>
<td>C++11</td>
<td>Hiding of member template parameters by other members</td>
<td class="full" align="center">Clang 11</td>
</tr>
<tr id="459">
<td><a href="https://cplusplus.github.io/CWG/issues/459.html">459</a></td>
+ <td>[<a href="https://wg21.link/temp.local">temp.local</a>]</td>
<td>NAD</td>
<td>Hiding of template parameters by base class members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="460">
<td><a href="https://cplusplus.github.io/CWG/issues/460.html">460</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>CD1</td>
<td>Can a <I>using-declaration</I> name a namespace?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="461">
<td><a href="https://cplusplus.github.io/CWG/issues/461.html">461</a></td>
+ <td>[<a href="https://wg21.link/dcl.asm">dcl.asm</a>]</td>
<td>NAD</td>
<td>Make <TT>asm</TT> conditionally-supported</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="462">
<td><a href="https://cplusplus.github.io/CWG/issues/462.html">462</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>CD3</td>
<td>Lifetime of temporaries bound to comma expressions</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="463">
<td><a href="https://cplusplus.github.io/CWG/issues/463.html">463</a></td>
+ <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>
<td>CD1</td>
<td><TT>reinterpret_cast&lt;T*&gt;(0)</TT></td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="464">
<td><a href="https://cplusplus.github.io/CWG/issues/464.html">464</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>CD1</td>
<td>Wording nit on lifetime of temporaries to which references are bound</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="465">
<td><a href="https://cplusplus.github.io/CWG/issues/465.html">465</a></td>
+ <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>
<td>NAD</td>
<td>May constructors of global objects call <TT>exit()</TT>?</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="466">
<td><a href="https://cplusplus.github.io/CWG/issues/466.html">466</a></td>
+ <td>[<a href="https://wg21.link/expr.pseudo">expr.pseudo</a>]</td>
<td>CD1</td>
<td>cv-qualifiers on pseudo-destructor type</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="467">
<td><a href="https://cplusplus.github.io/CWG/issues/467.html">467</a></td>
+ <td>[<a href="https://wg21.link/stmt.dcl">stmt.dcl</a>]</td>
<td>NAD</td>
<td>Jump past initialization of local static variable</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="468">
<td><a href="https://cplusplus.github.io/CWG/issues/468.html">468</a></td>
+ <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>
<td>CD1</td>
<td>Allow <TT>::template</TT> outside of templates</td>
<td class="full" align="center">Clang 2.7 (C++11 onwards)</td>
</tr>
<tr id="469">
<td><a href="https://cplusplus.github.io/CWG/issues/469.html">469</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>NAD</td>
<td>Const template specializations and reference arguments</td>
<td class="none" align="center">No</td>
</tr>
<tr id="470">
<td><a href="https://cplusplus.github.io/CWG/issues/470.html">470</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>CD1</td>
<td>Instantiation of members of an explicitly-instantiated class template</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="471">
<td><a href="https://cplusplus.github.io/CWG/issues/471.html">471</a></td>
+ <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>
<td>NAD</td>
<td>Conflicting inherited access specifications</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr class="open" id="472">
<td><a href="https://cplusplus.github.io/CWG/issues/472.html">472</a></td>
+ <td>[<a href="https://wg21.link/class.protected">class.protected</a>]</td>
<td>open</td>
<td>Casting across protected inheritance</td>
<td align="center">
@@ -2887,5528 +3358,6447 @@ of class templates</td>
</tr>
<tr id="473">
<td><a href="https://cplusplus.github.io/CWG/issues/473.html">473</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>NAD</td>
<td>Block-scope declarations of allocator functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="474">
<td><a href="https://cplusplus.github.io/CWG/issues/474.html">474</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>CD1</td>
<td>Block-scope <TT>extern</TT> declarations in namespace members</td>
<td class="full" align="center">Clang 3.4</td>
</tr>
<tr id="475">
<td><a href="https://cplusplus.github.io/CWG/issues/475.html">475</a></td>
+ <td>[<a href="https://wg21.link/except.uncaught">except.uncaught</a>]</td>
<td>C++11</td>
<td>When is <TT>std::uncaught_exception()</TT> true? (take 2)</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="476">
<td><a href="https://cplusplus.github.io/CWG/issues/476.html">476</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD5</td>
<td>Determining the buffer size for placement new</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="477">
<td><a href="https://cplusplus.github.io/CWG/issues/477.html">477</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.spec">dcl.fct.spec</a>]</td>
<td>CD1</td>
<td>Can <TT>virtual</TT> appear in a <TT>friend</TT> declaration?</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="478">
<td><a href="https://cplusplus.github.io/CWG/issues/478.html">478</a></td>
+ <td>[<a href="https://wg21.link/dcl.array">dcl.array</a>]</td>
<td>NAD</td>
<td>May a function parameter be an array of an abstract class type?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="479">
<td><a href="https://cplusplus.github.io/CWG/issues/479.html">479</a></td>
+ <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>
<td>CD1</td>
<td>Copy elision in exception handling</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="480">
<td><a href="https://cplusplus.github.io/CWG/issues/480.html">480</a></td>
+ <td>[<a href="https://wg21.link/conv.mem">conv.mem</a>]</td>
<td>CD1</td>
<td>Is a base of a virtual base also virtual?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="481">
<td><a href="https://cplusplus.github.io/CWG/issues/481.html">481</a></td>
+ <td>[<a href="https://wg21.link/basic.scope">basic.scope</a>]</td>
<td>CD2</td>
<td>Scope of template parameters</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="482">
<td><a href="https://cplusplus.github.io/CWG/issues/482.html">482</a></td>
+ <td>[<a href="https://wg21.link/dcl.meaning">dcl.meaning</a>]</td>
<td>CD3</td>
<td>Qualified declarators in redeclarations</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="483">
<td><a href="https://cplusplus.github.io/CWG/issues/483.html">483</a></td>
+ <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>
<td>CD3</td>
<td>Normative requirements on integral ranges</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="484">
<td><a href="https://cplusplus.github.io/CWG/issues/484.html">484</a></td>
+ <td>[<a href="https://wg21.link/class.derived">class.derived</a>]</td>
<td>CD1</td>
<td>Can a <I>base-specifier</I> name a cv-qualified class type?</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="485">
<td><a href="https://cplusplus.github.io/CWG/issues/485.html">485</a></td>
+ <td>[<a href="https://wg21.link/basic.pre">basic.pre</a>]</td>
<td>CD1</td>
<td>What is a &#8220;name&#8221;?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="486">
<td><a href="https://cplusplus.github.io/CWG/issues/486.html">486</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>CD1</td>
<td>Invalid return types and template argument deduction</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="487">
<td><a href="https://cplusplus.github.io/CWG/issues/487.html">487</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>NAD</td>
<td>Operator overloading in constant expressions</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="488">
<td><a href="https://cplusplus.github.io/CWG/issues/488.html">488</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>CD1</td>
<td>Local types, overload resolution, and template argument deduction</td>
<td class="full" align="center">Clang 2.9 (C++11 onwards)</td>
</tr>
<tr id="489">
<td><a href="https://cplusplus.github.io/CWG/issues/489.html">489</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>NAD</td>
<td>Must member function templates be instantiated during overload resolution?</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="490">
<td><a href="https://cplusplus.github.io/CWG/issues/490.html">490</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>
<td>CD2</td>
<td>Name lookup in friend declarations</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="491">
<td><a href="https://cplusplus.github.io/CWG/issues/491.html">491</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>CD1</td>
<td>Initializers for empty-class aggregrate members</td>
<td class="full" align="center">Duplicate of <a href="#413">413</a></td>
</tr>
<tr id="492">
<td><a href="https://cplusplus.github.io/CWG/issues/492.html">492</a></td>
+ <td>[<a href="https://wg21.link/expr.typeid">expr.typeid</a>]</td>
<td>CD1</td>
<td><TT>typeid</TT> constness inconsistent with example</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="493">
<td><a href="https://cplusplus.github.io/CWG/issues/493.html">493</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.conv">temp.deduct.conv</a>]</td>
<td>CD2</td>
<td>Type deduction from a <TT>bool</TT> context</td>
<td class="unknown" align="center">Duplicate of <a href="#976">976</a></td>
</tr>
<tr id="494">
<td><a href="https://cplusplus.github.io/CWG/issues/494.html">494</a></td>
+ <td>[<a href="https://wg21.link/class.access">class.access</a>]</td>
<td>CD1</td>
<td>Problems with the resolution of issue 45</td>
<td class="none" align="center">Duplicate of <a href="#372">372</a></td>
</tr>
<tr id="495">
<td><a href="https://cplusplus.github.io/CWG/issues/495.html">495</a></td>
+ <td>[<a href="https://wg21.link/over.match.best">over.match.best</a>]</td>
<td>CD2</td>
<td>Overload resolution with template and non-template conversion functions</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="496">
<td><a href="https://cplusplus.github.io/CWG/issues/496.html">496</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>CD3</td>
<td>Is a volatile-qualified type really a POD?</td>
<td class="full-superseded" align="center">Superseded by <a href="#2094">2094</a></td>
</tr>
<tr id="497">
<td><a href="https://cplusplus.github.io/CWG/issues/497.html">497</a></td>
+ <td>[<a href="https://wg21.link/expr.mptr.oper">expr.mptr.oper</a>]</td>
<td>CD1</td>
<td>Missing required initialization in example</td>
<td class="unknown-superseded" align="center">Superseded by <a href="#253">253</a></td>
</tr>
<tr class="open" id="498">
<td><a href="https://cplusplus.github.io/CWG/issues/498.html">498</a></td>
+ <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>
<td>open</td>
<td>Storage class specifiers in definitions of class members</td>
<td align="center">Not resolved</td>
</tr>
<tr id="499">
<td><a href="https://cplusplus.github.io/CWG/issues/499.html">499</a></td>
+ <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>
<td>CD2</td>
<td>Throwing an array of unknown size</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="500">
<td><a href="https://cplusplus.github.io/CWG/issues/500.html">500</a></td>
+ <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>
<td>CD1</td>
<td>Access in <I>base-specifier</I>s of friend and nested classes</td>
<td class="none" align="center">Duplicate of <a href="#372">372</a></td>
</tr>
<tr id="501">
<td><a href="https://cplusplus.github.io/CWG/issues/501.html">501</a></td>
+ <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>
<td>NAD</td>
<td>Visibility of friend declarations within the befriending class</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="502">
<td><a href="https://cplusplus.github.io/CWG/issues/502.html">502</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>C++11</td>
<td>Dependency of nested enumerations and enumerators</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr class="open" id="503">
<td><a href="https://cplusplus.github.io/CWG/issues/503.html">503</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>open</td>
<td>Cv-qualified function types in template argument deduction</td>
<td align="center">Not resolved</td>
</tr>
<tr id="504">
<td><a href="https://cplusplus.github.io/CWG/issues/504.html">504</a></td>
+ <td>[<a href="https://wg21.link/dcl.ref">dcl.ref</a>]</td>
<td>NAD</td>
<td>Should use of a variable in its own initializer require a diagnostic?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="505">
<td><a href="https://cplusplus.github.io/CWG/issues/505.html">505</a></td>
+ <td>[<a href="https://wg21.link/lex.ccon">lex.ccon</a>]</td>
<td>CD1</td>
<td>Conditionally-supported behavior for unknown character escapes</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="506">
<td><a href="https://cplusplus.github.io/CWG/issues/506.html">506</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>CD1</td>
<td>Conditionally-supported behavior for non-POD objects passed to ellipsis</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="507">
<td><a href="https://cplusplus.github.io/CWG/issues/507.html">507</a></td>
+ <td>[<a href="https://wg21.link/over.built">over.built</a>]</td>
<td>dup</td>
<td>Ambiguity assigning class object to built-in type</td>
<td class="unknown" align="center">Duplicate of <a href="#260">260</a></td>
</tr>
<tr id="508">
<td><a href="https://cplusplus.github.io/CWG/issues/508.html">508</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>C++11</td>
<td>Non-constructed value-initialized objects</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="509">
<td><a href="https://cplusplus.github.io/CWG/issues/509.html">509</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>CD1</td>
<td>Dead code in the specification of default initialization</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="510">
<td><a href="https://cplusplus.github.io/CWG/issues/510.html">510</a></td>
+ <td>[<a href="https://wg21.link/class.init">class.init</a>]</td>
<td>CD1</td>
<td>Default initialization of POD classes?</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="511">
<td><a href="https://cplusplus.github.io/CWG/issues/511.html">511</a></td>
+ <td>[<a href="https://wg21.link/class.prop">class.prop</a>]</td>
<td>NAD</td>
<td>POD-structs with template assignment operators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="512">
<td><a href="https://cplusplus.github.io/CWG/issues/512.html">512</a></td>
+ <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>
<td>NAD</td>
<td>Union members with user-declared non-default constructors</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="513">
<td><a href="https://cplusplus.github.io/CWG/issues/513.html">513</a></td>
+ <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>
<td>CD1</td>
<td>Non-class &#8220;most-derived&#8221; objects</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="514">
<td><a href="https://cplusplus.github.io/CWG/issues/514.html">514</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>
<td>CD1</td>
<td>Is the initializer for a namespace member in the scope of the namespace?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="515">
<td><a href="https://cplusplus.github.io/CWG/issues/515.html">515</a></td>
+ <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>
<td>CD1</td>
<td>Non-dependent references to base class members</td>
<td class="unknown-superseded" align="center">Superseded by <a href="#1017">1017</a></td>
</tr>
<tr id="516">
<td><a href="https://cplusplus.github.io/CWG/issues/516.html">516</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>
<td>CD1</td>
<td>Use of <TT>signed</TT> in bit-field declarations</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="517">
<td><a href="https://cplusplus.github.io/CWG/issues/517.html">517</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial.general">temp.spec.partial.general</a>]</td>
<td>CD1</td>
<td>Partial specialization following explicit instantiation</td>
<td class="none" align="center">No</td>
</tr>
<tr id="518">
<td><a href="https://cplusplus.github.io/CWG/issues/518.html">518</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>CD1</td>
<td>Trailing comma following <I>enumerator-list</I></td>
<td class="full" align="center">Clang 2.7 (C++11 onwards)</td>
</tr>
<tr id="519">
<td><a href="https://cplusplus.github.io/CWG/issues/519.html">519</a></td>
+ <td>[<a href="https://wg21.link/conv.ptr">conv.ptr</a>]</td>
<td>CD1</td>
<td>Null pointer preservation in <TT>void*</TT> conversions</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="520">
<td><a href="https://cplusplus.github.io/CWG/issues/520.html">520</a></td>
+ <td>[<a href="https://wg21.link/expr.cast">expr.cast</a>]</td>
<td>CD1</td>
<td>Old-style casts between incomplete class types</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="521">
<td><a href="https://cplusplus.github.io/CWG/issues/521.html">521</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic.allocation">basic.stc.dynamic.allocation</a>]</td>
<td>CD1</td>
<td>Requirements for exceptions thrown by allocation functions</td>
<td class="none" align="center">No</td>
</tr>
<tr id="522">
<td><a href="https://cplusplus.github.io/CWG/issues/522.html">522</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>CD1</td>
<td>Array-to-pointer decay in template argument deduction</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr class="open" id="523">
<td><a href="https://cplusplus.github.io/CWG/issues/523.html">523</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic.deallocation">basic.stc.dynamic.deallocation</a>]</td>
<td>open</td>
<td>Can a one-past-the-end pointer be invalidated by deleting an adjacent object?</td>
<td align="center">Not resolved</td>
</tr>
<tr id="524">
<td><a href="https://cplusplus.github.io/CWG/issues/524.html">524</a></td>
+ <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>
<td>CD1</td>
<td>Can function-notation calls to operator functions be dependent?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="525">
<td><a href="https://cplusplus.github.io/CWG/issues/525.html">525</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>CD1</td>
<td>Missing <TT>*</TT> in example</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="526">
<td><a href="https://cplusplus.github.io/CWG/issues/526.html">526</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>CD1</td>
<td>Confusing aspects in the specification of non-deduced contexts</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="527">
<td><a href="https://cplusplus.github.io/CWG/issues/527.html">527</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>CD2</td>
<td>Problems with linkage of types</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="528">
<td><a href="https://cplusplus.github.io/CWG/issues/528.html">528</a></td>
+ <td>[<a href="https://wg21.link/expr.typeid">expr.typeid</a>]</td>
<td>NAD</td>
<td>Why are incomplete class types not allowed with <TT>typeid</TT>?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr class="open" id="529">
<td><a href="https://cplusplus.github.io/CWG/issues/529.html">529</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>open</td>
<td>Use of <TT>template&lt;&gt;</TT> with &#8220;explicitly-specialized&#8221; class templates</td>
<td align="center">Not resolved</td>
</tr>
<tr id="530">
<td><a href="https://cplusplus.github.io/CWG/issues/530.html">530</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD1</td>
<td>Nontype template arguments in constant expressions</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="531">
<td><a href="https://cplusplus.github.io/CWG/issues/531.html">531</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>C++11</td>
<td>Defining members of explicit specializations</td>
<td class="partial" align="center">Partial</td>
</tr>
<tr id="532">
<td><a href="https://cplusplus.github.io/CWG/issues/532.html">532</a></td>
+ <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>
<td>C++11</td>
<td>Member/nonmember operator template partial ordering</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="533">
<td><a href="https://cplusplus.github.io/CWG/issues/533.html">533</a></td>
+ <td>[<a href="https://wg21.link/cpp.include">cpp.include</a>]</td>
<td>NAD</td>
<td>Special treatment for C-style header names</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="534">
<td><a href="https://cplusplus.github.io/CWG/issues/534.html">534</a></td>
+ <td>[<a href="https://wg21.link/temp">temp</a>]</td>
<td>CD1</td>
<td><I>template-name</I>s and <I>operator-function-id</I>s</td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="535">
<td><a href="https://cplusplus.github.io/CWG/issues/535.html">535</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>CD3</td>
<td>Copy construction without a copy constructor</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="536">
<td><a href="https://cplusplus.github.io/CWG/issues/536.html">536</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>
<td>CD6</td>
<td>Problems in the description of <I>id-expression</I>s</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="537">
<td><a href="https://cplusplus.github.io/CWG/issues/537.html">537</a></td>
+ <td>[<a href="https://wg21.link/intro.defs">intro.defs</a>]</td>
<td>CD1</td>
<td>Definition of &#8220;signature&#8221;</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="538">
<td><a href="https://cplusplus.github.io/CWG/issues/538.html">538</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>CD1</td>
- <td>Definition and usage
-of <I>structure</I>, <I>POD-struct</I>, <I>POD-union</I>,
-and <I>POD class</I></td>
+ <td>Definition and usage of <I>structure</I>, <I>POD-struct</I>, <I>POD-union</I>, and <I>POD class</I></td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="539">
<td><a href="https://cplusplus.github.io/CWG/issues/539.html">539</a></td>
+ <td>[<a href="https://wg21.link/dcl.type">dcl.type</a>]</td>
<td>CD3</td>
<td>Constraints on <I>type-specifier-seq</I></td>
<td class="full" align="center">Clang 3.4</td>
</tr>
<tr id="540">
<td><a href="https://cplusplus.github.io/CWG/issues/540.html">540</a></td>
+ <td>[<a href="https://wg21.link/namespace.def">namespace.def</a>]</td>
<td>CD1</td>
<td>Propagation of cv-qualifiers in reference-to-reference collapse</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="541">
<td><a href="https://cplusplus.github.io/CWG/issues/541.html">541</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>
<td>CD2</td>
<td>Dependent function types</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="542">
<td><a href="https://cplusplus.github.io/CWG/issues/542.html">542</a></td>
+ <td>[<a href="https://wg21.link/class.init">class.init</a>]</td>
<td>CD2</td>
<td>Value initialization of arrays of POD-structs</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="543">
<td><a href="https://cplusplus.github.io/CWG/issues/543.html">543</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>CD1</td>
<td>Value initialization and default constructors</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="544">
<td><a href="https://cplusplus.github.io/CWG/issues/544.html">544</a></td>
+ <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>
<td>NAD</td>
<td>Base class lookup in explicit specialization</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr class="open" id="545">
<td><a href="https://cplusplus.github.io/CWG/issues/545.html">545</a></td>
+ <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>
<td>open</td>
<td>User-defined conversions and built-in operator overload resolution</td>
<td align="center">Not resolved</td>
</tr>
<tr id="546">
<td><a href="https://cplusplus.github.io/CWG/issues/546.html">546</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>C++11</td>
<td>Explicit instantiation of class template members</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="547">
<td><a href="https://cplusplus.github.io/CWG/issues/547.html">547</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>C++11</td>
<td>Partial specialization on member function types</td>
<td class="full" align="center">Clang 3.2</td>
</tr>
<tr id="548">
<td><a href="https://cplusplus.github.io/CWG/issues/548.html">548</a></td>
+ <td>[<a href="https://wg21.link/dcl.meaning">dcl.meaning</a>]</td>
<td>dup</td>
<td><I>qualified-id</I>s in declarations</td>
<td class="full" align="center">Duplicate of <a href="#482">482</a></td>
</tr>
<tr class="open" id="549">
<td><a href="https://cplusplus.github.io/CWG/issues/549.html">549</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial.match">temp.spec.partial.match</a>]</td>
<td>drafting</td>
<td>Non-deducible parameters in partial specializations</td>
<td align="center">Not resolved</td>
</tr>
<tr id="550">
<td><a href="https://cplusplus.github.io/CWG/issues/550.html">550</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>dup</td>
<td>Pointer to array of unknown bound in parameter declarations</td>
<td class="full" align="center">Duplicate of <a href="#393">393</a></td>
</tr>
<tr id="551">
<td><a href="https://cplusplus.github.io/CWG/issues/551.html">551</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>CD1</td>
<td>When is <TT>inline</TT> permitted in an explicit instantiation?</td>
<td class="full" align="center">Clang 2.7 (C++11 onwards)</td>
</tr>
<tr id="552">
<td><a href="https://cplusplus.github.io/CWG/issues/552.html">552</a></td>
+ <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>
<td>NAD</td>
<td>Use of <TT>typename</TT> in the type in a non-type <I>parameter-declaration</I></td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="553">
<td><a href="https://cplusplus.github.io/CWG/issues/553.html">553</a></td>
+ <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>
<td>NAD</td>
<td>Problems with friend allocation and deallocation functions</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="554">
<td><a href="https://cplusplus.github.io/CWG/issues/554.html">554</a></td>
+ <td>[<a href="https://wg21.link/basic.scope">basic.scope</a>]</td>
<td>CD6</td>
<td>Definition of &#8220;declarative region&#8221; and &#8220;scope&#8221;</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="555">
<td><a href="https://cplusplus.github.io/CWG/issues/555.html">555</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup">basic.lookup</a>]</td>
<td>CD5</td>
<td>Pseudo-destructor name lookup</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="556">
<td><a href="https://cplusplus.github.io/CWG/issues/556.html">556</a></td>
+ <td>[<a href="https://wg21.link/expr.assign">expr.assign</a>]</td>
<td>CD2</td>
<td>Conflicting requirements for acceptable aliasing</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="557">
<td><a href="https://cplusplus.github.io/CWG/issues/557.html">557</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>CD1</td>
<td>Does argument-dependent lookup cause template instantiation?</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="558">
<td><a href="https://cplusplus.github.io/CWG/issues/558.html">558</a></td>
+ <td>[<a href="https://wg21.link/lex.charset">lex.charset</a>]</td>
<td>CD1</td>
<td>Excluded characters in universal character names</td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="559">
<td><a href="https://cplusplus.github.io/CWG/issues/559.html">559</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>CD1</td>
<td>Editing error in issue 382 resolution</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="560">
<td><a href="https://cplusplus.github.io/CWG/issues/560.html">560</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>NAD</td>
<td>Use of the <TT>typename</TT> keyword in return types</td>
<td class="full" align="center">Clang 16</td>
</tr>
<tr id="561">
<td><a href="https://cplusplus.github.io/CWG/issues/561.html">561</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.candidate">temp.dep.candidate</a>]</td>
<td>CD2</td>
<td>Internal linkage functions in dependent name lookup</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="562">
<td><a href="https://cplusplus.github.io/CWG/issues/562.html">562</a></td>
+ <td>[<a href="https://wg21.link/class.qual">class.qual</a>]</td>
<td>CD6</td>
<td><I>qualified-id</I>s in non-expression contexts</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="563">
<td><a href="https://cplusplus.github.io/CWG/issues/563.html">563</a></td>
+ <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>
<td>CD6</td>
<td>Linkage specification for objects</td>
<td class="full" align="center">Clang 3.3</td>
</tr>
<tr id="564">
<td><a href="https://cplusplus.github.io/CWG/issues/564.html">564</a></td>
+ <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>
<td>CD2</td>
<td>Agreement of language linkage or <I>linkage-specification</I>s?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="565">
<td><a href="https://cplusplus.github.io/CWG/issues/565.html">565</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>CD3</td>
<td>Conflict rules for <I>using-declaration</I>s naming function templates</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="566">
<td><a href="https://cplusplus.github.io/CWG/issues/566.html">566</a></td>
+ <td>[<a href="https://wg21.link/conv.fpint">conv.fpint</a>]</td>
<td>NAD</td>
<td>Conversion of negative floating point values to integer type</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="567">
<td><a href="https://cplusplus.github.io/CWG/issues/567.html">567</a></td>
+ <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>
<td>NAD</td>
<td>Can <TT>size_t</TT> and <TT>ptrdiff_t</TT> be larger than <TT>long</TT>?</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="568">
<td><a href="https://cplusplus.github.io/CWG/issues/568.html">568</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>CD1</td>
<td>Definition of POD is too strict</td>
<td class="full" align="center">Clang 3.0 (C++11 onwards)</td>
</tr>
<tr id="569">
<td><a href="https://cplusplus.github.io/CWG/issues/569.html">569</a></td>
+ <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>
<td>CD2</td>
<td>Spurious semicolons at namespace scope should be allowed</td>
<td class="full" align="center">Clang 2.7 (C++11 onwards)</td>
</tr>
<tr id="570">
<td><a href="https://cplusplus.github.io/CWG/issues/570.html">570</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD2</td>
<td>Are references subject to the ODR?</td>
<td class="na" align="center">Duplicate of <a href="#633">633</a></td>
</tr>
<tr id="571">
<td><a href="https://cplusplus.github.io/CWG/issues/571.html">571</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>CD2</td>
<td>References declared <TT>const</TT></td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="572">
<td><a href="https://cplusplus.github.io/CWG/issues/572.html">572</a></td>
+ <td>[<a href="https://wg21.link/conv">conv</a>]</td>
<td>C++11</td>
<td>Standard conversions for non-built-in types</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="573">
<td><a href="https://cplusplus.github.io/CWG/issues/573.html">573</a></td>
+ <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>
<td>C++11</td>
<td>Conversions between function pointers and <TT>void*</TT></td>
<td class="none" align="center">No</td>
</tr>
<tr id="574">
<td><a href="https://cplusplus.github.io/CWG/issues/574.html">574</a></td>
+ <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>
<td>NAD</td>
<td>Definition of &#8220;copy assignment operator&#8221;</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="575">
<td><a href="https://cplusplus.github.io/CWG/issues/575.html">575</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>C++11</td>
<td>Criteria for deduction failure</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="576">
<td><a href="https://cplusplus.github.io/CWG/issues/576.html">576</a></td>
+ <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>
<td>CD2</td>
<td>Typedefs in function definitions</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="577">
<td><a href="https://cplusplus.github.io/CWG/issues/577.html">577</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>CD3</td>
<td><TT>void</TT> in an empty parameter list</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="578">
<td><a href="https://cplusplus.github.io/CWG/issues/578.html">578</a></td>
+ <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>
<td>CD6</td>
<td>Phase 1 replacement of characters with <I>universal-character-name</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="579">
<td><a href="https://cplusplus.github.io/CWG/issues/579.html">579</a></td>
+ <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>
<td>open</td>
<td>What is a &#8220;nested&#8221; <TT>&gt;</TT> or <TT>&gt;&gt;</TT>?</td>
<td align="center">Not resolved</td>
</tr>
<tr id="580">
<td><a href="https://cplusplus.github.io/CWG/issues/580.html">580</a></td>
+ <td>[<a href="https://wg21.link/class.access">class.access</a>]</td>
<td>C++11</td>
<td>Access in <I>template-parameter</I>s of member and friend definitions</td>
<td class="partial" align="center">Partial</td>
</tr>
<tr id="581">
<td><a href="https://cplusplus.github.io/CWG/issues/581.html">581</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.explicit">temp.arg.explicit</a>]</td>
<td>CD5</td>
<td>Can a templated constructor be explicitly instantiated or specialized?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="582">
<td><a href="https://cplusplus.github.io/CWG/issues/582.html">582</a></td>
+ <td>[<a href="https://wg21.link/temp.mem">temp.mem</a>]</td>
<td>CD1</td>
<td>Template conversion functions</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="583">
<td><a href="https://cplusplus.github.io/CWG/issues/583.html">583</a></td>
+ <td>[<a href="https://wg21.link/expr.rel">expr.rel</a>]</td>
<td>CD3</td>
<td>Relational pointer comparisons against the null pointer constant</td>
<td class="full" align="center">Clang 4</td>
</tr>
<tr id="584">
<td><a href="https://cplusplus.github.io/CWG/issues/584.html">584</a></td>
+ <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>
<td>NAD</td>
<td>Unions and aliasing</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="585">
<td><a href="https://cplusplus.github.io/CWG/issues/585.html">585</a></td>
+ <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>
<td>NAD</td>
<td>Friend template template parameters</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="586">
<td><a href="https://cplusplus.github.io/CWG/issues/586.html">586</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>NAD</td>
<td>Default <I>template-argument</I>s and template argument deduction</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="587">
<td><a href="https://cplusplus.github.io/CWG/issues/587.html">587</a></td>
+ <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>
<td>CD2</td>
<td>Lvalue operands of a conditional expression differing only in cv-qualification</td>
<td class="full" align="center">Clang 3.2</td>
</tr>
<tr id="588">
<td><a href="https://cplusplus.github.io/CWG/issues/588.html">588</a></td>
+ <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>
<td>CD2</td>
<td>Searching dependent bases of classes local to function templates</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="589">
<td><a href="https://cplusplus.github.io/CWG/issues/589.html">589</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>CD2</td>
<td>Direct binding of class and array rvalues in reference initialization</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="590">
<td><a href="https://cplusplus.github.io/CWG/issues/590.html">590</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>C++11</td>
<td>Nested classes and the &#8220;current instantiation&#8221;</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="591">
<td><a href="https://cplusplus.github.io/CWG/issues/591.html">591</a></td>
+ <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>
<td>CD4</td>
<td>When a dependent base class is the current instantiation</td>
<td class="full" align="center">Clang 20</td>
</tr>
<tr id="592">
<td><a href="https://cplusplus.github.io/CWG/issues/592.html">592</a></td>
+ <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>
<td>CD1</td>
<td>Exceptions during construction of local static objects</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="593">
<td><a href="https://cplusplus.github.io/CWG/issues/593.html">593</a></td>
+ <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>
<td>NAD</td>
<td>Falling off the end of a destructor's <I>function-try-block</I> handler</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="594">
<td><a href="https://cplusplus.github.io/CWG/issues/594.html">594</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>CD1</td>
<td>Coordinating issues 119 and 404 with delegating constructors</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="595">
<td><a href="https://cplusplus.github.io/CWG/issues/595.html">595</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>dup</td>
<td>Exception specifications in templates instantiated from class bodies</td>
<td class="full" align="center">Duplicate of <a href="#1330">1330</a></td>
</tr>
<tr id="596">
<td><a href="https://cplusplus.github.io/CWG/issues/596.html">596</a></td>
+ <td>[<a href="https://wg21.link/except.unexpected">except.unexpected</a>]</td>
<td>NAD</td>
<td>Replacing an exception object</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="597">
<td><a href="https://cplusplus.github.io/CWG/issues/597.html">597</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>CD3</td>
<td>Conversions applied to out-of-lifetime non-POD lvalues</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="598">
<td><a href="https://cplusplus.github.io/CWG/issues/598.html">598</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>CD2</td>
<td>Associated namespaces of overloaded functions and function templates</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="599">
<td><a href="https://cplusplus.github.io/CWG/issues/599.html">599</a></td>
+ <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>
<td>CD2</td>
<td>Deleting a null function pointer</td>
<td class="partial" align="center">Partial</td>
</tr>
<tr id="600">
<td><a href="https://cplusplus.github.io/CWG/issues/600.html">600</a></td>
+ <td>[<a href="https://wg21.link/class.access">class.access</a>]</td>
<td>CD6</td>
<td>Does access control apply to members or to names?</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="601">
<td><a href="https://cplusplus.github.io/CWG/issues/601.html">601</a></td>
+ <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>
<td>CD2</td>
<td>Type of literals in preprocessing expressions</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="602">
<td><a href="https://cplusplus.github.io/CWG/issues/602.html">602</a></td>
+ <td>[<a href="https://wg21.link/temp.local">temp.local</a>]</td>
<td>C++11</td>
<td>When is the injected-class-name of a class template a template?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="603">
<td><a href="https://cplusplus.github.io/CWG/issues/603.html">603</a></td>
+ <td>[<a href="https://wg21.link/temp.type">temp.type</a>]</td>
<td>CD1</td>
<td>Type equivalence and unsigned overflow</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="604">
<td><a href="https://cplusplus.github.io/CWG/issues/604.html">604</a></td>
+ <td>[<a href="https://wg21.link/over.match.ctor">over.match.ctor</a>]</td>
<td>CD2</td>
<td>Argument list for overload resolution in copy-initialization</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="605">
<td><a href="https://cplusplus.github.io/CWG/issues/605.html">605</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>C++11</td>
<td>Linkage of explicit specializations</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="606">
<td><a href="https://cplusplus.github.io/CWG/issues/606.html">606</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>CD1</td>
<td>Template argument deduction for rvalue references</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="607">
<td><a href="https://cplusplus.github.io/CWG/issues/607.html">607</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>CD6</td>
<td>Lookup of <I>mem-initializer-id</I>s</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="608">
<td><a href="https://cplusplus.github.io/CWG/issues/608.html">608</a></td>
+ <td>[<a href="https://wg21.link/class.virtual">class.virtual</a>]</td>
<td>CD2</td>
<td>Determining the final overrider of a virtual function</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="609">
<td><a href="https://cplusplus.github.io/CWG/issues/609.html">609</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.cv">dcl.type.cv</a>]</td>
<td>CD4</td>
<td>What is a &#8220;top-level&#8221; cv-qualifier?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="610">
<td><a href="https://cplusplus.github.io/CWG/issues/610.html">610</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>
<td>NAD</td>
<td>Computing the negative of <TT>0U</TT></td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="611">
<td><a href="https://cplusplus.github.io/CWG/issues/611.html">611</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>CD2</td>
<td>Zero-initializing references</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="612">
<td><a href="https://cplusplus.github.io/CWG/issues/612.html">612</a></td>
+ <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>
<td>CD2</td>
<td>Requirements on a conforming implementation</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="613">
<td><a href="https://cplusplus.github.io/CWG/issues/613.html">613</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>CD1</td>
<td>Unevaluated uses of non-static class members</td>
<td class="full" align="center">Clang 3.1 (C++11 onwards)</td>
</tr>
<tr id="614">
<td><a href="https://cplusplus.github.io/CWG/issues/614.html">614</a></td>
+ <td>[<a href="https://wg21.link/expr.mul">expr.mul</a>]</td>
<td>CD1</td>
<td>Results of integer <TT>/</TT> and <TT>%</TT></td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="615">
<td><a href="https://cplusplus.github.io/CWG/issues/615.html">615</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>C++11</td>
<td>Incorrect description of variables that can be initialized</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="616">
<td><a href="https://cplusplus.github.io/CWG/issues/616.html">616</a></td>
+ <td>[<a href="https://wg21.link/intro.defs">intro.defs</a>]</td>
<td>CD3</td>
<td>Definition of &#8220;indeterminate value&#8221;</td>
<td class="full" align="center">Clang 4</td>
</tr>
<tr id="617">
<td><a href="https://cplusplus.github.io/CWG/issues/617.html">617</a></td>
+ <td>[<a href="https://wg21.link/conv.lval">conv.lval</a>]</td>
<td>NAD</td>
<td>Lvalue-to-rvalue conversions of uninitialized <TT>char</TT> objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="618">
<td><a href="https://cplusplus.github.io/CWG/issues/618.html">618</a></td>
+ <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>
<td>CD2</td>
<td>Casts in preprocessor conditional expressions</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="619">
<td><a href="https://cplusplus.github.io/CWG/issues/619.html">619</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>C++11</td>
<td>Completeness of array types</td>
<td class="full" align="center">Clang 3.4</td>
</tr>
<tr id="620">
<td><a href="https://cplusplus.github.io/CWG/issues/620.html">620</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>CD1</td>
<td>Declaration order in layout-compatible POD structs</td>
<td class="full" align="center">Duplicate of <a href="#568">568</a></td>
</tr>
<tr id="621">
<td><a href="https://cplusplus.github.io/CWG/issues/621.html">621</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>C++11</td>
<td>Template argument deduction from function return types</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="622">
<td><a href="https://cplusplus.github.io/CWG/issues/622.html">622</a></td>
+ <td>[<a href="https://wg21.link/expr.rel">expr.rel</a>]</td>
<td>NAD</td>
<td>Relational comparisons of arbitrary pointers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="623">
<td><a href="https://cplusplus.github.io/CWG/issues/623.html">623</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic.deallocation">basic.stc.dynamic.deallocation</a>]</td>
<td>CD3</td>
<td>Use of pointers to deallocated storage</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="624">
<td><a href="https://cplusplus.github.io/CWG/issues/624.html">624</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD1</td>
<td>Overflow in calculating size of allocation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="625">
<td><a href="https://cplusplus.github.io/CWG/issues/625.html">625</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>CD2</td>
<td>Use of <TT>auto</TT> as a <I>template-argument</I></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="626">
<td><a href="https://cplusplus.github.io/CWG/issues/626.html">626</a></td>
+ <td>[<a href="https://wg21.link/cpp.stringize">cpp.stringize</a>]</td>
<td>CD2</td>
<td>Preprocessor string literals</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="627">
<td><a href="https://cplusplus.github.io/CWG/issues/627.html">627</a></td>
+ <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>
<td>NAD</td>
<td>Values behaving as types</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="628">
<td><a href="https://cplusplus.github.io/CWG/issues/628.html">628</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>CD2</td>
<td>The values of an enumeration with no enumerator</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="629">
<td><a href="https://cplusplus.github.io/CWG/issues/629.html">629</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>CD1</td>
<td><TT>auto</TT> parsing ambiguity</td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="630">
<td><a href="https://cplusplus.github.io/CWG/issues/630.html">630</a></td>
+ <td>[<a href="https://wg21.link/lex.charset">lex.charset</a>]</td>
<td>CD2</td>
<td>Equality of narrow and wide character values in the basic character set</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="631">
<td><a href="https://cplusplus.github.io/CWG/issues/631.html">631</a></td>
+ <td>[<a href="https://wg21.link/stmt.if">stmt.if</a>]</td>
<td>CD3</td>
<td>Jumping into a &#8220;then&#8221; clause</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="632">
<td><a href="https://cplusplus.github.io/CWG/issues/632.html">632</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>CD1</td>
<td>Brace-enclosed initializer for scalar member of aggregate</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="633">
<td><a href="https://cplusplus.github.io/CWG/issues/633.html">633</a></td>
+ <td>[<a href="https://wg21.link/basic.pre">basic.pre</a>]</td>
<td>CD2</td>
<td>Specifications for variables that should also apply to references</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="634">
<td><a href="https://cplusplus.github.io/CWG/issues/634.html">634</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>CD1</td>
<td>Conditionally-supported behavior for non-POD objects passed to ellipsis redux</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="635">
<td><a href="https://cplusplus.github.io/CWG/issues/635.html">635</a></td>
+ <td>[<a href="https://wg21.link/class.qual">class.qual</a>]</td>
<td>NAD</td>
<td>Names of constructors and destructors of templates</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="636">
<td><a href="https://cplusplus.github.io/CWG/issues/636.html">636</a></td>
+ <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>
<td>CD4</td>
<td>Dynamic type of objects and aliasing</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="637">
<td><a href="https://cplusplus.github.io/CWG/issues/637.html">637</a></td>
+ <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>
<td>CD1</td>
<td>Sequencing rules and example disagree</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="638">
<td><a href="https://cplusplus.github.io/CWG/issues/638.html">638</a></td>
+ <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>
<td>CD2</td>
<td>Explicit specialization and friendship</td>
<td class="none" align="center">No</td>
</tr>
<tr id="639">
<td><a href="https://cplusplus.github.io/CWG/issues/639.html">639</a></td>
+ <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>
<td>CD1</td>
<td>What makes side effects &#8220;different&#8221; from one another?</td>
<td class="full" align="center">Clang 3.3</td>
</tr>
<tr id="640">
<td><a href="https://cplusplus.github.io/CWG/issues/640.html">640</a></td>
+ <td>[<a href="https://wg21.link/basic.start.dynamic">basic.start.dynamic</a>]</td>
<td>NAD</td>
<td>Accessing destroyed local objects of static storage duration</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="641">
<td><a href="https://cplusplus.github.io/CWG/issues/641.html">641</a></td>
+ <td>[<a href="https://wg21.link/over.match.viable">over.match.viable</a>]</td>
<td>CD2</td>
<td>Overload resolution and conversion-to-same-type operators</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="642">
<td><a href="https://cplusplus.github.io/CWG/issues/642.html">642</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.block">basic.scope.block</a>]</td>
<td>CD2</td>
<td>Definition and use of &#8220;block scope&#8221; and &#8220;local scope&#8221;</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="643">
<td><a href="https://cplusplus.github.io/CWG/issues/643.html">643</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>
<td>NAD</td>
<td>Use of <TT>decltype</TT> in a class <I>member-specification</I></td>
<td class="full" align="center">Clang 3.2</td>
</tr>
<tr id="644">
<td><a href="https://cplusplus.github.io/CWG/issues/644.html">644</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>CD1</td>
<td>Should a trivial class type be a literal type?</td>
<td class="partial" align="center">Partial</td>
</tr>
<tr id="645">
<td><a href="https://cplusplus.github.io/CWG/issues/645.html">645</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>CD2</td>
<td>Are bit-field and non-bit-field members layout compatible?</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="646">
<td><a href="https://cplusplus.github.io/CWG/issues/646.html">646</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>NAD</td>
<td>Can a class with a constexpr copy constructor be a literal type?</td>
<td class="unknown-superseded" align="center">Superseded by <a href="#981">981</a></td>
</tr>
<tr id="647">
<td><a href="https://cplusplus.github.io/CWG/issues/647.html">647</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>CD1</td>
<td>Non-constexpr instances of constexpr constructor templates</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="648">
<td><a href="https://cplusplus.github.io/CWG/issues/648.html">648</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>CD1</td>
<td>Constant expressions in constexpr initializers</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="649">
<td><a href="https://cplusplus.github.io/CWG/issues/649.html">649</a></td>
+ <td>[<a href="https://wg21.link/basic.align">basic.align</a>]</td>
<td>CD1</td>
<td>Optionally ill-formed extended alignment requests</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="650">
<td><a href="https://cplusplus.github.io/CWG/issues/650.html">650</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>CD2</td>
<td>Order of destruction for temporaries bound to the returned value of a function</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="651">
<td><a href="https://cplusplus.github.io/CWG/issues/651.html">651</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>
<td>CD1</td>
<td>Problems in <TT>decltype</TT> specification and examples</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="652">
<td><a href="https://cplusplus.github.io/CWG/issues/652.html">652</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD2</td>
<td>Compile-time evaluation of floating-point expressions</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="653">
<td><a href="https://cplusplus.github.io/CWG/issues/653.html">653</a></td>
+ <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>
<td>CD2</td>
<td>Copy assignment of unions</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="654">
<td><a href="https://cplusplus.github.io/CWG/issues/654.html">654</a></td>
+ <td>[<a href="https://wg21.link/conv.ptr">conv.ptr</a>]</td>
<td>CD1</td>
<td>Conversions to and from <TT>nullptr_t</TT></td>
<td class="full-superseded" align="center">Superseded by <a href="#1423">1423</a></td>
</tr>
<tr id="655">
<td><a href="https://cplusplus.github.io/CWG/issues/655.html">655</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>C++11</td>
<td>Initialization not specified for forwarding constructors</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="656">
<td><a href="https://cplusplus.github.io/CWG/issues/656.html">656</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>CD2</td>
<td>Direct binding to the result of a conversion operator</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="657">
<td><a href="https://cplusplus.github.io/CWG/issues/657.html">657</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>CD2</td>
<td>Abstract class parameter in synthesized declaration</td>
<td class="partial" align="center">Partial</td>
</tr>
<tr id="658">
<td><a href="https://cplusplus.github.io/CWG/issues/658.html">658</a></td>
+ <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>
<td>CD2</td>
<td>Defining <TT>reinterpret_cast</TT> for pointer types</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="659">
<td><a href="https://cplusplus.github.io/CWG/issues/659.html">659</a></td>
+ <td>[<a href="https://wg21.link/expr.alignof">expr.alignof</a>]</td>
<td>CD1</td>
<td>Alignment of function types</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="660">
<td><a href="https://cplusplus.github.io/CWG/issues/660.html">660</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>CD1</td>
<td>Unnamed scoped enumerations</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="661">
<td><a href="https://cplusplus.github.io/CWG/issues/661.html">661</a></td>
+ <td>[<a href="https://wg21.link/expr.rel">expr.rel</a>]</td>
<td>CD1</td>
<td>Semantics of arithmetic comparisons</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="662">
<td><a href="https://cplusplus.github.io/CWG/issues/662.html">662</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>NAD</td>
<td>Forming a pointer to a reference type</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="663">
<td><a href="https://cplusplus.github.io/CWG/issues/663.html">663</a></td>
+ <td>[<a href="https://wg21.link/extendid">extendid</a>]</td>
<td>CD1</td>
<td>Valid Cyrillic identifier characters</td>
<td class="na" align="center">Superseded by <a href="https://wg21.link/P1949">P1949</a></td>
</tr>
<tr id="664">
<td><a href="https://cplusplus.github.io/CWG/issues/664.html">664</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>CD2</td>
<td>Direct binding of references to non-class rvalue references</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="665">
<td><a href="https://cplusplus.github.io/CWG/issues/665.html">665</a></td>
+ <td>[<a href="https://wg21.link/expr.dynamic.cast">expr.dynamic.cast</a>]</td>
<td>CD2</td>
<td>Problems in the specification of <TT>dynamic_cast</TT></td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="666">
<td><a href="https://cplusplus.github.io/CWG/issues/666.html">666</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>CD1</td>
<td>Dependent <I>qualified-id</I>s without the <TT>typename</TT> keyword</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="667">
<td><a href="https://cplusplus.github.io/CWG/issues/667.html">667</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>CD2</td>
<td>Trivial special member functions that cannot be implicitly defined</td>
<td class="full" align="center">Clang 8</td>
</tr>
<tr id="668">
<td><a href="https://cplusplus.github.io/CWG/issues/668.html">668</a></td>
+ <td>[<a href="https://wg21.link/except.terminate">except.terminate</a>]</td>
<td>CD2</td>
<td>Throwing an exception from the destructor of a local static object</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="669">
<td><a href="https://cplusplus.github.io/CWG/issues/669.html">669</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>
<td>NAD</td>
<td>Confusing specification of the meaning of <TT>decltype</TT></td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="670">
<td><a href="https://cplusplus.github.io/CWG/issues/670.html">670</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>CD4</td>
<td>Copy initialization via derived-to-base conversion in the second step</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="671">
<td><a href="https://cplusplus.github.io/CWG/issues/671.html">671</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>CD1</td>
<td>Explicit conversion from a scoped enumeration type to integral type</td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="672">
<td><a href="https://cplusplus.github.io/CWG/issues/672.html">672</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD2</td>
<td>Sequencing of initialization in <I>new-expression</I>s</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="673">
<td><a href="https://cplusplus.github.io/CWG/issues/673.html">673</a></td>
+ <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>
<td>NAD</td>
<td>Injection of names from <I>elaborated-type-specifier</I>s in <TT>friend</TT> declarations</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="674">
<td><a href="https://cplusplus.github.io/CWG/issues/674.html">674</a></td>
+ <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>
<td>C++11</td>
<td>&#8220;matching specialization&#8221; for a friend declaration</td>
<td class="full" align="center">Clang 8</td>
</tr>
<tr id="675">
<td><a href="https://cplusplus.github.io/CWG/issues/675.html">675</a></td>
+ <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>
<td>CD3</td>
<td>Signedness of bit-field with typedef or template parameter type</td>
<td class="unknown" align="center">Duplicate of <a href="#739">739</a></td>
</tr>
<tr id="676">
<td><a href="https://cplusplus.github.io/CWG/issues/676.html">676</a></td>
+ <td>[<a href="https://wg21.link/basic.def">basic.def</a>]</td>
<td>C++11</td>
<td><I>static_assert-declaration</I>s and general requirements for declarations</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="677">
<td><a href="https://cplusplus.github.io/CWG/issues/677.html">677</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>CD1</td>
<td>Deleted <TT>operator delete</TT> and virtual destructors</td>
<td class="none" align="center">No</td>
</tr>
<tr id="678">
<td><a href="https://cplusplus.github.io/CWG/issues/678.html">678</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>C++11</td>
<td>Language linkage of member function parameter types and the ODR</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="679">
<td><a href="https://cplusplus.github.io/CWG/issues/679.html">679</a></td>
+ <td>[<a href="https://wg21.link/temp.type">temp.type</a>]</td>
<td>CD1</td>
<td>Equivalence of <I>template-id</I>s and operator function templates</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="680">
<td><a href="https://cplusplus.github.io/CWG/issues/680.html">680</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>CD2</td>
<td>What is a move constructor?</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="681">
<td><a href="https://cplusplus.github.io/CWG/issues/681.html">681</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>CD1</td>
<td>Restrictions on declarators with late-specified return types</td>
<td class="partial" align="center">Partial</td>
</tr>
<tr id="682">
<td><a href="https://cplusplus.github.io/CWG/issues/682.html">682</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>
<td>CD5</td>
<td>Missing description of lookup of template aliases</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="683">
<td><a href="https://cplusplus.github.io/CWG/issues/683.html">683</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>CD1</td>
<td>Requirements for trivial subobject special functions</td>
<td class="full" align="center">Clang 3.3</td>
</tr>
<tr id="684">
<td><a href="https://cplusplus.github.io/CWG/issues/684.html">684</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD1</td>
<td>Constant expressions involving the address of an automatic variable</td>
<td class="unknown-superseded" align="center">Superseded by <a href="#1454">1454</a></td>
</tr>
<tr id="685">
<td><a href="https://cplusplus.github.io/CWG/issues/685.html">685</a></td>
+ <td>[<a href="https://wg21.link/conv.prom">conv.prom</a>]</td>
<td>CD2</td>
<td>Integral promotion of enumeration ignores fixed underlying type</td>
<td class="full" align="center">Clang 10</td>
</tr>
<tr id="686">
<td><a href="https://cplusplus.github.io/CWG/issues/686.html">686</a></td>
+ <td>[<a href="https://wg21.link/dcl.name">dcl.name</a>]</td>
<td>CD1</td>
<td>Type declarations/definitions in <I>type-specifier-seq</I>s and <I>type-id</I>s</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="687">
<td><a href="https://cplusplus.github.io/CWG/issues/687.html">687</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>
<td>NAD</td>
<td><TT>template</TT> keyword with <I>unqualified-id</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="688">
<td><a href="https://cplusplus.github.io/CWG/issues/688.html">688</a></td>
+ <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>
<td>CD1</td>
<td>Constexpr constructors and static initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="689">
<td><a href="https://cplusplus.github.io/CWG/issues/689.html">689</a></td>
+ <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>
<td>CD5</td>
<td>Maximum values of signed and unsigned integers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="690">
<td><a href="https://cplusplus.github.io/CWG/issues/690.html">690</a></td>
+ <td>[<a href="https://wg21.link/intro.defs">intro.defs</a>]</td>
<td>CD2</td>
<td>The dynamic type of an rvalue reference</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="691">
<td><a href="https://cplusplus.github.io/CWG/issues/691.html">691</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>C++11</td>
<td>Template parameter packs in class template partial specializations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="692">
<td><a href="https://cplusplus.github.io/CWG/issues/692.html">692</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>C++11</td>
<td>Partial ordering of variadic class template partial specializations</td>
<td class="full" align="center">Clang 16</td>
</tr>
<tr id="693">
<td><a href="https://cplusplus.github.io/CWG/issues/693.html">693</a></td>
+ <td>[<a href="https://wg21.link/conv.array">conv.array</a>]</td>
<td>CD2</td>
<td>New string types and deprecated conversion</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="694">
<td><a href="https://cplusplus.github.io/CWG/issues/694.html">694</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>C++11</td>
<td>Zero- and value-initialization of union objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="695">
<td><a href="https://cplusplus.github.io/CWG/issues/695.html">695</a></td>
+ <td>[<a href="https://wg21.link/expr">expr</a>]</td>
<td>CD2</td>
<td>Compile-time calculation errors in constexpr functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="696">
<td><a href="https://cplusplus.github.io/CWG/issues/696.html">696</a></td>
+ <td>[<a href="https://wg21.link/class.local">class.local</a>]</td>
<td>C++11</td>
<td>Use of block-scope constants in local classes</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr class="open" id="697">
<td><a href="https://cplusplus.github.io/CWG/issues/697.html">697</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>open</td>
<td>Deduction rules apply to more than functions</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="698">
<td><a href="https://cplusplus.github.io/CWG/issues/698.html">698</a></td>
+ <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>
<td>open</td>
<td>The definition of &#8220;sequenced before&#8221; is too narrow</td>
<td align="center">Not resolved</td>
</tr>
<tr id="699">
<td><a href="https://cplusplus.github.io/CWG/issues/699.html">699</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>CD2</td>
<td>Must constexpr member functions be defined in the class <I>member-specification</I>?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="700">
<td><a href="https://cplusplus.github.io/CWG/issues/700.html">700</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>C++11</td>
<td>Constexpr member functions of class templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="701">
<td><a href="https://cplusplus.github.io/CWG/issues/701.html">701</a></td>
+ <td>[<a href="https://wg21.link/dcl.array">dcl.array</a>]</td>
<td>CD2</td>
<td>When is the array-to-pointer conversion applied?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="702">
<td><a href="https://cplusplus.github.io/CWG/issues/702.html">702</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>CD2</td>
<td>Preferring conversion to <TT>std::initializer_list</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="703">
<td><a href="https://cplusplus.github.io/CWG/issues/703.html">703</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD2</td>
<td>Narrowing for literals that cannot be exactly represented</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="704">
<td><a href="https://cplusplus.github.io/CWG/issues/704.html">704</a></td>
+ <td>[<a href="https://wg21.link/over.match.call">over.match.call</a>]</td>
<td>CD2</td>
<td>To which <I>postfix-expression</I>s does overload resolution apply?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="705">
<td><a href="https://cplusplus.github.io/CWG/issues/705.html">705</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>CD2</td>
<td>Suppressing argument-dependent lookup via parentheses</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="706">
<td><a href="https://cplusplus.github.io/CWG/issues/706.html">706</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>NAD</td>
<td>Use of <TT>auto</TT> with rvalue references</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="707">
<td><a href="https://cplusplus.github.io/CWG/issues/707.html">707</a></td>
+ <td>[<a href="https://wg21.link/conv.fpint">conv.fpint</a>]</td>
<td>CD2</td>
<td>Undefined behavior in integral-to-floating conversions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="708">
<td><a href="https://cplusplus.github.io/CWG/issues/708.html">708</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>
<td>open</td>
<td>Partial specialization of member templates of class templates</td>
<td align="center">Not resolved</td>
</tr>
<tr id="709">
<td><a href="https://cplusplus.github.io/CWG/issues/709.html">709</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>C++11</td>
<td>Enumeration names as <I>nested-name-specifier</I>s in deduction failure</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="710">
<td><a href="https://cplusplus.github.io/CWG/issues/710.html">710</a></td>
+ <td>[<a href="https://wg21.link/class.cdtor">class.cdtor</a>]</td>
<td>CD2</td>
<td>Data races during construction</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="711">
<td><a href="https://cplusplus.github.io/CWG/issues/711.html">711</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>CD2</td>
<td><TT>auto</TT> with <I>braced-init-list</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="712">
<td><a href="https://cplusplus.github.io/CWG/issues/712.html">712</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD3</td>
<td>Are integer constant operands of a <I>conditional-expression</I> &#8220;used?&#8221;</td>
<td class="partial" align="center">Partial</td>
</tr>
<tr id="713">
<td><a href="https://cplusplus.github.io/CWG/issues/713.html">713</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>CD2</td>
<td>Unclear note about cv-qualified function types</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="714">
<td><a href="https://cplusplus.github.io/CWG/issues/714.html">714</a></td>
+ <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>
<td>CD2</td>
<td>Static const data members and <I>braced-init-list</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="715">
<td><a href="https://cplusplus.github.io/CWG/issues/715.html">715</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD2</td>
<td>Class member access constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="716">
<td><a href="https://cplusplus.github.io/CWG/issues/716.html">716</a></td>
+ <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>
<td>CD2</td>
<td>Specifications that should apply only to non-static union data members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="717">
<td><a href="https://cplusplus.github.io/CWG/issues/717.html">717</a></td>
+ <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>
<td>CD2</td>
<td>Unintentional restrictions on the use of <TT>thread_local</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="718">
<td><a href="https://cplusplus.github.io/CWG/issues/718.html">718</a></td>
+ <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>
<td>NAD</td>
<td>Non-class, non-function friend declarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="719">
<td><a href="https://cplusplus.github.io/CWG/issues/719.html">719</a></td>
+ <td>[<a href="https://wg21.link/basic.pre">basic.pre</a>]</td>
<td>CD2</td>
<td>Specifications for <I>operator-function-id</I> that should also apply to <I>literal-operator-id</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="720">
<td><a href="https://cplusplus.github.io/CWG/issues/720.html">720</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>CD2</td>
<td>Need examples of <I>lambda-expression</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="721">
<td><a href="https://cplusplus.github.io/CWG/issues/721.html">721</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD2</td>
<td>Where must a variable be initialized to be used in a constant expression?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="722">
<td><a href="https://cplusplus.github.io/CWG/issues/722.html">722</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>CD2</td>
<td>Can <TT>nullptr</TT> be passed to an ellipsis?</td>
<td class="full" align="center">Clang 20</td>
</tr>
<tr id="726">
<td><a href="https://cplusplus.github.io/CWG/issues/726.html">726</a></td>
+ <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>
<td>CD2</td>
<td>Atomic and non-atomic objects in the memory model</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="727">
<td><a href="https://cplusplus.github.io/CWG/issues/727.html">727</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>C++17</td>
<td>In-class explicit specializations</td>
<td class="partial" align="center">Partial</td>
</tr>
<tr id="728">
<td><a href="https://cplusplus.github.io/CWG/issues/728.html">728</a></td>
+ <td>[<a href="https://wg21.link/temp">temp</a>]</td>
<td>NAD</td>
<td>Restrictions on local classes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="729">
<td><a href="https://cplusplus.github.io/CWG/issues/729.html">729</a></td>
+ <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>
<td>CD3</td>
<td>Qualification conversions and handlers of reference-to-pointer type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="730">
<td><a href="https://cplusplus.github.io/CWG/issues/730.html">730</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>CD2</td>
<td>Explicit specializations of members of non-template classes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="731">
<td><a href="https://cplusplus.github.io/CWG/issues/731.html">731</a></td>
+ <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>
<td>CD2</td>
<td>Omitted reference qualification of member function type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="732">
<td><a href="https://cplusplus.github.io/CWG/issues/732.html">732</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def">dcl.fct.def</a>]</td>
<td>CD2</td>
<td>Late-specified return types in function definitions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="733">
<td><a href="https://cplusplus.github.io/CWG/issues/733.html">733</a></td>
+ <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>
<td>NAD</td>
<td>Reference qualification of copy assignment operators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="734">
<td><a href="https://cplusplus.github.io/CWG/issues/734.html">734</a></td>
+ <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>
<td>CD2</td>
<td>Are unique addresses required for namespace-scope variables?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="735">
<td><a href="https://cplusplus.github.io/CWG/issues/735.html">735</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic.safety">basic.stc.dynamic.safety</a>]</td>
<td>CD2</td>
<td>Missing case in specification of safely-derived pointers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="736">
<td><a href="https://cplusplus.github.io/CWG/issues/736.html">736</a></td>
+ <td>[<a href="https://wg21.link/dcl.decl">dcl.decl</a>]</td>
<td>NAD</td>
<td>Is the <TT>&amp;</TT> <I>ref-qualifier</I> needed?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="737">
<td><a href="https://cplusplus.github.io/CWG/issues/737.html">737</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.string">dcl.init.string</a>]</td>
<td>CD2</td>
<td>Uninitialized trailing characters in string initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="738">
<td><a href="https://cplusplus.github.io/CWG/issues/738.html">738</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>C++11</td>
<td><TT>constexpr</TT> not permitted by the syntax of constructor declarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="739">
<td><a href="https://cplusplus.github.io/CWG/issues/739.html">739</a></td>
+ <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>
<td>CD3</td>
<td>Signedness of plain bit-fields</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="740">
<td><a href="https://cplusplus.github.io/CWG/issues/740.html">740</a></td>
+ <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>
<td>CD2</td>
<td>Incorrect note on data races</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="741">
<td><a href="https://cplusplus.github.io/CWG/issues/741.html">741</a></td>
+ <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>
<td>C++11</td>
<td>&#8220;plain&#8221; <TT>long long</TT> bit-fields</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="742">
<td><a href="https://cplusplus.github.io/CWG/issues/742.html">742</a></td>
+ <td>[<a href="https://wg21.link/expr.post.incr">expr.post.incr</a>]</td>
<td>open</td>
<td>Postfix increment/decrement with long bit-field operands</td>
<td align="center">Not resolved</td>
</tr>
<tr id="743">
<td><a href="https://cplusplus.github.io/CWG/issues/743.html">743</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>
<td>CD2</td>
<td>Use of <TT>decltype</TT> in a <I>nested-name-specifier</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="744">
<td><a href="https://cplusplus.github.io/CWG/issues/744.html">744</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.template">temp.arg.template</a>]</td>
<td>CD2</td>
<td>Matching template arguments with template template parameters with parameter packs</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="745">
<td><a href="https://cplusplus.github.io/CWG/issues/745.html">745</a></td>
+ <td>[<a href="https://wg21.link/cpp.error">cpp.error</a>]</td>
<td>C++23</td>
<td>Effect of ill-formedness resulting from <TT>#error</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="746">
<td><a href="https://cplusplus.github.io/CWG/issues/746.html">746</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>CD2</td>
<td>Use of <TT>auto</TT> in <I>new-expression</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="747">
<td><a href="https://cplusplus.github.io/CWG/issues/747.html">747</a></td>
+ <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>
<td>dup</td>
<td>Access of protected base classes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="749">
<td><a href="https://cplusplus.github.io/CWG/issues/749.html">749</a></td>
+ <td>[<a href="https://wg21.link/over.built">over.built</a>]</td>
<td>CD2</td>
<td>References to function types with a <I>cv-qualifier</I> or <I>ref-qualifier</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="750">
<td><a href="https://cplusplus.github.io/CWG/issues/750.html">750</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD2</td>
<td>Implementation constraints on reference-only closure objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="751">
<td><a href="https://cplusplus.github.io/CWG/issues/751.html">751</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD2</td>
<td>Deriving from closure classes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="752">
<td><a href="https://cplusplus.github.io/CWG/issues/752.html">752</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>CD2</td>
<td>Name lookup in nested <I>lambda-expression</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="753">
<td><a href="https://cplusplus.github.io/CWG/issues/753.html">753</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>CD2</td>
<td>Array names in lambda capture sets</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="754">
<td><a href="https://cplusplus.github.io/CWG/issues/754.html">754</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>CD2</td>
<td>Lambda expressions in default arguments of block-scope function declarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="755">
<td><a href="https://cplusplus.github.io/CWG/issues/755.html">755</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>CD3</td>
<td>Generalized <I>lambda-capture</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="756">
<td><a href="https://cplusplus.github.io/CWG/issues/756.html">756</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD2</td>
<td>Dropping cv-qualification on members of closure objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="757">
<td><a href="https://cplusplus.github.io/CWG/issues/757.html">757</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>CD2</td>
<td>Types without linkage in declarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="758">
<td><a href="https://cplusplus.github.io/CWG/issues/758.html">758</a></td>
+ <td>[<a href="https://wg21.link/basic.def">basic.def</a>]</td>
<td>C++11</td>
<td>Missing cases of declarations that are not definitions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="759">
<td><a href="https://cplusplus.github.io/CWG/issues/759.html">759</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD2</td>
<td>Destruction of closure objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="760">
<td><a href="https://cplusplus.github.io/CWG/issues/760.html">760</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>
<td>CD2</td>
<td><TT>this</TT> inside a nested class of a non-static member function</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="761">
<td><a href="https://cplusplus.github.io/CWG/issues/761.html">761</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD2</td>
<td>Inferred return type of closure object call operator</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="762">
<td><a href="https://cplusplus.github.io/CWG/issues/762.html">762</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>CD2</td>
<td>Name lookup in the <I>compound-statement</I> of a lambda expression</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="763">
<td><a href="https://cplusplus.github.io/CWG/issues/763.html">763</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD2</td>
<td>Is a closure object's <TT>operator()</TT> inline?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="764">
<td><a href="https://cplusplus.github.io/CWG/issues/764.html">764</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>CD2</td>
<td>Capturing unused variables in a lambda expression</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="765">
<td><a href="https://cplusplus.github.io/CWG/issues/765.html">765</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.spec">dcl.fct.spec</a>]</td>
<td>CD2</td>
<td>Local types in inline functions with external linkage</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="766">
<td><a href="https://cplusplus.github.io/CWG/issues/766.html">766</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>CD2</td>
<td>Where may lambda expressions appear?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="767">
<td><a href="https://cplusplus.github.io/CWG/issues/767.html">767</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>CD2</td>
<td><TT>void</TT> and other unnamed <I>lambda-parameter</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="768">
<td><a href="https://cplusplus.github.io/CWG/issues/768.html">768</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>CD2</td>
<td>Ellipsis in a lambda parameter list</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="769">
<td><a href="https://cplusplus.github.io/CWG/issues/769.html">769</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>CD2</td>
<td>Initialization of closure objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="770">
<td><a href="https://cplusplus.github.io/CWG/issues/770.html">770</a></td>
+ <td>[<a href="https://wg21.link/dcl.decl">dcl.decl</a>]</td>
<td>CD2</td>
<td>Ambiguity in late-specified return type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="771">
<td><a href="https://cplusplus.github.io/CWG/issues/771.html">771</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD2</td>
<td>Move-construction of reference members of closure objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="772">
<td><a href="https://cplusplus.github.io/CWG/issues/772.html">772</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>CD2</td>
<td><I>capture-default</I> in lambdas in local default arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="773">
<td><a href="https://cplusplus.github.io/CWG/issues/773.html">773</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>
<td>C++11</td>
<td>Parentheses in address non-type template arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="774">
<td><a href="https://cplusplus.github.io/CWG/issues/774.html">774</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD2</td>
<td>Can a closure class be a POD?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="775">
<td><a href="https://cplusplus.github.io/CWG/issues/775.html">775</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>CD2</td>
<td>Capturing references to functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="776">
<td><a href="https://cplusplus.github.io/CWG/issues/776.html">776</a></td>
+ <td>[<a href="https://wg21.link/basic.start.dynamic">basic.start.dynamic</a>]</td>
<td>CD2</td>
<td>Delegating constructors, destructors, and <TT>std::exit</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="777">
<td><a href="https://cplusplus.github.io/CWG/issues/777.html">777</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>CD2</td>
<td>Default arguments and parameter packs</td>
<td class="full" align="center">Clang 3.7</td>
</tr>
<tr id="778">
<td><a href="https://cplusplus.github.io/CWG/issues/778.html">778</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>C++11</td>
<td>Template parameter packs in non-type template parameters</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="779">
<td><a href="https://cplusplus.github.io/CWG/issues/779.html">779</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD2</td>
<td>Rvalue reference members of closure objects?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="782">
<td><a href="https://cplusplus.github.io/CWG/issues/782.html">782</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>CD2</td>
<td>Lambda expressions and argument-dependent lookup</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="783">
<td><a href="https://cplusplus.github.io/CWG/issues/783.html">783</a></td>
+ <td>[<a href="https://wg21.link/intro.defs">intro.defs</a>]</td>
<td>open</td>
<td>Definition of &#8220;argument&#8221;</td>
<td align="center">Not resolved</td>
</tr>
<tr id="784">
<td><a href="https://cplusplus.github.io/CWG/issues/784.html">784</a></td>
+ <td>[<a href="https://wg21.link/intro.structure">intro.structure</a>]</td>
<td>C++11</td>
<td>List of incompatibilities with the previous Standard</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="785">
<td><a href="https://cplusplus.github.io/CWG/issues/785.html">785</a></td>
+ <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>
<td>CD2</td>
<td>&#8220;Execution sequence&#8221; is inappropriate phraseology</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="786">
<td><a href="https://cplusplus.github.io/CWG/issues/786.html">786</a></td>
+ <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>
<td>CD2</td>
<td>Definition of &#8220;thread&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="787">
<td><a href="https://cplusplus.github.io/CWG/issues/787.html">787</a></td>
+ <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>
<td>CD2</td>
<td>Unnecessary lexical undefined behavior</td>
<td class="full" align="center">Clang 21</td>
</tr>
<tr id="788">
<td><a href="https://cplusplus.github.io/CWG/issues/788.html">788</a></td>
+ <td>[<a href="https://wg21.link/lex.charset">lex.charset</a>]</td>
<td>CD2</td>
<td>Relationship between locale and values of the execution character set</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="789">
<td><a href="https://cplusplus.github.io/CWG/issues/789.html">789</a></td>
+ <td>[<a href="https://wg21.link/lex.trigraph">lex.trigraph</a>]</td>
<td>CD2</td>
<td>Deprecating trigraphs</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="790">
<td><a href="https://cplusplus.github.io/CWG/issues/790.html">790</a></td>
+ <td>[<a href="https://wg21.link/lex.string">lex.string</a>]</td>
<td>CD2</td>
<td>Concatenation of raw and non-raw string literals</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="792">
<td><a href="https://cplusplus.github.io/CWG/issues/792.html">792</a></td>
+ <td>[<a href="https://wg21.link/basic.start.main">basic.start.main</a>]</td>
<td>CD2</td>
<td>Effects of <TT>std::quick_exit</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="793">
<td><a href="https://cplusplus.github.io/CWG/issues/793.html">793</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>CD2</td>
<td>Use of class members during destruction</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="794">
<td><a href="https://cplusplus.github.io/CWG/issues/794.html">794</a></td>
+ <td>[<a href="https://wg21.link/conv.mem">conv.mem</a>]</td>
<td>NAD</td>
<td>Base-derived conversion in member type of pointer-to-member conversion</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="795">
<td><a href="https://cplusplus.github.io/CWG/issues/795.html">795</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>NAD</td>
<td>Dependency of lambdas on <TT>&lt;functional&gt;</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="796">
<td><a href="https://cplusplus.github.io/CWG/issues/796.html">796</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>CD2</td>
<td>Lifetime of a closure object with members captured by reference</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="797">
<td><a href="https://cplusplus.github.io/CWG/issues/797.html">797</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD2</td>
<td>Converting a no-capture lambda to a function type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="798">
<td><a href="https://cplusplus.github.io/CWG/issues/798.html">798</a></td>
+ <td>[<a href="https://wg21.link/expr.sub">expr.sub</a>]</td>
<td>C++11</td>
<td>Overloaded subscript operator described in clause 5</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="799">
<td><a href="https://cplusplus.github.io/CWG/issues/799.html">799</a></td>
+ <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>
<td>CD2</td>
<td>Can <TT>reinterpret_cast</TT> be used to cast an operand to its own type?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="800">
<td><a href="https://cplusplus.github.io/CWG/issues/800.html">800</a></td>
+ <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>
<td>NAD</td>
<td>Safely-derived pointers and object pointers converted from function pointers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="801">
<td><a href="https://cplusplus.github.io/CWG/issues/801.html">801</a></td>
+ <td>[<a href="https://wg21.link/expr.const.cast">expr.const.cast</a>]</td>
<td>CD2</td>
<td>Casting away constness in a cast to rvalue reference type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="803">
<td><a href="https://cplusplus.github.io/CWG/issues/803.html">803</a></td>
+ <td>[<a href="https://wg21.link/expr.sizeof">expr.sizeof</a>]</td>
<td>CD2</td>
<td><TT>sizeof</TT> an enumeration type with a fixed underlying type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="804">
<td><a href="https://cplusplus.github.io/CWG/issues/804.html">804</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD2</td>
<td>Deducing the type in <TT>new auto(x)</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="805">
<td><a href="https://cplusplus.github.io/CWG/issues/805.html">805</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD2</td>
<td>Which exception to throw for overflow in array size calculation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="806">
<td><a href="https://cplusplus.github.io/CWG/issues/806.html">806</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD2</td>
<td>Enumeration types in integral constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="807">
<td><a href="https://cplusplus.github.io/CWG/issues/807.html">807</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>NAD</td>
<td><TT>typeid</TT> expressions in constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="808">
<td><a href="https://cplusplus.github.io/CWG/issues/808.html">808</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec">dcl.spec</a>]</td>
<td>CD2</td>
<td>Non-type <I>decl-specifier</I>s versus max-munch</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="809">
<td><a href="https://cplusplus.github.io/CWG/issues/809.html">809</a></td>
+ <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>
<td>CD2</td>
<td>Deprecation of the <TT>register</TT> keyword</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="810">
<td><a href="https://cplusplus.github.io/CWG/issues/810.html">810</a></td>
+ <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>
<td>CD2</td>
<td>Block-scope <TT>thread_local</TT> variables should be implicitly <TT>static</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="811">
<td><a href="https://cplusplus.github.io/CWG/issues/811.html">811</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.cv">dcl.type.cv</a>]</td>
<td>CD2</td>
<td>Unclear implications of const-qualification</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="812">
<td><a href="https://cplusplus.github.io/CWG/issues/812.html">812</a></td>
+ <td>[<a href="https://wg21.link/namespace.def">namespace.def</a>]</td>
<td>CD2</td>
<td>Duplicate names in inline namespaces</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="813">
<td><a href="https://cplusplus.github.io/CWG/issues/813.html">813</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>open</td>
<td><TT>typename</TT> in a <I>using-declaration</I> with a non-dependent name</td>
<td align="center">Not resolved</td>
</tr>
<tr id="814">
<td><a href="https://cplusplus.github.io/CWG/issues/814.html">814</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr">dcl.attr</a>]</td>
<td>CD2</td>
<td>Attribute to indicate that a function throws nothing</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="815">
<td><a href="https://cplusplus.github.io/CWG/issues/815.html">815</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>
<td>CD2</td>
<td>Parameter pack expansion inside attributes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="816">
<td><a href="https://cplusplus.github.io/CWG/issues/816.html">816</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.final">dcl.attr.final</a>]</td>
<td>CD2</td>
<td>Diagnosing violations of <TT>[[final]]</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="817">
<td><a href="https://cplusplus.github.io/CWG/issues/817.html">817</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.final">dcl.attr.final</a>]</td>
<td>CD2</td>
<td>Meaning of <TT>[[final]]</TT> applied to a class definition</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="818">
<td><a href="https://cplusplus.github.io/CWG/issues/818.html">818</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>CD2</td>
<td>Function parameter packs in non-final positions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="819">
<td><a href="https://cplusplus.github.io/CWG/issues/819.html">819</a></td>
+ <td>[<a href="https://wg21.link/special">special</a>]</td>
<td>NAD</td>
<td>Access control and deleted implicitly-declared special member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="820">
<td><a href="https://cplusplus.github.io/CWG/issues/820.html">820</a></td>
+ <td>[<a href="https://wg21.link/temp">temp</a>]</td>
<td>CD2</td>
<td>Deprecation of <TT>export</TT></td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="822">
<td><a href="https://cplusplus.github.io/CWG/issues/822.html">822</a></td>
+ <td>[<a href="https://wg21.link/temp">temp</a>]</td>
<td>NAD</td>
<td>Additional contexts for template aliases</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="823">
<td><a href="https://cplusplus.github.io/CWG/issues/823.html">823</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>
<td>CD2</td>
<td>Literal types with constexpr conversions as non-type template arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="828">
<td><a href="https://cplusplus.github.io/CWG/issues/828.html">828</a></td>
+ <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>
<td>CD2</td>
<td>Destruction of exception objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="829">
<td><a href="https://cplusplus.github.io/CWG/issues/829.html">829</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>NAD</td>
<td>At what point is <TT>std::unexpected</TT> called?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="830">
<td><a href="https://cplusplus.github.io/CWG/issues/830.html">830</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>CD2</td>
<td>Deprecating exception specifications</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="831">
<td><a href="https://cplusplus.github.io/CWG/issues/831.html">831</a></td>
+ <td>[<a href="https://wg21.link/implimits">implimits</a>]</td>
<td>CD2</td>
<td>Limit on recursively nested template instantiations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="832">
<td><a href="https://cplusplus.github.io/CWG/issues/832.html">832</a></td>
+ <td>[<a href="https://wg21.link/lex.ppnumber">lex.ppnumber</a>]</td>
<td>CD2</td>
<td>Value of preprocessing numbers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="833">
<td><a href="https://cplusplus.github.io/CWG/issues/833.html">833</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>CD2</td>
<td>Explicit conversion of a scoped enumeration value to a floating type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="834">
<td><a href="https://cplusplus.github.io/CWG/issues/834.html">834</a></td>
+ <td>[<a href="https://wg21.link/lex.string">lex.string</a>]</td>
<td>CD2</td>
<td>What is an &#8220;ordinary string literal&#8221;?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="835">
<td><a href="https://cplusplus.github.io/CWG/issues/835.html">835</a></td>
+ <td>[<a href="https://wg21.link/expr">expr</a>]</td>
<td>CD2</td>
<td>Scoped enumerations and the &#8220;usual arithmetic conversions&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="836">
<td><a href="https://cplusplus.github.io/CWG/issues/836.html">836</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.noreturn">dcl.attr.noreturn</a>]</td>
<td>NAD</td>
<td><TT>[[noreturn]]</TT> applied to function types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="837">
<td><a href="https://cplusplus.github.io/CWG/issues/837.html">837</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>C++11</td>
<td>Constexpr functions and <TT>return</TT> <I>braced-init-list</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="838">
<td><a href="https://cplusplus.github.io/CWG/issues/838.html">838</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>C++11</td>
<td>Use of <TT>this</TT> in a <I>brace-or-equal-initializer</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="839">
<td><a href="https://cplusplus.github.io/CWG/issues/839.html">839</a></td>
+ <td>[<a href="https://wg21.link/expr.sizeof">expr.sizeof</a>]</td>
<td>dup</td>
<td><TT>sizeof</TT> with opaque enumerations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="840">
<td><a href="https://cplusplus.github.io/CWG/issues/840.html">840</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>CD2</td>
<td>Rvalue references as nontype template parameters</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="842">
<td><a href="https://cplusplus.github.io/CWG/issues/842.html">842</a></td>
+ <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>
<td>CD2</td>
<td>Casting to rvalue reference type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="845">
<td><a href="https://cplusplus.github.io/CWG/issues/845.html">845</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def">dcl.fct.def</a>]</td>
<td>CD2</td>
<td>What is the &#8220;first declaration&#8221; of an explicit specialization?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="846">
<td><a href="https://cplusplus.github.io/CWG/issues/846.html">846</a></td>
+ <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>
<td>CD2</td>
<td>Rvalue references to functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="847">
<td><a href="https://cplusplus.github.io/CWG/issues/847.html">847</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>CD2</td>
<td>Error in rvalue reference deduction example</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="850">
<td><a href="https://cplusplus.github.io/CWG/issues/850.html">850</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>
<td>CD2</td>
<td>Restrictions on use of non-static data members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="852">
<td><a href="https://cplusplus.github.io/CWG/issues/852.html">852</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>CD6</td>
<td><I>using-declaration</I>s and dependent base classes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="853">
<td><a href="https://cplusplus.github.io/CWG/issues/853.html">853</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic.safety">basic.stc.dynamic.safety</a>]</td>
<td>CD2</td>
<td>Support for relaxed pointer safety</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="854">
<td><a href="https://cplusplus.github.io/CWG/issues/854.html">854</a></td>
+ <td>[<a href="https://wg21.link/expr.shift">expr.shift</a>]</td>
<td>CD2</td>
<td>Left shift and unsigned extended types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="855">
<td><a href="https://cplusplus.github.io/CWG/issues/855.html">855</a></td>
+ <td>[<a href="https://wg21.link/expr.assign">expr.assign</a>]</td>
<td>CD2</td>
<td>Incorrect comments in <I>braced-init-list</I> assignment example</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="858">
<td><a href="https://cplusplus.github.io/CWG/issues/858.html">858</a></td>
+ <td>[<a href="https://wg21.link/expr">expr</a>]</td>
<td>CD2</td>
<td>Example binding an rvalue reference to an lvalue</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="860">
<td><a href="https://cplusplus.github.io/CWG/issues/860.html">860</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>C++11</td>
<td>Explicit qualification of constexpr member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="861">
<td><a href="https://cplusplus.github.io/CWG/issues/861.html">861</a></td>
+ <td>[<a href="https://wg21.link/namespace.qual">namespace.qual</a>]</td>
<td>CD2</td>
<td>Unintended ambiguity in inline namespace lookup</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="862">
<td><a href="https://cplusplus.github.io/CWG/issues/862.html">862</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>CD2</td>
<td>Undefined behavior with enumerator value overflow</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="863">
<td><a href="https://cplusplus.github.io/CWG/issues/863.html">863</a></td>
+ <td>[<a href="https://wg21.link/expr.post">expr.post</a>]</td>
<td>CD2</td>
<td>Rvalue reference cast to incomplete type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="864">
<td><a href="https://cplusplus.github.io/CWG/issues/864.html">864</a></td>
+ <td>[<a href="https://wg21.link/stmt.ranged">stmt.ranged</a>]</td>
<td>C++11</td>
<td><I>braced-init-list</I> in the range-based <TT>for</TT> statement</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="865">
<td><a href="https://cplusplus.github.io/CWG/issues/865.html">865</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD2</td>
<td>Initializing a <TT>std::initializer_list</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="869">
<td><a href="https://cplusplus.github.io/CWG/issues/869.html">869</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>CD2</td>
<td>Uninitialized <TT>thread_local</TT> objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="872">
<td><a href="https://cplusplus.github.io/CWG/issues/872.html">872</a></td>
+ <td>[<a href="https://wg21.link/lex.string">lex.string</a>]</td>
<td>CD2</td>
<td>Lexical issues with raw strings</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="873">
<td><a href="https://cplusplus.github.io/CWG/issues/873.html">873</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>C++11</td>
<td>Deducing rvalue references in declarative contexts</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="874">
<td><a href="https://cplusplus.github.io/CWG/issues/874.html">874</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>CD2</td>
<td>Class-scope definitions of enumeration types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="876">
<td><a href="https://cplusplus.github.io/CWG/issues/876.html">876</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>CD2</td>
<td>Type references in rvalue reference deduction specification</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="877">
<td><a href="https://cplusplus.github.io/CWG/issues/877.html">877</a></td>
+ <td>[<a href="https://wg21.link/over.match.viable">over.match.viable</a>]</td>
<td>CD2</td>
<td>Viable functions and binding references to rvalues</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="879">
<td><a href="https://cplusplus.github.io/CWG/issues/879.html">879</a></td>
+ <td>[<a href="https://wg21.link/over.built">over.built</a>]</td>
<td>CD2</td>
<td>Missing built-in comparison operators for pointer types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="880">
<td><a href="https://cplusplus.github.io/CWG/issues/880.html">880</a></td>
+ <td>[<a href="https://wg21.link/over.built">over.built</a>]</td>
<td>CD2</td>
<td>Built-in conditional operator for scoped enumerations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="882">
<td><a href="https://cplusplus.github.io/CWG/issues/882.html">882</a></td>
+ <td>[<a href="https://wg21.link/basic.start.main">basic.start.main</a>]</td>
<td>CD2</td>
<td>Defining <TT>main</TT> as deleted</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="883">
<td><a href="https://cplusplus.github.io/CWG/issues/883.html">883</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>CD2</td>
<td><TT>std::memcpy</TT> vs <TT>std::memmove</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="884">
<td><a href="https://cplusplus.github.io/CWG/issues/884.html">884</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>CD2</td>
<td>Defining an explicitly-specialized static data member</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="885">
<td><a href="https://cplusplus.github.io/CWG/issues/885.html">885</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.partial">temp.deduct.partial</a>]</td>
<td>NAD</td>
<td>Partial ordering of function templates with unordered parameter pairs</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="886">
<td><a href="https://cplusplus.github.io/CWG/issues/886.html">886</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>CD2</td>
<td>Member initializers and aggregates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="887">
<td><a href="https://cplusplus.github.io/CWG/issues/887.html">887</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>CD2</td>
<td>Move construction of thrown object</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="888">
<td><a href="https://cplusplus.github.io/CWG/issues/888.html">888</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>CD2</td>
<td>Union member initializers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="891">
<td><a href="https://cplusplus.github.io/CWG/issues/891.html">891</a></td>
+ <td>[<a href="https://wg21.link/expr.const.cast">expr.const.cast</a>]</td>
<td>CD2</td>
<td><TT>const_cast</TT> to rvalue reference from objectless rvalue</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="892">
<td><a href="https://cplusplus.github.io/CWG/issues/892.html">892</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>C++11</td>
<td>Missing requirements for constexpr constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="893">
<td><a href="https://cplusplus.github.io/CWG/issues/893.html">893</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>NAD</td>
<td>Brace syntax for <I>enumerator-definition</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="896">
<td><a href="https://cplusplus.github.io/CWG/issues/896.html">896</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>CD2</td>
<td>Rvalue references and rvalue-reference conversion functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="897">
<td><a href="https://cplusplus.github.io/CWG/issues/897.html">897</a></td>
+ <td>[<a href="https://wg21.link/cpp.pragma.op">cpp.pragma.op</a>]</td>
<td>open</td>
<td><TT>_Pragma</TT> and extended <I>string-literal</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr id="898">
<td><a href="https://cplusplus.github.io/CWG/issues/898.html">898</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>C++11</td>
<td>Declarations in constexpr functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="899">
<td><a href="https://cplusplus.github.io/CWG/issues/899.html">899</a></td>
+ <td>[<a href="https://wg21.link/over.match.copy">over.match.copy</a>]</td>
<td>CD2</td>
<td>Explicit conversion functions in direct class initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="900">
<td><a href="https://cplusplus.github.io/CWG/issues/900.html">900</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>C++23</td>
<td>Lifetime of temporaries in range-based <TT>for</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="901">
<td><a href="https://cplusplus.github.io/CWG/issues/901.html">901</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>open</td>
<td>Deleted <TT>operator delete</TT></td>
<td align="center">Not resolved</td>
</tr>
<tr id="902">
<td><a href="https://cplusplus.github.io/CWG/issues/902.html">902</a></td>
+ <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>
<td>NAD</td>
<td>In-class initialization of non-constant static data members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="903">
<td><a href="https://cplusplus.github.io/CWG/issues/903.html">903</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>
<td>CD3</td>
<td>Value-dependent integral null pointer constants</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="904">
<td><a href="https://cplusplus.github.io/CWG/issues/904.html">904</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>CD2</td>
<td>Parameter packs in <I>lambda-capture</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="905">
<td><a href="https://cplusplus.github.io/CWG/issues/905.html">905</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>CD2</td>
<td>Explicit defaulted copy constructors and trivial copyability</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="906">
<td><a href="https://cplusplus.github.io/CWG/issues/906.html">906</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def">dcl.fct.def</a>]</td>
<td>CD2</td>
<td>Which special member functions can be defaulted?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="908">
<td><a href="https://cplusplus.github.io/CWG/issues/908.html">908</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def">dcl.fct.def</a>]</td>
<td>CD2</td>
<td>Deleted global allocation and deallocation functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="909">
<td><a href="https://cplusplus.github.io/CWG/issues/909.html">909</a></td>
+ <td>[<a href="https://wg21.link/expr.cast">expr.cast</a>]</td>
<td>NAD</td>
<td>Old-style casts with conversion functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="910">
<td><a href="https://cplusplus.github.io/CWG/issues/910.html">910</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>CD2</td>
<td>Move constructors and implicitly-declared copy constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="912">
<td><a href="https://cplusplus.github.io/CWG/issues/912.html">912</a></td>
+ <td>[<a href="https://wg21.link/lex.ccon">lex.ccon</a>]</td>
<td>CD3</td>
<td>Character literals and <I>universal-character-name</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="913">
<td><a href="https://cplusplus.github.io/CWG/issues/913.html">913</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.conv">temp.deduct.conv</a>]</td>
<td>CD2</td>
<td>Deduction rules for array- and function-type conversion functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="914">
<td><a href="https://cplusplus.github.io/CWG/issues/914.html">914</a></td>
+ <td>[<a href="https://wg21.link/expr.type.conv">expr.type.conv</a>]</td>
<td>open</td>
<td>Value-initialization of array types</td>
<td align="center">Not resolved</td>
</tr>
<tr id="915">
<td><a href="https://cplusplus.github.io/CWG/issues/915.html">915</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def">dcl.fct.def</a>]</td>
<td>CD2</td>
<td>Deleted specializations of member function templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="919">
<td><a href="https://cplusplus.github.io/CWG/issues/919.html">919</a></td>
+ <td>[<a href="https://wg21.link/namespace.def">namespace.def</a>]</td>
<td>CD2</td>
<td>Contradictions regarding inline namespaces</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="920">
<td><a href="https://cplusplus.github.io/CWG/issues/920.html">920</a></td>
+ <td>[<a href="https://wg21.link/dcl.meaning">dcl.meaning</a>]</td>
<td>CD2</td>
<td>Interaction of inline namespaces and <I>using-declaration</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="921">
<td><a href="https://cplusplus.github.io/CWG/issues/921.html">921</a></td>
+ <td>[<a href="https://wg21.link/namespace.def">namespace.def</a>]</td>
<td>CD2</td>
<td>Unclear specification of inline namespaces</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="922">
<td><a href="https://cplusplus.github.io/CWG/issues/922.html">922</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>CD2</td>
<td>Implicit default constructor definitions and <TT>const</TT> variant members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="923">
<td><a href="https://cplusplus.github.io/CWG/issues/923.html">923</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>CD2</td>
<td>Inline explicit specializations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="924">
<td><a href="https://cplusplus.github.io/CWG/issues/924.html">924</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>C++11</td>
<td><I>alias-declaration</I> as a class member</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="925">
<td><a href="https://cplusplus.github.io/CWG/issues/925.html">925</a></td>
+ <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>
<td>open</td>
<td>Type of character literals in preprocessor expressions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="926">
<td><a href="https://cplusplus.github.io/CWG/issues/926.html">926</a></td>
+ <td>[<a href="https://wg21.link/namespace.unnamed">namespace.unnamed</a>]</td>
<td>CD2</td>
<td>Inline unnamed namespaces</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="927">
<td><a href="https://cplusplus.github.io/CWG/issues/927.html">927</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>CD2</td>
<td>Implicitly-deleted default constructors and member initializers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="928">
<td><a href="https://cplusplus.github.io/CWG/issues/928.html">928</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def">dcl.fct.def</a>]</td>
<td>CD2</td>
<td>Defaulting a function that would be implicitly defined as deleted</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="929">
<td><a href="https://cplusplus.github.io/CWG/issues/929.html">929</a></td>
+ <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>
<td>CD2</td>
<td>What is a template alias?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="930">
<td><a href="https://cplusplus.github.io/CWG/issues/930.html">930</a></td>
+ <td>[<a href="https://wg21.link/expr.alignof">expr.alignof</a>]</td>
<td>CD2</td>
<td><TT>alignof</TT> with incomplete array type</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="931">
<td><a href="https://cplusplus.github.io/CWG/issues/931.html">931</a></td>
+ <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>
<td>CD2</td>
<td>Confusing reference to the length of a user-defined string literal</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="932">
<td><a href="https://cplusplus.github.io/CWG/issues/932.html">932</a></td>
+ <td>[<a href="https://wg21.link/lex.string">lex.string</a>]</td>
<td>CD2</td>
<td>UCNs in closing delimiters of raw string literals</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="933">
<td><a href="https://cplusplus.github.io/CWG/issues/933.html">933</a></td>
+ <td>[<a href="https://wg21.link/lex.ccon">lex.ccon</a>]</td>
<td>CD2</td>
<td>32-bit UCNs with 16-bit <TT>wchar_t</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="934">
<td><a href="https://cplusplus.github.io/CWG/issues/934.html">934</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD2</td>
<td>List-initialization of references</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="935">
<td><a href="https://cplusplus.github.io/CWG/issues/935.html">935</a></td>
+ <td>[<a href="https://wg21.link/over.literal">over.literal</a>]</td>
<td>CD2</td>
<td>Missing overloads for character types for user-defined literals</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="936">
<td><a href="https://cplusplus.github.io/CWG/issues/936.html">936</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.string">dcl.init.string</a>]</td>
<td>CD2</td>
<td>Array initialization with new string literals</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="937">
<td><a href="https://cplusplus.github.io/CWG/issues/937.html">937</a></td>
+ <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>
<td>NAD</td>
<td>Restrictions on values of template arguments in user-defined literals</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="938">
<td><a href="https://cplusplus.github.io/CWG/issues/938.html">938</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>C++11</td>
<td>Initializer lists and array new</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="939">
<td><a href="https://cplusplus.github.io/CWG/issues/939.html">939</a></td>
+ <td>[<a href="https://wg21.link/class.virtual">class.virtual</a>]</td>
<td>CD2</td>
<td>Explicitly checking virtual function overriding</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="940">
<td><a href="https://cplusplus.github.io/CWG/issues/940.html">940</a></td>
+ <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>
<td>CD2</td>
<td>Global anonymous unions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="941">
<td><a href="https://cplusplus.github.io/CWG/issues/941.html">941</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>C++11</td>
<td>Explicit specialization of deleted function template</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="942">
<td><a href="https://cplusplus.github.io/CWG/issues/942.html">942</a></td>
+ <td>[<a href="https://wg21.link/basic.pre">basic.pre</a>]</td>
<td>CD2</td>
<td>Is <TT>this</TT> an entity?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="943">
<td><a href="https://cplusplus.github.io/CWG/issues/943.html">943</a></td>
+ <td>[<a href="https://wg21.link/expr.type.conv">expr.type.conv</a>]</td>
<td>CD5</td>
<td>Is <TT>T()</TT> a temporary?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="944">
<td><a href="https://cplusplus.github.io/CWG/issues/944.html">944</a></td>
+ <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>
<td>NAD</td>
<td><TT>reinterpret_cast</TT> for all types with the same size and alignment</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="945">
<td><a href="https://cplusplus.github.io/CWG/issues/945.html">945</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>
<td>C++11</td>
<td>Use of <TT>this</TT> in a late-specified return type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="946">
<td><a href="https://cplusplus.github.io/CWG/issues/946.html">946</a></td>
+ <td>[<a href="https://wg21.link/basic.start.dynamic">basic.start.dynamic</a>]</td>
<td>CD2</td>
<td>Order of destruction of local static objects and calls to <TT>std::atexit</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="947">
<td><a href="https://cplusplus.github.io/CWG/issues/947.html">947</a></td>
+ <td>[<a href="https://wg21.link/temp.over">temp.over</a>]</td>
<td>NAD</td>
<td>Deducing type template arguments from default function arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="948">
<td><a href="https://cplusplus.github.io/CWG/issues/948.html">948</a></td>
+ <td>[<a href="https://wg21.link/stmt.select">stmt.select</a>]</td>
<td>C++11</td>
<td><TT>constexpr</TT> in <I>condition</I>s</td>
<td class="full" align="center">Clang 3.7</td>
</tr>
<tr class="open" id="949">
<td><a href="https://cplusplus.github.io/CWG/issues/949.html">949</a></td>
+ <td>[<a href="https://wg21.link/intro.compliance">intro.compliance</a>]</td>
<td>open</td>
<td>Requirements for freestanding implementations</td>
<td align="center">Not resolved</td>
</tr>
<tr id="950">
<td><a href="https://cplusplus.github.io/CWG/issues/950.html">950</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>
<td>CD2</td>
<td>Use of <TT>decltype</TT> as a <I>class-name</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="951">
<td><a href="https://cplusplus.github.io/CWG/issues/951.html">951</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr">dcl.attr</a>]</td>
<td>CD2</td>
<td>Problems with <I>attribute-specifier</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="952">
<td><a href="https://cplusplus.github.io/CWG/issues/952.html">952</a></td>
+ <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>
<td>CD6</td>
<td>Insufficient description of &#8220;naming class&#8221;</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="953">
<td><a href="https://cplusplus.github.io/CWG/issues/953.html">953</a></td>
+ <td>[<a href="https://wg21.link/over.ics.ref">over.ics.ref</a>]</td>
<td>CD2</td>
<td>Rvalue references and function viability</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="954">
<td><a href="https://cplusplus.github.io/CWG/issues/954.html">954</a></td>
+ <td>[<a href="https://wg21.link/over.built">over.built</a>]</td>
<td>open</td>
<td>Overload resolution of conversion operator templates with built-in types</td>
<td align="center">Not resolved</td>
</tr>
<tr id="955">
<td><a href="https://cplusplus.github.io/CWG/issues/955.html">955</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD2</td>
<td>Can a closure type's <TT>operator()</TT> be virtual?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="956">
<td><a href="https://cplusplus.github.io/CWG/issues/956.html">956</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>CD2</td>
<td>Function prototype scope with late-specified return types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="957">
<td><a href="https://cplusplus.github.io/CWG/issues/957.html">957</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>
<td>CD2</td>
<td>Alternative tokens and <I>attribute-token</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="958">
<td><a href="https://cplusplus.github.io/CWG/issues/958.html">958</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>NAD</td>
<td>Lambdas and <TT>decltype</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="959">
<td><a href="https://cplusplus.github.io/CWG/issues/959.html">959</a></td>
+ <td>[<a href="https://wg21.link/dcl.align">dcl.align</a>]</td>
<td>CD2</td>
<td>Alignment attribute for class and enumeration types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="960">
<td><a href="https://cplusplus.github.io/CWG/issues/960.html">960</a></td>
+ <td>[<a href="https://wg21.link/class.virtual">class.virtual</a>]</td>
<td>CD2</td>
<td>Covariant functions and lvalue/rvalue references</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="961">
<td><a href="https://cplusplus.github.io/CWG/issues/961.html">961</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>CD2</td>
<td>Overload resolution and conversion of <TT>std::nullptr_t</TT> to <TT>bool</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="962">
<td><a href="https://cplusplus.github.io/CWG/issues/962.html">962</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.elab">dcl.type.elab</a>]</td>
<td>CD2</td>
<td>Attributes appertaining to class and enum types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="963">
<td><a href="https://cplusplus.github.io/CWG/issues/963.html">963</a></td>
+ <td>[<a href="https://wg21.link/expr.rel">expr.rel</a>]</td>
<td>CD2</td>
<td>Comparing <TT>nullptr</TT> with 0</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="964">
<td><a href="https://cplusplus.github.io/CWG/issues/964.html">964</a></td>
+ <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>
<td>C++11</td>
<td>Incorrect description of when the lvalue-to-rvalue conversion applies</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="965">
<td><a href="https://cplusplus.github.io/CWG/issues/965.html">965</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.depend">dcl.attr.depend</a>]</td>
<td>CD2</td>
<td>Limiting the applicability of the <TT>carries_dependency</TT> attribute</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="966">
<td><a href="https://cplusplus.github.io/CWG/issues/966.html">966</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>CD2</td>
<td>Nested types without linkage</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="967">
<td><a href="https://cplusplus.github.io/CWG/issues/967.html">967</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic">basic.stc.dynamic</a>]</td>
<td>NAD</td>
<td>Exception specification of replacement allocation function</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="968">
<td><a href="https://cplusplus.github.io/CWG/issues/968.html">968</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>
<td>CD2</td>
<td>Syntactic ambiguity of the attribute notation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="969">
<td><a href="https://cplusplus.github.io/CWG/issues/969.html">969</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>CD2</td>
<td>Explicit instantiation declarations of class template specializations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="970">
<td><a href="https://cplusplus.github.io/CWG/issues/970.html">970</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr">dcl.attr</a>]</td>
<td>CD2</td>
<td>Consistent use of &#8220;appertain&#8221; and &#8220;apply&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="971">
<td><a href="https://cplusplus.github.io/CWG/issues/971.html">971</a></td>
+ <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>
<td>C++11</td>
<td>Incorrect treatment of <I>exception-declaration</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="972">
<td><a href="https://cplusplus.github.io/CWG/issues/972.html">972</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>
<td>C++11</td>
<td>Allowing multiple <I>attribute-specifier</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="973">
<td><a href="https://cplusplus.github.io/CWG/issues/973.html">973</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>CD2</td>
<td>Function types in <I>exception-specification</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="974">
<td><a href="https://cplusplus.github.io/CWG/issues/974.html">974</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>CD3</td>
<td>Default arguments for lambdas</td>
<td class="full" align="center">Clang 3.3</td>
</tr>
<tr id="975">
<td><a href="https://cplusplus.github.io/CWG/issues/975.html">975</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>CD3</td>
<td>Restrictions on return type deduction for lambdas</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="976">
<td><a href="https://cplusplus.github.io/CWG/issues/976.html">976</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.conv">temp.deduct.conv</a>]</td>
<td>CD2</td>
<td>Deduction for <TT>const T&amp;</TT> conversion operators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="977">
<td><a href="https://cplusplus.github.io/CWG/issues/977.html">977</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>CD3</td>
<td>When is an enumeration type complete?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="978">
<td><a href="https://cplusplus.github.io/CWG/issues/978.html">978</a></td>
+ <td>[<a href="https://wg21.link/over.best.ics">over.best.ics</a>]</td>
<td>CD2</td>
<td>Incorrect specification for copy initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="979">
<td><a href="https://cplusplus.github.io/CWG/issues/979.html">979</a></td>
+ <td>[<a href="https://wg21.link/dcl.decl">dcl.decl</a>]</td>
<td>CD2</td>
<td>Position of <I>attribute-specifier</I> in declarator syntax</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="980">
<td><a href="https://cplusplus.github.io/CWG/issues/980.html">980</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>CD2</td>
<td>Explicit instantiation of a member of a class template</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="981">
<td><a href="https://cplusplus.github.io/CWG/issues/981.html">981</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>C++11</td>
<td>Constexpr constructor templates and literal types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="982">
<td><a href="https://cplusplus.github.io/CWG/issues/982.html">982</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>NAD</td>
<td>Initialization with an empty initializer list</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="983">
<td><a href="https://cplusplus.github.io/CWG/issues/983.html">983</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>
<td>CD2</td>
<td>Ambiguous pointer-to-member constant</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="984">
<td><a href="https://cplusplus.github.io/CWG/issues/984.html">984</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>CD2</td>
<td>&#8220;Deduced type&#8221; is unclear in <TT>auto</TT> type deduction</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="985">
<td><a href="https://cplusplus.github.io/CWG/issues/985.html">985</a></td>
+ <td>[<a href="https://wg21.link/lex.digraph">lex.digraph</a>]</td>
<td>C++11</td>
<td>Alternative tokens and user-defined literals</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="986">
<td><a href="https://cplusplus.github.io/CWG/issues/986.html">986</a></td>
+ <td>[<a href="https://wg21.link/namespace.udir">namespace.udir</a>]</td>
<td>CD2</td>
<td>Transitivity of <I>using-directive</I>s versus qualified lookup</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="987">
<td><a href="https://cplusplus.github.io/CWG/issues/987.html">987</a></td>
+ <td>[<a href="https://wg21.link/basic.namespace">basic.namespace</a>]</td>
<td>CD4</td>
<td>Which declarations introduce namespace members?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="988">
<td><a href="https://cplusplus.github.io/CWG/issues/988.html">988</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>
<td>CD2</td>
<td>Reference-to-reference collapsing with <TT>decltype</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="989">
<td><a href="https://cplusplus.github.io/CWG/issues/989.html">989</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD2</td>
<td>Misplaced list-initialization example</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="990">
<td><a href="https://cplusplus.github.io/CWG/issues/990.html">990</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD2</td>
<td>Value initialization with multiple initializer-list constructors</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="991">
<td><a href="https://cplusplus.github.io/CWG/issues/991.html">991</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>CD2</td>
<td>Reference parameters of constexpr functions and constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="992">
<td><a href="https://cplusplus.github.io/CWG/issues/992.html">992</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>NAD</td>
<td>Inheriting explicitness</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="993">
<td><a href="https://cplusplus.github.io/CWG/issues/993.html">993</a></td>
+ <td>[<a href="https://wg21.link/temp.point">temp.point</a>]</td>
<td>C++11</td>
<td>Freedom to perform instantiation at the end of the translation unit</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="994">
<td><a href="https://cplusplus.github.io/CWG/issues/994.html">994</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>C++11</td>
<td><I>braced-init-list</I> as a default argument</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="995">
<td><a href="https://cplusplus.github.io/CWG/issues/995.html">995</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>CD2</td>
<td>Incorrect example for <I>using-declaration</I> and explicit instantiation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="996">
<td><a href="https://cplusplus.github.io/CWG/issues/996.html">996</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>
<td>C++11</td>
<td>Ambiguous partial specializations of member class templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="997">
<td><a href="https://cplusplus.github.io/CWG/issues/997.html">997</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>C++11</td>
<td>Argument-dependent lookup and dependent function template parameter types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="998">
<td><a href="https://cplusplus.github.io/CWG/issues/998.html">998</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>dup</td>
<td>Function parameter transformations and template functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="999">
<td><a href="https://cplusplus.github.io/CWG/issues/999.html">999</a></td>
+ <td>[<a href="https://wg21.link/over.match">over.match</a>]</td>
<td>CD2</td>
<td>&#8220;Implicit&#8221; or &#8220;implied&#8221; object argument/parameter?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1000">
<td><a href="https://cplusplus.github.io/CWG/issues/1000.html">1000</a></td>
+ <td>[<a href="https://wg21.link/class.qual">class.qual</a>]</td>
<td>CD2</td>
<td>Mistaking member typedefs for constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1001">
<td><a href="https://cplusplus.github.io/CWG/issues/1001.html">1001</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>review</td>
<td>Parameter type adjustment in dependent parameter types</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1002">
<td><a href="https://cplusplus.github.io/CWG/issues/1002.html">1002</a></td>
+ <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>
<td>NAD</td>
<td>Pack expansion for function arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1003">
<td><a href="https://cplusplus.github.io/CWG/issues/1003.html">1003</a></td>
+ <td>[<a href="https://wg21.link/basic.start.main">basic.start.main</a>]</td>
<td>CD3</td>
<td>Acceptable definitions of <TT>main</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1004">
<td><a href="https://cplusplus.github.io/CWG/issues/1004.html">1004</a></td>
+ <td>[<a href="https://wg21.link/temp.local">temp.local</a>]</td>
<td>C++11</td>
<td>Injected-class-names as arguments for template template parameters</td>
<td class="full" align="center">Clang 5</td>
</tr>
<tr id="1005">
<td><a href="https://cplusplus.github.io/CWG/issues/1005.html">1005</a></td>
+ <td>[<a href="https://wg21.link/class.mfct.non.static">class.mfct.non.static</a>]</td>
<td>NAD</td>
<td>Qualified name resolution in member functions of class templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1006">
<td><a href="https://cplusplus.github.io/CWG/issues/1006.html">1006</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>C++11</td>
<td><TT>std::nullptr_t</TT> as a non-type template parameter</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1007">
<td><a href="https://cplusplus.github.io/CWG/issues/1007.html">1007</a></td>
+ <td>[<a href="https://wg21.link/class.protected">class.protected</a>]</td>
<td>NAD</td>
<td>Protected access and pointers to members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1008">
<td><a href="https://cplusplus.github.io/CWG/issues/1008.html">1008</a></td>
+ <td>[<a href="https://wg21.link/expr.alignof">expr.alignof</a>]</td>
<td>NAD</td>
<td>Querying the alignment of an object</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1009">
<td><a href="https://cplusplus.github.io/CWG/issues/1009.html">1009</a></td>
+ <td>[<a href="https://wg21.link/temp">temp</a>]</td>
<td>C++11</td>
<td>Missing cases in the <I>declarator-id</I> of a function template declaration</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1010">
<td><a href="https://cplusplus.github.io/CWG/issues/1010.html">1010</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD2</td>
<td>Address of object with dynamic storage duration in constant expression</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1011">
<td><a href="https://cplusplus.github.io/CWG/issues/1011.html">1011</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>C++11</td>
<td>Standard conversions that cannot be inverted</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1012">
<td><a href="https://cplusplus.github.io/CWG/issues/1012.html">1012</a></td>
+ <td>[<a href="https://wg21.link/namespace.unnamed">namespace.unnamed</a>]</td>
<td>C++11</td>
<td>Undeprecating <TT>static</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1013">
<td><a href="https://cplusplus.github.io/CWG/issues/1013.html">1013</a></td>
+ <td>[<a href="https://wg21.link/conv.lval">conv.lval</a>]</td>
<td>CD3</td>
<td>Uninitialized <TT>std::nullptr_t</TT> objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1014">
<td><a href="https://cplusplus.github.io/CWG/issues/1014.html">1014</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>NAD</td>
<td>Overload resolution between <TT>const T&amp;</TT> and <TT>T&amp;&amp;</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1015">
<td><a href="https://cplusplus.github.io/CWG/issues/1015.html">1015</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>C++11</td>
<td>Template arguments and argument-dependent lookup</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1016">
<td><a href="https://cplusplus.github.io/CWG/issues/1016.html">1016</a></td>
+ <td>[<a href="https://wg21.link/over">over</a>]</td>
<td>C++11</td>
<td>Overloadable declarations, function templates, and references</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1017">
<td><a href="https://cplusplus.github.io/CWG/issues/1017.html">1017</a></td>
+ <td>[<a href="https://wg21.link/class.mfct.non.static">class.mfct.non.static</a>]</td>
<td>C++11</td>
<td>Member access transformation in unevaluated operands</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1018">
<td><a href="https://cplusplus.github.io/CWG/issues/1018.html">1018</a></td>
+ <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>
<td>C++11</td>
<td>Ambiguity between <I>simple-declaration</I> and <I>attribute-declaration</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1019">
<td><a href="https://cplusplus.github.io/CWG/issues/1019.html">1019</a></td>
+ <td>[<a href="https://wg21.link/class.derived">class.derived</a>]</td>
<td>dup</td>
<td>Dependent <I>simple-template-id</I>s in <I>base-specifier</I>s and <I>mem-initializer</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1020">
<td><a href="https://cplusplus.github.io/CWG/issues/1020.html">1020</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>C++11</td>
<td>Implicitly-defined copy constructors and explicit base class constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1021">
<td><a href="https://cplusplus.github.io/CWG/issues/1021.html">1021</a></td>
+ <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>
<td>CD4</td>
<td>Definitions of namespace members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1022">
<td><a href="https://cplusplus.github.io/CWG/issues/1022.html">1022</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>C++11</td>
<td>Can an enumeration variable have values outside the values of the enumeration?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1023">
<td><a href="https://cplusplus.github.io/CWG/issues/1023.html">1023</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>
<td>dup</td>
<td><TT>thread_local</TT> objects as non-type template arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1024">
<td><a href="https://cplusplus.github.io/CWG/issues/1024.html">1024</a></td>
+ <td>[<a href="https://wg21.link/lex.ccon">lex.ccon</a>]</td>
<td>CD3</td>
<td>Limits on multicharacter literals</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1025">
<td><a href="https://cplusplus.github.io/CWG/issues/1025.html">1025</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>
<td>C++11</td>
<td>Use of a reference as a non-type template argument</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1026">
<td><a href="https://cplusplus.github.io/CWG/issues/1026.html">1026</a></td>
+ <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>
<td>NAD</td>
<td>Cv-qualified non-class rvalues</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1027">
<td><a href="https://cplusplus.github.io/CWG/issues/1027.html">1027</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>review</td>
<td>Type consistency and reallocation of scalar types</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1028">
<td><a href="https://cplusplus.github.io/CWG/issues/1028.html">1028</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.res">temp.dep.res</a>]</td>
<td>CD6</td>
<td>Dependent names in non-defining declarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1029">
<td><a href="https://cplusplus.github.io/CWG/issues/1029.html">1029</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>C++11</td>
<td>Type of a destructor call</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1030">
<td><a href="https://cplusplus.github.io/CWG/issues/1030.html">1030</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>C++11</td>
<td>Evaluation order in <I>initializer-list</I>s used in aggregate initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1031">
<td><a href="https://cplusplus.github.io/CWG/issues/1031.html">1031</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>
<td>C++11</td>
<td>Optional elements in attributes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1032">
<td><a href="https://cplusplus.github.io/CWG/issues/1032.html">1032</a></td>
+ <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>
<td>C++11</td>
<td>Empty pack expansions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1033">
<td><a href="https://cplusplus.github.io/CWG/issues/1033.html">1033</a></td>
+ <td>[<a href="https://wg21.link/dcl.align">dcl.align</a>]</td>
<td>C++11</td>
<td>Restrictions on alignment attributes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1034">
<td><a href="https://cplusplus.github.io/CWG/issues/1034.html">1034</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>C++11</td>
<td>Attributes for <TT>return</TT> statements in lambdas</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1035">
<td><a href="https://cplusplus.github.io/CWG/issues/1035.html">1035</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>C++11</td>
<td>Omitted and required <I>decl-specifier</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1036">
<td><a href="https://cplusplus.github.io/CWG/issues/1036.html">1036</a></td>
+ <td>[<a href="https://wg21.link/dcl.align">dcl.align</a>]</td>
<td>C++11</td>
<td>Alignment attribute in an <I>exception-declaration</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1037">
<td><a href="https://cplusplus.github.io/CWG/issues/1037.html">1037</a></td>
+ <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>
<td>C++11</td>
<td>Requirements for operands of <I>delete-expression</I>s and deallocation functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1038">
<td><a href="https://cplusplus.github.io/CWG/issues/1038.html">1038</a></td>
+ <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>
<td>CD7</td>
<td>Overload resolution of <TT>&amp;x.static_func</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1039">
<td><a href="https://cplusplus.github.io/CWG/issues/1039.html">1039</a></td>
+ <td>[<a href="https://wg21.link/dcl.align">dcl.align</a>]</td>
<td>dup</td>
<td>Coordinating C and C++ alignment specifications</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1040">
<td><a href="https://cplusplus.github.io/CWG/issues/1040.html">1040</a></td>
+ <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>
<td>NAD</td>
<td>Memory model issues</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1041">
<td><a href="https://cplusplus.github.io/CWG/issues/1041.html">1041</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>dup</td>
<td><I>alias-declaration</I>s as class members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1042">
<td><a href="https://cplusplus.github.io/CWG/issues/1042.html">1042</a></td>
+ <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>
<td>C++11</td>
<td>Attributes in <I>alias-declaration</I>s</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="1043">
<td><a href="https://cplusplus.github.io/CWG/issues/1043.html">1043</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>C++11</td>
<td>Qualified name lookup in the current instantiation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1044">
<td><a href="https://cplusplus.github.io/CWG/issues/1044.html">1044</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.pdecl">basic.scope.pdecl</a>]</td>
<td>C++11</td>
<td>Point of declaration for an <I>alias-declaration</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1045">
<td><a href="https://cplusplus.github.io/CWG/issues/1045.html">1045</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>NAD</td>
<td>Requiring explicit instantiation declarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1046">
<td><a href="https://cplusplus.github.io/CWG/issues/1046.html">1046</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>open</td>
<td>What is a &#8220;use&#8221; of a class specialization?</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1047">
<td><a href="https://cplusplus.github.io/CWG/issues/1047.html">1047</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>
<td>C++11</td>
<td>When is <TT>typeid</TT> value-dependent?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1048">
<td><a href="https://cplusplus.github.io/CWG/issues/1048.html">1048</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>CD3</td>
<td><TT>auto</TT> deduction and lambda return type deduction.</td>
<td class="full" align="center">Clang 3.6</td>
</tr>
<tr class="open" id="1049">
<td><a href="https://cplusplus.github.io/CWG/issues/1049.html">1049</a></td>
+ <td>[<a href="https://wg21.link/class.copy.elision">class.copy.elision</a>]</td>
<td>open</td>
<td>Copy elision through reference parameters of inline functions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1050">
<td><a href="https://cplusplus.github.io/CWG/issues/1050.html">1050</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>NAD</td>
<td>Effects of thread support on object lifetime</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1051">
<td><a href="https://cplusplus.github.io/CWG/issues/1051.html">1051</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>C++11</td>
<td>Reference members and generated copy constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1052">
<td><a href="https://cplusplus.github.io/CWG/issues/1052.html">1052</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>dup</td>
<td><TT>const</TT> non-static data member and PODness</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1053">
<td><a href="https://cplusplus.github.io/CWG/issues/1053.html">1053</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>NAD</td>
<td>Terminate vs undefined behavior for noexcept violation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1054">
<td><a href="https://cplusplus.github.io/CWG/issues/1054.html">1054</a></td>
+ <td>[<a href="https://wg21.link/stmt.expr">stmt.expr</a>]</td>
<td>C++11</td>
<td>Lvalue-to-rvalue conversions in expression statements</td>
<td class="none" align="center">No</td>
</tr>
<tr id="1055">
<td><a href="https://cplusplus.github.io/CWG/issues/1055.html">1055</a></td>
+ <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>
<td>C++11</td>
<td>Permissible uses of <TT>void</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1056">
<td><a href="https://cplusplus.github.io/CWG/issues/1056.html">1056</a></td>
+ <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>
<td>C++11</td>
<td>Template aliases, member definitions, and the current instantiation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1057">
<td><a href="https://cplusplus.github.io/CWG/issues/1057.html">1057</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>C++11</td>
<td><TT>decltype</TT> and the current instantiation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1058">
<td><a href="https://cplusplus.github.io/CWG/issues/1058.html">1058</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>NAD</td>
<td>Reference binding of incompatible array types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1059">
<td><a href="https://cplusplus.github.io/CWG/issues/1059.html">1059</a></td>
+ <td>[<a href="https://wg21.link/basic.type.qualifier">basic.type.qualifier</a>]</td>
<td>CD3</td>
<td>Cv-qualified array types (with rvalues)</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1060">
<td><a href="https://cplusplus.github.io/CWG/issues/1060.html">1060</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++11</td>
<td>Scoped enumerators in integral constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1061">
<td><a href="https://cplusplus.github.io/CWG/issues/1061.html">1061</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>C++11</td>
<td>Negative array bounds in a <I>new-expression</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1062">
<td><a href="https://cplusplus.github.io/CWG/issues/1062.html">1062</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>C++11</td>
<td>Syntax of <I>attribute-specifier</I>s in lambdas</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1063">
<td><a href="https://cplusplus.github.io/CWG/issues/1063.html">1063</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.override">dcl.attr.override</a>]</td>
<td>C++11</td>
<td><TT>[[hiding]]</TT> with non-attribute declarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1064">
<td><a href="https://cplusplus.github.io/CWG/issues/1064.html">1064</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>C++11</td>
<td>Defaulted move constructor for a union</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1065">
<td><a href="https://cplusplus.github.io/CWG/issues/1065.html">1065</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.override">dcl.attr.override</a>]</td>
<td>C++11</td>
<td><TT>[[hiding]]</TT> with <TT>[[override]]</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1066">
<td><a href="https://cplusplus.github.io/CWG/issues/1066.html">1066</a></td>
+ <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>
<td>C++11</td>
<td>When is a copy/move assignment operator implicitly defined?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1067">
<td><a href="https://cplusplus.github.io/CWG/issues/1067.html">1067</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.override">dcl.attr.override</a>]</td>
<td>NAD</td>
<td><TT>[[hiding]]</TT>, <I>using-declaration</I>s, and multiple inheritance</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1068">
<td><a href="https://cplusplus.github.io/CWG/issues/1068.html">1068</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>C++11</td>
<td>Template aliases with default arguments and template parameter packs</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1069">
<td><a href="https://cplusplus.github.io/CWG/issues/1069.html">1069</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>C++11</td>
<td>Incorrect function type with <I>trailing-return-type</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1070">
<td><a href="https://cplusplus.github.io/CWG/issues/1070.html">1070</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>C++11</td>
<td>Missing initializer clauses in aggregate initialization</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="1071">
<td><a href="https://cplusplus.github.io/CWG/issues/1071.html">1071</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>C++11</td>
<td>Literal class types and trivial default constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1072">
<td><a href="https://cplusplus.github.io/CWG/issues/1072.html">1072</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>C++11</td>
<td>Scoped enumerator with the same name as its containing class</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1073">
<td><a href="https://cplusplus.github.io/CWG/issues/1073.html">1073</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>C++11</td>
<td>Merging <I>dynamic-exception-specification</I>s and <I>noexcept-specification</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1074">
<td><a href="https://cplusplus.github.io/CWG/issues/1074.html">1074</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>
<td>C++11</td>
<td>Value-dependent <I>noexcept-expression</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1075">
<td><a href="https://cplusplus.github.io/CWG/issues/1075.html">1075</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>
<td>C++11</td>
<td>Grammar does not allow template alias in <I>type-name</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1076">
<td><a href="https://cplusplus.github.io/CWG/issues/1076.html">1076</a></td>
+ <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>
<td>CD5</td>
<td>Value categories and lvalue temporaries</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1077">
<td><a href="https://cplusplus.github.io/CWG/issues/1077.html">1077</a></td>
+ <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>
<td>NAD</td>
<td>Explicit specializations in non-containing namespaces</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1078">
<td><a href="https://cplusplus.github.io/CWG/issues/1078.html">1078</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>NAD</td>
<td>Narrowing and the usual arithmetic conversions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1079">
<td><a href="https://cplusplus.github.io/CWG/issues/1079.html">1079</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>C++11</td>
<td>Overload resolution involving aggregate initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1080">
<td><a href="https://cplusplus.github.io/CWG/issues/1080.html">1080</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>C++11</td>
<td>Confusing relationship between templates and copy constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1081">
<td><a href="https://cplusplus.github.io/CWG/issues/1081.html">1081</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>C++11</td>
<td>Defaulted destructor and unusable operator delete</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1082">
<td><a href="https://cplusplus.github.io/CWG/issues/1082.html">1082</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>C++11</td>
<td>Implicit copy function if subobject has none?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1083">
<td><a href="https://cplusplus.github.io/CWG/issues/1083.html">1083</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>C++11</td>
<td>Passing an object to ellipsis with non-trivial move constructor</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1084">
<td><a href="https://cplusplus.github.io/CWG/issues/1084.html">1084</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>NAD</td>
<td>Conditions for a deleted move function</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1085">
<td><a href="https://cplusplus.github.io/CWG/issues/1085.html">1085</a></td>
+ <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>
<td>NAD</td>
<td>Move assignment operators and virtual bases</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1086">
<td><a href="https://cplusplus.github.io/CWG/issues/1086.html">1086</a></td>
+ <td>[<a href="https://wg21.link/expr.const.cast">expr.const.cast</a>]</td>
<td>C++11</td>
<td><TT>const_cast</TT> to rvalue reference to function type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1087">
<td><a href="https://cplusplus.github.io/CWG/issues/1087.html">1087</a></td>
+ <td>[<a href="https://wg21.link/over.match.copy">over.match.copy</a>]</td>
<td>C++11</td>
<td>Additional applications of issue 899</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1088">
<td><a href="https://cplusplus.github.io/CWG/issues/1088.html">1088</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>
<td>C++11</td>
<td>Dependent non-type template arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1089">
<td><a href="https://cplusplus.github.io/CWG/issues/1089.html">1089</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.qual.general">basic.lookup.qual.general</a>]</td>
<td>open</td>
<td>Template parameters in member selections</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1090">
<td><a href="https://cplusplus.github.io/CWG/issues/1090.html">1090</a></td>
+ <td>[<a href="https://wg21.link/basic.align">basic.align</a>]</td>
<td>C++11</td>
<td>Alignment of subobjects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1091">
<td><a href="https://cplusplus.github.io/CWG/issues/1091.html">1091</a></td>
+ <td>[<a href="https://wg21.link/expr.mptr.oper">expr.mptr.oper</a>]</td>
<td>C++11</td>
<td>Inconsistent use of the term &#8220;object expression&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1092">
<td><a href="https://cplusplus.github.io/CWG/issues/1092.html">1092</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>drafting</td>
<td>Cycles in overload resolution during instantiation</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1093">
<td><a href="https://cplusplus.github.io/CWG/issues/1093.html">1093</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>CD3</td>
<td>Value-initializing non-objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1094">
<td><a href="https://cplusplus.github.io/CWG/issues/1094.html">1094</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>C++11</td>
<td>Converting floating-point values to scoped enumeration types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1095">
<td><a href="https://cplusplus.github.io/CWG/issues/1095.html">1095</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>C++11</td>
<td>List-initialization of references</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1096">
<td><a href="https://cplusplus.github.io/CWG/issues/1096.html">1096</a></td>
+ <td>[<a href="https://wg21.link/temp">temp</a>]</td>
<td>C++11</td>
<td>Missing requirement for template definitions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1097">
<td><a href="https://cplusplus.github.io/CWG/issues/1097.html">1097</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>NAD</td>
<td>Aggregate initialization of function parameters</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1098">
<td><a href="https://cplusplus.github.io/CWG/issues/1098.html">1098</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++11</td>
<td>Pointer conversions in constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1099">
<td><a href="https://cplusplus.github.io/CWG/issues/1099.html">1099</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++11</td>
<td>Infinite recursion in <TT>constexpr</TT> functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1100">
<td><a href="https://cplusplus.github.io/CWG/issues/1100.html">1100</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++11</td>
<td><TT>constexpr</TT> conversion functions and non-type template arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1101">
<td><a href="https://cplusplus.github.io/CWG/issues/1101.html">1101</a></td>
+ <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>
<td>C++11</td>
<td>Non-integral initialized static data members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1102">
<td><a href="https://cplusplus.github.io/CWG/issues/1102.html">1102</a></td>
+ <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>
<td>C++11</td>
<td>Better example of undefined behavior</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1103">
<td><a href="https://cplusplus.github.io/CWG/issues/1103.html">1103</a></td>
+ <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>
<td>C++11</td>
<td>Reversion of phase 1 and 2 transformations in raw string literals</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1104">
<td><a href="https://cplusplus.github.io/CWG/issues/1104.html">1104</a></td>
+ <td>[<a href="https://wg21.link/lex.digraph">lex.digraph</a>]</td>
<td>C++11</td>
<td>Global-scope template arguments vs the <TT>&lt;:</TT> digraph</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1105">
<td><a href="https://cplusplus.github.io/CWG/issues/1105.html">1105</a></td>
+ <td>[<a href="https://wg21.link/lex.name">lex.name</a>]</td>
<td>C++11</td>
<td>Issues relating to TR 10176:2003</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1106">
<td><a href="https://cplusplus.github.io/CWG/issues/1106.html">1106</a></td>
+ <td>[<a href="https://wg21.link/lex.nullptr">lex.nullptr</a>]</td>
<td>C++11</td>
<td>Need more detail in <TT>nullptr</TT> keyword description</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1107">
<td><a href="https://cplusplus.github.io/CWG/issues/1107.html">1107</a></td>
+ <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>
<td>C++11</td>
<td>Overload resolution for user-defined integer literals</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1108">
<td><a href="https://cplusplus.github.io/CWG/issues/1108.html">1108</a></td>
+ <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>
<td>NAD</td>
<td>User-defined literals have not been implemented</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1109">
<td><a href="https://cplusplus.github.io/CWG/issues/1109.html">1109</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>C++11</td>
<td>When is &#8220;use&#8221; a reference to the ODR meaning?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1110">
<td><a href="https://cplusplus.github.io/CWG/issues/1110.html">1110</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>NAD</td>
<td>Incomplete return type should be allowed in <TT>decltype</TT> operand</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="1111">
<td><a href="https://cplusplus.github.io/CWG/issues/1111.html">1111</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>
<td>C++11</td>
<td>Remove dual-scope lookup of member template names</td>
<td class="partial" align="center">Partial</td>
</tr>
<tr id="1112">
<td><a href="https://cplusplus.github.io/CWG/issues/1112.html">1112</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>C++11</td>
<td><TT>constexpr</TT> variables should have internal linkage like <TT>const</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1113">
<td><a href="https://cplusplus.github.io/CWG/issues/1113.html">1113</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>C++11</td>
<td>Linkage of namespace member of unnamed namespace</td>
<td class="partial" align="center">Partial</td>
</tr>
<tr id="1114">
<td><a href="https://cplusplus.github.io/CWG/issues/1114.html">1114</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>C++11</td>
<td>Incorrect use of placement <TT>new</TT> in example</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1115">
<td><a href="https://cplusplus.github.io/CWG/issues/1115.html">1115</a></td>
+ <td>[<a href="https://wg21.link/basic.align">basic.align</a>]</td>
<td>C++11</td>
<td>C-compatible alignment specification</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1116">
<td><a href="https://cplusplus.github.io/CWG/issues/1116.html">1116</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>CD4</td>
<td>Aliasing of union members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1117">
<td><a href="https://cplusplus.github.io/CWG/issues/1117.html">1117</a></td>
+ <td>[<a href="https://wg21.link/expr">expr</a>]</td>
<td>C++11</td>
<td>Incorrect note about xvalue member access expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1118">
<td><a href="https://cplusplus.github.io/CWG/issues/1118.html">1118</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>NAD</td>
<td>Implicit lambda capture via explicit copy constructor</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1119">
<td><a href="https://cplusplus.github.io/CWG/issues/1119.html">1119</a></td>
+ <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>
<td>C++11</td>
<td>Missing case in description of member access ambiguity</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1120">
<td><a href="https://cplusplus.github.io/CWG/issues/1120.html">1120</a></td>
+ <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>
<td>C++11</td>
<td><TT>reinterpret_cast</TT> and <TT>void*</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1121">
<td><a href="https://cplusplus.github.io/CWG/issues/1121.html">1121</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>
<td>C++11</td>
<td>Unnecessary ambiguity error in formation of pointer to member</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1122">
<td><a href="https://cplusplus.github.io/CWG/issues/1122.html">1122</a></td>
+ <td>[<a href="https://wg21.link/expr.sizeof">expr.sizeof</a>]</td>
<td>C++11</td>
<td>Circular definition of <TT>std::size_t</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1123">
<td><a href="https://cplusplus.github.io/CWG/issues/1123.html">1123</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.noexcept">expr.unary.noexcept</a>]</td>
<td>C++11</td>
<td>Destructors should be <TT>noexcept</TT> by default</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1124">
<td><a href="https://cplusplus.github.io/CWG/issues/1124.html">1124</a></td>
+ <td>[<a href="https://wg21.link/expr.mptr.oper">expr.mptr.oper</a>]</td>
<td>NAD</td>
<td>Error in description of value category of pointer-to-member expression</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1125">
<td><a href="https://cplusplus.github.io/CWG/issues/1125.html">1125</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++11</td>
<td>Unclear definition of &#8220;potential constant expression&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1126">
<td><a href="https://cplusplus.github.io/CWG/issues/1126.html">1126</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++11</td>
<td><TT>constexpr</TT> functions in <TT>const</TT> initializers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1127">
<td><a href="https://cplusplus.github.io/CWG/issues/1127.html">1127</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++11</td>
<td>Overload resolution in <TT>constexpr</TT> functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1128">
<td><a href="https://cplusplus.github.io/CWG/issues/1128.html">1128</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec">dcl.spec</a>]</td>
<td>C++11</td>
<td><I>attribute-specifier</I>s in <I>decl-specifier-seq</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1129">
<td><a href="https://cplusplus.github.io/CWG/issues/1129.html">1129</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>C++11</td>
<td>Default <TT>nothrow</TT> for <TT>constexpr</TT> functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1130">
<td><a href="https://cplusplus.github.io/CWG/issues/1130.html">1130</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>
<td>C++11</td>
<td>Function parameter type adjustments and <TT>decltype</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1131">
<td><a href="https://cplusplus.github.io/CWG/issues/1131.html">1131</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.elab">dcl.type.elab</a>]</td>
<td>C++11</td>
<td>Template aliases in <I>elaborated-type-specifier</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1132">
<td><a href="https://cplusplus.github.io/CWG/issues/1132.html">1132</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.noreturn">dcl.attr.noreturn</a>]</td>
<td>NAD</td>
<td>Keyword vs attribute for <TT>noreturn</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1133">
<td><a href="https://cplusplus.github.io/CWG/issues/1133.html">1133</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.override">dcl.attr.override</a>]</td>
<td>C++11</td>
<td>Keywords vs attributes for control of hiding and overriding</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1134">
<td><a href="https://cplusplus.github.io/CWG/issues/1134.html">1134</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>C++11</td>
<td>When is an explicitly-defaulted function defined?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1135">
<td><a href="https://cplusplus.github.io/CWG/issues/1135.html">1135</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>C++11</td>
<td>Explicitly-defaulted non-public special member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1136">
<td><a href="https://cplusplus.github.io/CWG/issues/1136.html">1136</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>C++11</td>
<td>Explicitly-defaulted explicit constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1137">
<td><a href="https://cplusplus.github.io/CWG/issues/1137.html">1137</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>C++11</td>
<td>Explicitly-defaulted virtual special member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1138">
<td><a href="https://cplusplus.github.io/CWG/issues/1138.html">1138</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>C++11</td>
<td>Rvalue-ness check for rvalue reference binding is wrong</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1139">
<td><a href="https://cplusplus.github.io/CWG/issues/1139.html">1139</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>C++11</td>
<td>Rvalue reference binding to scalar xvalues</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1140">
<td><a href="https://cplusplus.github.io/CWG/issues/1140.html">1140</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>C++11</td>
<td>Incorrect redefinition of POD class</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1141">
<td><a href="https://cplusplus.github.io/CWG/issues/1141.html">1141</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>NAD</td>
<td>Non-static data member initializers have not been implemented</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1142">
<td><a href="https://cplusplus.github.io/CWG/issues/1142.html">1142</a></td>
+ <td>[<a href="https://wg21.link/class.mfct">class.mfct</a>]</td>
<td>C++11</td>
<td><TT>friend</TT> declaration of member function of containing class</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1143">
<td><a href="https://cplusplus.github.io/CWG/issues/1143.html">1143</a></td>
+ <td>[<a href="https://wg21.link/class.mfct.non.static">class.mfct.non.static</a>]</td>
<td>NAD</td>
<td>Move semantics for <TT>*this</TT> have not been implemented</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1144">
<td><a href="https://cplusplus.github.io/CWG/issues/1144.html">1144</a></td>
+ <td>[<a href="https://wg21.link/class.access.dcl">class.access.dcl</a>]</td>
<td>C++11</td>
<td>Remove access declarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1145">
<td><a href="https://cplusplus.github.io/CWG/issues/1145.html">1145</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>C++11</td>
<td>Defaulting and triviality</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1146">
<td><a href="https://cplusplus.github.io/CWG/issues/1146.html">1146</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>C++11</td>
<td><I>exception-specification</I>s of defaulted functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1147">
<td><a href="https://cplusplus.github.io/CWG/issues/1147.html">1147</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>C++11</td>
<td>Destructors should be default <TT>nothrow</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1148">
<td><a href="https://cplusplus.github.io/CWG/issues/1148.html">1148</a></td>
+ <td>[<a href="https://wg21.link/class.copy.elision">class.copy.elision</a>]</td>
<td>C++11</td>
<td>Copy elision and move construction of function parameters</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1149">
<td><a href="https://cplusplus.github.io/CWG/issues/1149.html">1149</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>C++11</td>
<td>Trivial non-public copy operators in subobjects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1150">
<td><a href="https://cplusplus.github.io/CWG/issues/1150.html">1150</a></td>
+ <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>
<td>NAD</td>
<td>Inheriting constructors have not been implemented</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="1151">
<td><a href="https://cplusplus.github.io/CWG/issues/1151.html">1151</a></td>
+ <td>[<a href="https://wg21.link/over.match.list">over.match.list</a>]</td>
<td>C++11</td>
<td>Overload resolution with initializer-list and non-list constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1152">
<td><a href="https://cplusplus.github.io/CWG/issues/1152.html">1152</a></td>
+ <td>[<a href="https://wg21.link/over.match.viable">over.match.viable</a>]</td>
<td>C++11</td>
<td>Rules for determining existence of implicit conversion sequence</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1153">
<td><a href="https://cplusplus.github.io/CWG/issues/1153.html">1153</a></td>
+ <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>
<td>C++11</td>
<td>Type matching in address of overloaded function</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1154">
<td><a href="https://cplusplus.github.io/CWG/issues/1154.html">1154</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>
<td>C++11</td>
<td>Address of <TT>thread_local</TT> variable as non-type template argument</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1155">
<td><a href="https://cplusplus.github.io/CWG/issues/1155.html">1155</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>
<td>C++11</td>
<td>Internal-linkage non-type template arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1156">
<td><a href="https://cplusplus.github.io/CWG/issues/1156.html">1156</a></td>
+ <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>
<td>C++11</td>
<td>Partial ordering in a non-call context</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1157">
<td><a href="https://cplusplus.github.io/CWG/issues/1157.html">1157</a></td>
+ <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>
<td>open</td>
<td>Partial ordering of function templates is still underspecified</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1158">
<td><a href="https://cplusplus.github.io/CWG/issues/1158.html">1158</a></td>
+ <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>
<td>C++11</td>
<td>Recursive instantiation via alias template</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1159">
<td><a href="https://cplusplus.github.io/CWG/issues/1159.html">1159</a></td>
+ <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>
<td>C++11</td>
<td>Class and enumeration definitions in template aliases</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1160">
<td><a href="https://cplusplus.github.io/CWG/issues/1160.html">1160</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>C++11</td>
<td>Definitions of template members and the current instantiation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1161">
<td><a href="https://cplusplus.github.io/CWG/issues/1161.html">1161</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>C++11</td>
<td>Dependent <I>nested-name-specifier</I> in a pointer-to-member declarator</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1162">
<td><a href="https://cplusplus.github.io/CWG/issues/1162.html">1162</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>NAD</td>
<td>Dependent <I>elaborated-type-specifier</I>s in non-deduced contexts</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1163">
<td><a href="https://cplusplus.github.io/CWG/issues/1163.html">1163</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>NAD</td>
<td><TT>extern template</TT> prevents inlining functions not marked <TT>inline</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1164">
<td><a href="https://cplusplus.github.io/CWG/issues/1164.html">1164</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>C++11</td>
<td>Partial ordering of <TT>f(T&amp;)</TT> and <TT>f(T&amp;&amp;)</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1165">
<td><a href="https://cplusplus.github.io/CWG/issues/1165.html">1165</a></td>
+ <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>
<td>C++11</td>
<td>Exceptions when destroying array elements</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1166">
<td><a href="https://cplusplus.github.io/CWG/issues/1166.html">1166</a></td>
+ <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>
<td>C++11</td>
<td><I>exception-declaration</I>s that do not declare objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1167">
<td><a href="https://cplusplus.github.io/CWG/issues/1167.html">1167</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>C++11</td>
<td><I>function-try-block</I>s for destructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1168">
<td><a href="https://cplusplus.github.io/CWG/issues/1168.html">1168</a></td>
+ <td>[<a href="https://wg21.link/except.terminate">except.terminate</a>]</td>
<td>C++11</td>
<td>Additional reasons to call <TT>std::terminate</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1169">
<td><a href="https://cplusplus.github.io/CWG/issues/1169.html">1169</a></td>
+ <td>[<a href="https://wg21.link/cpp.predefined">cpp.predefined</a>]</td>
<td>C++11</td>
<td>Missing feature macro for strict pointer safety</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1170">
<td><a href="https://cplusplus.github.io/CWG/issues/1170.html">1170</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>C++11</td>
<td>Access checking during template argument deduction</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1171">
<td><a href="https://cplusplus.github.io/CWG/issues/1171.html">1171</a></td>
+ <td>[<a href="https://wg21.link/except.terminate">except.terminate</a>]</td>
<td>C++11</td>
<td>Partial stack unwinding with <TT>noexcept</TT> violation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1172">
<td><a href="https://cplusplus.github.io/CWG/issues/1172.html">1172</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>drafting</td>
<td>&#8220;instantiation-dependent&#8221; constructs</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1173">
<td><a href="https://cplusplus.github.io/CWG/issues/1173.html">1173</a></td>
+ <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>
<td>C++11</td>
<td>Unclear specification of effects of signal handling</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1174">
<td><a href="https://cplusplus.github.io/CWG/issues/1174.html">1174</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>C++11</td>
<td>When is a pure virtual function &#8220;used?&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1175">
<td><a href="https://cplusplus.github.io/CWG/issues/1175.html">1175</a></td>
+ <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>
<td>C++11</td>
<td>Disambiguating user-defined literals</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1176">
<td><a href="https://cplusplus.github.io/CWG/issues/1176.html">1176</a></td>
+ <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>
<td>C++11</td>
<td>Definition of release sequence</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1177">
<td><a href="https://cplusplus.github.io/CWG/issues/1177.html">1177</a></td>
+ <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>
<td>C++11</td>
<td>Intra-thread dependency-ordered-before</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1178">
<td><a href="https://cplusplus.github.io/CWG/issues/1178.html">1178</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.decl">temp.deduct.decl</a>]</td>
<td>C++11</td>
<td>Deduction failure matching placement new</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1179">
<td><a href="https://cplusplus.github.io/CWG/issues/1179.html">1179</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>NAD</td>
<td>Cv-qualification of non-type template parameters</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1180">
<td><a href="https://cplusplus.github.io/CWG/issues/1180.html">1180</a></td>
+ <td>[<a href="https://wg21.link/basic.align">basic.align</a>]</td>
<td>C++11</td>
<td>Over-aligned class types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1181">
<td><a href="https://cplusplus.github.io/CWG/issues/1181.html">1181</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>C++11</td>
<td>What is a &#8220;built-in type?&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1182">
<td><a href="https://cplusplus.github.io/CWG/issues/1182.html">1182</a></td>
+ <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>
<td>C++11</td>
<td>Incorrect description of pack expansion syntax</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1183">
<td><a href="https://cplusplus.github.io/CWG/issues/1183.html">1183</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>C++11</td>
<td>Expansion of parameter packs in declarators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1184">
<td><a href="https://cplusplus.github.io/CWG/issues/1184.html">1184</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>C++11</td>
<td>Argument conversions to nondeduced parameter types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1185">
<td><a href="https://cplusplus.github.io/CWG/issues/1185.html">1185</a></td>
+ <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>
<td>C++11</td>
<td>Misleading description of language linkage and member function types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1186">
<td><a href="https://cplusplus.github.io/CWG/issues/1186.html">1186</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>C++11</td>
<td>Non-dependent <TT>constexpr</TT> violations in function templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1187">
<td><a href="https://cplusplus.github.io/CWG/issues/1187.html">1187</a></td>
+ <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>
<td>C++11</td>
<td>Problems in initialization example</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1188">
<td><a href="https://cplusplus.github.io/CWG/issues/1188.html">1188</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++11</td>
<td>Type punning in constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1189">
<td><a href="https://cplusplus.github.io/CWG/issues/1189.html">1189</a></td>
+ <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>
<td>C++11</td>
<td>Address of distinct base class subobjects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1190">
<td><a href="https://cplusplus.github.io/CWG/issues/1190.html">1190</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic.safety">basic.stc.dynamic.safety</a>]</td>
<td>C++11</td>
<td>Operations on non-safely-derived pointers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1191">
<td><a href="https://cplusplus.github.io/CWG/issues/1191.html">1191</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>C++11</td>
<td>Deleted subobject destructors and implicitly-defined constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1192">
<td><a href="https://cplusplus.github.io/CWG/issues/1192.html">1192</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>C++11</td>
<td>Inadvertent change to ODR and templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1193">
<td><a href="https://cplusplus.github.io/CWG/issues/1193.html">1193</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++11</td>
<td>Use of address-constant pointers in constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1194">
<td><a href="https://cplusplus.github.io/CWG/issues/1194.html">1194</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>C++11</td>
<td>Constexpr references</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1195">
<td><a href="https://cplusplus.github.io/CWG/issues/1195.html">1195</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>C++11</td>
<td>References to non-literal types in constexpr functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1196">
<td><a href="https://cplusplus.github.io/CWG/issues/1196.html">1196</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>C++11</td>
<td>Definition required for explicit instantiation after explicit specialization?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1197">
<td><a href="https://cplusplus.github.io/CWG/issues/1197.html">1197</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++11</td>
<td>Constexpr arrays</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1198">
<td><a href="https://cplusplus.github.io/CWG/issues/1198.html">1198</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>C++11</td>
<td>Literal types and copy constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1199">
<td><a href="https://cplusplus.github.io/CWG/issues/1199.html">1199</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>C++11</td>
<td>Deleted constexpr functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1200">
<td><a href="https://cplusplus.github.io/CWG/issues/1200.html">1200</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>
<td>CD6</td>
<td>Lookup rules for template parameters</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="1201">
<td><a href="https://cplusplus.github.io/CWG/issues/1201.html">1201</a></td>
+ <td>[<a href="https://wg21.link/basic.def">basic.def</a>]</td>
<td>C++11</td>
<td>Are deleted and defaulted functions definitions?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1202">
<td><a href="https://cplusplus.github.io/CWG/issues/1202.html">1202</a></td>
+ <td>[<a href="https://wg21.link/class.cdtor">class.cdtor</a>]</td>
<td>C++11</td>
<td>Calling virtual functions during destruction</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1203">
<td><a href="https://cplusplus.github.io/CWG/issues/1203.html">1203</a></td>
+ <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>
<td>dup</td>
<td>Misleading note regarding initialized static data members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1204">
<td><a href="https://cplusplus.github.io/CWG/issues/1204.html">1204</a></td>
+ <td>[<a href="https://wg21.link/stmt.iter">stmt.iter</a>]</td>
<td>C++11</td>
<td>Specifiers in a <I>for-range-declaration</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1205">
<td><a href="https://cplusplus.github.io/CWG/issues/1205.html">1205</a></td>
+ <td>[<a href="https://wg21.link/over.ics.ref">over.ics.ref</a>]</td>
<td>dup</td>
<td>Lvalue reference binding and function viability</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1206">
<td><a href="https://cplusplus.github.io/CWG/issues/1206.html">1206</a></td>
+ <td>[<a href="https://wg21.link/temp.class">temp.class</a>]</td>
<td>C++11</td>
<td>Defining opaque enumeration members of class templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1207">
<td><a href="https://cplusplus.github.io/CWG/issues/1207.html">1207</a></td>
+ <td>[<a href="https://wg21.link/class.mfct.non.static">class.mfct.non.static</a>]</td>
<td>C++11</td>
<td>Type of class member in <I>trailing-return-type</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1208">
<td><a href="https://cplusplus.github.io/CWG/issues/1208.html">1208</a></td>
+ <td>[<a href="https://wg21.link/class.mfct.non.static">class.mfct.non.static</a>]</td>
<td>C++11</td>
<td>Explicit <TT>noexcept</TT> in defaulted definition</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1209">
<td><a href="https://cplusplus.github.io/CWG/issues/1209.html">1209</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>open</td>
<td>Is a potentially-evaluated expression in a template definition a &#8220;use?&#8221;</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1210">
<td><a href="https://cplusplus.github.io/CWG/issues/1210.html">1210</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.pdecl">basic.scope.pdecl</a>]</td>
<td>C++11</td>
<td>Injection of <I>elaborated-type-specifier</I> in enumeration scope</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1211">
<td><a href="https://cplusplus.github.io/CWG/issues/1211.html">1211</a></td>
+ <td>[<a href="https://wg21.link/basic.align">basic.align</a>]</td>
<td>open</td>
<td>Misaligned lvalues</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1212">
<td><a href="https://cplusplus.github.io/CWG/issues/1212.html">1212</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>
<td>C++11</td>
<td>Non-function-call xvalues and <TT>decltype</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1213">
<td><a href="https://cplusplus.github.io/CWG/issues/1213.html">1213</a></td>
+ <td>[<a href="https://wg21.link/expr.sub">expr.sub</a>]</td>
<td>CD3</td>
<td>Array subscripting and xvalues</td>
<td class="full" align="center">Clang 7</td>
</tr>
<tr id="1214">
<td><a href="https://cplusplus.github.io/CWG/issues/1214.html">1214</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>C++11</td>
<td>Kinds of initializers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1215">
<td><a href="https://cplusplus.github.io/CWG/issues/1215.html">1215</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>C++11</td>
<td>Definition of POD struct</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1216">
<td><a href="https://cplusplus.github.io/CWG/issues/1216.html">1216</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>C++11</td>
<td>Exceptions &#8220;allowed&#8221; by a <I>noexcept-specification</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1217">
<td><a href="https://cplusplus.github.io/CWG/issues/1217.html">1217</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.delete">dcl.fct.def.delete</a>]</td>
<td>NAD</td>
<td>Are deleted functions implicitly <TT>noexcept</TT>?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1218">
<td><a href="https://cplusplus.github.io/CWG/issues/1218.html">1218</a></td>
+ <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>
<td>C++11</td>
<td>What is the &#8220;currently-handled exception&#8221; in a multi-threaded program?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1219">
<td><a href="https://cplusplus.github.io/CWG/issues/1219.html">1219</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>C++11</td>
<td>Non-static data member initializers in constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1220">
<td><a href="https://cplusplus.github.io/CWG/issues/1220.html">1220</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>
<td>C++11</td>
<td>Looking up <I>conversion-type-id</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1221">
<td><a href="https://cplusplus.github.io/CWG/issues/1221.html">1221</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.partial">temp.deduct.partial</a>]</td>
<td>open</td>
<td>Partial ordering and reference collapsing</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1222">
<td><a href="https://cplusplus.github.io/CWG/issues/1222.html">1222</a></td>
+ <td>[<a href="https://wg21.link/dcl.array">dcl.array</a>]</td>
<td>NAD</td>
<td>Unnecessary restriction on <TT>auto</TT> array types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1223">
<td><a href="https://cplusplus.github.io/CWG/issues/1223.html">1223</a></td>
+ <td>[<a href="https://wg21.link/stmt.ambig">stmt.ambig</a>]</td>
<td>CD7</td>
<td>Syntactic disambiguation and <I>trailing-return-type</I>s</td>
<td class="full" align="center">Clang 17</td>
</tr>
<tr id="1224">
<td><a href="https://cplusplus.github.io/CWG/issues/1224.html">1224</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>C++11</td>
<td><TT>constexpr</TT> defaulted copy constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1225">
<td><a href="https://cplusplus.github.io/CWG/issues/1225.html">1225</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>C++11</td>
<td><TT>constexpr</TT> constructors and virtual bases</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1226">
<td><a href="https://cplusplus.github.io/CWG/issues/1226.html">1226</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>CD3</td>
<td>Converting a <I>braced-init-list</I> default argument</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1227">
<td><a href="https://cplusplus.github.io/CWG/issues/1227.html">1227</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>CD3</td>
<td>Mixing immediate and non-immediate contexts in deduction failure</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="1228">
<td><a href="https://cplusplus.github.io/CWG/issues/1228.html">1228</a></td>
+ <td>[<a href="https://wg21.link/over.match.list">over.match.list</a>]</td>
<td>NAD</td>
<td>Copy-list-initialization and <TT>explicit</TT> constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1229">
<td><a href="https://cplusplus.github.io/CWG/issues/1229.html">1229</a></td>
+ <td>[<a href="https://wg21.link/over.match.list">over.match.list</a>]</td>
<td>C++11</td>
<td>Overload resolution with empty <I>braced-init-list</I> argument</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1230">
<td><a href="https://cplusplus.github.io/CWG/issues/1230.html">1230</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>
<td>dup</td>
<td>Confusing description of ambiguity of destructor name</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1231">
<td><a href="https://cplusplus.github.io/CWG/issues/1231.html">1231</a></td>
+ <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>
<td>C++11</td>
<td>Variadic templates requiring an empty pack expansion</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1232">
<td><a href="https://cplusplus.github.io/CWG/issues/1232.html">1232</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>C++11</td>
<td>Creation of array temporaries using a <I>braced-init-list</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1233">
<td><a href="https://cplusplus.github.io/CWG/issues/1233.html">1233</a></td>
+ <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>
<td>C++11</td>
<td>Pack expansions and dependent calls</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1234">
<td><a href="https://cplusplus.github.io/CWG/issues/1234.html">1234</a></td>
+ <td>[<a href="https://wg21.link/dcl.name">dcl.name</a>]</td>
<td>C++11</td>
<td><I>abstract-declarator</I> does not permit <TT>...</TT> after <I>ptr-operator</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1235">
<td><a href="https://cplusplus.github.io/CWG/issues/1235.html">1235</a></td>
+ <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>
<td>C++11</td>
<td>&#8220;Unused&#8221; ellipsis and default arguments in partial ordering</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1236">
<td><a href="https://cplusplus.github.io/CWG/issues/1236.html">1236</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>C++11</td>
<td>Inconsistently-interrelated examples</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1237">
<td><a href="https://cplusplus.github.io/CWG/issues/1237.html">1237</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>C++11</td>
<td>Deprecated implicit copy assignment in example</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1238">
<td><a href="https://cplusplus.github.io/CWG/issues/1238.html">1238</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>C++11</td>
<td>Overloading ambiguity binding reference to function</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1239">
<td><a href="https://cplusplus.github.io/CWG/issues/1239.html">1239</a></td>
+ <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>
<td>C++11</td>
<td>Hexadecimal floating-point literals vs user-defined literals</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1240">
<td><a href="https://cplusplus.github.io/CWG/issues/1240.html">1240</a></td>
+ <td>[<a href="https://wg21.link/dcl.name">dcl.name</a>]</td>
<td>C++11</td>
<td><TT>constexpr</TT> defaulted constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1241">
<td><a href="https://cplusplus.github.io/CWG/issues/1241.html">1241</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>C++11</td>
<td>Which members does a destructor destroy?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1242">
<td><a href="https://cplusplus.github.io/CWG/issues/1242.html">1242</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>C++11</td>
<td>Initializing variant class members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1243">
<td><a href="https://cplusplus.github.io/CWG/issues/1243.html">1243</a></td>
+ <td>[<a href="https://wg21.link/dcl.decl">dcl.decl</a>]</td>
<td>C++11</td>
<td>Misleading footnote regarding multiple-declarator declarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1244">
<td><a href="https://cplusplus.github.io/CWG/issues/1244.html">1244</a></td>
+ <td>[<a href="https://wg21.link/temp.type">temp.type</a>]</td>
<td>C++11</td>
<td>Equivalence of alias templates and class templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1245">
<td><a href="https://cplusplus.github.io/CWG/issues/1245.html">1245</a></td>
+ <td>[<a href="https://wg21.link/temp.mem.func">temp.mem.func</a>]</td>
<td>C++11</td>
<td>Matching declarations involving <TT>decltype</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1246">
<td><a href="https://cplusplus.github.io/CWG/issues/1246.html">1246</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>C++11</td>
<td>Non-deduced non-final parameter packs</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1247">
<td><a href="https://cplusplus.github.io/CWG/issues/1247.html">1247</a></td>
+ <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>
<td>CD4</td>
<td>Restriction on alias name appearing in <I>type-id</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1248">
<td><a href="https://cplusplus.github.io/CWG/issues/1248.html">1248</a></td>
+ <td>[<a href="https://wg21.link/diff.iso">diff.iso</a>]</td>
<td>open</td>
<td>Updating Annex C to C99 and C23</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1249">
<td><a href="https://cplusplus.github.io/CWG/issues/1249.html">1249</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>CD6</td>
<td>Cv-qualification of nested lambda capture</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1250">
<td><a href="https://cplusplus.github.io/CWG/issues/1250.html">1250</a></td>
+ <td>[<a href="https://wg21.link/class.virtual">class.virtual</a>]</td>
<td>CD3</td>
<td>Cv-qualification of incomplete virtual function return types</td>
<td class="full" align="center">Clang 3.9</td>
</tr>
<tr id="1251">
<td><a href="https://cplusplus.github.io/CWG/issues/1251.html">1251</a></td>
+ <td>[<a href="https://wg21.link/diff.conv">diff.conv</a>]</td>
<td>CD3</td>
<td>C compatibility: casting to unqualified <TT>void*</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1252">
<td><a href="https://cplusplus.github.io/CWG/issues/1252.html">1252</a></td>
+ <td>[<a href="https://wg21.link/over.load">over.load</a>]</td>
<td>CD6</td>
<td>Overloading member function templates based on dependent return type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1253">
<td><a href="https://cplusplus.github.io/CWG/issues/1253.html">1253</a></td>
+ <td>[<a href="https://wg21.link/temp.spec">temp.spec</a>]</td>
<td>C++17</td>
<td>Generic non-template members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1254">
<td><a href="https://cplusplus.github.io/CWG/issues/1254.html">1254</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>NAD</td>
<td>odr-use vs template arguments and constexpr functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1255">
<td><a href="https://cplusplus.github.io/CWG/issues/1255.html">1255</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>drafting</td>
<td>Definition problems with <TT>constexpr</TT> functions</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="1256">
<td><a href="https://cplusplus.github.io/CWG/issues/1256.html">1256</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>open</td>
<td>Unevaluated operands are not necessarily constant expressions</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="1257">
<td><a href="https://cplusplus.github.io/CWG/issues/1257.html">1257</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>open</td>
<td>Instantiation via non-dependent references in uninstantiated templates</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1258">
<td><a href="https://cplusplus.github.io/CWG/issues/1258.html">1258</a></td>
+ <td>[<a href="https://wg21.link/temp.point">temp.point</a>]</td>
<td>CD5</td>
<td>&#8220;Instantiation context&#8221; differs from dependent lookup rules</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1259">
<td><a href="https://cplusplus.github.io/CWG/issues/1259.html">1259</a></td>
+ <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>
<td>NAD</td>
<td>Deleting a POD via a pointer to base</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1260">
<td><a href="https://cplusplus.github.io/CWG/issues/1260.html">1260</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD3</td>
<td>Incorrect use of term &#8220;overloaded&#8221; in description of odr-use</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1261">
<td><a href="https://cplusplus.github.io/CWG/issues/1261.html">1261</a></td>
+ <td>[<a href="https://wg21.link/expr">expr</a>]</td>
<td>CD3</td>
<td>Explicit handling of cv-qualification with non-class prvalues</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1262">
<td><a href="https://cplusplus.github.io/CWG/issues/1262.html">1262</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>CD3</td>
<td>Default template arguments and deduction failure</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1263">
<td><a href="https://cplusplus.github.io/CWG/issues/1263.html">1263</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>NAD</td>
<td>Mismatch between rvalue reference binding and overload resolution</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1264">
<td><a href="https://cplusplus.github.io/CWG/issues/1264.html">1264</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD3</td>
<td>Use of <TT>this</TT> in <TT>constexpr</TT> constructor</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1265">
<td><a href="https://cplusplus.github.io/CWG/issues/1265.html">1265</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>CD3</td>
<td>Mixed use of the <TT>auto</TT> specifier</td>
<td class="full" align="center">Clang 5</td>
</tr>
<tr class="open" id="1266">
<td><a href="https://cplusplus.github.io/CWG/issues/1266.html">1266</a></td>
+ <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>
<td>open</td>
<td><I>user-defined-integer-literal</I> overflow</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1267">
<td><a href="https://cplusplus.github.io/CWG/issues/1267.html">1267</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>CD3</td>
<td>Rvalue reference types in <I>exception-specification</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1268">
<td><a href="https://cplusplus.github.io/CWG/issues/1268.html">1268</a></td>
+ <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>
<td>CD3</td>
<td><TT>reinterpret_cast</TT> of an xvalue operand</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1269">
<td><a href="https://cplusplus.github.io/CWG/issues/1269.html">1269</a></td>
+ <td>[<a href="https://wg21.link/expr.dynamic.cast">expr.dynamic.cast</a>]</td>
<td>CD3</td>
<td><TT>dynamic_cast</TT> of an xvalue operand</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1270">
<td><a href="https://cplusplus.github.io/CWG/issues/1270.html">1270</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD3</td>
<td>Brace elision in array temporary initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1271">
<td><a href="https://cplusplus.github.io/CWG/issues/1271.html">1271</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>CD5</td>
<td>Imprecise wording regarding dependent types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1272">
<td><a href="https://cplusplus.github.io/CWG/issues/1272.html">1272</a></td>
+ <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>
<td>NAD</td>
<td>Implicit definition of static data member of const literal type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1273">
<td><a href="https://cplusplus.github.io/CWG/issues/1273.html">1273</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>NAD</td>
<td>Accessibility and function signatures</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1274">
<td><a href="https://cplusplus.github.io/CWG/issues/1274.html">1274</a></td>
+ <td>[<a href="https://wg21.link/stmt.ranged">stmt.ranged</a>]</td>
<td>CD4</td>
<td>Common nonterminal for <I>expression</I> and <I>braced-init-list</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1275">
<td><a href="https://cplusplus.github.io/CWG/issues/1275.html">1275</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>CD3</td>
<td>Incorrect comment in example of template parameter pack restriction</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1276">
<td><a href="https://cplusplus.github.io/CWG/issues/1276.html">1276</a></td>
+ <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>
<td>NAD</td>
<td>Reference to <TT>stdint.h</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1277">
<td><a href="https://cplusplus.github.io/CWG/issues/1277.html">1277</a></td>
+ <td>[<a href="https://wg21.link/cstdint.syn">cstdint.syn</a>]</td>
<td>NAD</td>
<td>Lax definition of <TT>intmax_t</TT> and <TT>uintmax_t</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1278">
<td><a href="https://cplusplus.github.io/CWG/issues/1278.html">1278</a></td>
+ <td>[<a href="https://wg21.link/over.call.func">over.call.func</a>]</td>
<td>drafting</td>
<td>Incorrect treatment of contrived object</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="1279">
<td><a href="https://cplusplus.github.io/CWG/issues/1279.html">1279</a></td>
+ <td>[<a href="https://wg21.link/diff.cpp03">diff.cpp03</a>]</td>
<td>open</td>
<td>Additional differences between C++ 2003 and C++ 2011</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1280">
<td><a href="https://cplusplus.github.io/CWG/issues/1280.html">1280</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>NAD</td>
<td>Object reallocation and reference members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1281">
<td><a href="https://cplusplus.github.io/CWG/issues/1281.html">1281</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>NAD</td>
<td>Virtual and dependent base classes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1282">
<td><a href="https://cplusplus.github.io/CWG/issues/1282.html">1282</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>CD3</td>
<td>Underspecified destructor <I>exception-specification</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1283">
<td><a href="https://cplusplus.github.io/CWG/issues/1283.html">1283</a></td>
+ <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>
<td>open</td>
<td>Static data members of classes with typedef name for linkage purposes</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1284">
<td><a href="https://cplusplus.github.io/CWG/issues/1284.html">1284</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>CD4</td>
<td>Should the lifetime of an array be independent of that of its elements?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1285">
<td><a href="https://cplusplus.github.io/CWG/issues/1285.html">1285</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>NAD</td>
<td>Trivial destructors and object lifetime</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1286">
<td><a href="https://cplusplus.github.io/CWG/issues/1286.html">1286</a></td>
+ <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>
<td>open</td>
<td>Equivalence of alias templates</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1287">
<td><a href="https://cplusplus.github.io/CWG/issues/1287.html">1287</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>C++14</td>
<td>Direct initialization vs &#8220;implicit&#8221; conversion in reference binding</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1288">
<td><a href="https://cplusplus.github.io/CWG/issues/1288.html">1288</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD3</td>
<td>Reference list initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1289">
<td><a href="https://cplusplus.github.io/CWG/issues/1289.html">1289</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>NAD</td>
<td>Can an alias template name the current instantiation?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1290">
<td><a href="https://cplusplus.github.io/CWG/issues/1290.html">1290</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD3</td>
<td>Lifetime of the underlying array of an <TT>initializer_list</TT> member</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1291">
<td><a href="https://cplusplus.github.io/CWG/issues/1291.html">1291</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>
<td>CD6</td>
<td>Looking up a <I>conversion-type-id</I></td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="1292">
<td><a href="https://cplusplus.github.io/CWG/issues/1292.html">1292</a></td>
+ <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>
<td>CD4</td>
<td>Dependent calls with <I>braced-init-list</I>s containing a pack expansion</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1293">
<td><a href="https://cplusplus.github.io/CWG/issues/1293.html">1293</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD3</td>
<td>String literals in constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1294">
<td><a href="https://cplusplus.github.io/CWG/issues/1294.html">1294</a></td>
+ <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>
<td>open</td>
<td>Side effects in dynamic/static initialization</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1295">
<td><a href="https://cplusplus.github.io/CWG/issues/1295.html">1295</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>CD3</td>
<td>Binding a reference to an rvalue bit-field</td>
<td class="full" align="center">Clang 4</td>
</tr>
<tr id="1296">
<td><a href="https://cplusplus.github.io/CWG/issues/1296.html">1296</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>CD3</td>
<td>Ill-formed template declarations (not just definitions)</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1297">
<td><a href="https://cplusplus.github.io/CWG/issues/1297.html">1297</a></td>
+ <td>[<a href="https://wg21.link/dcl.decl">dcl.decl</a>]</td>
<td>CD3</td>
<td>Misplaced function <I>attribute-specifier</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1298">
<td><a href="https://cplusplus.github.io/CWG/issues/1298.html">1298</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>CD3</td>
<td>Incorrect example in overload resolution</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1299">
<td><a href="https://cplusplus.github.io/CWG/issues/1299.html">1299</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>CD5</td>
<td>&#8220;Temporary objects&#8221; vs &#8220;temporary expressions&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1300">
<td><a href="https://cplusplus.github.io/CWG/issues/1300.html">1300</a></td>
+ <td>[<a href="https://wg21.link/expr.type.conv">expr.type.conv</a>]</td>
<td>dup</td>
<td><TT>T()</TT> for array types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1301">
<td><a href="https://cplusplus.github.io/CWG/issues/1301.html">1301</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>CD3</td>
<td>Value initialization of union</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1302">
<td><a href="https://cplusplus.github.io/CWG/issues/1302.html">1302</a></td>
+ <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>
<td>CD3</td>
<td><TT>noexcept</TT> applied to expression of type <TT>void</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1303">
<td><a href="https://cplusplus.github.io/CWG/issues/1303.html">1303</a></td>
+ <td>[<a href="https://wg21.link/temp">temp</a>]</td>
<td>NAD</td>
<td>C language linkage for template with internal linkage</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1304">
<td><a href="https://cplusplus.github.io/CWG/issues/1304.html">1304</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.string">dcl.init.string</a>]</td>
<td>drafting</td>
<td>Omitted array bound with string initialization</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1305">
<td><a href="https://cplusplus.github.io/CWG/issues/1305.html">1305</a></td>
+ <td>[<a href="https://wg21.link/expr.alignof">expr.alignof</a>]</td>
<td>CD3</td>
<td><TT>alignof</TT> applied to array of unknown size</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="1306">
<td><a href="https://cplusplus.github.io/CWG/issues/1306.html">1306</a></td>
+ <td>[<a href="https://wg21.link/class.this">class.this</a>]</td>
<td>CD3</td>
<td>Modifying an object within a <TT>const</TT> member function</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1307">
<td><a href="https://cplusplus.github.io/CWG/issues/1307.html">1307</a></td>
+ <td>[<a href="https://wg21.link/over.ics.list">over.ics.list</a>]</td>
<td>C++14</td>
<td>Overload resolution based on size of array <I>initializer-list</I></td>
<td class="full" align="center">Clang 14</td>
</tr>
<tr id="1308">
<td><a href="https://cplusplus.github.io/CWG/issues/1308.html">1308</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>CD3</td>
<td>Completeness of class type within an <I>exception-specification</I></td>
<td class="full-superseded" align="center">Superseded by <a href="#1330">1330</a></td>
</tr>
<tr id="1309">
<td><a href="https://cplusplus.github.io/CWG/issues/1309.html">1309</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>CD4</td>
<td>Incorrect note regarding lookup of a member of the current instantiation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1310">
<td><a href="https://cplusplus.github.io/CWG/issues/1310.html">1310</a></td>
+ <td>[<a href="https://wg21.link/class.qual">class.qual</a>]</td>
<td>CD3</td>
<td>What is an &#8220;acceptable lookup result?&#8221;</td>
<td class="full" align="center">Clang 5</td>
</tr>
<tr id="1311">
<td><a href="https://cplusplus.github.io/CWG/issues/1311.html">1311</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD3</td>
<td>Volatile lvalues in constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1312">
<td><a href="https://cplusplus.github.io/CWG/issues/1312.html">1312</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD3</td>
<td>Simulated <TT>reinterpret_cast</TT> in constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1313">
<td><a href="https://cplusplus.github.io/CWG/issues/1313.html">1313</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD3</td>
<td>Undefined pointer arithmetic in constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1314">
<td><a href="https://cplusplus.github.io/CWG/issues/1314.html">1314</a></td>
+ <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>
<td>NAD</td>
<td>Pointer arithmetic within standard-layout objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1315">
<td><a href="https://cplusplus.github.io/CWG/issues/1315.html">1315</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial.general">temp.spec.partial.general</a>]</td>
<td>CD4</td>
<td>Restrictions on non-type template arguments in partial specializations</td>
<td class="partial" align="center">Partial</td>
</tr>
<tr id="1316">
<td><a href="https://cplusplus.github.io/CWG/issues/1316.html">1316</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>NAD</td>
<td><TT>constexpr</TT> function requirements and class scope</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1317">
<td><a href="https://cplusplus.github.io/CWG/issues/1317.html">1317</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>NAD</td>
<td>Unnamed scoped enumerations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1318">
<td><a href="https://cplusplus.github.io/CWG/issues/1318.html">1318</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>CD3</td>
<td>Syntactic ambiguities with <TT>final</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1319">
<td><a href="https://cplusplus.github.io/CWG/issues/1319.html">1319</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>NAD</td>
<td>Error in pack expansion example</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1320">
<td><a href="https://cplusplus.github.io/CWG/issues/1320.html">1320</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>CD3</td>
<td>Converting scoped enumerations to <TT>bool</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1321">
<td><a href="https://cplusplus.github.io/CWG/issues/1321.html">1321</a></td>
+ <td>[<a href="https://wg21.link/temp.over.link">temp.over.link</a>]</td>
<td>CD3</td>
<td>Equivalency of dependent calls</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1322">
<td><a href="https://cplusplus.github.io/CWG/issues/1322.html">1322</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>drafting</td>
<td>Function parameter type decay in templates</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1323">
<td><a href="https://cplusplus.github.io/CWG/issues/1323.html">1323</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>
<td>NAD</td>
<td>Nonexistent nonterminal in <I>alignment-specifier</I> grammar</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1324">
<td><a href="https://cplusplus.github.io/CWG/issues/1324.html">1324</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>CD3</td>
<td>Value initialization and defaulted constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1325">
<td><a href="https://cplusplus.github.io/CWG/issues/1325.html">1325</a></td>
+ <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>
<td>NAD</td>
<td>Omitted declarator in <TT>friend</TT> declarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1326">
<td><a href="https://cplusplus.github.io/CWG/issues/1326.html">1326</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>dup</td>
<td>Deducing an array bound from an <I>initializer-list</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1327">
<td><a href="https://cplusplus.github.io/CWG/issues/1327.html">1327</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>CD3</td>
<td><I>virt-specifier</I> in a defaulted definition</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1328">
<td><a href="https://cplusplus.github.io/CWG/issues/1328.html">1328</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>CD3</td>
<td>Conflict in reference binding vs overload resolution</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1329">
<td><a href="https://cplusplus.github.io/CWG/issues/1329.html">1329</a></td>
+ <td>[<a href="https://wg21.link/implimits">implimits</a>]</td>
<td>CD3</td>
<td>Recursive deduction substitutions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1330">
<td><a href="https://cplusplus.github.io/CWG/issues/1330.html">1330</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>CD3</td>
<td>Delayed instantiation of <TT>noexcept</TT> specifiers</td>
<td class="full" align="center">Clang 4 (C++11 onwards)</td>
</tr>
<tr id="1331">
<td><a href="https://cplusplus.github.io/CWG/issues/1331.html">1331</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>CD5</td>
<td><TT>const</TT> mismatch with defaulted copy constructor</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1332">
<td><a href="https://cplusplus.github.io/CWG/issues/1332.html">1332</a></td>
+ <td>[<a href="https://wg21.link/lex.charset">lex.charset</a>]</td>
<td>CD5</td>
<td>Handling of invalid universal-character-names</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1333">
<td><a href="https://cplusplus.github.io/CWG/issues/1333.html">1333</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>CD3</td>
<td>Omission of <TT>const</TT> in a defaulted copy constructor</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1334">
<td><a href="https://cplusplus.github.io/CWG/issues/1334.html">1334</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>NAD</td>
<td>Layout compatibility and cv-qualification</td>
<td class="full-superseded" align="center">Superseded by <a href="#1719">1719</a></td>
</tr>
<tr id="1335">
<td><a href="https://cplusplus.github.io/CWG/issues/1335.html">1335</a></td>
+ <td>[<a href="https://wg21.link/cpp.stringize">cpp.stringize</a>]</td>
<td>CD6</td>
<td>Stringizing, extended characters, and universal-character-names</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1336">
<td><a href="https://cplusplus.github.io/CWG/issues/1336.html">1336</a></td>
+ <td>[<a href="https://wg21.link/class.conv.ctor">class.conv.ctor</a>]</td>
<td>CD3</td>
<td>Definition of &#8220;converting constructor&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1337">
<td><a href="https://cplusplus.github.io/CWG/issues/1337.html">1337</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.partial">temp.deduct.partial</a>]</td>
<td>dup</td>
<td>Partial ordering and non-deduced parameters</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1338">
<td><a href="https://cplusplus.github.io/CWG/issues/1338.html">1338</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic.allocation">basic.stc.dynamic.allocation</a>]</td>
<td>CD4</td>
<td>Aliasing and allocation functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1339">
<td><a href="https://cplusplus.github.io/CWG/issues/1339.html">1339</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>NAD</td>
<td>Parenthesized <I>braced-init-list</I> and arrays</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1340">
<td><a href="https://cplusplus.github.io/CWG/issues/1340.html">1340</a></td>
+ <td>[<a href="https://wg21.link/expr.mptr.oper">expr.mptr.oper</a>]</td>
<td>CD3</td>
<td>Complete type in member pointer expressions</td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="1341">
<td><a href="https://cplusplus.github.io/CWG/issues/1341.html">1341</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>NAD</td>
<td>Bit-field initializers</td>
<td class="na" align="center">Superseded by <a href="https://wg21.link/P0683R1">P0683R1</a></td>
</tr>
<tr id="1342">
<td><a href="https://cplusplus.github.io/CWG/issues/1342.html">1342</a></td>
+ <td>[<a href="https://wg21.link/dcl.decl">dcl.decl</a>]</td>
<td>CD6</td>
<td>Order of initialization with multiple declarators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1343">
<td><a href="https://cplusplus.github.io/CWG/issues/1343.html">1343</a></td>
+ <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>
<td>C++17</td>
<td>Sequencing of non-class initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1344">
<td><a href="https://cplusplus.github.io/CWG/issues/1344.html">1344</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>C++14</td>
<td>Adding new special member functions to a class via default arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1345">
<td><a href="https://cplusplus.github.io/CWG/issues/1345.html">1345</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>CD3</td>
<td>Initialization of anonymous union class members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1346">
<td><a href="https://cplusplus.github.io/CWG/issues/1346.html">1346</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>CD3</td>
<td><I>expression-list</I> initializers and the <TT>auto</TT> specifier</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="1347">
<td><a href="https://cplusplus.github.io/CWG/issues/1347.html">1347</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>CD3</td>
<td>Consistency of <TT>auto</TT> in multiple-declarator declarations</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr class="open" id="1348">
<td><a href="https://cplusplus.github.io/CWG/issues/1348.html">1348</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>drafting</td>
<td>Use of <TT>auto</TT> in a <I>trailing-return-type</I></td>
<td align="center">Not resolved</td>
</tr>
<tr id="1349">
<td><a href="https://cplusplus.github.io/CWG/issues/1349.html">1349</a></td>
+ <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>
<td>dup</td>
<td>Consistency of alias template redeclarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1350">
<td><a href="https://cplusplus.github.io/CWG/issues/1350.html">1350</a></td>
+ <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>
<td>CD3</td>
<td>Incorrect exception specification for inherited constructors</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="1351">
<td><a href="https://cplusplus.github.io/CWG/issues/1351.html">1351</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>CD4</td>
<td>Problems with implicitly-declared <I>exception-specification</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1352">
<td><a href="https://cplusplus.github.io/CWG/issues/1352.html">1352</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.class">basic.scope.class</a>]</td>
<td>CD3</td>
<td>Inconsistent class scope and completeness rules</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="1353">
<td><a href="https://cplusplus.github.io/CWG/issues/1353.html">1353</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>CD7</td>
<td>Array and variant members and deleted special member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1354">
<td><a href="https://cplusplus.github.io/CWG/issues/1354.html">1354</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.noexcept">expr.unary.noexcept</a>]</td>
<td>CD3</td>
<td>Destructor exceptions for temporaries in noexcept expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1355">
<td><a href="https://cplusplus.github.io/CWG/issues/1355.html">1355</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>CD3</td>
<td>Aggregates and &#8220;user-provided&#8221; constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1356">
<td><a href="https://cplusplus.github.io/CWG/issues/1356.html">1356</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>CD4</td>
<td>Exception specifications of copy assignment operators with virtual bases</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1357">
<td><a href="https://cplusplus.github.io/CWG/issues/1357.html">1357</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>CD3</td>
<td><I>brace-or-equal-initializer</I>s for function and typedef members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1358">
<td><a href="https://cplusplus.github.io/CWG/issues/1358.html">1358</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>CD3</td>
<td>Unintentionally ill-formed <TT>constexpr</TT> function template instances</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="1359">
<td><a href="https://cplusplus.github.io/CWG/issues/1359.html">1359</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>CD3</td>
<td><TT>constexpr</TT> union constructors</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="1360">
<td><a href="https://cplusplus.github.io/CWG/issues/1360.html">1360</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>CD6</td>
<td><TT>constexpr</TT> defaulted default constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1361">
<td><a href="https://cplusplus.github.io/CWG/issues/1361.html">1361</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>CD3</td>
<td>Requirement on <I>brace-or-equal-initializer</I>s of literal types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1362">
<td><a href="https://cplusplus.github.io/CWG/issues/1362.html">1362</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD3</td>
<td>Complete type required for implicit conversion to <TT>T&amp;</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1363">
<td><a href="https://cplusplus.github.io/CWG/issues/1363.html">1363</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>CD3</td>
<td>Triviality vs multiple default constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1364">
<td><a href="https://cplusplus.github.io/CWG/issues/1364.html">1364</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD3</td>
<td><TT>constexpr</TT> function parameters</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1365">
<td><a href="https://cplusplus.github.io/CWG/issues/1365.html">1365</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD3</td>
<td>Calling undefined <TT>constexpr</TT> functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1366">
<td><a href="https://cplusplus.github.io/CWG/issues/1366.html">1366</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>CD3</td>
<td>Deleted <TT>constexpr</TT> constructors and virtual base classes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1367">
<td><a href="https://cplusplus.github.io/CWG/issues/1367.html">1367</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD3</td>
<td>Use of <TT>this</TT> in a constant expression</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1368">
<td><a href="https://cplusplus.github.io/CWG/issues/1368.html">1368</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>CD3</td>
<td>Value initialization and defaulted constructors (part 2)</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1369">
<td><a href="https://cplusplus.github.io/CWG/issues/1369.html">1369</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>CD3</td>
<td>Function invocation substitution of <TT>this</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1370">
<td><a href="https://cplusplus.github.io/CWG/issues/1370.html">1370</a></td>
+ <td>[<a href="https://wg21.link/cpp.replace">cpp.replace</a>]</td>
<td>CD3</td>
<td><I>identifier-list</I> cannot contain ellipsis</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1371">
<td><a href="https://cplusplus.github.io/CWG/issues/1371.html">1371</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>NAD</td>
<td>Deduction from <TT>T&amp;&amp;</TT> in return types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1372">
<td><a href="https://cplusplus.github.io/CWG/issues/1372.html">1372</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.conv">temp.deduct.conv</a>]</td>
<td>CD3</td>
<td>Cross-references incorrect in conversion function template argument deduction</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1373">
<td><a href="https://cplusplus.github.io/CWG/issues/1373.html">1373</a></td>
+ <td>[<a href="https://wg21.link/over.match.ref">over.match.ref</a>]</td>
<td>dup</td>
<td>Overload resolution changes matching reference-binding changes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1374">
<td><a href="https://cplusplus.github.io/CWG/issues/1374.html">1374</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>CD3</td>
<td>Qualification conversion vs difference in reference binding</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1375">
<td><a href="https://cplusplus.github.io/CWG/issues/1375.html">1375</a></td>
+ <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>
<td>CD3</td>
<td>Reference to anonymous union?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1376">
<td><a href="https://cplusplus.github.io/CWG/issues/1376.html">1376</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>C++14</td>
<td><TT>static_cast</TT> of temporary to rvalue reference</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1377">
<td><a href="https://cplusplus.github.io/CWG/issues/1377.html">1377</a></td>
+ <td>[<a href="https://wg21.link/diff.cpp03">diff.cpp03</a>]</td>
<td>dup</td>
<td>Access declarations not mentioned in Annex C</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1378">
<td><a href="https://cplusplus.github.io/CWG/issues/1378.html">1378</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>CD5</td>
<td>When is an instantiation required?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1379">
<td><a href="https://cplusplus.github.io/CWG/issues/1379.html">1379</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>NAD</td>
<td>Is <TT>std::initializer_list</TT> an aggregate?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1380">
<td><a href="https://cplusplus.github.io/CWG/issues/1380.html">1380</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>CD3</td>
<td>Type definitions in <I>template-parameter</I> <I>parameter-declaration</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1381">
<td><a href="https://cplusplus.github.io/CWG/issues/1381.html">1381</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>CD3</td>
<td>Implicitly-declared special member functions and default <TT>nothrow</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1382">
<td><a href="https://cplusplus.github.io/CWG/issues/1382.html">1382</a></td>
+ <td>[<a href="https://wg21.link/dcl.decl">dcl.decl</a>]</td>
<td>CD3</td>
<td>Dead code for constructor names</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1383">
<td><a href="https://cplusplus.github.io/CWG/issues/1383.html">1383</a></td>
+ <td>[<a href="https://wg21.link/expr">expr</a>]</td>
<td>CD3</td>
<td>Clarifying discarded-value expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1384">
<td><a href="https://cplusplus.github.io/CWG/issues/1384.html">1384</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>NAD</td>
<td><TT>reinterpret_cast</TT> in constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1385">
<td><a href="https://cplusplus.github.io/CWG/issues/1385.html">1385</a></td>
+ <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>
<td>CD3</td>
<td>Syntactic forms of conversion functions for surrogate call functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1386">
<td><a href="https://cplusplus.github.io/CWG/issues/1386.html">1386</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.explicit">temp.arg.explicit</a>]</td>
<td>NAD</td>
<td>Explicitly-specified partial argument list with multiple parameter packs</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1387">
<td><a href="https://cplusplus.github.io/CWG/issues/1387.html">1387</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>CD3</td>
<td>Missing non-deduced context for <TT>decltype</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1388">
<td><a href="https://cplusplus.github.io/CWG/issues/1388.html">1388</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>CD3</td>
<td>Missing non-deduced context following a function parameter pack</td>
<td class="full" align="center">Clang 4</td>
</tr>
<tr id="1389">
<td><a href="https://cplusplus.github.io/CWG/issues/1389.html">1389</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>NAD</td>
<td>Recursive reference in <I>trailing-return-type</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1390">
<td><a href="https://cplusplus.github.io/CWG/issues/1390.html">1390</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>drafting</td>
<td>Dependency of alias template specializations</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1391">
<td><a href="https://cplusplus.github.io/CWG/issues/1391.html">1391</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.explicit">temp.arg.explicit</a>]</td>
<td>CD4</td>
<td>Conversions to parameter types with non-deduced template arguments</td>
<td class="partial" align="center">Partial</td>
</tr>
<tr id="1392">
<td><a href="https://cplusplus.github.io/CWG/issues/1392.html">1392</a></td>
+ <td>[<a href="https://wg21.link/over.match.ref">over.match.ref</a>]</td>
<td>CD3</td>
<td>Explicit conversion functions for references and non-references</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1393">
<td><a href="https://cplusplus.github.io/CWG/issues/1393.html">1393</a></td>
+ <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>
<td>C++17</td>
<td>Pack expansions in <I>using-declaration</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1394">
<td><a href="https://cplusplus.github.io/CWG/issues/1394.html">1394</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>CD3</td>
<td>Incomplete types as parameters of deleted functions</td>
<td class="full" align="center">Clang 15</td>
</tr>
<tr id="1395">
<td><a href="https://cplusplus.github.io/CWG/issues/1395.html">1395</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>C++17</td>
<td>Partial ordering of variadic templates reconsidered</td>
<td class="full" align="center">Clang 16</td>
</tr>
<tr id="1396">
<td><a href="https://cplusplus.github.io/CWG/issues/1396.html">1396</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>C++23</td>
<td>Deferred instantiation and checking of non-static data member initializers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1397">
<td><a href="https://cplusplus.github.io/CWG/issues/1397.html">1397</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>CD4</td>
<td>Class completeness in non-static data member initializers</td>
<td class="full" align="center">Clang 3.2</td>
</tr>
<tr id="1398">
<td><a href="https://cplusplus.github.io/CWG/issues/1398.html">1398</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>
<td>CD3</td>
<td>Non-type template parameters of type <TT>std::nullptr_t</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1399">
<td><a href="https://cplusplus.github.io/CWG/issues/1399.html">1399</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>CD3</td>
<td>Deduction with multiple function parameter packs</td>
<td class="full" align="center">Duplicate of <a href="#1388">1388</a></td>
</tr>
<tr id="1400">
<td><a href="https://cplusplus.github.io/CWG/issues/1400.html">1400</a></td>
+ <td>[<a href="https://wg21.link/expr.eq">expr.eq</a>]</td>
<td>NAD</td>
<td>Function pointer equality</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1401">
<td><a href="https://cplusplus.github.io/CWG/issues/1401.html">1401</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>CD3</td>
<td>Similar types and reference compatibility</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1402">
<td><a href="https://cplusplus.github.io/CWG/issues/1402.html">1402</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>CD3</td>
<td>Move functions too often deleted</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1403">
<td><a href="https://cplusplus.github.io/CWG/issues/1403.html">1403</a></td>
+ <td>[<a href="https://wg21.link/lex.comment">lex.comment</a>]</td>
<td>CD6</td>
<td>Universal-character-names in comments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1404">
<td><a href="https://cplusplus.github.io/CWG/issues/1404.html">1404</a></td>
+ <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>
<td>open</td>
<td>Object reallocation in unions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1405">
<td><a href="https://cplusplus.github.io/CWG/issues/1405.html">1405</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>CD3</td>
<td><TT>constexpr</TT> and mutable members of literal types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1406">
<td><a href="https://cplusplus.github.io/CWG/issues/1406.html">1406</a></td>
+ <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>
<td>CD3</td>
<td><I>ref-qualifier</I>s and added parameters of non-static member function templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1407">
<td><a href="https://cplusplus.github.io/CWG/issues/1407.html">1407</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>NAD</td>
<td>Integral to <TT>bool</TT> conversion in converted constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1408">
<td><a href="https://cplusplus.github.io/CWG/issues/1408.html">1408</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>CD3</td>
<td>What is &#8220;the same aggregate initialization?&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1409">
<td><a href="https://cplusplus.github.io/CWG/issues/1409.html">1409</a></td>
+ <td>[<a href="https://wg21.link/over.ics.list">over.ics.list</a>]</td>
<td>CD3</td>
<td>What is the second standard conversion sequence of a list-initialization sequence?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1410">
<td><a href="https://cplusplus.github.io/CWG/issues/1410.html">1410</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>CD3</td>
<td>Reference overload tiebreakers should apply to rvalue references</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1411">
<td><a href="https://cplusplus.github.io/CWG/issues/1411.html">1411</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>CD3</td>
<td>More on global scope <TT>::</TT> in <I>nested-name-specifier</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1412">
<td><a href="https://cplusplus.github.io/CWG/issues/1412.html">1412</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>CD3</td>
<td>Problems in specifying pointer conversions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1413">
<td><a href="https://cplusplus.github.io/CWG/issues/1413.html">1413</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>
<td>CD3</td>
<td>Missing cases of value-dependency</td>
<td class="full" align="center">Clang 12</td>
</tr>
<tr class="open" id="1414">
<td><a href="https://cplusplus.github.io/CWG/issues/1414.html">1414</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>drafting</td>
<td>Binding an rvalue reference to a reference-unrelated lvalue</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1415">
<td><a href="https://cplusplus.github.io/CWG/issues/1415.html">1415</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>CD3</td>
<td>Missing prohibition of block-scope definition of <TT>extern</TT> object</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1416">
<td><a href="https://cplusplus.github.io/CWG/issues/1416.html">1416</a></td>
+ <td>[<a href="https://wg21.link/expr.typeid">expr.typeid</a>]</td>
<td>CD3</td>
<td>Function cv-qualifiers and <TT>typeid</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1417">
<td><a href="https://cplusplus.github.io/CWG/issues/1417.html">1417</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>C++14</td>
<td>Pointers/references to functions with cv-qualifiers or <I>ref-qualifier</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1418">
<td><a href="https://cplusplus.github.io/CWG/issues/1418.html">1418</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD3</td>
<td>Type of <TT>initializer_list</TT> backing array</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1419">
<td><a href="https://cplusplus.github.io/CWG/issues/1419.html">1419</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>NAD</td>
<td>Evaluation order in aggregate initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1420">
<td><a href="https://cplusplus.github.io/CWG/issues/1420.html">1420</a></td>
+ <td>[<a href="https://wg21.link/class.abstract">class.abstract</a>]</td>
<td>NAD</td>
<td>Abstract final classes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1421">
<td><a href="https://cplusplus.github.io/CWG/issues/1421.html">1421</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>NAD</td>
<td>Full expressions and aggregate initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1422">
<td><a href="https://cplusplus.github.io/CWG/issues/1422.html">1422</a></td>
+ <td>[<a href="https://wg21.link/lex.ccon">lex.ccon</a>]</td>
<td>dup</td>
<td>Type of character literals containing universal-character-names</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1423">
<td><a href="https://cplusplus.github.io/CWG/issues/1423.html">1423</a></td>
+ <td>[<a href="https://wg21.link/conv.fctptr">conv.fctptr</a>]</td>
<td>CD3</td>
<td>Convertibility of <TT>nullptr</TT> to <TT>bool</TT></td>
<td class="full" align="center">Clang 11</td>
</tr>
<tr id="1424">
<td><a href="https://cplusplus.github.io/CWG/issues/1424.html">1424</a></td>
+ <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>
<td>C++14</td>
<td>When must sub-object destructors be accessible?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1425">
<td><a href="https://cplusplus.github.io/CWG/issues/1425.html">1425</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>CD3</td>
<td>Base-class subobjects of standard-layout structs</td>
<td class="na" align="center">N/A (ABI constraint)</td>
</tr>
<tr id="1426">
<td><a href="https://cplusplus.github.io/CWG/issues/1426.html">1426</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>CD5</td>
<td>Allowing additional parameter types in defaulted functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1427">
<td><a href="https://cplusplus.github.io/CWG/issues/1427.html">1427</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>NAD</td>
<td>Default constructor and deleted or inaccessible destructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1428">
<td><a href="https://cplusplus.github.io/CWG/issues/1428.html">1428</a></td>
+ <td>[<a href="https://wg21.link/basic.type.qualifier">basic.type.qualifier</a>]</td>
<td>CD3</td>
<td>Dynamic const objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1429">
<td><a href="https://cplusplus.github.io/CWG/issues/1429.html">1429</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.temp">basic.scope.temp</a>]</td>
<td>NAD</td>
<td>Scope of a member template's template parameter</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1430">
<td><a href="https://cplusplus.github.io/CWG/issues/1430.html">1430</a></td>
+ <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>
<td>open</td>
<td>Pack expansion into fixed alias template parameter list</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1431">
<td><a href="https://cplusplus.github.io/CWG/issues/1431.html">1431</a></td>
+ <td>[<a href="https://wg21.link/except">except</a>]</td>
<td>CD3</td>
<td>Exceptions from other than <I>throw-expression</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1432">
<td><a href="https://cplusplus.github.io/CWG/issues/1432.html">1432</a></td>
+ <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>
<td>open</td>
<td>Newly-ambiguous variadic template expansions</td>
<td align="center">
@@ -8419,912 +9809,1064 @@ and <I>POD class</I></td>
</tr>
<tr id="1433">
<td><a href="https://cplusplus.github.io/CWG/issues/1433.html">1433</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.pdecl">basic.scope.pdecl</a>]</td>
<td>NAD</td>
<td><I>trailing-return-type</I> and point of declaration</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1434">
<td><a href="https://cplusplus.github.io/CWG/issues/1434.html">1434</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>NAD</td>
<td>Parenthesized <I>braced-init-list</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1435">
<td><a href="https://cplusplus.github.io/CWG/issues/1435.html">1435</a></td>
+ <td>[<a href="https://wg21.link/dcl.meaning">dcl.meaning</a>]</td>
<td>CD3</td>
<td><I>template-id</I> as the declarator for a class template constructor</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1436">
<td><a href="https://cplusplus.github.io/CWG/issues/1436.html">1436</a></td>
+ <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>
<td>open</td>
<td>Interaction of constant expression changes with preprocessor expressions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1437">
<td><a href="https://cplusplus.github.io/CWG/issues/1437.html">1437</a></td>
+ <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>
<td>CD3</td>
<td><TT>alignas</TT> in <I>alias-declaration</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1438">
<td><a href="https://cplusplus.github.io/CWG/issues/1438.html">1438</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic.safety">basic.stc.dynamic.safety</a>]</td>
<td>CD3</td>
<td>Non-dereference use of invalid pointers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1439">
<td><a href="https://cplusplus.github.io/CWG/issues/1439.html">1439</a></td>
+ <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>
<td>CD3</td>
<td>Lookup and friend template declarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1440">
<td><a href="https://cplusplus.github.io/CWG/issues/1440.html">1440</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>
<td>CD3</td>
<td>Acceptable <I>decltype-specifier</I>s used as <I>nested-name-specifier</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1441">
<td><a href="https://cplusplus.github.io/CWG/issues/1441.html">1441</a></td>
+ <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>
<td>C++14</td>
<td>Unclear wording for signal handler restrictions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1442">
<td><a href="https://cplusplus.github.io/CWG/issues/1442.html">1442</a></td>
+ <td>[<a href="https://wg21.link/stmt.ranged">stmt.ranged</a>]</td>
<td>CD3</td>
<td>Argument-dependent lookup in the range-based <TT>for</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1443">
<td><a href="https://cplusplus.github.io/CWG/issues/1443.html">1443</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>NAD</td>
<td>Default arguments and non-static data members</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr class="open" id="1444">
<td><a href="https://cplusplus.github.io/CWG/issues/1444.html">1444</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>drafting</td>
<td>Type adjustments of non-type template parameters</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1445">
<td><a href="https://cplusplus.github.io/CWG/issues/1445.html">1445</a></td>
+ <td>[<a href="https://wg21.link/stmt.ranged">stmt.ranged</a>]</td>
<td>dup</td>
<td>Argument-dependent lookup of <TT>begin</TT> and <TT>end</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1446">
<td><a href="https://cplusplus.github.io/CWG/issues/1446.html">1446</a></td>
+ <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>
<td>CD4</td>
<td>Member function with no <I>ref-qualifier</I> and non-member function with rvalue reference</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1447">
<td><a href="https://cplusplus.github.io/CWG/issues/1447.html">1447</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>CD3</td>
<td><TT>static_cast</TT> of bit-field lvalue to rvalue reference</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1448">
<td><a href="https://cplusplus.github.io/CWG/issues/1448.html">1448</a></td>
+ <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>
<td>NAD</td>
<td>Integral values of type <TT>bool</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1449">
<td><a href="https://cplusplus.github.io/CWG/issues/1449.html">1449</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD3</td>
<td>Narrowing conversion of negative value to unsigned type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1450">
<td><a href="https://cplusplus.github.io/CWG/issues/1450.html">1450</a></td>
+ <td>[<a href="https://wg21.link/expr.mul">expr.mul</a>]</td>
<td>CD3</td>
<td><TT>INT_MIN % -1</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1451">
<td><a href="https://cplusplus.github.io/CWG/issues/1451.html">1451</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>
<td>CD4</td>
<td>Objects with no linkage in non-type template arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1452">
<td><a href="https://cplusplus.github.io/CWG/issues/1452.html">1452</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>NAD</td>
<td>Value-initialized objects may be constants</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1453">
<td><a href="https://cplusplus.github.io/CWG/issues/1453.html">1453</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>CD3</td>
<td>Volatile members in literal classes?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1454">
<td><a href="https://cplusplus.github.io/CWG/issues/1454.html">1454</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD3</td>
<td>Passing constants through <TT>constexpr</TT> functions via references</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1455">
<td><a href="https://cplusplus.github.io/CWG/issues/1455.html">1455</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD3</td>
<td>Lvalue converted constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1456">
<td><a href="https://cplusplus.github.io/CWG/issues/1456.html">1456</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD3</td>
<td>Address constant expression designating the one-past-the-end address</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1457">
<td><a href="https://cplusplus.github.io/CWG/issues/1457.html">1457</a></td>
+ <td>[<a href="https://wg21.link/expr.shift">expr.shift</a>]</td>
<td>CD3</td>
<td>Undefined behavior in left-shift</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1458">
<td><a href="https://cplusplus.github.io/CWG/issues/1458.html">1458</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>
<td>CD3</td>
<td>Address of incomplete type vs <TT>operator&amp;()</TT></td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr class="open" id="1459">
<td><a href="https://cplusplus.github.io/CWG/issues/1459.html">1459</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>open</td>
<td>Reference-binding tiebreakers in overload resolution</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1460">
<td><a href="https://cplusplus.github.io/CWG/issues/1460.html">1460</a></td>
+ <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>
<td>C++14</td>
<td>What is an empty union?</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="1461">
<td><a href="https://cplusplus.github.io/CWG/issues/1461.html">1461</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>NAD</td>
<td>Narrowing conversions to bit-fields</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1462">
<td><a href="https://cplusplus.github.io/CWG/issues/1462.html">1462</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>CD3</td>
<td>Deduction failure vs &#8220;ill-formed, no diagnostic required&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1463">
<td><a href="https://cplusplus.github.io/CWG/issues/1463.html">1463</a></td>
+ <td>[<a href="https://wg21.link/temp.pre">temp.pre</a>]</td>
<td>drafting</td>
<td><TT>extern "C"</TT> alias templates</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1464">
<td><a href="https://cplusplus.github.io/CWG/issues/1464.html">1464</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD3</td>
<td>Negative array bound in a <I>new-expression</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1465">
<td><a href="https://cplusplus.github.io/CWG/issues/1465.html">1465</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.noexcept">expr.unary.noexcept</a>]</td>
<td>CD4</td>
<td><TT>noexcept</TT> and <TT>std::bad_array_new_length</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1466">
<td><a href="https://cplusplus.github.io/CWG/issues/1466.html">1466</a></td>
+ <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>
<td>C++14</td>
<td>Visible sequences of side effects are redundant</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1467">
<td><a href="https://cplusplus.github.io/CWG/issues/1467.html">1467</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD4</td>
<td>List-initialization of aggregate from same-type object</td>
<td class="full" align="center">Clang 3.7 (C++11 onwards)</td>
</tr>
<tr id="1468">
<td><a href="https://cplusplus.github.io/CWG/issues/1468.html">1468</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>CD5</td>
<td><TT>typeid</TT>, overload resolution, and implicit lambda capture</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1469">
<td><a href="https://cplusplus.github.io/CWG/issues/1469.html">1469</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD5</td>
<td>Omitted bound in array <I>new-expression</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1470">
<td><a href="https://cplusplus.github.io/CWG/issues/1470.html">1470</a></td>
+ <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>
<td>NAD</td>
<td>Thread migration</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1471">
<td><a href="https://cplusplus.github.io/CWG/issues/1471.html">1471</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>CD3</td>
<td>Nested type of non-dependent base</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1472">
<td><a href="https://cplusplus.github.io/CWG/issues/1472.html">1472</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD3</td>
<td>odr-use of reference variables</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1473">
<td><a href="https://cplusplus.github.io/CWG/issues/1473.html">1473</a></td>
+ <td>[<a href="https://wg21.link/over.literal">over.literal</a>]</td>
<td>CD3</td>
<td>Syntax of <I>literal-operator-id</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1474">
<td><a href="https://cplusplus.github.io/CWG/issues/1474.html">1474</a></td>
+ <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>
<td>NAD</td>
<td>User-defined literals and <TT>&lt;inttypes.h&gt;</TT> format macros</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1475">
<td><a href="https://cplusplus.github.io/CWG/issues/1475.html">1475</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.depend">dcl.attr.depend</a>]</td>
<td>CD3</td>
<td>Errors in <TT>[[carries_dependency]]</TT> example</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1476">
<td><a href="https://cplusplus.github.io/CWG/issues/1476.html">1476</a></td>
+ <td>[<a href="https://wg21.link/intro.defs">intro.defs</a>]</td>
<td>CD3</td>
<td>Definition of user-defined type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1477">
<td><a href="https://cplusplus.github.io/CWG/issues/1477.html">1477</a></td>
+ <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>
<td>CD3</td>
<td>Definition of a <TT>friend</TT> outside its namespace</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="1478">
<td><a href="https://cplusplus.github.io/CWG/issues/1478.html">1478</a></td>
+ <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>
<td>CD6</td>
<td><TT>template</TT> keyword for dependent template template arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1479">
<td><a href="https://cplusplus.github.io/CWG/issues/1479.html">1479</a></td>
+ <td>[<a href="https://wg21.link/over.literal">over.literal</a>]</td>
<td>CD3</td>
<td>Literal operators and default arguments</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="1480">
<td><a href="https://cplusplus.github.io/CWG/issues/1480.html">1480</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD3</td>
<td>Constant initialization via non-constant temporary</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1481">
<td><a href="https://cplusplus.github.io/CWG/issues/1481.html">1481</a></td>
+ <td>[<a href="https://wg21.link/over.inc">over.inc</a>]</td>
<td>CD3</td>
<td>Increment/decrement operators with reference parameters</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1482">
<td><a href="https://cplusplus.github.io/CWG/issues/1482.html">1482</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.pdecl">basic.scope.pdecl</a>]</td>
<td>CD3</td>
<td>Point of declaration of enumeration</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="1483">
<td><a href="https://cplusplus.github.io/CWG/issues/1483.html">1483</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>NAD</td>
<td>Non-dependent <I>static_assert-declaration</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1484">
<td><a href="https://cplusplus.github.io/CWG/issues/1484.html">1484</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>CD4</td>
<td>Unused local classes of function templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1485">
<td><a href="https://cplusplus.github.io/CWG/issues/1485.html">1485</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>drafting</td>
<td>Out-of-class definition of member unscoped opaque enumeration</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="1486">
<td><a href="https://cplusplus.github.io/CWG/issues/1486.html">1486</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.funcaddr">temp.deduct.funcaddr</a>]</td>
<td>drafting</td>
<td>Base-derived conversion in member pointer deduction</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1487">
<td><a href="https://cplusplus.github.io/CWG/issues/1487.html">1487</a></td>
+ <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>
<td>CD3</td>
<td>When are inheriting constructors declared?</td>
<td class="full" align="center">Clang 3.3</td>
</tr>
<tr class="open" id="1488">
<td><a href="https://cplusplus.github.io/CWG/issues/1488.html">1488</a></td>
+ <td>[<a href="https://wg21.link/dcl.name">dcl.name</a>]</td>
<td>drafting</td>
<td><I>abstract-pack-declarator</I>s in <I>type-id</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1489">
<td><a href="https://cplusplus.github.io/CWG/issues/1489.html">1489</a></td>
+ <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>
<td>CD3</td>
<td>Is value-initialization of an array constant initialization?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1490">
<td><a href="https://cplusplus.github.io/CWG/issues/1490.html">1490</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD4</td>
<td>List-initialization from a string literal</td>
<td class="full" align="center">Clang 3.7 (C++11 onwards)</td>
</tr>
<tr id="1491">
<td><a href="https://cplusplus.github.io/CWG/issues/1491.html">1491</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>CD3</td>
<td>Move construction and rvalue reference members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1492">
<td><a href="https://cplusplus.github.io/CWG/issues/1492.html">1492</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>CD4</td>
<td>Exception specifications on template destructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1493">
<td><a href="https://cplusplus.github.io/CWG/issues/1493.html">1493</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>C++14</td>
<td>Criteria for move-construction</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1494">
<td><a href="https://cplusplus.github.io/CWG/issues/1494.html">1494</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD3</td>
<td>Temporary initialization for reference binding in list-initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1495">
<td><a href="https://cplusplus.github.io/CWG/issues/1495.html">1495</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>
<td>CD3</td>
<td>Partial specialization of variadic class template</td>
<td class="full" align="center">Clang 4</td>
</tr>
<tr id="1496">
<td><a href="https://cplusplus.github.io/CWG/issues/1496.html">1496</a></td>
+ <td>[<a href="https://wg21.link/class.name">class.name</a>]</td>
<td>CD4</td>
<td>Triviality with deleted and missing default constructors</td>
<td class="none" align="center">No</td>
</tr>
<tr id="1497">
<td><a href="https://cplusplus.github.io/CWG/issues/1497.html">1497</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>NAD</td>
<td>Aggregate initialization with parenthesized string literal</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1498">
<td><a href="https://cplusplus.github.io/CWG/issues/1498.html">1498</a></td>
+ <td>[<a href="https://wg21.link/stmt.ranged">stmt.ranged</a>]</td>
<td>dup</td>
<td>Lifetime of temporaries in range-based <TT>for</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1499">
<td><a href="https://cplusplus.github.io/CWG/issues/1499.html">1499</a></td>
+ <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>
<td>CD7</td>
<td>Missing case for deleted move assignment operator</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1500">
<td><a href="https://cplusplus.github.io/CWG/issues/1500.html">1500</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.candidate">temp.dep.candidate</a>]</td>
<td>CD6</td>
<td>Name lookup of dependent conversion function</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1501">
<td><a href="https://cplusplus.github.io/CWG/issues/1501.html">1501</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>NAD</td>
<td>Nested braces in list-initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1502">
<td><a href="https://cplusplus.github.io/CWG/issues/1502.html">1502</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>CD3</td>
<td>Value initialization of unions with member initializers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1503">
<td><a href="https://cplusplus.github.io/CWG/issues/1503.html">1503</a></td>
+ <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>
<td>CD3</td>
<td>Exceptions during copy to exception object</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1504">
<td><a href="https://cplusplus.github.io/CWG/issues/1504.html">1504</a></td>
+ <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>
<td>CD3</td>
<td>Pointer arithmetic after derived-base conversion</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1505">
<td><a href="https://cplusplus.github.io/CWG/issues/1505.html">1505</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>dup</td>
<td>Direct binding of reference to temporary in list-initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1506">
<td><a href="https://cplusplus.github.io/CWG/issues/1506.html">1506</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD3</td>
<td>Value category of <TT>initializer_list</TT> object</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1507">
<td><a href="https://cplusplus.github.io/CWG/issues/1507.html">1507</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>CD3</td>
<td>Value initialization with trivial inaccessible default constructor</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1508">
<td><a href="https://cplusplus.github.io/CWG/issues/1508.html">1508</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>C++14</td>
<td>Template initializer-list constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1509">
<td><a href="https://cplusplus.github.io/CWG/issues/1509.html">1509</a></td>
+ <td>[<a href="https://wg21.link/intro.defs">intro.defs</a>]</td>
<td>C++14</td>
<td>Definition of &#8220;non-template function&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1510">
<td><a href="https://cplusplus.github.io/CWG/issues/1510.html">1510</a></td>
+ <td>[<a href="https://wg21.link/dcl.ref">dcl.ref</a>]</td>
<td>CD3</td>
<td>cv-qualified references via <TT>decltype</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1511">
<td><a href="https://cplusplus.github.io/CWG/issues/1511.html">1511</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD3</td>
<td><TT>const volatile</TT> variables and the one-definition rule</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1512">
<td><a href="https://cplusplus.github.io/CWG/issues/1512.html">1512</a></td>
+ <td>[<a href="https://wg21.link/expr.rel">expr.rel</a>]</td>
<td>CD3</td>
<td>Pointer comparison vs qualification conversions</td>
<td class="full" align="center">Clang 4</td>
</tr>
<tr class="open" id="1513">
<td><a href="https://cplusplus.github.io/CWG/issues/1513.html">1513</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>drafting</td>
<td><TT>initializer_list</TT> deduction failure</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1514">
<td><a href="https://cplusplus.github.io/CWG/issues/1514.html">1514</a></td>
+ <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>
<td>C++14</td>
<td>Ambiguity between enumeration definition and zero-length bit-field</td>
<td class="full" align="center">Clang 11</td>
</tr>
<tr id="1515">
<td><a href="https://cplusplus.github.io/CWG/issues/1515.html">1515</a></td>
+ <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>
<td>CD3</td>
<td>Modulo 2<SUP><I>n</I></SUP> arithmetic for implicitly-unsigned types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1516">
<td><a href="https://cplusplus.github.io/CWG/issues/1516.html">1516</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>CD3</td>
<td>Definition of &#8220;virtual function call&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1517">
<td><a href="https://cplusplus.github.io/CWG/issues/1517.html">1517</a></td>
+ <td>[<a href="https://wg21.link/class.cdtor">class.cdtor</a>]</td>
<td>open</td>
<td>Unclear/missing description of behavior during construction/destruction</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1518">
<td><a href="https://cplusplus.github.io/CWG/issues/1518.html">1518</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD4</td>
<td>Explicit default constructors and copy-list-initialization</td>
<td class="full" align="center">Clang 4</td>
</tr>
<tr id="1519">
<td><a href="https://cplusplus.github.io/CWG/issues/1519.html">1519</a></td>
+ <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>
<td>NAD</td>
<td>Conflicting default and variadic constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1520">
<td><a href="https://cplusplus.github.io/CWG/issues/1520.html">1520</a></td>
+ <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>
<td>NAD</td>
<td>Alias template specialization vs pack expansion</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1521">
<td><a href="https://cplusplus.github.io/CWG/issues/1521.html">1521</a></td>
+ <td>[<a href="https://wg21.link/expr.type.conv">expr.type.conv</a>]</td>
<td>dup</td>
<td><TT>T{</TT><I>expr</I><TT>}</TT> with reference types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1522">
<td><a href="https://cplusplus.github.io/CWG/issues/1522.html">1522</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD3</td>
<td>Access checking for <TT>initializer_list</TT> array initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1523">
<td><a href="https://cplusplus.github.io/CWG/issues/1523.html">1523</a></td>
+ <td>[<a href="https://wg21.link/stmt.ranged">stmt.ranged</a>]</td>
<td>CD5</td>
<td>Point of declaration in range-based <TT>for</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1524">
<td><a href="https://cplusplus.github.io/CWG/issues/1524.html">1524</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>drafting</td>
<td>Incompletely-defined class template base</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1525">
<td><a href="https://cplusplus.github.io/CWG/issues/1525.html">1525</a></td>
+ <td>[<a href="https://wg21.link/expr.type.conv">expr.type.conv</a>]</td>
<td>NAD</td>
<td>Array bound inference in temporary array</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1526">
<td><a href="https://cplusplus.github.io/CWG/issues/1526.html">1526</a></td>
+ <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>
<td>dup</td>
<td>Dependent-class lookup in the current instantiation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1527">
<td><a href="https://cplusplus.github.io/CWG/issues/1527.html">1527</a></td>
+ <td>[<a href="https://wg21.link/expr.assign">expr.assign</a>]</td>
<td>CD3</td>
<td>Assignment from <I>braced-init-list</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1528">
<td><a href="https://cplusplus.github.io/CWG/issues/1528.html">1528</a></td>
+ <td>[<a href="https://wg21.link/dcl.decl">dcl.decl</a>]</td>
<td>CD3</td>
<td>Repeated <I>cv-qualifier</I>s in declarators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1529">
<td><a href="https://cplusplus.github.io/CWG/issues/1529.html">1529</a></td>
+ <td>[<a href="https://wg21.link/basic.pre">basic.pre</a>]</td>
<td>drafting</td>
<td>Nomenclature for variable vs reference non-static data member</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="1530">
<td><a href="https://cplusplus.github.io/CWG/issues/1530.html">1530</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>drafting</td>
<td>Member access in out-of-lifetime objects</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1531">
<td><a href="https://cplusplus.github.io/CWG/issues/1531.html">1531</a></td>
+ <td>[<a href="https://wg21.link/intro.defs">intro.defs</a>]</td>
<td>CD3</td>
<td>Definition of &#8220;access&#8221; (verb)</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1532">
<td><a href="https://cplusplus.github.io/CWG/issues/1532.html">1532</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>CD3</td>
<td>Explicit instantiation and member templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1533">
<td><a href="https://cplusplus.github.io/CWG/issues/1533.html">1533</a></td>
+ <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>
<td>CD3</td>
<td>Function pack expansion for member initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1534">
<td><a href="https://cplusplus.github.io/CWG/issues/1534.html">1534</a></td>
+ <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>
<td>dup</td>
<td>cv-qualification of prvalue of type &#8220;array of class&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1535">
<td><a href="https://cplusplus.github.io/CWG/issues/1535.html">1535</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD3</td>
<td><TT>typeid</TT> in core constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1536">
<td><a href="https://cplusplus.github.io/CWG/issues/1536.html">1536</a></td>
+ <td>[<a href="https://wg21.link/over.ics.list">over.ics.list</a>]</td>
<td>drafting</td>
<td>Overload resolution with temporary from initializer list</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1537">
<td><a href="https://cplusplus.github.io/CWG/issues/1537.html">1537</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD3</td>
<td>Optional compile-time evaluation of constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1538">
<td><a href="https://cplusplus.github.io/CWG/issues/1538.html">1538</a></td>
+ <td>[<a href="https://wg21.link/expr.assign">expr.assign</a>]</td>
<td>CD3</td>
<td>C-style cast in <I>braced-init-list</I> assignment</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1539">
<td><a href="https://cplusplus.github.io/CWG/issues/1539.html">1539</a></td>
+ <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>
<td>CD3</td>
<td>Definition of &#8220;character type&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1540">
<td><a href="https://cplusplus.github.io/CWG/issues/1540.html">1540</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>NAD</td>
<td>Use of address constants in constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1541">
<td><a href="https://cplusplus.github.io/CWG/issues/1541.html">1541</a></td>
+ <td>[<a href="https://wg21.link/stmt.return">stmt.return</a>]</td>
<td>CD3</td>
<td><I>cv</I> <TT>void</TT> return types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1542">
<td><a href="https://cplusplus.github.io/CWG/issues/1542.html">1542</a></td>
+ <td>[<a href="https://wg21.link/expr.assign">expr.assign</a>]</td>
<td>open</td>
<td>Compound assignment of <I>braced-init-list</I></td>
<td align="center">Not resolved</td>
</tr>
<tr id="1543">
<td><a href="https://cplusplus.github.io/CWG/issues/1543.html">1543</a></td>
+ <td>[<a href="https://wg21.link/over.ics.list">over.ics.list</a>]</td>
<td>CD3</td>
<td>Implicit conversion sequence for empty initializer list</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1544">
<td><a href="https://cplusplus.github.io/CWG/issues/1544.html">1544</a></td>
+ <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>
<td>CD3</td>
<td>Linkage of member of unnamed namespace</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1545">
<td><a href="https://cplusplus.github.io/CWG/issues/1545.html">1545</a></td>
+ <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>
<td>NAD</td>
<td><TT>friend</TT> function templates defined in class templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1546">
<td><a href="https://cplusplus.github.io/CWG/issues/1546.html">1546</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>NAD</td>
<td>Errors in function template default arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1547">
<td><a href="https://cplusplus.github.io/CWG/issues/1547.html">1547</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>NAD</td>
<td><TT>typename</TT> keyword in <I>alias-declaration</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1548">
<td><a href="https://cplusplus.github.io/CWG/issues/1548.html">1548</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>open</td>
<td>Copy/move construction and conversion functions</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="1549">
<td><a href="https://cplusplus.github.io/CWG/issues/1549.html">1549</a></td>
+ <td>[<a href="https://wg21.link/over.binary">over.binary</a>]</td>
<td>open</td>
<td>Overloaded comma operator with <TT>void</TT> operand</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1550">
<td><a href="https://cplusplus.github.io/CWG/issues/1550.html">1550</a></td>
+ <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>
<td>CD3</td>
<td>Parenthesized <I>throw-expression</I> operand of <I>conditional-expression</I></td>
<td class="full" align="center">Clang 3.4</td>
</tr>
<tr id="1551">
<td><a href="https://cplusplus.github.io/CWG/issues/1551.html">1551</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>C++14</td>
<td>Wording problems in <I>using-declaration</I> specification</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1552">
<td><a href="https://cplusplus.github.io/CWG/issues/1552.html">1552</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>CD4</td>
<td><I>exception-specification</I>s and defaulted special member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1553">
<td><a href="https://cplusplus.github.io/CWG/issues/1553.html">1553</a></td>
+ <td>[<a href="https://wg21.link/expr.sizeof">expr.sizeof</a>]</td>
<td>CD3</td>
<td><TT>sizeof</TT> and xvalue bit-fields</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1554">
<td><a href="https://cplusplus.github.io/CWG/issues/1554.html">1554</a></td>
+ <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>
<td>drafting</td>
<td>Access and alias templates</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1555">
<td><a href="https://cplusplus.github.io/CWG/issues/1555.html">1555</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>NAD</td>
<td>Language linkage and function type compatibility</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1556">
<td><a href="https://cplusplus.github.io/CWG/issues/1556.html">1556</a></td>
+ <td>[<a href="https://wg21.link/over.match.copy">over.match.copy</a>]</td>
<td>CD3</td>
<td>Constructors and explicit conversion functions in direct initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1557">
<td><a href="https://cplusplus.github.io/CWG/issues/1557.html">1557</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD3</td>
<td>Language linkage of converted lambda function pointer</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1558">
<td><a href="https://cplusplus.github.io/CWG/issues/1558.html">1558</a></td>
+ <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>
<td>CD4</td>
<td>Unused arguments in alias template specializations</td>
<td class="full" align="center">Clang 12</td>
</tr>
<tr id="1559">
<td><a href="https://cplusplus.github.io/CWG/issues/1559.html">1559</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD3</td>
<td>String too long in initializer list of <I>new-expression</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1560">
<td><a href="https://cplusplus.github.io/CWG/issues/1560.html">1560</a></td>
+ <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>
<td>CD3</td>
<td>Gratuitous lvalue-to-rvalue conversion in <I>conditional-expression</I> with <I>throw-expression</I> operand</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="1561">
<td><a href="https://cplusplus.github.io/CWG/issues/1561.html">1561</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>CD4</td>
<td>Aggregates with empty base classes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1562">
<td><a href="https://cplusplus.github.io/CWG/issues/1562.html">1562</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>C++14</td>
<td>Non-static data member initializers and union <I>ctor-initializer</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1563">
<td><a href="https://cplusplus.github.io/CWG/issues/1563.html">1563</a></td>
+ <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>
<td>CD3</td>
<td>List-initialization and overloaded function disambiguation</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="1564">
<td><a href="https://cplusplus.github.io/CWG/issues/1564.html">1564</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>NAD</td>
<td>Template argument deduction from an initializer list</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1565">
<td><a href="https://cplusplus.github.io/CWG/issues/1565.html">1565</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>NAD</td>
<td>Copy elision and lifetime of <TT>initializer_list</TT> underlying array</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1566">
<td><a href="https://cplusplus.github.io/CWG/issues/1566.html">1566</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>NAD</td>
<td>Should <TT>new std::initializer_list&lt;T&gt;</TT> be ill-formed?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1567">
<td><a href="https://cplusplus.github.io/CWG/issues/1567.html">1567</a></td>
+ <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>
<td>C++14</td>
<td>Inheriting constructors and copy/move constructors</td>
<td class="full" align="center">Clang 3.3</td>
</tr>
<tr id="1568">
<td><a href="https://cplusplus.github.io/CWG/issues/1568.html">1568</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>dup</td>
<td>Temporary lifetime extension with intervening cast</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1569">
<td><a href="https://cplusplus.github.io/CWG/issues/1569.html">1569</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>C++14</td>
<td>Deducing a function parameter pack before ellipsis</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1570">
<td><a href="https://cplusplus.github.io/CWG/issues/1570.html">1570</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>
<td>C++14</td>
<td>Address of subobject as non-type template argument</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1571">
<td><a href="https://cplusplus.github.io/CWG/issues/1571.html">1571</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>CD4</td>
<td>cv-qualification for indirect reference binding via conversion function</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1572">
<td><a href="https://cplusplus.github.io/CWG/issues/1572.html">1572</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>CD4</td>
<td>Incorrect example for rvalue reference binding via conversion function</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1573">
<td><a href="https://cplusplus.github.io/CWG/issues/1573.html">1573</a></td>
+ <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>
<td>CD4</td>
<td>Inherited constructor characteristics</td>
<td class="full" align="center">Clang 3.9</td>
</tr>
<tr id="1574">
<td><a href="https://cplusplus.github.io/CWG/issues/1574.html">1574</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>NAD</td>
<td>Explicitly-defaulted <TT>constexpr</TT> functions in wrapper templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1575">
<td><a href="https://cplusplus.github.io/CWG/issues/1575.html">1575</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic.safety">basic.stc.dynamic.safety</a>]</td>
<td>C++14</td>
<td>Incorrect definition of &#8220;strict pointer safety&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1576">
<td><a href="https://cplusplus.github.io/CWG/issues/1576.html">1576</a></td>
+ <td>[<a href="https://wg21.link/expr">expr</a>]</td>
<td>C++14</td>
<td>Discarded-value volatile xvalues</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1577">
<td><a href="https://cplusplus.github.io/CWG/issues/1577.html">1577</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial.general">temp.spec.partial.general</a>]</td>
<td>NAD</td>
<td>Unnecessary restrictions on partial specializations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1578">
<td><a href="https://cplusplus.github.io/CWG/issues/1578.html">1578</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>NAD</td>
<td>Value-initialization of aggregates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1579">
<td><a href="https://cplusplus.github.io/CWG/issues/1579.html">1579</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>C++14</td>
<td>Return by converting move constructor</td>
<td class="full" align="center">Clang 3.9</td>
</tr>
<tr class="open" id="1580">
<td><a href="https://cplusplus.github.io/CWG/issues/1580.html">1580</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>drafting</td>
<td>Default arguments in explicit instantiations</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1581">
<td><a href="https://cplusplus.github.io/CWG/issues/1581.html">1581</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD5</td>
<td>When are <TT>constexpr</TT> member functions defined?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1582">
<td><a href="https://cplusplus.github.io/CWG/issues/1582.html">1582</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>drafting</td>
<td>Template default arguments and deduction failure</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1583">
<td><a href="https://cplusplus.github.io/CWG/issues/1583.html">1583</a></td>
+ <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>
<td>C++14</td>
<td>Incorrect example of unspecified behavior</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1584">
<td><a href="https://cplusplus.github.io/CWG/issues/1584.html">1584</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>drafting</td>
<td>Deducing function types from cv-qualified types</td>
<td align="center">
@@ -9335,1836 +10877,2142 @@ and <I>POD class</I></td>
</tr>
<tr id="1585">
<td><a href="https://cplusplus.github.io/CWG/issues/1585.html">1585</a></td>
+ <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>
<td>NAD</td>
<td>Value category of member access of rvalue reference member</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1586">
<td><a href="https://cplusplus.github.io/CWG/issues/1586.html">1586</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>NAD</td>
<td>Naming a destructor via <TT>decltype</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1587">
<td><a href="https://cplusplus.github.io/CWG/issues/1587.html">1587</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>C++14</td>
<td><TT>constexpr</TT> initialization and nested anonymous unions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1588">
<td><a href="https://cplusplus.github.io/CWG/issues/1588.html">1588</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>CD3</td>
<td>Deducing cv-qualified <TT>auto</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1589">
<td><a href="https://cplusplus.github.io/CWG/issues/1589.html">1589</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>CD4</td>
<td>Ambiguous ranking of list-initialization sequences</td>
<td class="full" align="center">Clang 3.7 (C++11 onwards)</td>
</tr>
<tr id="1590">
<td><a href="https://cplusplus.github.io/CWG/issues/1590.html">1590</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>CD4</td>
<td>Bypassing non-copy/move constructor copying</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1591">
<td><a href="https://cplusplus.github.io/CWG/issues/1591.html">1591</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>CD4</td>
<td>Deducing array bound and element type from initializer list</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1592">
<td><a href="https://cplusplus.github.io/CWG/issues/1592.html">1592</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.template">temp.arg.template</a>]</td>
<td>C++14</td>
<td>When do template parameters match?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1593">
<td><a href="https://cplusplus.github.io/CWG/issues/1593.html">1593</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>C++14</td>
<td>&#8220;Parameter type&#8221; of special member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1594">
<td><a href="https://cplusplus.github.io/CWG/issues/1594.html">1594</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>drafting</td>
<td>Lazy declaration of special members vs overload errors</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1595">
<td><a href="https://cplusplus.github.io/CWG/issues/1595.html">1595</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>C++14</td>
<td>Constructors &#8220;involved in&#8221; subobject initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1596">
<td><a href="https://cplusplus.github.io/CWG/issues/1596.html">1596</a></td>
+ <td>[<a href="https://wg21.link/expr.rel">expr.rel</a>]</td>
<td>CD4</td>
<td>Non-array objects as <TT>array[1]</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1597">
<td><a href="https://cplusplus.github.io/CWG/issues/1597.html">1597</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>CD3</td>
<td>Misleading <TT>constexpr</TT> example</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1598">
<td><a href="https://cplusplus.github.io/CWG/issues/1598.html">1598</a></td>
+ <td>[<a href="https://wg21.link/expr.eq">expr.eq</a>]</td>
<td>C++14</td>
<td>Criterion for equality of pointers to members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1599">
<td><a href="https://cplusplus.github.io/CWG/issues/1599.html">1599</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD4</td>
<td>Lifetime of <TT>initializer_list</TT> underlying array</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1600">
<td><a href="https://cplusplus.github.io/CWG/issues/1600.html">1600</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>
<td>CD4</td>
<td>Erroneous reference initialization in example</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1601">
<td><a href="https://cplusplus.github.io/CWG/issues/1601.html">1601</a></td>
+ <td>[<a href="https://wg21.link/conv.prom">conv.prom</a>]</td>
<td>C++14</td>
<td>Promotion of enumeration with fixed underlying type</td>
<td class="full" align="center">Clang 10</td>
</tr>
<tr class="open" id="1602">
<td><a href="https://cplusplus.github.io/CWG/issues/1602.html">1602</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>review</td>
<td>Linkage of specialization vs linkage of template arguments</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1603">
<td><a href="https://cplusplus.github.io/CWG/issues/1603.html">1603</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>CD4</td>
<td>Errors resulting from giving unnamed namespaces internal linkage</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1604">
<td><a href="https://cplusplus.github.io/CWG/issues/1604.html">1604</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>C++14</td>
<td>Double temporaries in reference initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1605">
<td><a href="https://cplusplus.github.io/CWG/issues/1605.html">1605</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>CD3</td>
<td>Misleading parenthetical comment for explicit destructor call</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1606">
<td><a href="https://cplusplus.github.io/CWG/issues/1606.html">1606</a></td>
+ <td>[<a href="https://wg21.link/expr.sizeof">expr.sizeof</a>]</td>
<td>NAD</td>
<td><TT>sizeof</TT> closure class</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="1607">
<td><a href="https://cplusplus.github.io/CWG/issues/1607.html">1607</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>C++14</td>
<td>Lambdas in template parameters</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1608">
<td><a href="https://cplusplus.github.io/CWG/issues/1608.html">1608</a></td>
+ <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>
<td>C++14</td>
<td>Operator lookup in trailing return type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1609">
<td><a href="https://cplusplus.github.io/CWG/issues/1609.html">1609</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>open</td>
<td>Default arguments and function parameter packs</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="1610">
<td><a href="https://cplusplus.github.io/CWG/issues/1610.html">1610</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.partial">temp.deduct.partial</a>]</td>
<td>drafting</td>
<td>Cv-qualification in deduction of reference to array</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1611">
<td><a href="https://cplusplus.github.io/CWG/issues/1611.html">1611</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>C++14</td>
<td>Deleted default constructor for abstract class</td>
<td class="full" align="center">Duplicate of <a href="#1658">1658</a></td>
</tr>
<tr id="1612">
<td><a href="https://cplusplus.github.io/CWG/issues/1612.html">1612</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>C++14</td>
<td>Implicit lambda capture and anonymous unions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1613">
<td><a href="https://cplusplus.github.io/CWG/issues/1613.html">1613</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>C++14</td>
<td>Constant expressions and lambda capture</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1614">
<td><a href="https://cplusplus.github.io/CWG/issues/1614.html">1614</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD4</td>
<td>Address of pure virtual function vs odr-use</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1615">
<td><a href="https://cplusplus.github.io/CWG/issues/1615.html">1615</a></td>
+ <td>[<a href="https://wg21.link/dcl.align">dcl.align</a>]</td>
<td>CD4</td>
<td>Alignment of types, variables, and members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1616">
<td><a href="https://cplusplus.github.io/CWG/issues/1616.html">1616</a></td>
+ <td>[<a href="https://wg21.link/stmt.ambig">stmt.ambig</a>]</td>
<td>CD6</td>
<td>Disambiguation parsing and template parameters</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1617">
<td><a href="https://cplusplus.github.io/CWG/issues/1617.html">1617</a></td>
+ <td>[<a href="https://wg21.link/dcl.align">dcl.align</a>]</td>
<td>open</td>
<td><TT>alignas</TT> and non-defining declarations</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1618">
<td><a href="https://cplusplus.github.io/CWG/issues/1618.html">1618</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>C++14</td>
<td>Gratuitously-unsigned underlying enum type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1619">
<td><a href="https://cplusplus.github.io/CWG/issues/1619.html">1619</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>open</td>
<td>Definition of current instantiation</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="1620">
<td><a href="https://cplusplus.github.io/CWG/issues/1620.html">1620</a></td>
+ <td>[<a href="https://wg21.link/over.literal">over.literal</a>]</td>
<td>open</td>
<td>User-defined literals and extended integer types</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1621">
<td><a href="https://cplusplus.github.io/CWG/issues/1621.html">1621</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>C++20</td>
<td>Member initializers in anonymous unions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1622">
<td><a href="https://cplusplus.github.io/CWG/issues/1622.html">1622</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>C++17</td>
<td>Empty aggregate initializer for union</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1623">
<td><a href="https://cplusplus.github.io/CWG/issues/1623.html">1623</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>drafting</td>
<td>Deleted default union constructor and member initializers</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1624">
<td><a href="https://cplusplus.github.io/CWG/issues/1624.html">1624</a></td>
+ <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>
<td>NAD</td>
<td>Destruction of union members with member initializers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1625">
<td><a href="https://cplusplus.github.io/CWG/issues/1625.html">1625</a></td>
+ <td>[<a href="https://wg21.link/cpp.stringize">cpp.stringize</a>]</td>
<td>open</td>
<td>Adding spaces between tokens in stringizing</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1626">
<td><a href="https://cplusplus.github.io/CWG/issues/1626.html">1626</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>dup</td>
<td><TT>constexpr</TT> member functions in <I>brace-or-equal-initializer</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1627">
<td><a href="https://cplusplus.github.io/CWG/issues/1627.html">1627</a></td>
+ <td>[<a href="https://wg21.link/dcl.align">dcl.align</a>]</td>
<td>NAD</td>
<td>Agreement of dependent <TT>alignas</TT> specifiers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1628">
<td><a href="https://cplusplus.github.io/CWG/issues/1628.html">1628</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>open</td>
<td>Deallocation function templates</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1629">
<td><a href="https://cplusplus.github.io/CWG/issues/1629.html">1629</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>C++14</td>
<td>Can a closure class be a literal type?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1630">
<td><a href="https://cplusplus.github.io/CWG/issues/1630.html">1630</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>CD4</td>
<td>Multiple default constructor templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1631">
<td><a href="https://cplusplus.github.io/CWG/issues/1631.html">1631</a></td>
+ <td>[<a href="https://wg21.link/over.ics.list">over.ics.list</a>]</td>
<td>CD4</td>
<td>Incorrect overload resolution for single-element <I>initializer-list</I></td>
<td class="full" align="center">Clang 3.7</td>
</tr>
<tr id="1632">
<td><a href="https://cplusplus.github.io/CWG/issues/1632.html">1632</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>CD5</td>
<td>Lambda capture in member initializers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1633">
<td><a href="https://cplusplus.github.io/CWG/issues/1633.html">1633</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>CD4</td>
<td>Copy-initialization in member initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1634">
<td><a href="https://cplusplus.github.io/CWG/issues/1634.html">1634</a></td>
+ <td>[<a href="https://wg21.link/basic.stc">basic.stc</a>]</td>
<td>open</td>
<td>Temporary storage duration</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="1635">
<td><a href="https://cplusplus.github.io/CWG/issues/1635.html">1635</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>drafting</td>
<td>How similar are template default arguments to function default arguments?</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1636">
<td><a href="https://cplusplus.github.io/CWG/issues/1636.html">1636</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>CD5</td>
<td>Bits required for negative enumerator values</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1637">
<td><a href="https://cplusplus.github.io/CWG/issues/1637.html">1637</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>NAD</td>
<td>Recursion in <TT>constexpr</TT> template default constructor</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1638">
<td><a href="https://cplusplus.github.io/CWG/issues/1638.html">1638</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>CD4</td>
<td>Declaring an explicit specialization of a scoped enumeration</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="1639">
<td><a href="https://cplusplus.github.io/CWG/issues/1639.html">1639</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>CD4</td>
<td><I>exception-specification</I>s and pointer/pointer-to-member expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1640">
<td><a href="https://cplusplus.github.io/CWG/issues/1640.html">1640</a></td>
+ <td>[<a href="https://wg21.link/dcl.array">dcl.array</a>]</td>
<td>CD5</td>
<td>Array of abstract instance of class template</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1641">
<td><a href="https://cplusplus.github.io/CWG/issues/1641.html">1641</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>NAD</td>
<td>Assignment in member initializer</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1642">
<td><a href="https://cplusplus.github.io/CWG/issues/1642.html">1642</a></td>
+ <td>[<a href="https://wg21.link/expr.compound">expr.compound</a>]</td>
<td>CD7</td>
<td>Missing requirements for prvalue operands</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1643">
<td><a href="https://cplusplus.github.io/CWG/issues/1643.html">1643</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>NAD</td>
<td>Default arguments for template parameter packs</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1644">
<td><a href="https://cplusplus.github.io/CWG/issues/1644.html">1644</a></td>
+ <td>[<a href="https://wg21.link/temp.over.link">temp.over.link</a>]</td>
<td>NAD</td>
<td>Equivalent <I>exception-specification</I>s in function template declarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1645">
<td><a href="https://cplusplus.github.io/CWG/issues/1645.html">1645</a></td>
+ <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>
<td>CD4</td>
<td>Identical inheriting constructors via default arguments</td>
<td class="full" align="center">Clang 3.9</td>
</tr>
<tr id="1646">
<td><a href="https://cplusplus.github.io/CWG/issues/1646.html">1646</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>CD5</td>
<td><I>decltype-specifier</I>s, abstract classes, and deduction failure</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1647">
<td><a href="https://cplusplus.github.io/CWG/issues/1647.html">1647</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>
<td>drafting</td>
<td>Type agreement of non-type template arguments in partial specializations</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1648">
<td><a href="https://cplusplus.github.io/CWG/issues/1648.html">1648</a></td>
+ <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>
<td>C++14</td>
<td><TT>thread_local</TT> vs block extern declarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1649">
<td><a href="https://cplusplus.github.io/CWG/issues/1649.html">1649</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>C++14</td>
<td>Error in the syntax of <I>mem-initializer-list</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1650">
<td><a href="https://cplusplus.github.io/CWG/issues/1650.html">1650</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>NAD</td>
<td>Class prvalues in reference initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1651">
<td><a href="https://cplusplus.github.io/CWG/issues/1651.html">1651</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>NAD</td>
<td>Lifetime extension of temporary via reference to subobject</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1652">
<td><a href="https://cplusplus.github.io/CWG/issues/1652.html">1652</a></td>
+ <td>[<a href="https://wg21.link/expr.eq">expr.eq</a>]</td>
<td>CD4</td>
<td>Object addresses in <TT>constexpr</TT> expressions</td>
<td class="full" align="center">Clang 3.6</td>
</tr>
<tr id="1653">
<td><a href="https://cplusplus.github.io/CWG/issues/1653.html">1653</a></td>
+ <td>[<a href="https://wg21.link/expr.pre.incr">expr.pre.incr</a>]</td>
<td>CD4</td>
<td>Removing deprecated increment of <TT>bool</TT></td>
<td class="full" align="center">Clang 4 (C++17 onwards)</td>
</tr>
<tr id="1654">
<td><a href="https://cplusplus.github.io/CWG/issues/1654.html">1654</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>dup</td>
<td>Literal types and <TT>constexpr</TT> defaulted constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1655">
<td><a href="https://cplusplus.github.io/CWG/issues/1655.html">1655</a></td>
+ <td>[<a href="https://wg21.link/lex.pptoken">lex.pptoken</a>]</td>
<td>open</td>
<td>Line endings in raw string literals</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1656">
<td><a href="https://cplusplus.github.io/CWG/issues/1656.html">1656</a></td>
+ <td>[<a href="https://wg21.link/lex.ccon">lex.ccon</a>]</td>
<td>CD6</td>
<td>Encoding of numerically-escaped characters</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1657">
<td><a href="https://cplusplus.github.io/CWG/issues/1657.html">1657</a></td>
+ <td>[<a href="https://wg21.link/namespace.def">namespace.def</a>]</td>
<td>CD4</td>
<td>Attributes for namespaces and enumerators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1658">
<td><a href="https://cplusplus.github.io/CWG/issues/1658.html">1658</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>C++14</td>
<td>Deleted default constructor for abstract class via destructor</td>
<td class="full" align="center">Clang 5</td>
</tr>
<tr class="open" id="1659">
<td><a href="https://cplusplus.github.io/CWG/issues/1659.html">1659</a></td>
+ <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>
<td>open</td>
<td>Initialization order of thread_local template static data members</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1660">
<td><a href="https://cplusplus.github.io/CWG/issues/1660.html">1660</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>C++14</td>
<td><I>member-declaration</I> requirements and unnamed bit-fields</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1661">
<td><a href="https://cplusplus.github.io/CWG/issues/1661.html">1661</a></td>
+ <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>
<td>NAD</td>
<td>Preservation of infinite loops</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1662">
<td><a href="https://cplusplus.github.io/CWG/issues/1662.html">1662</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>C++14</td>
<td>Capturing function parameter packs</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1663">
<td><a href="https://cplusplus.github.io/CWG/issues/1663.html">1663</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>NAD</td>
<td>Capturing an empty pack expansion</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1664">
<td><a href="https://cplusplus.github.io/CWG/issues/1664.html">1664</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>C++14</td>
<td>Argument-dependent lookup of lambdas used in default arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1665">
<td><a href="https://cplusplus.github.io/CWG/issues/1665.html">1665</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>drafting</td>
<td>Declaration matching in explicit instantiations</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1666">
<td><a href="https://cplusplus.github.io/CWG/issues/1666.html">1666</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>
<td>C++14</td>
<td>Address constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1667">
<td><a href="https://cplusplus.github.io/CWG/issues/1667.html">1667</a></td>
+ <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>
<td>NAD</td>
<td>Function exiting via exception called by destructor during unwinding</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1668">
<td><a href="https://cplusplus.github.io/CWG/issues/1668.html">1668</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>drafting</td>
<td>Parameter type determination still not clear enough</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1669">
<td><a href="https://cplusplus.github.io/CWG/issues/1669.html">1669</a></td>
+ <td>[<a href="https://wg21.link/basic.start.main">basic.start.main</a>]</td>
<td>C++14</td>
<td><TT>auto</TT> return type for <TT>main</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1670">
<td><a href="https://cplusplus.github.io/CWG/issues/1670.html">1670</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>review</td>
<td><TT>auto</TT> as <I>conversion-type-id</I></td>
<td align="center">Not resolved</td>
</tr>
<tr id="1671">
<td><a href="https://cplusplus.github.io/CWG/issues/1671.html">1671</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>NAD</td>
<td>Unclear rules for deduction with cv-qualification</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1672">
<td><a href="https://cplusplus.github.io/CWG/issues/1672.html">1672</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>CD4</td>
<td>Layout compatibility with multiple empty bases</td>
<td class="full" align="center">Clang 7</td>
</tr>
<tr id="1673">
<td><a href="https://cplusplus.github.io/CWG/issues/1673.html">1673</a></td>
+ <td>[<a href="https://wg21.link/over.best.ics">over.best.ics</a>]</td>
<td>C++14</td>
<td>Clarifying overload resolution for the second step of copy-initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1674">
<td><a href="https://cplusplus.github.io/CWG/issues/1674.html">1674</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>C++14</td>
<td>Return type deduction for address of function</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1675">
<td><a href="https://cplusplus.github.io/CWG/issues/1675.html">1675</a></td>
+ <td>[<a href="https://wg21.link/implimits">implimits</a>]</td>
<td>NAD</td>
<td>Size limit for automatic array object</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1676">
<td><a href="https://cplusplus.github.io/CWG/issues/1676.html">1676</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic.allocation">basic.stc.dynamic.allocation</a>]</td>
<td>drafting</td>
<td><TT>auto</TT> return type for allocation and deallocation functions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1677">
<td><a href="https://cplusplus.github.io/CWG/issues/1677.html">1677</a></td>
+ <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>
<td>C++17</td>
<td>Constant initialization via aggregate initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1678">
<td><a href="https://cplusplus.github.io/CWG/issues/1678.html">1678</a></td>
+ <td>[<a href="https://wg21.link/expr.sizeof">expr.sizeof</a>]</td>
<td>NAD</td>
<td>Naming the type of an array of runtime bound</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1679">
<td><a href="https://cplusplus.github.io/CWG/issues/1679.html">1679</a></td>
+ <td>[<a href="https://wg21.link/stmt.ranged">stmt.ranged</a>]</td>
<td>NAD</td>
<td>Range-based <TT>for</TT> and array of runtime bound</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1680">
<td><a href="https://cplusplus.github.io/CWG/issues/1680.html">1680</a></td>
+ <td>[<a href="https://wg21.link/stmt.ranged">stmt.ranged</a>]</td>
<td>drafting</td>
<td>Including <TT>&lt;initializer_list&gt;</TT> for range-based <TT>for</TT></td>
<td align="center">Not resolved</td>
</tr>
<tr id="1681">
<td><a href="https://cplusplus.github.io/CWG/issues/1681.html">1681</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>C++14</td>
<td><I>init-capture</I>s and nested lambdas</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1682">
<td><a href="https://cplusplus.github.io/CWG/issues/1682.html">1682</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic.allocation">basic.stc.dynamic.allocation</a>]</td>
<td>open</td>
<td>Overly-restrictive rules on function templates as allocation functions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1683">
<td><a href="https://cplusplus.github.io/CWG/issues/1683.html">1683</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD4</td>
<td>Incorrect example after <TT>constexpr</TT> changes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1684">
<td><a href="https://cplusplus.github.io/CWG/issues/1684.html">1684</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>C++14</td>
<td>Static <TT>constexpr</TT> member functions for non-literal classes</td>
<td class="full" align="center">Clang 3.6</td>
</tr>
<tr id="1685">
<td><a href="https://cplusplus.github.io/CWG/issues/1685.html">1685</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.noexcept">expr.unary.noexcept</a>]</td>
<td>NAD</td>
<td>Value category of <TT>noexcept</TT> expression</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1686">
<td><a href="https://cplusplus.github.io/CWG/issues/1686.html">1686</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>CD4</td>
<td>Which variables are &#8220;explicitly declared <TT>const</TT>?&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1687">
<td><a href="https://cplusplus.github.io/CWG/issues/1687.html">1687</a></td>
+ <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>
<td>C++14</td>
<td>Conversions of operands of built-in operators</td>
<td class="full" align="center">Clang 7</td>
</tr>
<tr id="1688">
<td><a href="https://cplusplus.github.io/CWG/issues/1688.html">1688</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>NAD</td>
<td>Volatile <TT>constexpr</TT> variables</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1689">
<td><a href="https://cplusplus.github.io/CWG/issues/1689.html">1689</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>
<td>C++14</td>
<td>Syntactic nonterminal for operand of <TT>alignas</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1690">
<td><a href="https://cplusplus.github.io/CWG/issues/1690.html">1690</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>C++14</td>
<td>Associated namespace for local type</td>
<td class="full" align="center">Clang 9</td>
</tr>
<tr id="1691">
<td><a href="https://cplusplus.github.io/CWG/issues/1691.html">1691</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>C++14</td>
<td>Argument-dependent lookup and opaque enumerations</td>
<td class="full" align="center">Clang 9</td>
</tr>
<tr id="1692">
<td><a href="https://cplusplus.github.io/CWG/issues/1692.html">1692</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>C++14</td>
<td>Associated namespaces of doubly-nested classes</td>
<td class="full" align="center">Clang 9</td>
</tr>
<tr id="1693">
<td><a href="https://cplusplus.github.io/CWG/issues/1693.html">1693</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>C++14</td>
<td>Superfluous semicolons in class definitions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1694">
<td><a href="https://cplusplus.github.io/CWG/issues/1694.html">1694</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD4</td>
<td>Restriction on reference to temporary as a constant expression</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1695">
<td><a href="https://cplusplus.github.io/CWG/issues/1695.html">1695</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>NAD</td>
<td>Lifetime extension via <I>init-capture</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1696">
<td><a href="https://cplusplus.github.io/CWG/issues/1696.html">1696</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>CD4</td>
<td>Temporary lifetime and non-static data member initializers</td>
<td class="full" align="center">Clang 7</td>
</tr>
<tr id="1697">
<td><a href="https://cplusplus.github.io/CWG/issues/1697.html">1697</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>CD4</td>
<td>Lifetime extension and copy elision</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1698">
<td><a href="https://cplusplus.github.io/CWG/issues/1698.html">1698</a></td>
+ <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>
<td>CD7</td>
<td>Files ending in <TT>\</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1699">
<td><a href="https://cplusplus.github.io/CWG/issues/1699.html">1699</a></td>
+ <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>
<td>open</td>
<td>Does befriending a class befriend its friends?</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1700">
<td><a href="https://cplusplus.github.io/CWG/issues/1700.html">1700</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>NAD</td>
<td>Does the special rvalue-reference deduction apply to alias templates?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1701">
<td><a href="https://cplusplus.github.io/CWG/issues/1701.html">1701</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>open</td>
<td>Array vs sequence in object representation</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="1702">
<td><a href="https://cplusplus.github.io/CWG/issues/1702.html">1702</a></td>
+ <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>
<td>drafting</td>
<td>Rephrasing the definition of &#8220;anonymous union&#8221;</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1703">
<td><a href="https://cplusplus.github.io/CWG/issues/1703.html">1703</a></td>
+ <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>
<td>NAD</td>
<td>Language linkage of names of functions with internal linkage</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1704">
<td><a href="https://cplusplus.github.io/CWG/issues/1704.html">1704</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>CD5</td>
<td>Type checking in explicit instantiation of variable templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1705">
<td><a href="https://cplusplus.github.io/CWG/issues/1705.html">1705</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.partial">temp.deduct.partial</a>]</td>
<td>CD4</td>
<td>Unclear specification of &#8220;more specialized&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1706">
<td><a href="https://cplusplus.github.io/CWG/issues/1706.html">1706</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>
<td>drafting</td>
<td><TT>alignas</TT> pack expansion syntax</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1707">
<td><a href="https://cplusplus.github.io/CWG/issues/1707.html">1707</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.elab">dcl.type.elab</a>]</td>
<td>C++14</td>
<td><TT>template</TT> in <I>elaborated-type-specifier</I> without <I>nested-name-specifier</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1708">
<td><a href="https://cplusplus.github.io/CWG/issues/1708.html">1708</a></td>
+ <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>
<td>CD4</td>
<td>overly-strict requirements for names with C language linkage</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1709">
<td><a href="https://cplusplus.github.io/CWG/issues/1709.html">1709</a></td>
+ <td>[<a href="https://wg21.link/cpp.stringize">cpp.stringize</a>]</td>
<td>open</td>
<td>Stringizing raw string literals containing newline</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1710">
<td><a href="https://cplusplus.github.io/CWG/issues/1710.html">1710</a></td>
+ <td>[<a href="https://wg21.link/class.derived">class.derived</a>]</td>
<td>C++17</td>
<td>Missing <TT>template</TT> keyword in <I>class-or-decltype</I></td>
<td class="none" align="center">No</td>
</tr>
<tr id="1711">
<td><a href="https://cplusplus.github.io/CWG/issues/1711.html">1711</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>
<td>CD6</td>
<td>Missing specification of variable template partial specializations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1712">
<td><a href="https://cplusplus.github.io/CWG/issues/1712.html">1712</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>CD4</td>
<td><TT>constexpr</TT> variable template declarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1713">
<td><a href="https://cplusplus.github.io/CWG/issues/1713.html">1713</a></td>
+ <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>
<td>dup</td>
<td>Linkage of variable template specializations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1714">
<td><a href="https://cplusplus.github.io/CWG/issues/1714.html">1714</a></td>
+ <td>[<a href="https://wg21.link/class.local">class.local</a>]</td>
<td>NAD</td>
<td>odr-use of <TT>this</TT> from a local class</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1715">
<td><a href="https://cplusplus.github.io/CWG/issues/1715.html">1715</a></td>
+ <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>
<td>CD4</td>
<td>Access and inherited constructor templates</td>
<td class="full" align="center">Clang 3.9</td>
</tr>
<tr id="1716">
<td><a href="https://cplusplus.github.io/CWG/issues/1716.html">1716</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>C++14</td>
<td>When are default arguments evaluated?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1717">
<td><a href="https://cplusplus.github.io/CWG/issues/1717.html">1717</a></td>
+ <td>[<a href="https://wg21.link/lex.icon">lex.icon</a>]</td>
<td>C++14</td>
<td>Missing specification of type of binary literal</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1718">
<td><a href="https://cplusplus.github.io/CWG/issues/1718.html">1718</a></td>
+ <td>[<a href="https://wg21.link/cpp.replace">cpp.replace</a>]</td>
<td>open</td>
<td>Macro invocation spanning end-of-file</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1719">
<td><a href="https://cplusplus.github.io/CWG/issues/1719.html">1719</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>CD4</td>
<td>Layout compatibility and cv-qualification revisited</td>
<td class="full" align="center">Clang 19</td>
</tr>
<tr id="1720">
<td><a href="https://cplusplus.github.io/CWG/issues/1720.html">1720</a></td>
+ <td>[<a href="https://wg21.link/cpp.include">cpp.include</a>]</td>
<td>NAD</td>
<td>Macro invocation in <TT>#include</TT> directive</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1721">
<td><a href="https://cplusplus.github.io/CWG/issues/1721.html">1721</a></td>
+ <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>
<td>review</td>
<td>Diagnosing ODR violations for static data members</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1722">
<td><a href="https://cplusplus.github.io/CWG/issues/1722.html">1722</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD4</td>
<td>Should lambda to function pointer conversion function be <TT>noexcept</TT>?</td>
<td class="full" align="center">Clang 9</td>
</tr>
<tr class="open" id="1723">
<td><a href="https://cplusplus.github.io/CWG/issues/1723.html">1723</a></td>
+ <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>
<td>open</td>
<td>Multicharacter user-defined character literals</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1724">
<td><a href="https://cplusplus.github.io/CWG/issues/1724.html">1724</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>CD6</td>
<td>Unclear rules for deduction failure</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1725">
<td><a href="https://cplusplus.github.io/CWG/issues/1725.html">1725</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>NAD</td>
<td>Trailing return type with nested function declarator</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1726">
<td><a href="https://cplusplus.github.io/CWG/issues/1726.html">1726</a></td>
+ <td>[<a href="https://wg21.link/class.conv.fct">class.conv.fct</a>]</td>
<td>CD6</td>
<td>Declarator operators and conversion function</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1727">
<td><a href="https://cplusplus.github.io/CWG/issues/1727.html">1727</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>NAD</td>
<td>Type of a specialization of a variable template</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1728">
<td><a href="https://cplusplus.github.io/CWG/issues/1728.html">1728</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>CD5</td>
<td>Type of an explicit instantiation of a variable template</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1729">
<td><a href="https://cplusplus.github.io/CWG/issues/1729.html">1729</a></td>
+ <td>[<a href="https://wg21.link/temp.decls">temp.decls</a>]</td>
<td>CD6</td>
<td>Matching declarations and definitions of variable templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1730">
<td><a href="https://cplusplus.github.io/CWG/issues/1730.html">1730</a></td>
+ <td>[<a href="https://wg21.link/temp.decls">temp.decls</a>]</td>
<td>drafting</td>
<td>Can a variable template have an unnamed type?</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1731">
<td><a href="https://cplusplus.github.io/CWG/issues/1731.html">1731</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>NAD</td>
<td><TT>is_trivially_</TT><I>X</I> and definitions of special member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1732">
<td><a href="https://cplusplus.github.io/CWG/issues/1732.html">1732</a></td>
+ <td>[<a href="https://wg21.link/stmt.select">stmt.select</a>]</td>
<td>C++14</td>
<td>Defining types in <I>condition</I>s and range-based <TT>for</TT> statements</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1733">
<td><a href="https://cplusplus.github.io/CWG/issues/1733.html">1733</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>CD6</td>
<td>Return type and value for <TT>operator=</TT> with <I>ref-qualifier</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1734">
<td><a href="https://cplusplus.github.io/CWG/issues/1734.html">1734</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>CD4</td>
<td>Nontrivial deleted copy functions</td>
<td class="none" align="center">No</td>
</tr>
<tr class="open" id="1735">
<td><a href="https://cplusplus.github.io/CWG/issues/1735.html">1735</a></td>
+ <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>
<td>open</td>
<td>Out-of-range literals in <I>user-defined-literal</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1736">
<td><a href="https://cplusplus.github.io/CWG/issues/1736.html">1736</a></td>
+ <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>
<td>CD4</td>
<td>Inheriting constructor templates in a local class</td>
<td class="full" align="center">Clang 3.9</td>
</tr>
<tr id="1737">
<td><a href="https://cplusplus.github.io/CWG/issues/1737.html">1737</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>C++14</td>
<td>Type dependence of call to a member of the current instantiation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1738">
<td><a href="https://cplusplus.github.io/CWG/issues/1738.html">1738</a></td>
+ <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>
<td>C++14</td>
<td>Explicit instantiation/specialization of inheriting constructor templates</td>
<td class="na" align="center">Superseded by <a href="https://wg21.link/P0136R1">P0136R1</a></td>
</tr>
<tr id="1739">
<td><a href="https://cplusplus.github.io/CWG/issues/1739.html">1739</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>C++14</td>
<td>Conversion of floating point to enumeration</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1740">
<td><a href="https://cplusplus.github.io/CWG/issues/1740.html">1740</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>C++14</td>
<td>Disambiguation of <TT>noexcept</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1741">
<td><a href="https://cplusplus.github.io/CWG/issues/1741.html">1741</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>C++14</td>
<td>odr-use of class object in lvalue-to-rvalue conversion</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1742">
<td><a href="https://cplusplus.github.io/CWG/issues/1742.html">1742</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>CD5</td>
<td><I>using-declaration</I>s and scoped enumerators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1743">
<td><a href="https://cplusplus.github.io/CWG/issues/1743.html">1743</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>NAD</td>
<td><I>init-capture</I>s in nested lambdas</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1744">
<td><a href="https://cplusplus.github.io/CWG/issues/1744.html">1744</a></td>
+ <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>
<td>CD4</td>
<td>Unordered initialization for variable template specializations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1745">
<td><a href="https://cplusplus.github.io/CWG/issues/1745.html">1745</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>NAD</td>
<td><TT>thread_local constexpr</TT> variable</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1746">
<td><a href="https://cplusplus.github.io/CWG/issues/1746.html">1746</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>C++14</td>
<td>Are volatile scalar types trivially copyable?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1747">
<td><a href="https://cplusplus.github.io/CWG/issues/1747.html">1747</a></td>
+ <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>
<td>C++14</td>
<td>Constant initialization of reference to function</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1748">
<td><a href="https://cplusplus.github.io/CWG/issues/1748.html">1748</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD4</td>
<td>Placement new with a null pointer</td>
<td class="full" align="center">Clang 3.7</td>
</tr>
<tr id="1749">
<td><a href="https://cplusplus.github.io/CWG/issues/1749.html">1749</a></td>
+ <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>
<td>NAD</td>
<td>Confusing definition for constant initializer</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1750">
<td><a href="https://cplusplus.github.io/CWG/issues/1750.html">1750</a></td>
+ <td>[<a href="https://wg21.link/over.match.copy">over.match.copy</a>]</td>
<td>CD4</td>
<td>&#8220;Argument&#8221; vs &#8220;parameter&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1751">
<td><a href="https://cplusplus.github.io/CWG/issues/1751.html">1751</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>CD4</td>
<td>Non-trivial operations vs non-trivial initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1752">
<td><a href="https://cplusplus.github.io/CWG/issues/1752.html">1752</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>CD4</td>
<td>Right-recursion in <I>mem-initializer-list</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1753">
<td><a href="https://cplusplus.github.io/CWG/issues/1753.html">1753</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.qual">basic.lookup.qual</a>]</td>
<td>CD4</td>
<td><I>decltype-specifier</I> in <I>nested-name-specifier</I> of destructor</td>
<td class="full" align="center">Clang 11</td>
</tr>
<tr id="1754">
<td><a href="https://cplusplus.github.io/CWG/issues/1754.html">1754</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>
<td>NAD</td>
<td>Declaration of partial specialization of static data member template</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1755">
<td><a href="https://cplusplus.github.io/CWG/issues/1755.html">1755</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial.member">temp.spec.partial.member</a>]</td>
<td>drafting</td>
<td>Out-of-class partial specializations of member templates</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1756">
<td><a href="https://cplusplus.github.io/CWG/issues/1756.html">1756</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD4</td>
<td>Direct-list-initialization of a non-class object</td>
<td class="full" align="center">Clang 3.7</td>
</tr>
<tr id="1757">
<td><a href="https://cplusplus.github.io/CWG/issues/1757.html">1757</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD4</td>
<td>Const integral subobjects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1758">
<td><a href="https://cplusplus.github.io/CWG/issues/1758.html">1758</a></td>
+ <td>[<a href="https://wg21.link/over.match.list">over.match.list</a>]</td>
<td>CD4</td>
<td>Explicit conversion in copy/move list initialization</td>
<td class="full" align="center">Clang 3.7</td>
</tr>
<tr id="1759">
<td><a href="https://cplusplus.github.io/CWG/issues/1759.html">1759</a></td>
+ <td>[<a href="https://wg21.link/lex.string">lex.string</a>]</td>
<td>C++14</td>
<td>UTF-8 code units in plain <TT>char</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1760">
<td><a href="https://cplusplus.github.io/CWG/issues/1760.html">1760</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>C++14</td>
<td>Access of member corresponding to <I>init-capture</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1761">
<td><a href="https://cplusplus.github.io/CWG/issues/1761.html">1761</a></td>
+ <td>[<a href="https://wg21.link/dcl.array">dcl.array</a>]</td>
<td>NAD</td>
<td>Runtime check on size of automatic array</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1762">
<td><a href="https://cplusplus.github.io/CWG/issues/1762.html">1762</a></td>
+ <td>[<a href="https://wg21.link/over.literal">over.literal</a>]</td>
<td>C++14</td>
<td>Reserved identifier used in <I>literal-operator-id</I> example</td>
<td class="full" align="center">Clang 14</td>
</tr>
<tr class="open" id="1763">
<td><a href="https://cplusplus.github.io/CWG/issues/1763.html">1763</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>open</td>
<td>Length mismatch in template type deduction</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1764">
<td><a href="https://cplusplus.github.io/CWG/issues/1764.html">1764</a></td>
+ <td>[<a href="https://wg21.link/class.member.lookup">class.member.lookup</a>]</td>
<td>C++14</td>
<td>Hiding of function from using-declaration by signature</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1765">
<td><a href="https://cplusplus.github.io/CWG/issues/1765.html">1765</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>C++14</td>
<td>Overflow of enumeration used as enumerator value</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1766">
<td><a href="https://cplusplus.github.io/CWG/issues/1766.html">1766</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>CD4</td>
<td>Values outside the range of the values of an enumeration</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1767">
<td><a href="https://cplusplus.github.io/CWG/issues/1767.html">1767</a></td>
+ <td>[<a href="https://wg21.link/stmt.switch">stmt.switch</a>]</td>
<td>C++14</td>
<td>Scoped enumeration in a <TT>switch</TT> statement</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1768">
<td><a href="https://cplusplus.github.io/CWG/issues/1768.html">1768</a></td>
+ <td>[<a href="https://wg21.link/dcl.array">dcl.array</a>]</td>
<td>NAD</td>
<td>Zero-element array of runtime bound</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1769">
<td><a href="https://cplusplus.github.io/CWG/issues/1769.html">1769</a></td>
+ <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>
<td>C++14</td>
<td>Catching a base class of the exception object</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1770">
<td><a href="https://cplusplus.github.io/CWG/issues/1770.html">1770</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>C++14</td>
<td>Type matching of non-type template parameters and arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1771">
<td><a href="https://cplusplus.github.io/CWG/issues/1771.html">1771</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.qual">basic.lookup.qual</a>]</td>
<td>CD6</td>
<td>Restricted lookup in <I>nested-name-specifier</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1772">
<td><a href="https://cplusplus.github.io/CWG/issues/1772.html">1772</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>C++14</td>
<td><TT>__func__</TT> in a lambda body</td>
<td class="full" align="center">Clang 14</td>
</tr>
<tr id="1773">
<td><a href="https://cplusplus.github.io/CWG/issues/1773.html">1773</a></td>
+ <td>[<a href="https://wg21.link/conv.lval">conv.lval</a>]</td>
<td>C++14</td>
<td>Out-of-lifetime lvalue-to-rvalue conversion</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1774">
<td><a href="https://cplusplus.github.io/CWG/issues/1774.html">1774</a></td>
+ <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>
<td>CD4</td>
<td>Discrepancy between subobject destruction and stack unwinding</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1775">
<td><a href="https://cplusplus.github.io/CWG/issues/1775.html">1775</a></td>
+ <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>
<td>C++14</td>
<td>Undefined behavior of line splice in raw string literal</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1776">
<td><a href="https://cplusplus.github.io/CWG/issues/1776.html">1776</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>CD4</td>
<td>Replacement of class objects containing reference members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1777">
<td><a href="https://cplusplus.github.io/CWG/issues/1777.html">1777</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>CD4</td>
<td>Empty pack expansion in <I>dynamic-exception-specification</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1778">
<td><a href="https://cplusplus.github.io/CWG/issues/1778.html">1778</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>C++14</td>
<td><I>exception-specification</I> in explicitly-defaulted functions</td>
<td class="full" align="center">Clang 9</td>
</tr>
<tr id="1779">
<td><a href="https://cplusplus.github.io/CWG/issues/1779.html">1779</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>
<td>CD4</td>
<td>Type dependency of <TT>__func__</TT></td>
<td class="full" align="center">Clang 14</td>
</tr>
<tr id="1780">
<td><a href="https://cplusplus.github.io/CWG/issues/1780.html">1780</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD4</td>
<td>Explicit instantiation/specialization of generic lambda <TT>operator()</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1781">
<td><a href="https://cplusplus.github.io/CWG/issues/1781.html">1781</a></td>
+ <td>[<a href="https://wg21.link/over.match.conv">over.match.conv</a>]</td>
<td>CD5</td>
<td>Converting from <TT>nullptr_t</TT> to <TT>bool</TT> in overload resolution</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1782">
<td><a href="https://cplusplus.github.io/CWG/issues/1782.html">1782</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>CD4</td>
<td>Form of initialization for <TT>nullptr_t</TT> to <TT>bool</TT> conversion</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1783">
<td><a href="https://cplusplus.github.io/CWG/issues/1783.html">1783</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>NAD</td>
<td>Why are virtual destructors non-trivial?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1784">
<td><a href="https://cplusplus.github.io/CWG/issues/1784.html">1784</a></td>
+ <td>[<a href="https://wg21.link/stmt.dcl">stmt.dcl</a>]</td>
<td>C++17</td>
<td>Concurrent execution during static local initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1785">
<td><a href="https://cplusplus.github.io/CWG/issues/1785.html">1785</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>NAD</td>
<td>Conflicting diagnostic requirements for template definitions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1786">
<td><a href="https://cplusplus.github.io/CWG/issues/1786.html">1786</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>C++14</td>
<td>Effect of merging allocations on memory leakage</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1787">
<td><a href="https://cplusplus.github.io/CWG/issues/1787.html">1787</a></td>
+ <td>[<a href="https://wg21.link/conv.lval">conv.lval</a>]</td>
<td>C++14</td>
<td>Uninitialized <TT>unsigned char</TT> values</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1788">
<td><a href="https://cplusplus.github.io/CWG/issues/1788.html">1788</a></td>
+ <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>
<td>CD4</td>
<td>Sized deallocation of array of non-class type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1789">
<td><a href="https://cplusplus.github.io/CWG/issues/1789.html">1789</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>open</td>
<td>Array reference vs array decay in overload resolution</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="1790">
<td><a href="https://cplusplus.github.io/CWG/issues/1790.html">1790</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>open</td>
<td>Ellipsis following function parameter pack</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1791">
<td><a href="https://cplusplus.github.io/CWG/issues/1791.html">1791</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.general">dcl.fct.def.general</a>]</td>
<td>CD4</td>
<td>Incorrect restrictions on <I>cv-qualifier-seq</I> and <I>ref-qualifier</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1792">
<td><a href="https://cplusplus.github.io/CWG/issues/1792.html">1792</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>NAD</td>
<td>Incorrect example of explicit specialization of member enumeration</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1793">
<td><a href="https://cplusplus.github.io/CWG/issues/1793.html">1793</a></td>
+ <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>
<td>CD4</td>
<td><TT>thread_local</TT> in explicit specializations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1794">
<td><a href="https://cplusplus.github.io/CWG/issues/1794.html">1794</a></td>
+ <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>
<td>C++17</td>
<td><TT>template</TT> keyword and alias templates</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="1795">
<td><a href="https://cplusplus.github.io/CWG/issues/1795.html">1795</a></td>
+ <td>[<a href="https://wg21.link/namespace.def">namespace.def</a>]</td>
<td>CD4</td>
<td>Disambiguating <I>original-namespace-definition</I> and <I>extension-namespace-definition</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1796">
<td><a href="https://cplusplus.github.io/CWG/issues/1796.html">1796</a></td>
+ <td>[<a href="https://wg21.link/lex.charset">lex.charset</a>]</td>
<td>CD4</td>
<td>Is all-bits-zero for null characters a meaningful requirement?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1797">
<td><a href="https://cplusplus.github.io/CWG/issues/1797.html">1797</a></td>
+ <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>
<td>CD4</td>
<td>Are all bit patterns of <TT>unsigned char</TT> distinct numbers?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1798">
<td><a href="https://cplusplus.github.io/CWG/issues/1798.html">1798</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>NAD</td>
<td><I>exception-specification</I>s of template arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1799">
<td><a href="https://cplusplus.github.io/CWG/issues/1799.html">1799</a></td>
+ <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>
<td>CD4</td>
<td><TT>mutable</TT> and non-explicit const qualification</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1800">
<td><a href="https://cplusplus.github.io/CWG/issues/1800.html">1800</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>
<td>CD4</td>
<td>Pointer to member of nested anonymous union</td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="1801">
<td><a href="https://cplusplus.github.io/CWG/issues/1801.html">1801</a></td>
+ <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>
<td>CD4</td>
<td>Kind of expression referring to member of anonymous union</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="1802">
<td><a href="https://cplusplus.github.io/CWG/issues/1802.html">1802</a></td>
+ <td>[<a href="https://wg21.link/lex.string">lex.string</a>]</td>
<td>CD4</td>
<td><TT>char16_t</TT> string literals and surrogate pairs</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="1803">
<td><a href="https://cplusplus.github.io/CWG/issues/1803.html">1803</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>CD5</td>
<td><I>opaque-enum-declaration</I> as <I>member-declaration</I></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="1804">
<td><a href="https://cplusplus.github.io/CWG/issues/1804.html">1804</a></td>
+ <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>
<td>CD4</td>
<td>Partial specialization and friendship</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="1805">
<td><a href="https://cplusplus.github.io/CWG/issues/1805.html">1805</a></td>
+ <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>
<td>CD4</td>
<td>Conversions of array operands in <I>conditional-expression</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1806">
<td><a href="https://cplusplus.github.io/CWG/issues/1806.html">1806</a></td>
+ <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>
<td>CD4</td>
<td>Virtual bases and move-assignment</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1807">
<td><a href="https://cplusplus.github.io/CWG/issues/1807.html">1807</a></td>
+ <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>
<td>CD4</td>
<td>Order of destruction of array elements after an exception</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr class="open" id="1808">
<td><a href="https://cplusplus.github.io/CWG/issues/1808.html">1808</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>drafting</td>
<td>Constructor templates vs default constructors</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1809">
<td><a href="https://cplusplus.github.io/CWG/issues/1809.html">1809</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>CD4</td>
<td>Narrowing and template argument deduction</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1810">
<td><a href="https://cplusplus.github.io/CWG/issues/1810.html">1810</a></td>
+ <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>
<td>CD4</td>
<td>Invalid <I>ud-suffix</I>es</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1811">
<td><a href="https://cplusplus.github.io/CWG/issues/1811.html">1811</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>CD4</td>
<td>Lookup of deallocation function in a virtual destructor definition</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1812">
<td><a href="https://cplusplus.github.io/CWG/issues/1812.html">1812</a></td>
+ <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>
<td>C++17</td>
<td>Omission of <TT>template</TT> in a <I>typename-specifier</I></td>
<td class="none" align="center">No</td>
</tr>
<tr id="1813">
<td><a href="https://cplusplus.github.io/CWG/issues/1813.html">1813</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>CD4</td>
<td>Direct vs indirect bases in standard-layout classes</td>
<td class="full" align="center">Clang 7</td>
</tr>
<tr id="1814">
<td><a href="https://cplusplus.github.io/CWG/issues/1814.html">1814</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>CD4</td>
<td>Default arguments in <I>lambda-expression</I>s</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="1815">
<td><a href="https://cplusplus.github.io/CWG/issues/1815.html">1815</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>CD4</td>
<td>Lifetime extension in aggregate initialization</td>
<td class="full" align="center">Clang 20</td>
</tr>
<tr id="1816">
<td><a href="https://cplusplus.github.io/CWG/issues/1816.html">1816</a></td>
+ <td>[<a href="https://wg21.link/conv.integral">conv.integral</a>]</td>
<td>CD4</td>
<td>Unclear specification of bit-field values</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1817">
<td><a href="https://cplusplus.github.io/CWG/issues/1817.html">1817</a></td>
+ <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>
<td>open</td>
<td>Linkage specifications and nested scopes</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1818">
<td><a href="https://cplusplus.github.io/CWG/issues/1818.html">1818</a></td>
+ <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>
<td>CD6</td>
<td>Visibility and inherited language linkage</td>
<td class="full" align="center">Clang 3.4</td>
</tr>
<tr id="1819">
<td><a href="https://cplusplus.github.io/CWG/issues/1819.html">1819</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial.general">temp.spec.partial.general</a>]</td>
<td>CD4</td>
<td>Acceptable scopes for definition of partial specialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1820">
<td><a href="https://cplusplus.github.io/CWG/issues/1820.html">1820</a></td>
+ <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>
<td>CD6</td>
<td>Qualified typedef names</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="1821">
<td><a href="https://cplusplus.github.io/CWG/issues/1821.html">1821</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>CD6</td>
<td>Qualified redeclarations in a class <I>member-specification</I></td>
<td class="full" align="center">Clang 2.9</td>
</tr>
<tr id="1822">
<td><a href="https://cplusplus.github.io/CWG/issues/1822.html">1822</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>CD6</td>
<td>Lookup of parameter names in <I>lambda-expression</I>s</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="1823">
<td><a href="https://cplusplus.github.io/CWG/issues/1823.html">1823</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.spec">dcl.fct.spec</a>]</td>
<td>CD4</td>
<td>String literal uniqueness in inline functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1824">
<td><a href="https://cplusplus.github.io/CWG/issues/1824.html">1824</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>CD4</td>
<td>Completeness of return type vs point of instantiation</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="1825">
<td><a href="https://cplusplus.github.io/CWG/issues/1825.html">1825</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.partial">temp.deduct.partial</a>]</td>
<td>C++17</td>
<td>Partial ordering between variadic and non-variadic function templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1826">
<td><a href="https://cplusplus.github.io/CWG/issues/1826.html">1826</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>NAD</td>
<td><TT>const</TT> floating-point in constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1827">
<td><a href="https://cplusplus.github.io/CWG/issues/1827.html">1827</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>drafting</td>
<td>Reference binding with ambiguous conversions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1828">
<td><a href="https://cplusplus.github.io/CWG/issues/1828.html">1828</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.qual">basic.lookup.qual</a>]</td>
<td>CD6</td>
<td><I>nested-name-specifier</I> ambiguity</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1829">
<td><a href="https://cplusplus.github.io/CWG/issues/1829.html">1829</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>CD6</td>
<td>Dependent unnamed types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1830">
<td><a href="https://cplusplus.github.io/CWG/issues/1830.html">1830</a></td>
+ <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>
<td>CD4</td>
<td>Repeated specifiers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1831">
<td><a href="https://cplusplus.github.io/CWG/issues/1831.html">1831</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>NAD</td>
<td>Explicitly vs implicitly deleted move constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1832">
<td><a href="https://cplusplus.github.io/CWG/issues/1832.html">1832</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>CD4</td>
<td>Casting to incomplete enumeration</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="1833">
<td><a href="https://cplusplus.github.io/CWG/issues/1833.html">1833</a></td>
+ <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>
<td>NAD</td>
<td><TT>friend</TT> declarations naming implicitly-declared member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1834">
<td><a href="https://cplusplus.github.io/CWG/issues/1834.html">1834</a></td>
+ <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>
<td>CD4</td>
<td>Constant initialization binding a reference to an xvalue</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1835">
<td><a href="https://cplusplus.github.io/CWG/issues/1835.html">1835</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>
<td>CD6</td>
<td>Dependent member lookup before <TT>&lt;</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1836">
<td><a href="https://cplusplus.github.io/CWG/issues/1836.html">1836</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>
<td>CD5</td>
<td>Use of class type being defined in <I>trailing-return-type</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1837">
<td><a href="https://cplusplus.github.io/CWG/issues/1837.html">1837</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>
<td>CD6</td>
<td>Use of <TT>this</TT> in <TT>friend</TT> and local class declarations</td>
<td class="full" align="center">Clang 3.3</td>
</tr>
<tr id="1838">
<td><a href="https://cplusplus.github.io/CWG/issues/1838.html">1838</a></td>
+ <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>
<td>CD4</td>
<td>Definition via <I>unqualified-id</I> and <I>using-declaration</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1839">
<td><a href="https://cplusplus.github.io/CWG/issues/1839.html">1839</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>CD6</td>
<td>Lookup of block-scope <TT>extern</TT> declarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1840">
<td><a href="https://cplusplus.github.io/CWG/issues/1840.html">1840</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>drafting</td>
<td>Non-deleted explicit specialization of deleted function template</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1841">
<td><a href="https://cplusplus.github.io/CWG/issues/1841.html">1841</a></td>
+ <td>[<a href="https://wg21.link/temp.local">temp.local</a>]</td>
<td>CD6</td>
<td><TT>&lt;</TT> following template injected-class-name</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1842">
<td><a href="https://cplusplus.github.io/CWG/issues/1842.html">1842</a></td>
+ <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>
<td>open</td>
<td>Unevaluated operands and &#8220;carries a dependency&#8221;</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1843">
<td><a href="https://cplusplus.github.io/CWG/issues/1843.html">1843</a></td>
+ <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>
<td>CD4</td>
<td>Bit-field in conditional operator with <TT>throw</TT> operand</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1844">
<td><a href="https://cplusplus.github.io/CWG/issues/1844.html">1844</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>open</td>
<td>Defining &#8220;immediate context&#8221;</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="1845">
<td><a href="https://cplusplus.github.io/CWG/issues/1845.html">1845</a></td>
+ <td>[<a href="https://wg21.link/temp.point">temp.point</a>]</td>
<td>review</td>
<td>Point of instantiation of a variable template specialization</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1846">
<td><a href="https://cplusplus.github.io/CWG/issues/1846.html">1846</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>CD4</td>
<td>Declaring explicitly-defaulted implicitly-deleted functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1847">
<td><a href="https://cplusplus.github.io/CWG/issues/1847.html">1847</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>CD4</td>
<td>Clarifying compatibility during partial ordering</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1848">
<td><a href="https://cplusplus.github.io/CWG/issues/1848.html">1848</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>CD4</td>
<td>Parenthesized constructor and destructor declarators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1849">
<td><a href="https://cplusplus.github.io/CWG/issues/1849.html">1849</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD6</td>
<td>Variable templates and the ODR</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1850">
<td><a href="https://cplusplus.github.io/CWG/issues/1850.html">1850</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>CD4</td>
<td>Differences between definition context and point of instantiation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1851">
<td><a href="https://cplusplus.github.io/CWG/issues/1851.html">1851</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD4</td>
<td><TT>decltype(auto)</TT> in <I>new-expression</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1852">
<td><a href="https://cplusplus.github.io/CWG/issues/1852.html">1852</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>
<td>CD4</td>
<td>Wording issues regarding <TT>decltype(auto)</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1853">
<td><a href="https://cplusplus.github.io/CWG/issues/1853.html">1853</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>dup</td>
<td>Defining &#8220;allocated storage&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1854">
<td><a href="https://cplusplus.github.io/CWG/issues/1854.html">1854</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>drafting</td>
<td>Disallowing use of implicitly-deleted functions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1855">
<td><a href="https://cplusplus.github.io/CWG/issues/1855.html">1855</a></td>
+ <td>[<a href="https://wg21.link/class.cdtor">class.cdtor</a>]</td>
<td>dup</td>
<td>Out-of-lifetime access to nonstatic data members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1856">
<td><a href="https://cplusplus.github.io/CWG/issues/1856.html">1856</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>open</td>
<td>Indirect nested classes of class templates</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1857">
<td><a href="https://cplusplus.github.io/CWG/issues/1857.html">1857</a></td>
+ <td>[<a href="https://wg21.link/expr.shift">expr.shift</a>]</td>
<td>CD5</td>
<td>Additional questions about bits</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1858">
<td><a href="https://cplusplus.github.io/CWG/issues/1858.html">1858</a></td>
+ <td>[<a href="https://wg21.link/expr.eq">expr.eq</a>]</td>
<td>CD4</td>
<td>Comparing pointers to union members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1859">
<td><a href="https://cplusplus.github.io/CWG/issues/1859.html">1859</a></td>
+ <td>[<a href="https://wg21.link/lex.string">lex.string</a>]</td>
<td>CD5</td>
<td>UTF-16 in <TT>char16_t</TT> string literals</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1860">
<td><a href="https://cplusplus.github.io/CWG/issues/1860.html">1860</a></td>
+ <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>
<td>C++17</td>
<td>What is a &#8220;direct member?&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1861">
<td><a href="https://cplusplus.github.io/CWG/issues/1861.html">1861</a></td>
+ <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>
<td>CD4</td>
<td>Values of a bit-field</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1862">
<td><a href="https://cplusplus.github.io/CWG/issues/1862.html">1862</a></td>
+ <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>
<td>CD5</td>
<td>Determining &#8220;corresponding members&#8221; for friendship</td>
<td class="none" align="center">No</td>
</tr>
<tr id="1863">
<td><a href="https://cplusplus.github.io/CWG/issues/1863.html">1863</a></td>
+ <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>
<td>CD4</td>
<td>Requirements on thrown object type to support <TT>std::current_exception()</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1864">
<td><a href="https://cplusplus.github.io/CWG/issues/1864.html">1864</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>NAD</td>
<td>List-initialization of array objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1865">
<td><a href="https://cplusplus.github.io/CWG/issues/1865.html">1865</a></td>
+ <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>
<td>CD4</td>
<td>Pointer arithmetic and multi-level qualification conversions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1866">
<td><a href="https://cplusplus.github.io/CWG/issues/1866.html">1866</a></td>
+ <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>
<td>CD4</td>
<td>Initializing variant members with non-trivial destructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1867">
<td><a href="https://cplusplus.github.io/CWG/issues/1867.html">1867</a></td>
+ <td>[<a href="https://wg21.link/dcl.ambig.res">dcl.ambig.res</a>]</td>
<td>NAD</td>
<td>Function/expression ambiguity with qualified parameter name</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1868">
<td><a href="https://cplusplus.github.io/CWG/issues/1868.html">1868</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>open</td>
<td>Meaning of &#8220;placeholder type&#8221;</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1869">
<td><a href="https://cplusplus.github.io/CWG/issues/1869.html">1869</a></td>
+ <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>
<td>NAD</td>
<td><TT>thread_local</TT> vs <I>linkage-specification</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1870">
<td><a href="https://cplusplus.github.io/CWG/issues/1870.html">1870</a></td>
+ <td>[<a href="https://wg21.link/basic.def">basic.def</a>]</td>
<td>CD4</td>
<td>Contradictory wording about definitions vs explicit specialization/instantiation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1871">
<td><a href="https://cplusplus.github.io/CWG/issues/1871.html">1871</a></td>
+ <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>
<td>NAD</td>
<td>Non-identifier characters in <I>ud-suffix</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1872">
<td><a href="https://cplusplus.github.io/CWG/issues/1872.html">1872</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>CD4</td>
<td>Instantiations of <TT>constexpr</TT> templates that cannot appear in constant expressions</td>
<td class="full" align="center">Clang 9</td>
</tr>
<tr id="1873">
<td><a href="https://cplusplus.github.io/CWG/issues/1873.html">1873</a></td>
+ <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>
<td>CD4</td>
<td>Protected member access from derived class friends</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1874">
<td><a href="https://cplusplus.github.io/CWG/issues/1874.html">1874</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>CD4</td>
<td>Type vs non-type template parameters with <TT>class</TT> keyword</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1875">
<td><a href="https://cplusplus.github.io/CWG/issues/1875.html">1875</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.class">basic.scope.class</a>]</td>
<td>CD4</td>
<td>Reordering declarations in class scope</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1876">
<td><a href="https://cplusplus.github.io/CWG/issues/1876.html">1876</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>NAD</td>
<td>Preventing explicit specialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1877">
<td><a href="https://cplusplus.github.io/CWG/issues/1877.html">1877</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>CD4</td>
<td>Return type deduction from <TT>return</TT> with no operand</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1878">
<td><a href="https://cplusplus.github.io/CWG/issues/1878.html">1878</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>CD4</td>
<td><TT>operator auto</TT> template</td>
<td class="full" align="center">Clang 18</td>
</tr>
<tr id="1879">
<td><a href="https://cplusplus.github.io/CWG/issues/1879.html">1879</a></td>
+ <td>[<a href="https://wg21.link/basic.align">basic.align</a>]</td>
<td>NAD</td>
<td>Inadequate definition of alignment requirement</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1880">
<td><a href="https://cplusplus.github.io/CWG/issues/1880.html">1880</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>CD4</td>
<td>When are parameter objects destroyed?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1881">
<td><a href="https://cplusplus.github.io/CWG/issues/1881.html">1881</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>CD4</td>
<td>Standard-layout classes and unnamed bit-fields</td>
<td class="full" align="center">Clang 7</td>
</tr>
<tr id="1882">
<td><a href="https://cplusplus.github.io/CWG/issues/1882.html">1882</a></td>
+ <td>[<a href="https://wg21.link/global.names">global.names</a>]</td>
<td>CD4</td>
<td>Reserved names without library use</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1883">
<td><a href="https://cplusplus.github.io/CWG/issues/1883.html">1883</a></td>
+ <td>[<a href="https://wg21.link/class.protected">class.protected</a>]</td>
<td>review</td>
<td>Protected access to constructors in <I>mem-initializer</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1884">
<td><a href="https://cplusplus.github.io/CWG/issues/1884.html">1884</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>CD6</td>
<td>Unclear requirements for same-named external-linkage entities</td>
<td class="partial" align="center">Partial</td>
</tr>
<tr id="1885">
<td><a href="https://cplusplus.github.io/CWG/issues/1885.html">1885</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>CD4</td>
<td>Return value of a function is underspecified</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1886">
<td><a href="https://cplusplus.github.io/CWG/issues/1886.html">1886</a></td>
+ <td>[<a href="https://wg21.link/basic.start.main">basic.start.main</a>]</td>
<td>CD4</td>
<td>Language linkage for <TT>main()</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1887">
<td><a href="https://cplusplus.github.io/CWG/issues/1887.html">1887</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>CD4</td>
<td>Problems with <TT>::</TT> as <I>nested-name-specifier</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1888">
<td><a href="https://cplusplus.github.io/CWG/issues/1888.html">1888</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>CD4</td>
<td>Implicitly-declared default constructors and <TT>explicit</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1889">
<td><a href="https://cplusplus.github.io/CWG/issues/1889.html">1889</a></td>
+ <td>[<a href="https://wg21.link/cpp.pragma">cpp.pragma</a>]</td>
<td>open</td>
<td>Unclear effect of <TT>#pragma</TT> on conformance</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="1890">
<td><a href="https://cplusplus.github.io/CWG/issues/1890.html">1890</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>drafting</td>
<td>Member type depending on definition of member function</td>
<td align="center">
@@ -11175,2670 +13023,3115 @@ and <I>POD class</I></td>
</tr>
<tr id="1891">
<td><a href="https://cplusplus.github.io/CWG/issues/1891.html">1891</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD4</td>
<td>Move constructor/assignment for closure class</td>
<td class="full" align="center">Clang 4</td>
</tr>
<tr id="1892">
<td><a href="https://cplusplus.github.io/CWG/issues/1892.html">1892</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>CD4</td>
<td>Use of <TT>auto</TT> in function type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1893">
<td><a href="https://cplusplus.github.io/CWG/issues/1893.html">1893</a></td>
+ <td>[<a href="https://wg21.link/expr.type.conv">expr.type.conv</a>]</td>
<td>CD5</td>
<td>Function-style cast with <I>braced-init-list</I>s and empty pack expansions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1894">
<td><a href="https://cplusplus.github.io/CWG/issues/1894.html">1894</a></td>
+ <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>
<td>CD6</td>
<td><I>typedef-name</I>s and <I>using-declaration</I>s</td>
<td class="full" align="center">Clang 3.8</td>
</tr>
<tr id="1895">
<td><a href="https://cplusplus.github.io/CWG/issues/1895.html">1895</a></td>
+ <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>
<td>CD4</td>
<td>Deleted conversions in conditional operator operands</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1896">
<td><a href="https://cplusplus.github.io/CWG/issues/1896.html">1896</a></td>
+ <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>
<td>CD6</td>
<td>Repeated alias templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1897">
<td><a href="https://cplusplus.github.io/CWG/issues/1897.html">1897</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>review</td>
<td>ODR vs alternative tokens</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1898">
<td><a href="https://cplusplus.github.io/CWG/issues/1898.html">1898</a></td>
+ <td>[<a href="https://wg21.link/over.dcl">over.dcl</a>]</td>
<td>CD6</td>
<td>Use of &#8220;equivalent&#8221; in overload resolution</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="1899">
<td><a href="https://cplusplus.github.io/CWG/issues/1899.html">1899</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>
<td>CD4</td>
<td>Value-dependent constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1900">
<td><a href="https://cplusplus.github.io/CWG/issues/1900.html">1900</a></td>
+ <td>[<a href="https://wg21.link/dcl.meaning">dcl.meaning</a>]</td>
<td>CD6</td>
<td>Do <TT>friend</TT> declarations count as &#8220;previous declarations&#8221;?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr class="open" id="1901">
<td><a href="https://cplusplus.github.io/CWG/issues/1901.html">1901</a></td>
+ <td>[<a href="https://wg21.link/lex.token">lex.token</a>]</td>
<td>open</td>
<td><I>punctuator</I> referenced but not defined</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1902">
<td><a href="https://cplusplus.github.io/CWG/issues/1902.html">1902</a></td>
+ <td>[<a href="https://wg21.link/over.best.ics">over.best.ics</a>]</td>
<td>CD4</td>
<td>What makes a conversion &#8220;otherwise ill-formed&#8221;?</td>
<td class="full" align="center">Clang 3.7</td>
</tr>
<tr id="1903">
<td><a href="https://cplusplus.github.io/CWG/issues/1903.html">1903</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>CD4</td>
<td>What declarations are introduced by a non-member <I>using-declaration</I>?</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="1904">
<td><a href="https://cplusplus.github.io/CWG/issues/1904.html">1904</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>NAD</td>
<td>Default template arguments for members of class templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1905">
<td><a href="https://cplusplus.github.io/CWG/issues/1905.html">1905</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>NAD</td>
<td>Dependent types and injected-class-names</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1906">
<td><a href="https://cplusplus.github.io/CWG/issues/1906.html">1906</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>
<td>NAD</td>
<td>Name lookup in member <TT>friend</TT> declaration</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1907">
<td><a href="https://cplusplus.github.io/CWG/issues/1907.html">1907</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>CD6</td>
<td><I>using-declaration</I>s and default arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1908">
<td><a href="https://cplusplus.github.io/CWG/issues/1908.html">1908</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>
<td>CD6</td>
<td>Dual destructor lookup and <I>template-id</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1909">
<td><a href="https://cplusplus.github.io/CWG/issues/1909.html">1909</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>CD4</td>
<td>Member class template with the same name as the class</td>
<td class="full" align="center">Clang 3.7</td>
</tr>
<tr id="1910">
<td><a href="https://cplusplus.github.io/CWG/issues/1910.html">1910</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic.allocation">basic.stc.dynamic.allocation</a>]</td>
<td>CD5</td>
<td>&#8220;Shall&#8221; requirement applied to runtime behavior</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1911">
<td><a href="https://cplusplus.github.io/CWG/issues/1911.html">1911</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>CD4</td>
<td><TT>constexpr</TT> constructor with non-literal base class</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1912">
<td><a href="https://cplusplus.github.io/CWG/issues/1912.html">1912</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>CD5</td>
<td><I>exception-specification</I> of defaulted function</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1913">
<td><a href="https://cplusplus.github.io/CWG/issues/1913.html">1913</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>CD5</td>
<td><TT>decltype((x))</TT> in <I>lambda-expression</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1914">
<td><a href="https://cplusplus.github.io/CWG/issues/1914.html">1914</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr">dcl.attr</a>]</td>
<td>extension</td>
<td>Duplicate standard attributes</td>
<td align="center">Extension</td>
</tr>
<tr class="open" id="1915">
<td><a href="https://cplusplus.github.io/CWG/issues/1915.html">1915</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>open</td>
<td>Potentially-invoked destructors in non-throwing constructors</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1916">
<td><a href="https://cplusplus.github.io/CWG/issues/1916.html">1916</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>CD4</td>
<td>&#8220;Same cv-unqualified type&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1917">
<td><a href="https://cplusplus.github.io/CWG/issues/1917.html">1917</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>NAD</td>
<td>decltype-qualified enumeration names</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1918">
<td><a href="https://cplusplus.github.io/CWG/issues/1918.html">1918</a></td>
+ <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>
<td>CD5</td>
<td><TT>friend</TT> templates with dependent scopes</td>
<td class="none" align="center">No</td>
</tr>
<tr class="open" id="1919">
<td><a href="https://cplusplus.github.io/CWG/issues/1919.html">1919</a></td>
+ <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>
<td>open</td>
<td>Overload resolution for <TT>!</TT> with explicit conversion operator</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1920">
<td><a href="https://cplusplus.github.io/CWG/issues/1920.html">1920</a></td>
+ <td>[<a href="https://wg21.link/expr.pseudo">expr.pseudo</a>]</td>
<td>CD4</td>
<td>Qualification mismatch in <I>pseudo-destructor-name</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1921">
<td><a href="https://cplusplus.github.io/CWG/issues/1921.html">1921</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>NAD</td>
<td><TT>constexpr</TT> constructors and point of initialization of <TT>const</TT> variables</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1922">
<td><a href="https://cplusplus.github.io/CWG/issues/1922.html">1922</a></td>
+ <td>[<a href="https://wg21.link/temp.local">temp.local</a>]</td>
<td>CD4</td>
<td>Injected class template names and default arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1923">
<td><a href="https://cplusplus.github.io/CWG/issues/1923.html">1923</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>
<td>NAD</td>
<td>Lvalues of type <TT>void</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1924">
<td><a href="https://cplusplus.github.io/CWG/issues/1924.html">1924</a></td>
+ <td>[<a href="https://wg21.link/lex.literal">lex.literal</a>]</td>
<td>review</td>
<td>Definition of &#8220;literal&#8221; and kinds of literals</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1925">
<td><a href="https://cplusplus.github.io/CWG/issues/1925.html">1925</a></td>
+ <td>[<a href="https://wg21.link/expr.comma">expr.comma</a>]</td>
<td>CD4</td>
<td>Bit-field prvalues</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1926">
<td><a href="https://cplusplus.github.io/CWG/issues/1926.html">1926</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD4</td>
<td>Potential results of subscript operator</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1927">
<td><a href="https://cplusplus.github.io/CWG/issues/1927.html">1927</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>dup</td>
<td>Lifetime of temporaries in <I>init-capture</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1928">
<td><a href="https://cplusplus.github.io/CWG/issues/1928.html">1928</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>NAD</td>
<td>Triviality of deleted special member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1929">
<td><a href="https://cplusplus.github.io/CWG/issues/1929.html">1929</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>
<td>CD4</td>
<td><TT>template</TT> keyword following namespace <I>nested-name-specifier</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1930">
<td><a href="https://cplusplus.github.io/CWG/issues/1930.html">1930</a></td>
+ <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>
<td>CD4</td>
<td><I>init-declarator-list</I> vs <I>member-declarator-list</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1931">
<td><a href="https://cplusplus.github.io/CWG/issues/1931.html">1931</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD5</td>
<td>Default-constructible and copy-assignable closure types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1932">
<td><a href="https://cplusplus.github.io/CWG/issues/1932.html">1932</a></td>
+ <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>
<td>CD4</td>
<td>Bit-field results of conditional operators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1933">
<td><a href="https://cplusplus.github.io/CWG/issues/1933.html">1933</a></td>
+ <td>[<a href="https://wg21.link/implimits">implimits</a>]</td>
<td>NAD</td>
<td>Implementation limit for <I>initializer-list</I> elements</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1934">
<td><a href="https://cplusplus.github.io/CWG/issues/1934.html">1934</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>NAD</td>
<td>Relaxing <I>exception-specification</I> compatibility requirements</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1935">
<td><a href="https://cplusplus.github.io/CWG/issues/1935.html">1935</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD5</td>
<td>Reuse of placement arguments in deallocation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1936">
<td><a href="https://cplusplus.github.io/CWG/issues/1936.html">1936</a></td>
+ <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>
<td>CD6</td>
<td>Dependent <I>qualified-id</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1937">
<td><a href="https://cplusplus.github.io/CWG/issues/1937.html">1937</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD5</td>
<td>Incomplete specification of function pointer from lambda</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1938">
<td><a href="https://cplusplus.github.io/CWG/issues/1938.html">1938</a></td>
+ <td>[<a href="https://wg21.link/intro.compliance">intro.compliance</a>]</td>
<td>CD5</td>
<td>Should hosted/freestanding be implementation-defined?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1939">
<td><a href="https://cplusplus.github.io/CWG/issues/1939.html">1939</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>open</td>
<td>Argument conversions to nondeduced parameter types revisited</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1940">
<td><a href="https://cplusplus.github.io/CWG/issues/1940.html">1940</a></td>
+ <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>
<td>CD4</td>
<td><TT>static_assert</TT> in anonymous unions</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="1941">
<td><a href="https://cplusplus.github.io/CWG/issues/1941.html">1941</a></td>
+ <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>
<td>CD4</td>
<td>SFINAE and inherited constructor default arguments</td>
<td class="full" align="center">Clang 3.9</td>
</tr>
<tr id="1942">
<td><a href="https://cplusplus.github.io/CWG/issues/1942.html">1942</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>CD4</td>
<td>Incorrect reference to <I>trailing-return-type</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1943">
<td><a href="https://cplusplus.github.io/CWG/issues/1943.html">1943</a></td>
+ <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>
<td>CD5</td>
<td>Unspecified meaning of &#8220;bit&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1944">
<td><a href="https://cplusplus.github.io/CWG/issues/1944.html">1944</a></td>
+ <td>[<a href="https://wg21.link/diff">diff</a>]</td>
<td>open</td>
<td>New C incompatibilities</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1945">
<td><a href="https://cplusplus.github.io/CWG/issues/1945.html">1945</a></td>
+ <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>
<td>CD5</td>
<td>Friend declarations naming members of class templates in non-templates</td>
<td class="none" align="center">No</td>
</tr>
<tr id="1946">
<td><a href="https://cplusplus.github.io/CWG/issues/1946.html">1946</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>CD4</td>
<td><I>exception-specification</I>s vs pointer dereference</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1947">
<td><a href="https://cplusplus.github.io/CWG/issues/1947.html">1947</a></td>
+ <td>[<a href="https://wg21.link/lex.icon">lex.icon</a>]</td>
<td>NAD</td>
<td>Digit separators following non-octal prefix</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="1948">
<td><a href="https://cplusplus.github.io/CWG/issues/1948.html">1948</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic">basic.stc.dynamic</a>]</td>
<td>NAD</td>
<td><I>exception-specification</I> of replacement global <TT>new</TT></td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr id="1949">
<td><a href="https://cplusplus.github.io/CWG/issues/1949.html">1949</a></td>
+ <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>
<td>CD4</td>
<td>&#8220;sequenced after&#8221; instead of &#8220;sequenced before&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1950">
<td><a href="https://cplusplus.github.io/CWG/issues/1950.html">1950</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>NAD</td>
<td>Restructuring description of ranks of conversion sequences</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1951">
<td><a href="https://cplusplus.github.io/CWG/issues/1951.html">1951</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>CD4</td>
<td>Cv-qualification and literal types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1952">
<td><a href="https://cplusplus.github.io/CWG/issues/1952.html">1952</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD4</td>
<td>Constant expressions and library undefined behavior</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1953">
<td><a href="https://cplusplus.github.io/CWG/issues/1953.html">1953</a></td>
+ <td>[<a href="https://wg21.link/intro.memory">intro.memory</a>]</td>
<td>CD7</td>
<td>Data races and common initial sequence</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1954">
<td><a href="https://cplusplus.github.io/CWG/issues/1954.html">1954</a></td>
+ <td>[<a href="https://wg21.link/expr.typeid">expr.typeid</a>]</td>
<td>CD7</td>
<td><TT>typeid</TT> null dereference check in subexpressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1955">
<td><a href="https://cplusplus.github.io/CWG/issues/1955.html">1955</a></td>
+ <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>
<td>CD4</td>
<td><TT>#elif</TT> with invalid controlling expression</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1956">
<td><a href="https://cplusplus.github.io/CWG/issues/1956.html">1956</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.auto">basic.stc.auto</a>]</td>
<td>CD4</td>
<td>Reuse of storage of automatic variables</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1957">
<td><a href="https://cplusplus.github.io/CWG/issues/1957.html">1957</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>NAD</td>
<td><TT>decltype(auto)</TT> with direct-list-initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1958">
<td><a href="https://cplusplus.github.io/CWG/issues/1958.html">1958</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>CD4</td>
<td><TT>decltype(auto)</TT> with parenthesized initializer</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1959">
<td><a href="https://cplusplus.github.io/CWG/issues/1959.html">1959</a></td>
+ <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>
<td>CD4</td>
<td>Inadvertently inherited copy constructor</td>
<td class="full" align="center">Clang 3.9</td>
</tr>
<tr id="1960">
<td><a href="https://cplusplus.github.io/CWG/issues/1960.html">1960</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>NAD</td>
<td>Visibility of entity named in class-scope <I>using-declaration</I></td>
<td class="none" align="center">No</td>
</tr>
<tr id="1961">
<td><a href="https://cplusplus.github.io/CWG/issues/1961.html">1961</a></td>
+ <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>
<td>C++17</td>
<td>Potentially-concurrent actions within a signal handler</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1962">
<td><a href="https://cplusplus.github.io/CWG/issues/1962.html">1962</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.general">dcl.fct.def.general</a>]</td>
<td>open</td>
<td>Type of <TT>__func__</TT></td>
<td align="center">Not resolved</td>
</tr>
<tr id="1963">
<td><a href="https://cplusplus.github.io/CWG/issues/1963.html">1963</a></td>
+ <td>[<a href="https://wg21.link/lex.name">lex.name</a>]</td>
<td>CD4</td>
<td>Implementation-defined identifier characters</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1964">
<td><a href="https://cplusplus.github.io/CWG/issues/1964.html">1964</a></td>
+ <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>
<td>NAD</td>
<td><I>opaque-enum-declaration</I> in <I>alias-declaration</I>?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1965">
<td><a href="https://cplusplus.github.io/CWG/issues/1965.html">1965</a></td>
+ <td>[<a href="https://wg21.link/expr.dynamic.cast">expr.dynamic.cast</a>]</td>
<td>CD7</td>
<td>Explicit casts to reference types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1966">
<td><a href="https://cplusplus.github.io/CWG/issues/1966.html">1966</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>CD4</td>
<td>Colon following enumeration <I>elaborated-type-specifier</I></td>
<td class="full" align="center">Clang 11</td>
</tr>
<tr id="1967">
<td><a href="https://cplusplus.github.io/CWG/issues/1967.html">1967</a></td>
+ <td>[<a href="https://wg21.link/class.copy.elision">class.copy.elision</a>]</td>
<td>CD4</td>
<td>Temporary lifetime and move-elision</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1968">
<td><a href="https://cplusplus.github.io/CWG/issues/1968.html">1968</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>NAD</td>
<td>Address of <TT>typeid</TT> in constant expressions</td>
<td class="none" align="center">No</td>
</tr>
<tr id="1969">
<td><a href="https://cplusplus.github.io/CWG/issues/1969.html">1969</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>CD6</td>
<td>Missing exclusion of <TT>~S</TT> as an ordinary function name</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1970">
<td><a href="https://cplusplus.github.io/CWG/issues/1970.html">1970</a></td>
+ <td>[<a href="https://wg21.link/dcl.ambig.res">dcl.ambig.res</a>]</td>
<td>NAD</td>
<td>Ambiguity resolution for <TT>(T())*x</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1971">
<td><a href="https://cplusplus.github.io/CWG/issues/1971.html">1971</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>
<td>CD4</td>
<td>Unclear disambiguation of destructor and <TT>operator~</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1972">
<td><a href="https://cplusplus.github.io/CWG/issues/1972.html">1972</a></td>
+ <td>[<a href="https://wg21.link/lex.name">lex.name</a>]</td>
<td>CD6</td>
<td>Identifier character restrictions in non-<I>identifier</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1973">
<td><a href="https://cplusplus.github.io/CWG/issues/1973.html">1973</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD7</td>
<td>Which <I>parameter-declaration-clause</I> in a <I>lambda-expression</I>?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1974">
<td><a href="https://cplusplus.github.io/CWG/issues/1974.html">1974</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>NAD</td>
<td>Redundant specification of non-type <I>typename-specifier</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1975">
<td><a href="https://cplusplus.github.io/CWG/issues/1975.html">1975</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>CD4</td>
<td>Permissible declarations for <I>exception-specification</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1976">
<td><a href="https://cplusplus.github.io/CWG/issues/1976.html">1976</a></td>
+ <td>[<a href="https://wg21.link/namespace.alias">namespace.alias</a>]</td>
<td>NAD</td>
<td>Ambiguity of <I>namespace-alias</I>es</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1977">
<td><a href="https://cplusplus.github.io/CWG/issues/1977.html">1977</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>open</td>
<td>Contradictory results of failed destructor lookup</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1978">
<td><a href="https://cplusplus.github.io/CWG/issues/1978.html">1978</a></td>
+ <td>[<a href="https://wg21.link/class.conv.ctor">class.conv.ctor</a>]</td>
<td>CD4</td>
<td>Redundant description of explicit constructor use</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1979">
<td><a href="https://cplusplus.github.io/CWG/issues/1979.html">1979</a></td>
+ <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>
<td>drafting</td>
<td>Alias template specialization in template member definition</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="1980">
<td><a href="https://cplusplus.github.io/CWG/issues/1980.html">1980</a></td>
+ <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>
<td>drafting</td>
<td>Equivalent but not functionally-equivalent redeclarations</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1981">
<td><a href="https://cplusplus.github.io/CWG/issues/1981.html">1981</a></td>
+ <td>[<a href="https://wg21.link/conv">conv</a>]</td>
<td>CD4</td>
<td>Implicit contextual conversions and <TT>explicit</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1982">
<td><a href="https://cplusplus.github.io/CWG/issues/1982.html">1982</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.explicit">temp.arg.explicit</a>]</td>
<td>NAD</td>
<td>Deduction extending parameter pack</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1983">
<td><a href="https://cplusplus.github.io/CWG/issues/1983.html">1983</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>CD5</td>
<td>Inappropriate use of <I>virt-specifier</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1984">
<td><a href="https://cplusplus.github.io/CWG/issues/1984.html">1984</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>NAD</td>
<td>Lossless narrowing conversions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1985">
<td><a href="https://cplusplus.github.io/CWG/issues/1985.html">1985</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>NAD</td>
<td>Unknown bound array member with <I>brace-or-equal-initializer</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1986">
<td><a href="https://cplusplus.github.io/CWG/issues/1986.html">1986</a></td>
+ <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>
<td>drafting</td>
<td>odr-use and delayed initialization</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1987">
<td><a href="https://cplusplus.github.io/CWG/issues/1987.html">1987</a></td>
+ <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>
<td>NAD</td>
<td><TT>constexpr</TT> static data members across translation units</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1988">
<td><a href="https://cplusplus.github.io/CWG/issues/1988.html">1988</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>CD4</td>
<td>Ambiguity between dependent and non-dependent bases in implicit member access</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1989">
<td><a href="https://cplusplus.github.io/CWG/issues/1989.html">1989</a></td>
+ <td>[<a href="https://wg21.link/over.oper">over.oper</a>]</td>
<td>drafting</td>
<td>Insufficient restrictions on parameters of postfix operators</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1990">
<td><a href="https://cplusplus.github.io/CWG/issues/1990.html">1990</a></td>
+ <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>
<td>CD4</td>
<td>Ambiguity due to optional <I>decl-specifier-seq</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1991">
<td><a href="https://cplusplus.github.io/CWG/issues/1991.html">1991</a></td>
+ <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>
<td>CD4</td>
<td>Inheriting constructors vs default arguments</td>
<td class="full" align="center">Clang 3.9</td>
</tr>
<tr id="1992">
<td><a href="https://cplusplus.github.io/CWG/issues/1992.html">1992</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD4</td>
<td><TT>new (std::nothrow) int[N]</TT> can throw</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1993">
<td><a href="https://cplusplus.github.io/CWG/issues/1993.html">1993</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>open</td>
<td>Use of <TT>template&lt;&gt;</TT> defining member of explicit specialization</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1994">
<td><a href="https://cplusplus.github.io/CWG/issues/1994.html">1994</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>dup</td>
<td>Confusing wording regarding multiple <TT>template&lt;&gt;</TT> prefixes</td>
<td class="unknown" align="center">Duplicate of <a href="#529">529</a></td>
</tr>
<tr id="1995">
<td><a href="https://cplusplus.github.io/CWG/issues/1995.html">1995</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>CD4</td>
<td><I>exception-specification</I>s and non-type template parameters</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="1996">
<td><a href="https://cplusplus.github.io/CWG/issues/1996.html">1996</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>drafting</td>
<td>Reference list-initialization ignores conversion functions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="1997">
<td><a href="https://cplusplus.github.io/CWG/issues/1997.html">1997</a></td>
+ <td>[<a href="https://wg21.link/basic.indet">basic.indet</a>]</td>
<td>CD7</td>
<td>Placement new and previous initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1998">
<td><a href="https://cplusplus.github.io/CWG/issues/1998.html">1998</a></td>
+ <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>
<td>NAD</td>
<td>Additional sources of xvalue expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="1999">
<td><a href="https://cplusplus.github.io/CWG/issues/1999.html">1999</a></td>
+ <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>
<td>CD4</td>
<td>Representation of source characters as universal-character-names</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2000">
<td><a href="https://cplusplus.github.io/CWG/issues/2000.html">2000</a></td>
+ <td>[<a href="https://wg21.link/lex.pptoken">lex.pptoken</a>]</td>
<td>CD4</td>
<td><I>header-name</I> outside <TT>#include</TT> directive</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2001">
<td><a href="https://cplusplus.github.io/CWG/issues/2001.html">2001</a></td>
+ <td>[<a href="https://wg21.link/cpp.pre">cpp.pre</a>]</td>
<td>CD4</td>
<td><I>non-directive</I> is underspecified</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2002">
<td><a href="https://cplusplus.github.io/CWG/issues/2002.html">2002</a></td>
+ <td>[<a href="https://wg21.link/cpp.pre">cpp.pre</a>]</td>
<td>open</td>
<td>White space within preprocessing directives</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2003">
<td><a href="https://cplusplus.github.io/CWG/issues/2003.html">2003</a></td>
+ <td>[<a href="https://wg21.link/cpp.replace">cpp.replace</a>]</td>
<td>drafting</td>
<td>Zero-argument macros incorrectly specified</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2004">
<td><a href="https://cplusplus.github.io/CWG/issues/2004.html">2004</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD4</td>
<td>Unions with mutable members in constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2005">
<td><a href="https://cplusplus.github.io/CWG/issues/2005.html">2005</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>NAD</td>
<td>Incorrect <TT>constexpr</TT> reference initialization requirements</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2006">
<td><a href="https://cplusplus.github.io/CWG/issues/2006.html">2006</a></td>
+ <td>[<a href="https://wg21.link/basic.compound">basic.compound</a>]</td>
<td>CD4</td>
<td>Cv-qualified <TT>void</TT> types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2007">
<td><a href="https://cplusplus.github.io/CWG/issues/2007.html">2007</a></td>
+ <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>
<td>CD6</td>
<td>Argument-dependent lookup for <TT>operator=</TT></td>
<td class="full" align="center">Clang 3.4</td>
</tr>
<tr id="2008">
<td><a href="https://cplusplus.github.io/CWG/issues/2008.html">2008</a></td>
+ <td>[<a href="https://wg21.link/temp.arg">temp.arg</a>]</td>
<td>CD4</td>
<td>Default <I>template-argument</I>s underspecified</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2009">
<td><a href="https://cplusplus.github.io/CWG/issues/2009.html">2009</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.class">basic.scope.class</a>]</td>
<td>CD6</td>
<td>Unclear specification of class scope</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="2010">
<td><a href="https://cplusplus.github.io/CWG/issues/2010.html">2010</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>CD4</td>
<td><I>exception-specification</I>s and conversion operators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2011">
<td><a href="https://cplusplus.github.io/CWG/issues/2011.html">2011</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>C++17</td>
<td>Unclear effect of reference capture of reference</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2012">
<td><a href="https://cplusplus.github.io/CWG/issues/2012.html">2012</a></td>
+ <td>[<a href="https://wg21.link/basic.stc">basic.stc</a>]</td>
<td>CD4</td>
<td>Lifetime of references</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2013">
<td><a href="https://cplusplus.github.io/CWG/issues/2013.html">2013</a></td>
+ <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>
<td>drafting</td>
<td>Pointer subtraction in large array</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2014">
<td><a href="https://cplusplus.github.io/CWG/issues/2014.html">2014</a></td>
+ <td>[<a href="https://wg21.link/new.delete.array">new.delete.array</a>]</td>
<td>NAD</td>
<td>Unneeded deallocation signatures</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2015">
<td><a href="https://cplusplus.github.io/CWG/issues/2015.html">2015</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.delete">dcl.fct.def.delete</a>]</td>
<td>CD4</td>
<td>odr-use of deleted virtual functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2016">
<td><a href="https://cplusplus.github.io/CWG/issues/2016.html">2016</a></td>
+ <td>[<a href="https://wg21.link/class.conv.fct">class.conv.fct</a>]</td>
<td>CD4</td>
<td>Confusing wording in description of conversion function</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2017">
<td><a href="https://cplusplus.github.io/CWG/issues/2017.html">2017</a></td>
+ <td>[<a href="https://wg21.link/stmt.return">stmt.return</a>]</td>
<td>CD4</td>
<td>Flowing off end is not equivalent to no-expression return</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2018">
<td><a href="https://cplusplus.github.io/CWG/issues/2018.html">2018</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>dup</td>
<td>Qualification conversion vs reference binding</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2019">
<td><a href="https://cplusplus.github.io/CWG/issues/2019.html">2019</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.general">basic.stc.general</a>]</td>
<td>CD4</td>
<td>Member references omitted from description of storage duration</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2020">
<td><a href="https://cplusplus.github.io/CWG/issues/2020.html">2020</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD5</td>
<td>Inadequate description of odr-use of implicitly-invoked functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2021">
<td><a href="https://cplusplus.github.io/CWG/issues/2021.html">2021</a></td>
+ <td>[<a href="https://wg21.link/temp.over.link">temp.over.link</a>]</td>
<td>dup</td>
<td>Function template redeclaration via alias template</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2022">
<td><a href="https://cplusplus.github.io/CWG/issues/2022.html">2022</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD4</td>
<td>Copy elision in constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2023">
<td><a href="https://cplusplus.github.io/CWG/issues/2023.html">2023</a></td>
+ <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>
<td>drafting</td>
<td>Composite reference result type of conditional operator</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2024">
<td><a href="https://cplusplus.github.io/CWG/issues/2024.html">2024</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>CD4</td>
<td>Dependent types and unexpanded parameter packs</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2025">
<td><a href="https://cplusplus.github.io/CWG/issues/2025.html">2025</a></td>
+ <td>[<a href="https://wg21.link/temp.over.link">temp.over.link</a>]</td>
<td>dup</td>
<td>Declaration matching via alias templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2026">
<td><a href="https://cplusplus.github.io/CWG/issues/2026.html">2026</a></td>
+ <td>[<a href="https://wg21.link/basic.start">basic.start</a>]</td>
<td>CD4</td>
<td>Zero-initialization and <TT>constexpr</TT></td>
<td class="full" align="center">Clang 11</td>
</tr>
<tr id="2027">
<td><a href="https://cplusplus.github.io/CWG/issues/2027.html">2027</a></td>
+ <td>[<a href="https://wg21.link/dcl.align">dcl.align</a>]</td>
<td>CD4</td>
<td>Unclear requirements for multiple <TT>alignas</TT> specifiers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2028">
<td><a href="https://cplusplus.github.io/CWG/issues/2028.html">2028</a></td>
+ <td>[<a href="https://wg21.link/over.match.ref">over.match.ref</a>]</td>
<td>drafting</td>
<td>Converting constructors in rvalue reference initialization</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2029">
<td><a href="https://cplusplus.github.io/CWG/issues/2029.html">2029</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>dup</td>
<td>Abstract class return type in <TT>decltype</TT> operand</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2030">
<td><a href="https://cplusplus.github.io/CWG/issues/2030.html">2030</a></td>
+ <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>
<td>NAD</td>
<td>Access of injected-class-name with template arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2031">
<td><a href="https://cplusplus.github.io/CWG/issues/2031.html">2031</a></td>
+ <td>[<a href="https://wg21.link/diff.cpp03.expr">diff.cpp03.expr</a>]</td>
<td>CD4</td>
<td>Missing incompatibility for <TT>&amp;&amp;</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2032">
<td><a href="https://cplusplus.github.io/CWG/issues/2032.html">2032</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>CD4</td>
<td>Default <I>template-argument</I>s of variable templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2033">
<td><a href="https://cplusplus.github.io/CWG/issues/2033.html">2033</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial.general">temp.spec.partial.general</a>]</td>
<td>CD4</td>
<td>Redundant restriction on partial specialization argument</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2034">
<td><a href="https://cplusplus.github.io/CWG/issues/2034.html">2034</a></td>
+ <td>[<a href="https://wg21.link/except.uncaught">except.uncaught</a>]</td>
<td>NAD</td>
<td>Deprecating <TT>uncaught_exception()</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2035">
<td><a href="https://cplusplus.github.io/CWG/issues/2035.html">2035</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial.match">temp.spec.partial.match</a>]</td>
<td>CD3</td>
<td>Multi-section example is confusing</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2036">
<td><a href="https://cplusplus.github.io/CWG/issues/2036.html">2036</a></td>
+ <td>[<a href="https://wg21.link/dcl.decl">dcl.decl</a>]</td>
<td>NAD</td>
<td>Refactoring <I>parameters-and-qualifiers</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2037">
<td><a href="https://cplusplus.github.io/CWG/issues/2037.html">2037</a></td>
+ <td>[<a href="https://wg21.link/temp.type">temp.type</a>]</td>
<td>drafting</td>
<td>Alias templates and template declaration matching</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2038">
<td><a href="https://cplusplus.github.io/CWG/issues/2038.html">2038</a></td>
+ <td>[<a href="https://wg21.link/diff.cpp14">diff.cpp14</a>]</td>
<td>CD4</td>
<td>Document C++14 incompatibility of new braced deduction rule</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2039">
<td><a href="https://cplusplus.github.io/CWG/issues/2039.html">2039</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>CD4</td>
<td>Constant conversions to <TT>bool</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2040">
<td><a href="https://cplusplus.github.io/CWG/issues/2040.html">2040</a></td>
+ <td>[<a href="https://wg21.link/dcl.decl">dcl.decl</a>]</td>
<td>CD4</td>
<td><I>trailing-return-type</I> no longer ambiguous</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2041">
<td><a href="https://cplusplus.github.io/CWG/issues/2041.html">2041</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>CD4</td>
<td>Namespace for explicit class template specialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2042">
<td><a href="https://cplusplus.github.io/CWG/issues/2042.html">2042</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic.deallocation">basic.stc.dynamic.deallocation</a>]</td>
<td>review</td>
<td>Exceptions and deallocation functions</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2043">
<td><a href="https://cplusplus.github.io/CWG/issues/2043.html">2043</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>
<td>drafting</td>
<td>Generalized template arguments and array-to-pointer decay</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2044">
<td><a href="https://cplusplus.github.io/CWG/issues/2044.html">2044</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>CD4</td>
<td><TT>decltype(auto)</TT> and <TT>void</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2045">
<td><a href="https://cplusplus.github.io/CWG/issues/2045.html">2045</a></td>
+ <td>[<a href="https://wg21.link/temp.over.link">temp.over.link</a>]</td>
<td>CD5</td>
<td>&#8220;Identical&#8221; template parameter lists</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2046">
<td><a href="https://cplusplus.github.io/CWG/issues/2046.html">2046</a></td>
+ <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>
<td>C++17</td>
<td>Incomplete thread specifications</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2047">
<td><a href="https://cplusplus.github.io/CWG/issues/2047.html">2047</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>CD4</td>
<td>Coordinating &#8220;throws anything&#8221; specifications</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2048">
<td><a href="https://cplusplus.github.io/CWG/issues/2048.html">2048</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>open</td>
<td>C-style casts that cast away constness vs <TT>static_cast</TT></td>
<td align="center">Not resolved</td>
</tr>
<tr id="2049">
<td><a href="https://cplusplus.github.io/CWG/issues/2049.html">2049</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>
<td>CD7</td>
<td>List initializer in non-type template default argument</td>
<td class="full" align="center">Clang 18</td>
</tr>
<tr id="2050">
<td><a href="https://cplusplus.github.io/CWG/issues/2050.html">2050</a></td>
+ <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>
<td>NAD</td>
<td>Consolidate specification of linkage</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2051">
<td><a href="https://cplusplus.github.io/CWG/issues/2051.html">2051</a></td>
+ <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>
<td>CD5</td>
<td>Simplifying alias rules</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2052">
<td><a href="https://cplusplus.github.io/CWG/issues/2052.html">2052</a></td>
+ <td>[<a href="https://wg21.link/over.oper">over.oper</a>]</td>
<td>CD4</td>
<td>Template argument deduction vs overloaded operators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2053">
<td><a href="https://cplusplus.github.io/CWG/issues/2053.html">2053</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>C++20</td>
<td><TT>auto</TT> in non-generic lambdas</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2054">
<td><a href="https://cplusplus.github.io/CWG/issues/2054.html">2054</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>CD7</td>
<td>Missing description of class SFINAE</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2055">
<td><a href="https://cplusplus.github.io/CWG/issues/2055.html">2055</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.explicit">temp.arg.explicit</a>]</td>
<td>drafting</td>
<td>Explicitly-specified non-deduced parameter packs</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2056">
<td><a href="https://cplusplus.github.io/CWG/issues/2056.html">2056</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>open</td>
<td>Member function calls in partially-initialized class objects</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2057">
<td><a href="https://cplusplus.github.io/CWG/issues/2057.html">2057</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.template">temp.arg.template</a>]</td>
<td>drafting</td>
<td>Template template arguments with default arguments</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2058">
<td><a href="https://cplusplus.github.io/CWG/issues/2058.html">2058</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>CD6</td>
<td>More errors from internal-linkage namespaces</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2059">
<td><a href="https://cplusplus.github.io/CWG/issues/2059.html">2059</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>CD5</td>
<td>Linkage and deduced return types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2060">
<td><a href="https://cplusplus.github.io/CWG/issues/2060.html">2060</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>NAD</td>
<td>Deduced return type for explicit specialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2061">
<td><a href="https://cplusplus.github.io/CWG/issues/2061.html">2061</a></td>
+ <td>[<a href="https://wg21.link/namespace.def">namespace.def</a>]</td>
<td>CD4</td>
<td>Inline namespace after simplifications</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="2062">
<td><a href="https://cplusplus.github.io/CWG/issues/2062.html">2062</a></td>
+ <td>[<a href="https://wg21.link/temp.class">temp.class</a>]</td>
<td>CD6</td>
<td>Class template redeclaration requirements</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2063">
<td><a href="https://cplusplus.github.io/CWG/issues/2063.html">2063</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.declarative">basic.scope.declarative</a>]</td>
<td>CD4</td>
<td>Type/nontype hiding in class scope</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2064">
<td><a href="https://cplusplus.github.io/CWG/issues/2064.html">2064</a></td>
+ <td>[<a href="https://wg21.link/temp.type">temp.type</a>]</td>
<td>CD4</td>
<td>Conflicting specifications for dependent <I>decltype-specifier</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2065">
<td><a href="https://cplusplus.github.io/CWG/issues/2065.html">2065</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>CD6</td>
<td>Current instantiation of a partial specialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2066">
<td><a href="https://cplusplus.github.io/CWG/issues/2066.html">2066</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>
<td>CD4</td>
<td>Does type-dependent imply value-dependent?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2067">
<td><a href="https://cplusplus.github.io/CWG/issues/2067.html">2067</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>open</td>
<td>Generated variadic templates requiring empty pack</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2068">
<td><a href="https://cplusplus.github.io/CWG/issues/2068.html">2068</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>CD4</td>
<td>When can/must a defaulted virtual destructor be defined?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2069">
<td><a href="https://cplusplus.github.io/CWG/issues/2069.html">2069</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>CD4</td>
<td>Do destructors have names?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2070">
<td><a href="https://cplusplus.github.io/CWG/issues/2070.html">2070</a></td>
+ <td>[<a href="https://wg21.link/class.qual">class.qual</a>]</td>
<td>CD6</td>
<td><I>using-declaration</I> with dependent <I>nested-name-specifier</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2071">
<td><a href="https://cplusplus.github.io/CWG/issues/2071.html">2071</a></td>
+ <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>
<td>CD4</td>
<td><TT>typedef</TT> with no declarator</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2072">
<td><a href="https://cplusplus.github.io/CWG/issues/2072.html">2072</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>C++23</td>
<td>Default argument instantiation for member functions of templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2073">
<td><a href="https://cplusplus.github.io/CWG/issues/2073.html">2073</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic.allocation">basic.stc.dynamic.allocation</a>]</td>
<td>open</td>
<td>Allocating memory for exception objects</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2074">
<td><a href="https://cplusplus.github.io/CWG/issues/2074.html">2074</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>drafting</td>
<td>Type-dependence of local class of function template</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2075">
<td><a href="https://cplusplus.github.io/CWG/issues/2075.html">2075</a></td>
+ <td>[<a href="https://wg21.link/over.ics.list">over.ics.list</a>]</td>
<td>CD4</td>
<td>Passing short initializer lists to array reference parameters</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2076">
<td><a href="https://cplusplus.github.io/CWG/issues/2076.html">2076</a></td>
+ <td>[<a href="https://wg21.link/over.best.ics">over.best.ics</a>]</td>
<td>CD4</td>
<td>List-initialization of arguments for constructor parameters</td>
<td class="full" align="center">Clang 13</td>
</tr>
<tr class="open" id="2077">
<td><a href="https://cplusplus.github.io/CWG/issues/2077.html">2077</a></td>
+ <td>[<a href="https://wg21.link/over.ics.ref">over.ics.ref</a>]</td>
<td>drafting</td>
<td>Overload resolution and invalid rvalue-reference initialization</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2078">
<td><a href="https://cplusplus.github.io/CWG/issues/2078.html">2078</a></td>
+ <td>[<a href="https://wg21.link/class.member.lookup">class.member.lookup</a>]</td>
<td>NAD</td>
<td>Name lookup of <I>mem-initilizer-id</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2079">
<td><a href="https://cplusplus.github.io/CWG/issues/2079.html">2079</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>
<td>CD4</td>
<td><TT>[[</TT> appearing in a <I>balanced-token-seq</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2080">
<td><a href="https://cplusplus.github.io/CWG/issues/2080.html">2080</a></td>
+ <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>
<td>CD5</td>
<td>Example with empty anonymous union member</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2081">
<td><a href="https://cplusplus.github.io/CWG/issues/2081.html">2081</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>CD5</td>
<td>Deduced return type in redeclaration or specialization of function template</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2082">
<td><a href="https://cplusplus.github.io/CWG/issues/2082.html">2082</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>CD4</td>
<td>Referring to parameters in unevaluated operands of default arguments</td>
<td class="full" align="center">Clang 11</td>
</tr>
<tr id="2083">
<td><a href="https://cplusplus.github.io/CWG/issues/2083.html">2083</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD5</td>
<td>Incorrect cases of odr-use</td>
<td class="partial" align="center">Partial</td>
</tr>
<tr id="2084">
<td><a href="https://cplusplus.github.io/CWG/issues/2084.html">2084</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>CD4</td>
<td>NSDMIs and deleted union default constructors</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="2085">
<td><a href="https://cplusplus.github.io/CWG/issues/2085.html">2085</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD4</td>
<td>Invalid example of adding special member function via default argument</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2086">
<td><a href="https://cplusplus.github.io/CWG/issues/2086.html">2086</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>drafting</td>
<td>Reference odr-use vs implicit capture</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2087">
<td><a href="https://cplusplus.github.io/CWG/issues/2087.html">2087</a></td>
+ <td>[<a href="https://wg21.link/expr.shift">expr.shift</a>]</td>
<td>NAD</td>
<td>Left shift of negative value by zero bits</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2088">
<td><a href="https://cplusplus.github.io/CWG/issues/2088.html">2088</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.partial">temp.deduct.partial</a>]</td>
<td>CD5</td>
<td>Late tiebreakers in partial ordering</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2089">
<td><a href="https://cplusplus.github.io/CWG/issues/2089.html">2089</a></td>
+ <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>
<td>drafting</td>
<td>Restricting selection of builtin overloaded operators</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2090">
<td><a href="https://cplusplus.github.io/CWG/issues/2090.html">2090</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.temp">temp.dep.temp</a>]</td>
<td>open</td>
<td>Dependency via non-dependent base class</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2091">
<td><a href="https://cplusplus.github.io/CWG/issues/2091.html">2091</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>CD4</td>
<td>Deducing reference non-type template arguments</td>
<td class="full" align="center">Clang 10</td>
</tr>
<tr id="2092">
<td><a href="https://cplusplus.github.io/CWG/issues/2092.html">2092</a></td>
+ <td>[<a href="https://wg21.link/temp.over">temp.over</a>]</td>
<td>CD5</td>
<td>Deduction failure and overload resolution</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2093">
<td><a href="https://cplusplus.github.io/CWG/issues/2093.html">2093</a></td>
+ <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>
<td>CD4</td>
<td>Qualification conversion for pointer-to-member handler matching</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2094">
<td><a href="https://cplusplus.github.io/CWG/issues/2094.html">2094</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>C++17</td>
<td>Trivial copy/move constructor for class with volatile member</td>
<td class="full" align="center">Clang 5</td>
</tr>
<tr id="2095">
<td><a href="https://cplusplus.github.io/CWG/issues/2095.html">2095</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>CD4</td>
<td>Capturing rvalue references to functions by copy</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2096">
<td><a href="https://cplusplus.github.io/CWG/issues/2096.html">2096</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>CD4</td>
<td>Constraints on literal unions</td>
<td class="full" align="center">Duplicate of <a href="#2598">2598</a></td>
</tr>
<tr class="open" id="2097">
<td><a href="https://cplusplus.github.io/CWG/issues/2097.html">2097</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>
<td>extension</td>
<td>Lambdas and <TT>noreturn</TT> attribute</td>
<td align="center">Extension</td>
</tr>
<tr id="2098">
<td><a href="https://cplusplus.github.io/CWG/issues/2098.html">2098</a></td>
+ <td>[<a href="https://wg21.link/except.uncaught">except.uncaught</a>]</td>
<td>CD4</td>
<td>Is <TT>uncaught_exceptions()</TT> per-thread?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2099">
<td><a href="https://cplusplus.github.io/CWG/issues/2099.html">2099</a></td>
+ <td>[<a href="https://wg21.link/dcl.array">dcl.array</a>]</td>
<td>CD4</td>
<td>Inferring the bound of an array static data member</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2100">
<td><a href="https://cplusplus.github.io/CWG/issues/2100.html">2100</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>
<td>C++17</td>
<td>Value-dependent address of static data member of class template</td>
<td class="full" align="center">Clang 12</td>
</tr>
<tr id="2101">
<td><a href="https://cplusplus.github.io/CWG/issues/2101.html">2101</a></td>
+ <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>
<td>CD4</td>
<td>Incorrect description of type- and value-dependence</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2102">
<td><a href="https://cplusplus.github.io/CWG/issues/2102.html">2102</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD7</td>
<td>Constructor checking in <I>new-expression</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2103">
<td><a href="https://cplusplus.github.io/CWG/issues/2103.html">2103</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD5</td>
<td>Lvalue-to-rvalue conversion is irrelevant in odr-use of a reference</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="2104">
<td><a href="https://cplusplus.github.io/CWG/issues/2104.html">2104</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD4</td>
<td>Internal-linkage <TT>constexpr</TT> references and ODR requirements</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2105">
<td><a href="https://cplusplus.github.io/CWG/issues/2105.html">2105</a></td>
+ <td>[<a href="https://wg21.link/temp.arg">temp.arg</a>]</td>
<td>open</td>
<td>When do the arguments for a parameter pack end?</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2106">
<td><a href="https://cplusplus.github.io/CWG/issues/2106.html">2106</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.type">temp.arg.type</a>]</td>
<td>CD4</td>
<td>Unclear restrictions on use of function-type template arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2107">
<td><a href="https://cplusplus.github.io/CWG/issues/2107.html">2107</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>CD4</td>
<td>Lifetime of temporaries for default arguments in array copying</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2108">
<td><a href="https://cplusplus.github.io/CWG/issues/2108.html">2108</a></td>
+ <td>[<a href="https://wg21.link/over.match.ref">over.match.ref</a>]</td>
<td>drafting</td>
<td>Conversions to non-class prvalues in reference initialization</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2109">
<td><a href="https://cplusplus.github.io/CWG/issues/2109.html">2109</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>
<td>CD4</td>
<td>Value dependence underspecified</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2110">
<td><a href="https://cplusplus.github.io/CWG/issues/2110.html">2110</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>drafting</td>
<td>Overload resolution for base class conversion and reference/non-reference</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2111">
<td><a href="https://cplusplus.github.io/CWG/issues/2111.html">2111</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>NAD</td>
<td>Array temporaries in reference binding</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2112">
<td><a href="https://cplusplus.github.io/CWG/issues/2112.html">2112</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD5</td>
<td><TT>new auto{x}</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2113">
<td><a href="https://cplusplus.github.io/CWG/issues/2113.html">2113</a></td>
+ <td>[<a href="https://wg21.link/dcl.meaning">dcl.meaning</a>]</td>
<td>CD4</td>
<td>Incompete specification of types for declarators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2114">
<td><a href="https://cplusplus.github.io/CWG/issues/2114.html">2114</a></td>
+ <td>[<a href="https://wg21.link/diff.cpp11.dcl.decl">diff.cpp11.dcl.decl</a>]</td>
<td>CD3</td>
<td>Missing description of incompatibility from aggregate NSDMIs</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2115">
<td><a href="https://cplusplus.github.io/CWG/issues/2115.html">2115</a></td>
+ <td>[<a href="https://wg21.link/stmt.jump">stmt.jump</a>]</td>
<td>open</td>
<td>Order of implicit destruction vs release of automatic storage</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2116">
<td><a href="https://cplusplus.github.io/CWG/issues/2116.html">2116</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>C++17</td>
<td>Direct or copy initialization for omitted aggregate initializers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2117">
<td><a href="https://cplusplus.github.io/CWG/issues/2117.html">2117</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>NAD</td>
<td>Explicit specializations and <TT>constexpr</TT> function templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2118">
<td><a href="https://cplusplus.github.io/CWG/issues/2118.html">2118</a></td>
+ <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>
<td>open</td>
<td>Stateful metaprogramming via friend injection</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2119">
<td><a href="https://cplusplus.github.io/CWG/issues/2119.html">2119</a></td>
+ <td>[<a href="https://wg21.link/class.virtual">class.virtual</a>]</td>
<td>NAD</td>
<td>Disambiguation of multi-level covariant return type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2120">
<td><a href="https://cplusplus.github.io/CWG/issues/2120.html">2120</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>CD4</td>
<td>Array as first non-static data member in standard-layout class</td>
<td class="full" align="center">Clang 7</td>
</tr>
<tr id="2121">
<td><a href="https://cplusplus.github.io/CWG/issues/2121.html">2121</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.general">expr.prim.lambda.general</a>]</td>
<td>CD6</td>
<td>More flexible lambda syntax</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2122">
<td><a href="https://cplusplus.github.io/CWG/issues/2122.html">2122</a></td>
+ <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>
<td>CD4</td>
<td>Glvalues of <TT>void</TT> type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2123">
<td><a href="https://cplusplus.github.io/CWG/issues/2123.html">2123</a></td>
+ <td>[<a href="https://wg21.link/stmt.dcl">stmt.dcl</a>]</td>
<td>open</td>
<td>Omitted constant initialization of local static variables</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2124">
<td><a href="https://cplusplus.github.io/CWG/issues/2124.html">2124</a></td>
+ <td>[<a href="https://wg21.link/defns.signature.member.templ">defns.signature.member.templ</a>]</td>
<td>CD4</td>
<td>Signature of constructor template</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2125">
<td><a href="https://cplusplus.github.io/CWG/issues/2125.html">2125</a></td>
+ <td>[<a href="https://wg21.link/class.copy.elision">class.copy.elision</a>]</td>
<td>NAD</td>
<td>Copy elision and comma operator</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2126">
<td><a href="https://cplusplus.github.io/CWG/issues/2126.html">2126</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++20</td>
<td>Lifetime-extended temporaries in constant expressions</td>
<td class="full" align="center">Clang 12</td>
</tr>
<tr class="open" id="2127">
<td><a href="https://cplusplus.github.io/CWG/issues/2127.html">2127</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>
<td>drafting</td>
<td>Partial specialization and nullptr</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2128">
<td><a href="https://cplusplus.github.io/CWG/issues/2128.html">2128</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>open</td>
<td>Imprecise rule for reference member initializer</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2129">
<td><a href="https://cplusplus.github.io/CWG/issues/2129.html">2129</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD4</td>
<td>Non-object prvalues and constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2130">
<td><a href="https://cplusplus.github.io/CWG/issues/2130.html">2130</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD4</td>
<td>Over-aligned types in <I>new-expression</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2131">
<td><a href="https://cplusplus.github.io/CWG/issues/2131.html">2131</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>drafting</td>
<td>Ambiguity with <I>opaque-enum-declaration</I></td>
<td align="center">Not resolved</td>
</tr>
<tr id="2132">
<td><a href="https://cplusplus.github.io/CWG/issues/2132.html">2132</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>NAD</td>
<td>Deprecated default generated copy constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2133">
<td><a href="https://cplusplus.github.io/CWG/issues/2133.html">2133</a></td>
+ <td>[<a href="https://wg21.link/conv.fctptr">conv.fctptr</a>]</td>
<td>CD5</td>
<td>Converting <TT>std::nullptr_t</TT> to <TT>bool</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2134">
<td><a href="https://cplusplus.github.io/CWG/issues/2134.html">2134</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>
<td>NAD</td>
<td>Objectless references to non-static member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2135">
<td><a href="https://cplusplus.github.io/CWG/issues/2135.html">2135</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>NAD</td>
<td><I>mem-initializer</I>s for virtual bases of abstract classes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2136">
<td><a href="https://cplusplus.github.io/CWG/issues/2136.html">2136</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>NAD</td>
<td>Argument-dependent lookup and initializer lists</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2137">
<td><a href="https://cplusplus.github.io/CWG/issues/2137.html">2137</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD4</td>
<td>List-initialization from object of same type</td>
<td class="full" align="center">Clang 20</td>
</tr>
<tr id="2138">
<td><a href="https://cplusplus.github.io/CWG/issues/2138.html">2138</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>NAD</td>
<td>Explicit member specialization vs implicit instantiation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2139">
<td><a href="https://cplusplus.github.io/CWG/issues/2139.html">2139</a></td>
+ <td>[<a href="https://wg21.link/conv.fpint">conv.fpint</a>]</td>
<td>NAD</td>
<td>Floating-point requirements for integer representation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2140">
<td><a href="https://cplusplus.github.io/CWG/issues/2140.html">2140</a></td>
+ <td>[<a href="https://wg21.link/conv.lval">conv.lval</a>]</td>
<td>CD4</td>
<td>Lvalue-to-rvalue conversion of <TT>std::nullptr_t</TT></td>
<td class="full" align="center">Clang 9</td>
</tr>
<tr id="2141">
<td><a href="https://cplusplus.github.io/CWG/issues/2141.html">2141</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD4</td>
<td>Ambiguity in <I>new-expression</I> with <I>elaborated-type-specifier</I></td>
<td class="full" align="center">Clang 17</td>
</tr>
<tr id="2142">
<td><a href="https://cplusplus.github.io/CWG/issues/2142.html">2142</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>NAD</td>
<td>Missing definition of associated classes and namespaces</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2143">
<td><a href="https://cplusplus.github.io/CWG/issues/2143.html">2143</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>C++17</td>
<td>Value-dependency via injected-class-name</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2144">
<td><a href="https://cplusplus.github.io/CWG/issues/2144.html">2144</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.general">dcl.fct.def.general</a>]</td>
<td>CD7</td>
<td>Function/variable declaration ambiguity</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2145">
<td><a href="https://cplusplus.github.io/CWG/issues/2145.html">2145</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.general">dcl.fct.def.general</a>]</td>
<td>CD4</td>
<td>Parenthesized declarator in function definition</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2146">
<td><a href="https://cplusplus.github.io/CWG/issues/2146.html">2146</a></td>
+ <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>
<td>CD4</td>
<td>Scalar object vs memory location in definition of &#8220;unsequenced&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2147">
<td><a href="https://cplusplus.github.io/CWG/issues/2147.html">2147</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>CD4</td>
<td>Initializer-list arguments and pack deduction</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2148">
<td><a href="https://cplusplus.github.io/CWG/issues/2148.html">2148</a></td>
+ <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>
<td>drafting</td>
<td>Thread storage duration and order of initialization</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2149">
<td><a href="https://cplusplus.github.io/CWG/issues/2149.html">2149</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>CD7</td>
<td>Brace elision and array length deduction</td>
<td class="full" align="center">Clang 3.1</td>
</tr>
<tr id="2150">
<td><a href="https://cplusplus.github.io/CWG/issues/2150.html">2150</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD3</td>
<td>Initializer list array lifetime</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2151">
<td><a href="https://cplusplus.github.io/CWG/issues/2151.html">2151</a></td>
+ <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>
<td>CD4</td>
<td>Exception object is not created</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2152">
<td><a href="https://cplusplus.github.io/CWG/issues/2152.html">2152</a></td>
+ <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>
<td>NAD</td>
<td>Can an alternative token be used as a <I>ud-suffix</I>?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2153">
<td><a href="https://cplusplus.github.io/CWG/issues/2153.html">2153</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>CD4</td>
<td><I>pure-specifier</I> in friend declaration</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2154">
<td><a href="https://cplusplus.github.io/CWG/issues/2154.html">2154</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>CD4</td>
<td>Ambiguity of <I>pure-specifier</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2155">
<td><a href="https://cplusplus.github.io/CWG/issues/2155.html">2155</a></td>
+ <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>
<td>C++17</td>
<td>Defining classes and enumerations via <I>using-declaration</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2156">
<td><a href="https://cplusplus.github.io/CWG/issues/2156.html">2156</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>CD4</td>
<td>Definition of enumeration declared by <I>using-declaration</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2157">
<td><a href="https://cplusplus.github.io/CWG/issues/2157.html">2157</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.elab">dcl.type.elab</a>]</td>
<td>CD4</td>
<td>Further disambiguation of enumeration <I>elaborated-type-specifier</I></td>
<td class="full" align="center">Clang 11</td>
</tr>
<tr class="open" id="2158">
<td><a href="https://cplusplus.github.io/CWG/issues/2158.html">2158</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>drafting</td>
<td>Polymorphic behavior during destruction</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2159">
<td><a href="https://cplusplus.github.io/CWG/issues/2159.html">2159</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>NAD</td>
<td>Lambda capture and local <TT>thread_local</TT> variables</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2160">
<td><a href="https://cplusplus.github.io/CWG/issues/2160.html">2160</a></td>
+ <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>
<td>open</td>
<td>Issues with partial ordering</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2161">
<td><a href="https://cplusplus.github.io/CWG/issues/2161.html">2161</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>NAD</td>
<td>Explicit instantiation declaration and &#8220;preceding initialization&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2162">
<td><a href="https://cplusplus.github.io/CWG/issues/2162.html">2162</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>CD3</td>
<td>Capturing <TT>this</TT> by reference</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2163">
<td><a href="https://cplusplus.github.io/CWG/issues/2163.html">2163</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>CD4</td>
<td>Labels in <TT>constexpr</TT> functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2164">
<td><a href="https://cplusplus.github.io/CWG/issues/2164.html">2164</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.hiding">basic.scope.hiding</a>]</td>
<td>CD5</td>
<td>Name hiding and <I>using-directive</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2165">
<td><a href="https://cplusplus.github.io/CWG/issues/2165.html">2165</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.declarative">basic.scope.declarative</a>]</td>
<td>CD6</td>
<td>Namespaces, declarative regions, and translation units</td>
<td class="na" align="center">N/A</td>
</tr>
<tr class="open" id="2166">
<td><a href="https://cplusplus.github.io/CWG/issues/2166.html">2166</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>drafting</td>
<td>Unclear meaning of &#8220;undefined <TT>constexpr</TT> function&#8221;</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2167">
<td><a href="https://cplusplus.github.io/CWG/issues/2167.html">2167</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD4</td>
<td>Non-member references with lifetimes within the current evaluation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2168">
<td><a href="https://cplusplus.github.io/CWG/issues/2168.html">2168</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>review</td>
<td>Narrowing conversions and +/- infinity</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2169">
<td><a href="https://cplusplus.github.io/CWG/issues/2169.html">2169</a></td>
+ <td>[<a href="https://wg21.link/over.ics.list">over.ics.list</a>]</td>
<td>open</td>
<td>Narrowing conversions and overload resolution</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2170">
<td><a href="https://cplusplus.github.io/CWG/issues/2170.html">2170</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD5</td>
<td>Unclear definition of odr-use for arrays</td>
<td class="full" align="center">Clang 9</td>
</tr>
<tr id="2171">
<td><a href="https://cplusplus.github.io/CWG/issues/2171.html">2171</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>CD4</td>
<td>Triviality of copy constructor with less-qualified parameter</td>
<td class="full" align="center">Clang 15</td>
</tr>
<tr class="open" id="2172">
<td><a href="https://cplusplus.github.io/CWG/issues/2172.html">2172</a></td>
+ <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>
<td>drafting</td>
<td>Multiple exceptions with one exception object</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2173">
<td><a href="https://cplusplus.github.io/CWG/issues/2173.html">2173</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>
<td>open</td>
<td>Partial specialization with non-deduced contexts</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2174">
<td><a href="https://cplusplus.github.io/CWG/issues/2174.html">2174</a></td>
+ <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>
<td>C++17</td>
<td>Unclear rules for friend definitions in templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2175">
<td><a href="https://cplusplus.github.io/CWG/issues/2175.html">2175</a></td>
+ <td>[<a href="https://wg21.link/dcl.ambig.res">dcl.ambig.res</a>]</td>
<td>CD4</td>
<td>Ambiguity with attribute in conversion operator declaration</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2176">
<td><a href="https://cplusplus.github.io/CWG/issues/2176.html">2176</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>CD4</td>
<td>Destroying the returned object when a destructor throws</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2177">
<td><a href="https://cplusplus.github.io/CWG/issues/2177.html">2177</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD5</td>
<td>Placement <TT>operator delete</TT> and parameter copies</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2178">
<td><a href="https://cplusplus.github.io/CWG/issues/2178.html">2178</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>NAD</td>
<td>Substitution of dependent template arguments in default template arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2179">
<td><a href="https://cplusplus.github.io/CWG/issues/2179.html">2179</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial.general">temp.spec.partial.general</a>]</td>
<td>drafting</td>
<td>Required diagnostic for partial specialization after first use</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2180">
<td><a href="https://cplusplus.github.io/CWG/issues/2180.html">2180</a></td>
+ <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>
<td>CD4</td>
<td>Virtual bases in destructors and defaulted assignment operators</td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="2181">
<td><a href="https://cplusplus.github.io/CWG/issues/2181.html">2181</a></td>
+ <td>[<a href="https://wg21.link/implimits">implimits</a>]</td>
<td>C++20</td>
<td>Normative requirements in an informative Annex</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2182">
<td><a href="https://cplusplus.github.io/CWG/issues/2182.html">2182</a></td>
+ <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>
<td>drafting</td>
<td>Pointer arithmetic in array-like containers</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2183">
<td><a href="https://cplusplus.github.io/CWG/issues/2183.html">2183</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>NAD</td>
<td>Problems in description of potential exceptions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2184">
<td><a href="https://cplusplus.github.io/CWG/issues/2184.html">2184</a></td>
+ <td>[<a href="https://wg21.link/diff.expr">diff.expr</a>]</td>
<td>CD4</td>
<td>Missing C compatibility entry for decrement of <TT>bool</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2185">
<td><a href="https://cplusplus.github.io/CWG/issues/2185.html">2185</a></td>
+ <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>
<td>CD6</td>
<td>Cv-qualified numeric types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2186">
<td><a href="https://cplusplus.github.io/CWG/issues/2186.html">2186</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++20</td>
<td>Unclear point that &#8220;preceding initialization&#8221; must precede</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2187">
<td><a href="https://cplusplus.github.io/CWG/issues/2187.html">2187</a></td>
+ <td>[<a href="https://wg21.link/class.protected">class.protected</a>]</td>
<td>drafting</td>
<td>Protected members and access via <I>qualified-id</I></td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2188">
<td><a href="https://cplusplus.github.io/CWG/issues/2188.html">2188</a></td>
+ <td>[<a href="https://wg21.link/class.mem.general">class.mem.general</a>]</td>
<td>open</td>
<td><I>empty-declaration</I> grammar ambiguity</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2189">
<td><a href="https://cplusplus.github.io/CWG/issues/2189.html">2189</a></td>
+ <td>[<a href="https://wg21.link/over.call.object">over.call.object</a>]</td>
<td>open</td>
<td>Surrogate call template</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2190">
<td><a href="https://cplusplus.github.io/CWG/issues/2190.html">2190</a></td>
+ <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>
<td>open</td>
<td>Insufficient specification of <TT>__has_include</TT></td>
<td align="center">Not resolved</td>
</tr>
<tr id="2191">
<td><a href="https://cplusplus.github.io/CWG/issues/2191.html">2191</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>C++17</td>
<td>Incorrect result for <TT>noexcept(typeid(v))</TT></td>
<td class="full" align="center">Clang 19</td>
</tr>
<tr class="open" id="2192">
<td><a href="https://cplusplus.github.io/CWG/issues/2192.html">2192</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>open</td>
<td>Constant expressions and order-of-eval undefined behavior</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2193">
<td><a href="https://cplusplus.github.io/CWG/issues/2193.html">2193</a></td>
+ <td>[<a href="https://wg21.link/numeric.limits.members">numeric.limits.members</a>]</td>
<td>NAD</td>
<td><TT>numeric_limits&lt;int&gt;::radix</TT> and <TT>digits</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2194">
<td><a href="https://cplusplus.github.io/CWG/issues/2194.html">2194</a></td>
+ <td>[<a href="https://wg21.link/over.match.list">over.match.list</a>]</td>
<td>drafting</td>
<td>Impossible case in list initialization</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2195">
<td><a href="https://cplusplus.github.io/CWG/issues/2195.html">2195</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.cv">dcl.type.cv</a>]</td>
<td>open</td>
<td>Unsolicited reading of trailing volatile members</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2196">
<td><a href="https://cplusplus.github.io/CWG/issues/2196.html">2196</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>C++17</td>
<td>Zero-initialization with virtual base classes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2197">
<td><a href="https://cplusplus.github.io/CWG/issues/2197.html">2197</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>C++17</td>
<td>Overload resolution and deleted special member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2198">
<td><a href="https://cplusplus.github.io/CWG/issues/2198.html">2198</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>C++17</td>
<td>Linkage of enumerators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2199">
<td><a href="https://cplusplus.github.io/CWG/issues/2199.html">2199</a></td>
+ <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>
<td>CD6</td>
<td>Typedefs and tags</td>
<td class="full" align="center">Clang 3.8</td>
</tr>
<tr id="2200">
<td><a href="https://cplusplus.github.io/CWG/issues/2200.html">2200</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.explicit">temp.arg.explicit</a>]</td>
<td>NAD</td>
<td>Conversions in template argument deduction</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2201">
<td><a href="https://cplusplus.github.io/CWG/issues/2201.html">2201</a></td>
+ <td>[<a href="https://wg21.link/basic.type.qualifier">basic.type.qualifier</a>]</td>
<td>C++17</td>
<td>Cv-qualification of array types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2202">
<td><a href="https://cplusplus.github.io/CWG/issues/2202.html">2202</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>drafting</td>
<td>When does default argument instantiation occur?</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2203">
<td><a href="https://cplusplus.github.io/CWG/issues/2203.html">2203</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>drafting</td>
<td>Defaulted copy/move constructors and UDCs</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2204">
<td><a href="https://cplusplus.github.io/CWG/issues/2204.html">2204</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>NAD</td>
<td>Naming delegated constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2205">
<td><a href="https://cplusplus.github.io/CWG/issues/2205.html">2205</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>
<td>C++17</td>
<td>Restrictions on use of <TT>alignas</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2206">
<td><a href="https://cplusplus.github.io/CWG/issues/2206.html">2206</a></td>
+ <td>[<a href="https://wg21.link/expr">expr</a>]</td>
<td>C++17</td>
<td>Composite type of object and function pointers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2207">
<td><a href="https://cplusplus.github.io/CWG/issues/2207.html">2207</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic.allocation">basic.stc.dynamic.allocation</a>]</td>
<td>CD5</td>
<td>Alignment of allocation function return value</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2208">
<td><a href="https://cplusplus.github.io/CWG/issues/2208.html">2208</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>NAD</td>
<td><I>static_assert-declaration</I> does not declare a member</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2209">
<td><a href="https://cplusplus.github.io/CWG/issues/2209.html">2209</a></td>
+ <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>
<td>NAD</td>
<td>Destruction of constructed array elements</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2210">
<td><a href="https://cplusplus.github.io/CWG/issues/2210.html">2210</a></td>
+ <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>
<td>NAD</td>
<td>Principal/target constructor confusion</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2211">
<td><a href="https://cplusplus.github.io/CWG/issues/2211.html">2211</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>C++17</td>
<td>Hiding by lambda captures and parameters</td>
<td class="full" align="center">Clang 8</td>
</tr>
<tr id="2212">
<td><a href="https://cplusplus.github.io/CWG/issues/2212.html">2212</a></td>
+ <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>
<td>CD5</td>
<td>Typedef changing linkage after use</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2213">
<td><a href="https://cplusplus.github.io/CWG/issues/2213.html">2213</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.elab">dcl.type.elab</a>]</td>
<td>CD6</td>
<td>Forward declaration of partial specializations</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="2214">
<td><a href="https://cplusplus.github.io/CWG/issues/2214.html">2214</a></td>
+ <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>
<td>C++17</td>
<td>Missing requirement on representation of integer values</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2215">
<td><a href="https://cplusplus.github.io/CWG/issues/2215.html">2215</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>C++17</td>
<td>Redundant description of language linkage in function call</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2216">
<td><a href="https://cplusplus.github.io/CWG/issues/2216.html">2216</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>NAD</td>
<td>Exception specifications in unevaluated contexts</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2217">
<td><a href="https://cplusplus.github.io/CWG/issues/2217.html">2217</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>NAD</td>
<td><TT>constexpr</TT> constructors for non-literal types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2218">
<td><a href="https://cplusplus.github.io/CWG/issues/2218.html">2218</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup">basic.lookup</a>]</td>
<td>C++17</td>
<td>Ambiguity and namespace aliases</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2219">
<td><a href="https://cplusplus.github.io/CWG/issues/2219.html">2219</a></td>
+ <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>
<td>drafting</td>
<td>Dynamically-unreachable handlers</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2220">
<td><a href="https://cplusplus.github.io/CWG/issues/2220.html">2220</a></td>
+ <td>[<a href="https://wg21.link/stmt.ranged">stmt.ranged</a>]</td>
<td>C++17</td>
<td>Hiding index variable in range-based <TT>for</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2221">
<td><a href="https://cplusplus.github.io/CWG/issues/2221.html">2221</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>CD6</td>
<td>Copying volatile objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2222">
<td><a href="https://cplusplus.github.io/CWG/issues/2222.html">2222</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>drafting</td>
<td>Additional contexts where instantiation is not required</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2223">
<td><a href="https://cplusplus.github.io/CWG/issues/2223.html">2223</a></td>
+ <td>[<a href="https://wg21.link/dcl.align">dcl.align</a>]</td>
<td>drafting</td>
<td>Multiple <TT>alignas</TT> specifiers</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2224">
<td><a href="https://cplusplus.github.io/CWG/issues/2224.html">2224</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>C++17</td>
<td>Member subobjects and base-class casts</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2225">
<td><a href="https://cplusplus.github.io/CWG/issues/2225.html">2225</a></td>
+ <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>
<td>NAD</td>
<td><TT>reinterpret_cast</TT> to same floating-point type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2226">
<td><a href="https://cplusplus.github.io/CWG/issues/2226.html">2226</a></td>
+ <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>
<td>CD5</td>
<td>Xvalues vs lvalues in conditional expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2227">
<td><a href="https://cplusplus.github.io/CWG/issues/2227.html">2227</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>CD5</td>
<td>Destructor access and default member initializers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2228">
<td><a href="https://cplusplus.github.io/CWG/issues/2228.html">2228</a></td>
+ <td>[<a href="https://wg21.link/dcl.ambig.res">dcl.ambig.res</a>]</td>
<td>review</td>
<td>Ambiguity resolution for cast to function type</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2229">
<td><a href="https://cplusplus.github.io/CWG/issues/2229.html">2229</a></td>
+ <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>
<td>CD5</td>
<td>Volatile unnamed bit-fields</td>
<td class="full" align="center">Clang 7</td>
</tr>
<tr id="2230">
<td><a href="https://cplusplus.github.io/CWG/issues/2230.html">2230</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>NAD</td>
<td>Linkage of <TT>extern "C"</TT> function in unnamed namespace</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2231">
<td><a href="https://cplusplus.github.io/CWG/issues/2231.html">2231</a></td>
+ <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>
<td>NAD</td>
<td>Class member access to static data member template</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2232">
<td><a href="https://cplusplus.github.io/CWG/issues/2232.html">2232</a></td>
+ <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>
<td>open</td>
<td><TT>thread_local</TT> anonymous unions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2233">
<td><a href="https://cplusplus.github.io/CWG/issues/2233.html">2233</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>CD5</td>
<td>Function parameter packs following default arguments</td>
<td class="full" align="center">Clang 11</td>
</tr>
<tr id="2234">
<td><a href="https://cplusplus.github.io/CWG/issues/2234.html">2234</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>CD5</td>
<td>Missing rules for <I>simple-template-id</I> as <I>class-name</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2235">
<td><a href="https://cplusplus.github.io/CWG/issues/2235.html">2235</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.partial">temp.deduct.partial</a>]</td>
<td>CD5</td>
<td>Partial ordering and non-dependent types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2236">
<td><a href="https://cplusplus.github.io/CWG/issues/2236.html">2236</a></td>
+ <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>
<td>drafting</td>
<td>When is an alias template specialization dependent?</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2237">
<td><a href="https://cplusplus.github.io/CWG/issues/2237.html">2237</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>CD5</td>
<td>Can a <I>template-id</I> name a constructor?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2238">
<td><a href="https://cplusplus.github.io/CWG/issues/2238.html">2238</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic.allocation">basic.stc.dynamic.allocation</a>]</td>
<td>NAD</td>
<td>Contradictory alignment requirements for allocation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2239">
<td><a href="https://cplusplus.github.io/CWG/issues/2239.html">2239</a></td>
+ <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>
<td>NAD</td>
<td>Sized deallocation with a trivial destructor</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2240">
<td><a href="https://cplusplus.github.io/CWG/issues/2240.html">2240</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>NAD</td>
<td><TT>this</TT> is not odr-used in a constant expression</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2241">
<td><a href="https://cplusplus.github.io/CWG/issues/2241.html">2241</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>CD5</td>
<td>Overload resolution is not invoked with a single function</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2242">
<td><a href="https://cplusplus.github.io/CWG/issues/2242.html">2242</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>C++23</td>
<td>ODR violation with constant initialization possibly omitted</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2243">
<td><a href="https://cplusplus.github.io/CWG/issues/2243.html">2243</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>drafting</td>
<td>Incorrect use of implicit conversion sequence</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2244">
<td><a href="https://cplusplus.github.io/CWG/issues/2244.html">2244</a></td>
+ <td>[<a href="https://wg21.link/class.protected">class.protected</a>]</td>
<td>open</td>
<td>Base class access in aggregate initialization</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2245">
<td><a href="https://cplusplus.github.io/CWG/issues/2245.html">2245</a></td>
+ <td>[<a href="https://wg21.link/temp.point">temp.point</a>]</td>
<td>drafting</td>
<td>Point of instantiation of incomplete class template</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2246">
<td><a href="https://cplusplus.github.io/CWG/issues/2246.html">2246</a></td>
+ <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>
<td>drafting</td>
<td>Access of indirect virtual base class constructors</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2247">
<td><a href="https://cplusplus.github.io/CWG/issues/2247.html">2247</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>C++17</td>
<td>Lambda capture and variable argument list</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2248">
<td><a href="https://cplusplus.github.io/CWG/issues/2248.html">2248</a></td>
+ <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>
<td>C++17</td>
<td>Problems with sized delete</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2249">
<td><a href="https://cplusplus.github.io/CWG/issues/2249.html">2249</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.id.unqual">expr.prim.id.unqual</a>]</td>
<td>CD5</td>
<td><I>identifier</I>s and <I>id-expression</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2250">
<td><a href="https://cplusplus.github.io/CWG/issues/2250.html">2250</a></td>
+ <td>[<a href="https://wg21.link/temp.point">temp.point</a>]</td>
<td>open</td>
<td>Implicit instantiation, destruction, and TUs</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2251">
<td><a href="https://cplusplus.github.io/CWG/issues/2251.html">2251</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>C++17</td>
<td>Unreachable enumeration list-initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2252">
<td><a href="https://cplusplus.github.io/CWG/issues/2252.html">2252</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD7</td>
<td>Enumeration list-initialization from the same type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2253">
<td><a href="https://cplusplus.github.io/CWG/issues/2253.html">2253</a></td>
+ <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>
<td>CD5</td>
<td>Unnamed bit-fields and zero-initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2254">
<td><a href="https://cplusplus.github.io/CWG/issues/2254.html">2254</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>CD5</td>
<td>Standard-layout classes and bit-fields</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2255">
<td><a href="https://cplusplus.github.io/CWG/issues/2255.html">2255</a></td>
+ <td>[<a href="https://wg21.link/temp.spec">temp.spec</a>]</td>
<td>CD5</td>
<td>Instantiated static data member templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2256">
<td><a href="https://cplusplus.github.io/CWG/issues/2256.html">2256</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>CD5</td>
<td>Lifetime of trivially-destructible objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2257">
<td><a href="https://cplusplus.github.io/CWG/issues/2257.html">2257</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>CD5</td>
<td>Lifetime extension of references vs exceptions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2258">
<td><a href="https://cplusplus.github.io/CWG/issues/2258.html">2258</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>open</td>
<td>Storage deallocation during period of destruction</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2259">
<td><a href="https://cplusplus.github.io/CWG/issues/2259.html">2259</a></td>
+ <td>[<a href="https://wg21.link/dcl.ambig.res">dcl.ambig.res</a>]</td>
<td>C++17</td>
<td>Unclear context describing ambiguity</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2260">
<td><a href="https://cplusplus.github.io/CWG/issues/2260.html">2260</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>CD5</td>
<td>Explicit specializations of deleted member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2261">
<td><a href="https://cplusplus.github.io/CWG/issues/2261.html">2261</a></td>
+ <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>
<td>extension</td>
<td>Explicit instantiation of in-class <TT>friend</TT> definition</td>
<td align="center">Extension</td>
</tr>
<tr id="2262">
<td><a href="https://cplusplus.github.io/CWG/issues/2262.html">2262</a></td>
+ <td>[<a href="https://wg21.link/dcl.asm">dcl.asm</a>]</td>
<td>C++17</td>
<td>Attributes for <I>asm-definition</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2263">
<td><a href="https://cplusplus.github.io/CWG/issues/2263.html">2263</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>drafting</td>
<td>Default argument instantiation for <TT>friend</TT>s</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2264">
<td><a href="https://cplusplus.github.io/CWG/issues/2264.html">2264</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>drafting</td>
<td>Memberwise copying with indeterminate value</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2265">
<td><a href="https://cplusplus.github.io/CWG/issues/2265.html">2265</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>drafting</td>
<td>Delayed pack expansion and member redeclarations</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2266">
<td><a href="https://cplusplus.github.io/CWG/issues/2266.html">2266</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>CD5</td>
<td>Has dependent type vs is type-dependent</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2267">
<td><a href="https://cplusplus.github.io/CWG/issues/2267.html">2267</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>CD5</td>
<td>Copy-initialization of temporary in reference direct-initialization</td>
<td class="none" align="center">No</td>
</tr>
<tr id="2268">
<td><a href="https://cplusplus.github.io/CWG/issues/2268.html">2268</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>C++17</td>
<td>Unions with mutable members in constant expressions revisited</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2269">
<td><a href="https://cplusplus.github.io/CWG/issues/2269.html">2269</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>dup</td>
<td>Additional recursive references in aggregate DMIs</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2270">
<td><a href="https://cplusplus.github.io/CWG/issues/2270.html">2270</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>NAD</td>
<td>Non-inline functions and explicit instantiation declarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2271">
<td><a href="https://cplusplus.github.io/CWG/issues/2271.html">2271</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>C++17</td>
<td>Aliasing <TT>this</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2272">
<td><a href="https://cplusplus.github.io/CWG/issues/2272.html">2272</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>C++17</td>
<td>Implicit initialization of aggregate members of reference type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2273">
<td><a href="https://cplusplus.github.io/CWG/issues/2273.html">2273</a></td>
+ <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>
<td>CD5</td>
<td>Inheriting constructors vs implicit default constructor</td>
<td class="full" align="center">Clang 3.3</td>
</tr>
<tr id="2274">
<td><a href="https://cplusplus.github.io/CWG/issues/2274.html">2274</a></td>
+ <td>[<a href="https://wg21.link/stmt.if">stmt.if</a>]</td>
<td>NAD</td>
<td>Generic lambda capture vs constexpr if</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2275">
<td><a href="https://cplusplus.github.io/CWG/issues/2275.html">2275</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>
<td>drafting</td>
<td>Type-dependence of function template</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2276">
<td><a href="https://cplusplus.github.io/CWG/issues/2276.html">2276</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>
<td>C++17</td>
<td>Dependent <TT>noexcept</TT> and function type-dependence</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2277">
<td><a href="https://cplusplus.github.io/CWG/issues/2277.html">2277</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>CD5</td>
<td>Ambiguity inheriting constructors with default arguments</td>
<td class="partial" align="center">Partial</td>
</tr>
<tr id="2278">
<td><a href="https://cplusplus.github.io/CWG/issues/2278.html">2278</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD5</td>
<td>Copy elision in constant expressions reconsidered</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2279">
<td><a href="https://cplusplus.github.io/CWG/issues/2279.html">2279</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>
<td>NAD</td>
<td>Multiple <I>attribute-specifier</I>s in one <I>attribute-list</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2280">
<td><a href="https://cplusplus.github.io/CWG/issues/2280.html">2280</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>C++20</td>
<td>Matching a usual deallocation function with placement new</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2281">
<td><a href="https://cplusplus.github.io/CWG/issues/2281.html">2281</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>drafting</td>
<td>Consistency of aligned <TT>operator delete</TT> replacement</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2282">
<td><a href="https://cplusplus.github.io/CWG/issues/2282.html">2282</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>C++20</td>
<td>Consistency with mismatched aligned/non-over-aligned allocation/deallocation functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2283">
<td><a href="https://cplusplus.github.io/CWG/issues/2283.html">2283</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>CD7</td>
<td>Missing complete type requirements</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2284">
<td><a href="https://cplusplus.github.io/CWG/issues/2284.html">2284</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>open</td>
<td>Sequencing of <I>braced-init-list</I> arguments</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2285">
<td><a href="https://cplusplus.github.io/CWG/issues/2285.html">2285</a></td>
+ <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>
<td>CD5</td>
<td>Issues with structured bindings</td>
<td class="full" align="center">Clang 4</td>
</tr>
<tr id="2286">
<td><a href="https://cplusplus.github.io/CWG/issues/2286.html">2286</a></td>
+ <td>[<a href="https://wg21.link/expr.assign">expr.assign</a>]</td>
<td>NAD</td>
<td>Assignment evaluation order</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2287">
<td><a href="https://cplusplus.github.io/CWG/issues/2287.html">2287</a></td>
+ <td>[<a href="https://wg21.link/basic.compound">basic.compound</a>]</td>
<td>CD5</td>
<td>Pointer-interconvertibility in non-standard-layout unions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2288">
<td><a href="https://cplusplus.github.io/CWG/issues/2288.html">2288</a></td>
+ <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>
<td>NAD</td>
<td>Contradictory optionality in <I>simple-declaration</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2289">
<td><a href="https://cplusplus.github.io/CWG/issues/2289.html">2289</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.declarative">basic.scope.declarative</a>]</td>
<td>CD5</td>
<td>Uniqueness of structured binding names</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2290">
<td><a href="https://cplusplus.github.io/CWG/issues/2290.html">2290</a></td>
+ <td>[<a href="https://wg21.link/over.match.funcs">over.match.funcs</a>]</td>
<td>CD5</td>
<td>Unclear specification for overload resolution and deleted special member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2291">
<td><a href="https://cplusplus.github.io/CWG/issues/2291.html">2291</a></td>
+ <td>[<a href="https://wg21.link/over.best.ics">over.best.ics</a>]</td>
<td>dup</td>
<td>Implicit conversion sequences in non-call contexts</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2292">
<td><a href="https://cplusplus.github.io/CWG/issues/2292.html">2292</a></td>
+ <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>
<td>CD5</td>
<td><I>simple-template-id</I> is ambiguous between <I>class-name</I> and <I>type-name</I></td>
<td class="full" align="center">Clang 9</td>
</tr>
<tr id="2293">
<td><a href="https://cplusplus.github.io/CWG/issues/2293.html">2293</a></td>
+ <td>[<a href="https://wg21.link/class">class</a>]</td>
<td>CD5</td>
<td>Requirements for <I>simple-template-id</I> used as a <I>class-name</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2294">
<td><a href="https://cplusplus.github.io/CWG/issues/2294.html">2294</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>
<td>CD5</td>
<td>Dependent <TT>auto</TT> static data members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2295">
<td><a href="https://cplusplus.github.io/CWG/issues/2295.html">2295</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>CD5</td>
<td>Aggregates with deleted defaulted constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2296">
<td><a href="https://cplusplus.github.io/CWG/issues/2296.html">2296</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>open</td>
<td>Are default argument instantiation failures in the &#8220;immediate context&#8221;?</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2297">
<td><a href="https://cplusplus.github.io/CWG/issues/2297.html">2297</a></td>
+ <td>[<a href="https://wg21.link/intro.races">intro.races</a>]</td>
<td>open</td>
<td>Unclear specification of atomic operations</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2298">
<td><a href="https://cplusplus.github.io/CWG/issues/2298.html">2298</a></td>
+ <td>[<a href="https://wg21.link/intro.races">intro.races</a>]</td>
<td>open</td>
<td>Actions and expression evaluation</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2299">
<td><a href="https://cplusplus.github.io/CWG/issues/2299.html">2299</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>CD5</td>
<td><TT>constexpr</TT> vararg functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2300">
<td><a href="https://cplusplus.github.io/CWG/issues/2300.html">2300</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD5</td>
<td>Lambdas in multiple definitions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2301">
<td><a href="https://cplusplus.github.io/CWG/issues/2301.html">2301</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>open</td>
<td>Value-initialization and constexpr constructor evaluation</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2302">
<td><a href="https://cplusplus.github.io/CWG/issues/2302.html">2302</a></td>
+ <td>[<a href="https://wg21.link/expr.eq">expr.eq</a>]</td>
<td>NAD</td>
<td>Address comparison between different member subobjects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2303">
<td><a href="https://cplusplus.github.io/CWG/issues/2303.html">2303</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>CD5</td>
<td>Partial ordering and recursive variadic inheritance</td>
<td class="full" align="center">Clang 12</td>
</tr>
<tr id="2304">
<td><a href="https://cplusplus.github.io/CWG/issues/2304.html">2304</a></td>
+ <td>[<a href="https://wg21.link/over.best.ics">over.best.ics</a>]</td>
<td>NAD</td>
<td>Incomplete type vs overload resolution</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="2305">
<td><a href="https://cplusplus.github.io/CWG/issues/2305.html">2305</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>CD5</td>
<td>Explicit instantiation of constexpr or inline variable template</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2306">
<td><a href="https://cplusplus.github.io/CWG/issues/2306.html">2306</a></td>
+ <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>
<td>NAD</td>
<td>Nested friend templates of class templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2307">
<td><a href="https://cplusplus.github.io/CWG/issues/2307.html">2307</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>CD5</td>
<td>Unclear definition of &#8220;equivalent to a nontype template parameter&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2308">
<td><a href="https://cplusplus.github.io/CWG/issues/2308.html">2308</a></td>
+ <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>
<td>NAD</td>
<td>Structured bindings and lambda capture</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2309">
<td><a href="https://cplusplus.github.io/CWG/issues/2309.html">2309</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>CD5</td>
<td>Restrictions on nested statements within <TT>constexpr</TT> functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2310">
<td><a href="https://cplusplus.github.io/CWG/issues/2310.html">2310</a></td>
+ <td>[<a href="https://wg21.link/conv.ptr">conv.ptr</a>]</td>
<td>CD5</td>
<td>Type completeness and derived-to-base pointer conversions</td>
<td class="partial" align="center">Partial</td>
</tr>
<tr class="open" id="2311">
<td><a href="https://cplusplus.github.io/CWG/issues/2311.html">2311</a></td>
+ <td>[<a href="https://wg21.link/over.match.list">over.match.list</a>]</td>
<td>open</td>
<td>Missed case for guaranteed copy elision</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2312">
<td><a href="https://cplusplus.github.io/CWG/issues/2312.html">2312</a></td>
+ <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>
<td>CD6</td>
<td>Structured bindings and <TT>mutable</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2313">
<td><a href="https://cplusplus.github.io/CWG/issues/2313.html">2313</a></td>
+ <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>
<td>CD5</td>
<td>Redeclaration of structured binding reference variables</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2314">
<td><a href="https://cplusplus.github.io/CWG/issues/2314.html">2314</a></td>
+ <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>
<td>dup</td>
<td>Structured bindings and lambda capture</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2315">
<td><a href="https://cplusplus.github.io/CWG/issues/2315.html">2315</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>CD5</td>
<td>What is the &#8220;corresponding special member&#8221; of a variant member?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2316">
<td><a href="https://cplusplus.github.io/CWG/issues/2316.html">2316</a></td>
+ <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>
<td>drafting</td>
<td>Simplifying class conversions in conditional expressions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2317">
<td><a href="https://cplusplus.github.io/CWG/issues/2317.html">2317</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>CD5</td>
<td>Self-referential default member initializers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2318">
<td><a href="https://cplusplus.github.io/CWG/issues/2318.html">2318</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>CD5</td>
<td>Nondeduced contexts in deduction from a <I>braced-init-list</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2319">
<td><a href="https://cplusplus.github.io/CWG/issues/2319.html">2319</a></td>
+ <td>[<a href="https://wg21.link/over.best.ics">over.best.ics</a>]</td>
<td>drafting</td>
<td>Nested brace initialization from same type</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2320">
<td><a href="https://cplusplus.github.io/CWG/issues/2320.html">2320</a></td>
+ <td>[<a href="https://wg21.link/stmt.if">stmt.if</a>]</td>
<td>extension</td>
<td><TT>constexpr if</TT> and boolean conversions</td>
<td align="center">Extension</td>
</tr>
<tr id="2321">
<td><a href="https://cplusplus.github.io/CWG/issues/2321.html">2321</a></td>
+ <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>
<td>CD5</td>
<td>Conditional operator and cv-qualified class prvalues</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2322">
<td><a href="https://cplusplus.github.io/CWG/issues/2322.html">2322</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>CD5</td>
<td>Substitution failure and lexical order</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2323">
<td><a href="https://cplusplus.github.io/CWG/issues/2323.html">2323</a></td>
+ <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>
<td>C++20</td>
<td>Expunge POD</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2324">
<td><a href="https://cplusplus.github.io/CWG/issues/2324.html">2324</a></td>
+ <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>
<td>drafting</td>
<td>Size of base class subobject</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2325">
<td><a href="https://cplusplus.github.io/CWG/issues/2325.html">2325</a></td>
+ <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>
<td>drafting</td>
<td><TT>std::launder</TT> and reuse of character buffers</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2326">
<td><a href="https://cplusplus.github.io/CWG/issues/2326.html">2326</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>dup</td>
<td>Type deduction with initializer list containing ambiguous functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2327">
<td><a href="https://cplusplus.github.io/CWG/issues/2327.html">2327</a></td>
+ <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>
<td>drafting</td>
<td>Copy elision for direct-initialization with a conversion function</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2328">
<td><a href="https://cplusplus.github.io/CWG/issues/2328.html">2328</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>drafting</td>
<td>Unclear presentation style of template argument deduction rules</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2329">
<td><a href="https://cplusplus.github.io/CWG/issues/2329.html">2329</a></td>
+ <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>
<td>open</td>
<td>Virtual base classes and generated assignment operators</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2330">
<td><a href="https://cplusplus.github.io/CWG/issues/2330.html">2330</a></td>
+ <td>[<a href="https://wg21.link/temp.spec">temp.spec</a>]</td>
<td>CD5</td>
<td>Missing references to variable templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2331">
<td><a href="https://cplusplus.github.io/CWG/issues/2331.html">2331</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.class">basic.scope.class</a>]</td>
<td>CD6</td>
<td>Redundancy in description of class scope</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="2332">
<td><a href="https://cplusplus.github.io/CWG/issues/2332.html">2332</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>
<td>CD5</td>
<td><I>template-name</I> as <I>simple-type-name</I> vs injected-class-name</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2333">
<td><a href="https://cplusplus.github.io/CWG/issues/2333.html">2333</a></td>
+ <td>[<a href="https://wg21.link/lex.ccon">lex.ccon</a>]</td>
<td>CD6</td>
<td>Escape sequences in UTF-8 character literals</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2334">
<td><a href="https://cplusplus.github.io/CWG/issues/2334.html">2334</a></td>
+ <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>
<td>open</td>
<td>Creation of objects by <TT>typeid</TT></td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2335">
<td><a href="https://cplusplus.github.io/CWG/issues/2335.html">2335</a></td>
+ <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>
<td>drafting</td>
<td>Deduced return types vs member types</td>
<td align="center">
@@ -13849,1308 +16142,1526 @@ and <I>POD class</I></td>
</tr>
<tr id="2336">
<td><a href="https://cplusplus.github.io/CWG/issues/2336.html">2336</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>CD5</td>
<td>Destructor characteristics vs potentially-constructed subobjects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2337">
<td><a href="https://cplusplus.github.io/CWG/issues/2337.html">2337</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>open</td>
<td>Incorrect implication of logic ladder for conversion sequence tiebreakers</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2338">
<td><a href="https://cplusplus.github.io/CWG/issues/2338.html">2338</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>CD5</td>
<td>Undefined behavior converting to short enums with fixed underlying types</td>
<td class="full" align="center">Clang 12</td>
</tr>
<tr id="2339">
<td><a href="https://cplusplus.github.io/CWG/issues/2339.html">2339</a></td>
+ <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>
<td>CD5</td>
<td>Underspecified template arguments in structured bindings</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2340">
<td><a href="https://cplusplus.github.io/CWG/issues/2340.html">2340</a></td>
+ <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>
<td>open</td>
<td>Reference collapsing and structured bindings</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2341">
<td><a href="https://cplusplus.github.io/CWG/issues/2341.html">2341</a></td>
+ <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>
<td>CD5</td>
<td>Structured bindings with static storage duration</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2342">
<td><a href="https://cplusplus.github.io/CWG/issues/2342.html">2342</a></td>
+ <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>
<td>CD5</td>
<td>Reference <TT>reinterpret_cast</TT> and pointer-interconvertibility</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2343">
<td><a href="https://cplusplus.github.io/CWG/issues/2343.html">2343</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>C++20</td>
<td><TT>void*</TT> non-type template parameters</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2344">
<td><a href="https://cplusplus.github.io/CWG/issues/2344.html">2344</a></td>
+ <td>[<a href="https://wg21.link/stmt.select">stmt.select</a>]</td>
<td>NAD</td>
<td>Redeclaration of names in <I>init-statement</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2345">
<td><a href="https://cplusplus.github.io/CWG/issues/2345.html">2345</a></td>
+ <td>[<a href="https://wg21.link/stmt.if">stmt.if</a>]</td>
<td>CD5</td>
<td>Jumping across initializers in <I>init-statement</I>s and <I>condition</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2346">
<td><a href="https://cplusplus.github.io/CWG/issues/2346.html">2346</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>CD5</td>
<td>Local variables in default arguments</td>
<td class="full" align="center">Clang 11</td>
</tr>
<tr id="2347">
<td><a href="https://cplusplus.github.io/CWG/issues/2347.html">2347</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>C++20</td>
<td>Passing short scoped enumerations to ellipsis</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2348">
<td><a href="https://cplusplus.github.io/CWG/issues/2348.html">2348</a></td>
+ <td>[<a href="https://wg21.link/stmt.if">stmt.if</a>]</td>
<td>NAD</td>
<td>Non-templated <TT>constexpr if</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2349">
<td><a href="https://cplusplus.github.io/CWG/issues/2349.html">2349</a></td>
+ <td>[<a href="https://wg21.link/stmt">stmt</a>]</td>
<td>NAD</td>
<td>Class/enumeration names vs conditions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2350">
<td><a href="https://cplusplus.github.io/CWG/issues/2350.html">2350</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.partial">temp.deduct.partial</a>]</td>
<td>NAD</td>
<td>Forwarding references and deduction guides</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2351">
<td><a href="https://cplusplus.github.io/CWG/issues/2351.html">2351</a></td>
+ <td>[<a href="https://wg21.link/expr.type.conv">expr.type.conv</a>]</td>
<td>CD5</td>
<td><TT>void{}</TT></td>
<td class="full" align="center">Clang 20</td>
</tr>
<tr id="2352">
<td><a href="https://cplusplus.github.io/CWG/issues/2352.html">2352</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>CD5</td>
<td>Similar types and reference binding</td>
<td class="full" align="center">Clang 10</td>
</tr>
<tr id="2353">
<td><a href="https://cplusplus.github.io/CWG/issues/2353.html">2353</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD5</td>
<td>Potential results of a member access expression for a static data member</td>
<td class="full" align="center">Clang 9</td>
</tr>
<tr id="2354">
<td><a href="https://cplusplus.github.io/CWG/issues/2354.html">2354</a></td>
+ <td>[<a href="https://wg21.link/basic.align">basic.align</a>]</td>
<td>CD5</td>
<td>Extended alignment and object representation</td>
<td class="full" align="center">Clang 15</td>
</tr>
<tr id="2355">
<td><a href="https://cplusplus.github.io/CWG/issues/2355.html">2355</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>CD6</td>
<td>Deducing <I>noexcept-specifier</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2356">
<td><a href="https://cplusplus.github.io/CWG/issues/2356.html">2356</a></td>
+ <td>[<a href="https://wg21.link/over.match.funcs">over.match.funcs</a>]</td>
<td>CD5</td>
<td>Base class copy and move constructors should not be inherited</td>
<td class="full" align="center">Clang 4</td>
</tr>
<tr id="2357">
<td><a href="https://cplusplus.github.io/CWG/issues/2357.html">2357</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>
<td>NAD</td>
<td>Lookup in member function declarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2358">
<td><a href="https://cplusplus.github.io/CWG/issues/2358.html">2358</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>CD5</td>
<td>Explicit capture of value</td>
<td class="full" align="center">Clang 16</td>
</tr>
<tr id="2359">
<td><a href="https://cplusplus.github.io/CWG/issues/2359.html">2359</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>CD5</td>
<td>Unintended copy initialization with designated initializers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2360">
<td><a href="https://cplusplus.github.io/CWG/issues/2360.html">2360</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.unused">dcl.attr.unused</a>]</td>
<td>CD5</td>
<td><TT>[[maybe_unused]]</TT> and structured bindings</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2361">
<td><a href="https://cplusplus.github.io/CWG/issues/2361.html">2361</a></td>
+ <td>[<a href="https://wg21.link/csetjmp.syn">csetjmp.syn</a>]</td>
<td>open</td>
<td>Unclear description of <TT>longjmp</TT> undefined behavior</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2362">
<td><a href="https://cplusplus.github.io/CWG/issues/2362.html">2362</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.general">dcl.fct.def.general</a>]</td>
<td>open</td>
<td><TT>__func__</TT> should be <TT>constexpr</TT></td>
<td align="center">Not resolved</td>
</tr>
<tr id="2363">
<td><a href="https://cplusplus.github.io/CWG/issues/2363.html">2363</a></td>
+ <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>
<td>NAD</td>
<td>Opaque enumeration friend declarations</td>
<td class="full" align="center">Clang 19</td>
</tr>
<tr id="2364">
<td><a href="https://cplusplus.github.io/CWG/issues/2364.html">2364</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>NAD</td>
<td>Constant expressions, aggregate initialization, and modifications</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2365">
<td><a href="https://cplusplus.github.io/CWG/issues/2365.html">2365</a></td>
+ <td>[<a href="https://wg21.link/expr.dynamic.cast">expr.dynamic.cast</a>]</td>
<td>CD5</td>
<td>Confusing specification for <TT>dynamic_cast</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2366">
<td><a href="https://cplusplus.github.io/CWG/issues/2366.html">2366</a></td>
+ <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>
<td>CD5</td>
<td>Can default initialization be constant initialization?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2367">
<td><a href="https://cplusplus.github.io/CWG/issues/2367.html">2367</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>NAD</td>
<td>Lambdas in default arguments vs the ODR</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2368">
<td><a href="https://cplusplus.github.io/CWG/issues/2368.html">2368</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD5</td>
<td>Differences in relational and three-way constant comparisons</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2369">
<td><a href="https://cplusplus.github.io/CWG/issues/2369.html">2369</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>CD6</td>
<td>Ordering between constraints and substitution</td>
<td class="partial" align="center">Partial</td>
</tr>
<tr id="2370">
<td><a href="https://cplusplus.github.io/CWG/issues/2370.html">2370</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>
<td>CD6</td>
<td><TT>friend</TT> declarations of namespace-scope functions</td>
<td class="none" align="center">No</td>
</tr>
<tr id="2371">
<td><a href="https://cplusplus.github.io/CWG/issues/2371.html">2371</a></td>
+ <td>[<a href="https://wg21.link/basic.def">basic.def</a>]</td>
<td>CD5</td>
<td>Use of the English term &#8220;attributes&#8221; is confusing</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2372">
<td><a href="https://cplusplus.github.io/CWG/issues/2372.html">2372</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>CD5</td>
<td>Incorrect matching rules for block-scope <TT>extern</TT> declarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2373">
<td><a href="https://cplusplus.github.io/CWG/issues/2373.html">2373</a></td>
+ <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>
<td>CD5</td>
<td>Incorrect handling of static member function templates in partial ordering</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2374">
<td><a href="https://cplusplus.github.io/CWG/issues/2374.html">2374</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>C++20</td>
<td>Overly permissive specification of <TT>enum</TT> direct-list-initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2375">
<td><a href="https://cplusplus.github.io/CWG/issues/2375.html">2375</a></td>
+ <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>
<td>NAD</td>
<td>Multiple redeclarations of <TT>constexpr</TT> static data members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2376">
<td><a href="https://cplusplus.github.io/CWG/issues/2376.html">2376</a></td>
+ <td>[<a href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</a>]</td>
<td>CD5</td>
<td>Class template argument deduction with array declarator</td>
<td class="full" align="center">Clang 21</td>
</tr>
<tr id="2377">
<td><a href="https://cplusplus.github.io/CWG/issues/2377.html">2377</a></td>
+ <td>[<a href="https://wg21.link/over.match.viable">over.match.viable</a>]</td>
<td>NAD</td>
<td>Explicit copy constructor vs function viability</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2378">
<td><a href="https://cplusplus.github.io/CWG/issues/2378.html">2378</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>C++20</td>
<td>Inconsistent grammar for reference <I>init-capture</I> of pack</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2379">
<td><a href="https://cplusplus.github.io/CWG/issues/2379.html">2379</a></td>
+ <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>
<td>CD5</td>
<td>Missing prohibition against <TT>constexpr</TT> in <TT>friend</TT> declaration</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2380">
<td><a href="https://cplusplus.github.io/CWG/issues/2380.html">2380</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD5</td>
<td><I>capture-default</I> makes too many references odr-usable</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2381">
<td><a href="https://cplusplus.github.io/CWG/issues/2381.html">2381</a></td>
+ <td>[<a href="https://wg21.link/expr.type">expr.type</a>]</td>
<td>CD5</td>
<td>Composite pointer type of pointers to plain and noexcept member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2382">
<td><a href="https://cplusplus.github.io/CWG/issues/2382.html">2382</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD5</td>
<td>Array allocation overhead for non-allocating placement <TT>new</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2383">
<td><a href="https://cplusplus.github.io/CWG/issues/2383.html">2383</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>NAD</td>
<td>Variadic member functions of variadic class templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2384">
<td><a href="https://cplusplus.github.io/CWG/issues/2384.html">2384</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.conv">temp.deduct.conv</a>]</td>
<td>CD5</td>
<td>Conversion function templates and qualification conversions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2385">
<td><a href="https://cplusplus.github.io/CWG/issues/2385.html">2385</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.id.qual">expr.prim.id.qual</a>]</td>
<td>CD5</td>
<td>Lookup for <I>conversion-function-id</I>s</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="2386">
<td><a href="https://cplusplus.github.io/CWG/issues/2386.html">2386</a></td>
+ <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>
<td>CD5</td>
<td><T>tuple_size</T> requirements for structured binding</td>
<td class="full" align="center">Clang 9</td>
</tr>
<tr id="2387">
<td><a href="https://cplusplus.github.io/CWG/issues/2387.html">2387</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>CD5</td>
<td>Linkage of const-qualified variable template</td>
<td class="full" align="center">Clang 9</td>
</tr>
<tr id="2388">
<td><a href="https://cplusplus.github.io/CWG/issues/2388.html">2388</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>
<td>NAD</td>
<td>Applicability of <I>contract-attribute-specifier</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2389">
<td><a href="https://cplusplus.github.io/CWG/issues/2389.html">2389</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>CD6</td>
<td>Agreement of deduced and explicitly-specified variable types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2390">
<td><a href="https://cplusplus.github.io/CWG/issues/2390.html">2390</a></td>
+ <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>
<td>CD5</td>
<td>Is the argument of <TT>__has_cpp_attribute</TT> macro-expanded?</td>
<td class="full" align="center">Clang 14</td>
</tr>
<tr id="2391">
<td><a href="https://cplusplus.github.io/CWG/issues/2391.html">2391</a></td>
+ <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>
<td>dup</td>
<td>Additional template parameters following pack expansion</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2392">
<td><a href="https://cplusplus.github.io/CWG/issues/2392.html">2392</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++23</td>
<td><I>new-expression</I> size check and constant evaluation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2393">
<td><a href="https://cplusplus.github.io/CWG/issues/2393.html">2393</a></td>
+ <td>[<a href="https://wg21.link/expr.pseudo">expr.pseudo</a>]</td>
<td>NAD</td>
<td>Pseudo-destructors and object lifetime</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2394">
<td><a href="https://cplusplus.github.io/CWG/issues/2394.html">2394</a></td>
+ <td>[<a href="https://wg21.link/class.default.ctor">class.default.ctor</a>]</td>
<td>CD5</td>
<td>Const-default-constructible for members</td>
<td class="full" align="center">Clang 15</td>
</tr>
<tr class="open" id="2395">
<td><a href="https://cplusplus.github.io/CWG/issues/2395.html">2395</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>drafting</td>
<td>Parameters following a pack expansion</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2396">
<td><a href="https://cplusplus.github.io/CWG/issues/2396.html">2396</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.id.qual">expr.prim.id.qual</a>]</td>
<td>CD6</td>
<td>Lookup of names in complex <I>conversion-type-id</I>s</td>
<td class="none" align="center">No</td>
</tr>
<tr id="2397">
<td><a href="https://cplusplus.github.io/CWG/issues/2397.html">2397</a></td>
+ <td>[<a href="https://wg21.link/dcl.array">dcl.array</a>]</td>
<td>CD6</td>
<td><TT>auto</TT> specifier for pointers and references to arrays</td>
<td class="full" align="center">Clang 17</td>
</tr>
<tr class="open" id="2398">
<td><a href="https://cplusplus.github.io/CWG/issues/2398.html">2398</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.template">temp.arg.template</a>]</td>
<td>drafting</td>
<td>Template template parameter matching and deduction</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2399">
<td><a href="https://cplusplus.github.io/CWG/issues/2399.html">2399</a></td>
+ <td>[<a href="https://wg21.link/expr.assign">expr.assign</a>]</td>
<td>CD5</td>
<td>Unclear referent of &#8220;expression&#8221; in <I>assignment-expression</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2400">
<td><a href="https://cplusplus.github.io/CWG/issues/2400.html">2400</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD5</td>
<td>Constexpr virtual functions and temporary objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2401">
<td><a href="https://cplusplus.github.io/CWG/issues/2401.html">2401</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>
<td>C++20</td>
<td>Array decay vs prohibition of subobject non-type arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2402">
<td><a href="https://cplusplus.github.io/CWG/issues/2402.html">2402</a></td>
+ <td>[<a href="https://wg21.link/lex.ccon">lex.ccon</a>]</td>
<td>CD6</td>
<td>When is the restriction to a single <I>c-char</I> in a Unicode literal enforced?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2403">
<td><a href="https://cplusplus.github.io/CWG/issues/2403.html">2403</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>drafting</td>
<td>Temporary materialization and base/member initialization</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2404">
<td><a href="https://cplusplus.github.io/CWG/issues/2404.html">2404</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>CD5</td>
<td><TT>[[no_unique_address]]</TT> and allocation order</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2405">
<td><a href="https://cplusplus.github.io/CWG/issues/2405.html">2405</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>
<td>CD6</td>
<td>Additional type-dependent expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2406">
<td><a href="https://cplusplus.github.io/CWG/issues/2406.html">2406</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.fallthrough">dcl.attr.fallthrough</a>]</td>
<td>CD5</td>
<td><TT>[[fallthrough]]</TT> attribute and iteration statements</td>
<td class="full" align="center">Clang 5</td>
</tr>
<tr id="2407">
<td><a href="https://cplusplus.github.io/CWG/issues/2407.html">2407</a></td>
+ <td>[<a href="https://wg21.link/diff">diff</a>]</td>
<td>C++23</td>
<td>Missing entry in Annex C for defaulted comparison operators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2408">
<td><a href="https://cplusplus.github.io/CWG/issues/2408.html">2408</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>NAD</td>
<td>Temporaries and previously-initialized elements in aggregate initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2409">
<td><a href="https://cplusplus.github.io/CWG/issues/2409.html">2409</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>drafting</td>
<td>Explicit specializations of constexpr static data members</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2410">
<td><a href="https://cplusplus.github.io/CWG/issues/2410.html">2410</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>C++23</td>
<td>Implicit calls of immediate functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2411">
<td><a href="https://cplusplus.github.io/CWG/issues/2411.html">2411</a></td>
+ <td>[<a href="https://wg21.link/temp.type">temp.type</a>]</td>
<td>C++20</td>
<td>Comparison of pointers to members in template non-type arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2412">
<td><a href="https://cplusplus.github.io/CWG/issues/2412.html">2412</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>review</td>
<td>SFINAE vs undeduced placeholder type</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2413">
<td><a href="https://cplusplus.github.io/CWG/issues/2413.html">2413</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>CD6</td>
<td><TT>typename</TT> in <I>conversion-function-id</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2414">
<td><a href="https://cplusplus.github.io/CWG/issues/2414.html">2414</a></td>
+ <td>[<a href="https://wg21.link/class.compare.default">class.compare.default</a>]</td>
<td>C++20</td>
<td>Unclear results if both member and friend <TT>operator&lt;=&gt;</TT> are declared</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2415">
<td><a href="https://cplusplus.github.io/CWG/issues/2415.html">2415</a></td>
+ <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>
<td>NAD</td>
<td><I>using-declaration</I>s vs copy assignment operators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2416">
<td><a href="https://cplusplus.github.io/CWG/issues/2416.html">2416</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>C++20</td>
<td>Explicit specializations vs <TT>constexpr</TT> and <TT>consteval</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2417">
<td><a href="https://cplusplus.github.io/CWG/issues/2417.html">2417</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>open</td>
<td>Explicit instantiation and exception specifications</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2418">
<td><a href="https://cplusplus.github.io/CWG/issues/2418.html">2418</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD5</td>
<td>Missing cases in definition of &#8220;usable in constant expressions&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2419">
<td><a href="https://cplusplus.github.io/CWG/issues/2419.html">2419</a></td>
+ <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>
<td>C++20</td>
<td>Loss of generality treating pointers to objects as one-element arrays</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2420">
<td><a href="https://cplusplus.github.io/CWG/issues/2420.html">2420</a></td>
+ <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>
<td>dup</td>
<td>Exception specifications in explicit instantiation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2421">
<td><a href="https://cplusplus.github.io/CWG/issues/2421.html">2421</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>drafting</td>
<td>Explicit instantiation of constrained member functions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2422">
<td><a href="https://cplusplus.github.io/CWG/issues/2422.html">2422</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.guide">temp.deduct.guide</a>]</td>
<td>C++20</td>
<td>Incorrect grammar for <I>deduction-guide</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2423">
<td><a href="https://cplusplus.github.io/CWG/issues/2423.html">2423</a></td>
+ <td>[<a href="https://wg21.link/basic.pre">basic.pre</a>]</td>
<td>NAD</td>
<td>Typedefs, names, and entities</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2424">
<td><a href="https://cplusplus.github.io/CWG/issues/2424.html">2424</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>C++20</td>
<td><TT>constexpr</TT> initialization requirements for variant members</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2425">
<td><a href="https://cplusplus.github.io/CWG/issues/2425.html">2425</a></td>
+ <td>[<a href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</a>]</td>
<td>open</td>
<td>Confusing wording for deduction from a type</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2426">
<td><a href="https://cplusplus.github.io/CWG/issues/2426.html">2426</a></td>
+ <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>
<td>C++20</td>
<td>Reference to destructor that cannot be invoked</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2427">
<td><a href="https://cplusplus.github.io/CWG/issues/2427.html">2427</a></td>
+ <td>[<a href="https://wg21.link/expr.assign">expr.assign</a>]</td>
<td>C++20</td>
<td>Deprecation of volatile operands and unevaluated contexts</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2428">
<td><a href="https://cplusplus.github.io/CWG/issues/2428.html">2428</a></td>
+ <td>[<a href="https://wg21.link/temp.concept">temp.concept</a>]</td>
<td>C++23</td>
<td>Deprecating a concept</td>
<td class="full" align="center">Clang 19</td>
</tr>
<tr id="2429">
<td><a href="https://cplusplus.github.io/CWG/issues/2429.html">2429</a></td>
+ <td>[<a href="https://wg21.link/stmt.dcl">stmt.dcl</a>]</td>
<td>C++20</td>
<td>Initialization of <TT>thread_local</TT> variables referenced by lambdas</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2430">
<td><a href="https://cplusplus.github.io/CWG/issues/2430.html">2430</a></td>
+ <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>
<td>C++20</td>
<td>Completeness of return and parameter types of member functions</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="2431">
<td><a href="https://cplusplus.github.io/CWG/issues/2431.html">2431</a></td>
+ <td>[<a href="https://wg21.link/basic.exec">basic.exec</a>]</td>
<td>C++20</td>
<td>Full-expressions and temporaries bound to references</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2432">
<td><a href="https://cplusplus.github.io/CWG/issues/2432.html">2432</a></td>
+ <td>[<a href="https://wg21.link/class.spaceship">class.spaceship</a>]</td>
<td>C++20</td>
<td>Return types for defaulted <TT>&lt;=&gt;</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2433">
<td><a href="https://cplusplus.github.io/CWG/issues/2433.html">2433</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>C++20</td>
<td>Variable templates in the ODR</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2434">
<td><a href="https://cplusplus.github.io/CWG/issues/2434.html">2434</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>review</td>
<td>Mandatory copy elision vs non-class objects</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2435">
<td><a href="https://cplusplus.github.io/CWG/issues/2435.html">2435</a></td>
+ <td>[<a href="https://wg21.link/temp.spec">temp.spec</a>]</td>
<td>open</td>
<td>Alias template specializations</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2436">
<td><a href="https://cplusplus.github.io/CWG/issues/2436.html">2436</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>
<td>C++20</td>
<td>Copy semantics of coroutine parameters</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2437">
<td><a href="https://cplusplus.github.io/CWG/issues/2437.html">2437</a></td>
+ <td>[<a href="https://wg21.link/class.spaceship">class.spaceship</a>]</td>
<td>C++20</td>
<td>Conversion of <TT>std::strong_ordering</TT> in a defaulted <TT>operator&lt;=&gt;</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2438">
<td><a href="https://cplusplus.github.io/CWG/issues/2438.html">2438</a></td>
+ <td>[<a href="https://wg21.link/conv.qual">conv.qual</a>]</td>
<td>open</td>
<td>Problems in the specification of qualification conversions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2439">
<td><a href="https://cplusplus.github.io/CWG/issues/2439.html">2439</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++20</td>
<td>Undefined term in definition of &#8220;usable in constant expressions&#8221;</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2440">
<td><a href="https://cplusplus.github.io/CWG/issues/2440.html">2440</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++23</td>
<td>Allocation in core constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2441">
<td><a href="https://cplusplus.github.io/CWG/issues/2441.html">2441</a></td>
+ <td>[<a href="https://wg21.link/dcl.inline">dcl.inline</a>]</td>
<td>C++20</td>
<td>Inline function parameters</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2442">
<td><a href="https://cplusplus.github.io/CWG/issues/2442.html">2442</a></td>
+ <td>[<a href="https://wg21.link/over.match.viable">over.match.viable</a>]</td>
<td>C++20</td>
<td>Incorrect requirement for default arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2443">
<td><a href="https://cplusplus.github.io/CWG/issues/2443.html">2443</a></td>
+ <td>[<a href="https://wg21.link/module.interface">module.interface</a>]</td>
<td>C++23</td>
<td>Meaningless template exports</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2444">
<td><a href="https://cplusplus.github.io/CWG/issues/2444.html">2444</a></td>
+ <td>[<a href="https://wg21.link/basic.start.dynamic">basic.start.dynamic</a>]</td>
<td>drafting</td>
<td>Constant expressions in initialization odr-use</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2445">
<td><a href="https://cplusplus.github.io/CWG/issues/2445.html">2445</a></td>
+ <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>
<td>C++20</td>
<td>Partial ordering with rewritten candidates</td>
<td class="full" align="center">Clang 19</td>
</tr>
<tr id="2446">
<td><a href="https://cplusplus.github.io/CWG/issues/2446.html">2446</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>
<td>C++20</td>
<td>Questionable type-dependency of <I>concept-id</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2447">
<td><a href="https://cplusplus.github.io/CWG/issues/2447.html">2447</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>
<td>C++20</td>
<td>Unintended description of abbreviated function templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2448">
<td><a href="https://cplusplus.github.io/CWG/issues/2448.html">2448</a></td>
+ <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>
<td>CD6</td>
<td>Cv-qualification of arithmetic types and deprecation of volatile</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2449">
<td><a href="https://cplusplus.github.io/CWG/issues/2449.html">2449</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>
<td>extension</td>
<td>Thunks as an implementation technique for pointers to virtual functions</td>
<td align="center">Extension</td>
</tr>
<tr id="2450">
<td><a href="https://cplusplus.github.io/CWG/issues/2450.html">2450</a></td>
+ <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>
<td>CD7</td>
<td><I>braced-init-list</I> as a <I>template-argument</I></td>
<td class="full" align="center">Clang 18</td>
</tr>
<tr id="2451">
<td><a href="https://cplusplus.github.io/CWG/issues/2451.html">2451</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>
<td>C++23</td>
<td><I>promise</I><TT>.unhandled_exception()</TT> and final suspend point</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2452">
<td><a href="https://cplusplus.github.io/CWG/issues/2452.html">2452</a></td>
+ <td>[<a href="https://wg21.link/stmt.return.coroutine">stmt.return.coroutine</a>]</td>
<td>CD6</td>
<td>Flowing off the end of a coroutine</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2453">
<td><a href="https://cplusplus.github.io/CWG/issues/2453.html">2453</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto.general">dcl.spec.auto.general</a>]</td>
<td>NAD</td>
<td>Deduced return types and coroutine lambdas</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2454">
<td><a href="https://cplusplus.github.io/CWG/issues/2454.html">2454</a></td>
+ <td>[<a href="https://wg21.link/expr.await">expr.await</a>]</td>
<td>NAD</td>
<td>Tail recursion and coroutine symmetric transfer</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2455">
<td><a href="https://cplusplus.github.io/CWG/issues/2455.html">2455</a></td>
+ <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>
<td>CD6</td>
<td>Concatenation of string literals vs translation phases 5 and 6</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2456">
<td><a href="https://cplusplus.github.io/CWG/issues/2456.html">2456</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>open</td>
<td>Viable user-defined conversions in converted constant expressions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2457">
<td><a href="https://cplusplus.github.io/CWG/issues/2457.html">2457</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>CD6</td>
<td>Unexpanded parameter packs don't make a function type dependent</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2458">
<td><a href="https://cplusplus.github.io/CWG/issues/2458.html">2458</a></td>
+ <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>
<td>CD6</td>
<td>Value category of expressions denoting non-static member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2459">
<td><a href="https://cplusplus.github.io/CWG/issues/2459.html">2459</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>
<td>CD7</td>
<td>Template parameter initialization</td>
<td class="full" align="center">Clang 18</td>
</tr>
<tr id="2460">
<td><a href="https://cplusplus.github.io/CWG/issues/2460.html">2460</a></td>
+ <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>
<td>CD6</td>
<td>C language linkage and constrained non-template friends</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2461">
<td><a href="https://cplusplus.github.io/CWG/issues/2461.html">2461</a></td>
+ <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>
<td>CD6</td>
<td>Diagnosing non-<TT>bool</TT> type constraints</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2462">
<td><a href="https://cplusplus.github.io/CWG/issues/2462.html">2462</a></td>
+ <td>[<a href="https://wg21.link/temp.res.general">temp.res.general</a>]</td>
<td>open</td>
<td>Problems with the omission of the <TT>typename</TT> keyword</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2463">
<td><a href="https://cplusplus.github.io/CWG/issues/2463.html">2463</a></td>
+ <td>[<a href="https://wg21.link/class.prop">class.prop</a>]</td>
<td>open</td>
<td>Trivial copyability and unions with non-trivial members</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2464">
<td><a href="https://cplusplus.github.io/CWG/issues/2464.html">2464</a></td>
+ <td>[<a href="https://wg21.link/ptr.launder">ptr.launder</a>]</td>
<td>CD6</td>
<td>Constexpr launder and unions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2465">
<td><a href="https://cplusplus.github.io/CWG/issues/2465.html">2465</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>
<td>CD6</td>
<td>Coroutine parameters passed to a promise constructor</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2466">
<td><a href="https://cplusplus.github.io/CWG/issues/2466.html">2466</a></td>
+ <td>[<a href="https://wg21.link/expr.await">expr.await</a>]</td>
<td>CD6</td>
<td><TT>co_await</TT> should be a single evaluation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2467">
<td><a href="https://cplusplus.github.io/CWG/issues/2467.html">2467</a></td>
+ <td>[<a href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</a>]</td>
<td>drafting</td>
<td>CTAD for alias templates and the deducible check</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2468">
<td><a href="https://cplusplus.github.io/CWG/issues/2468.html">2468</a></td>
+ <td>[<a href="https://wg21.link/temp.res.general">temp.res.general</a>]</td>
<td>open</td>
<td>Omission of the <TT>typename</TT> keyword in a member template parameter list</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2469">
<td><a href="https://cplusplus.github.io/CWG/issues/2469.html">2469</a></td>
+ <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>
<td>drafting</td>
<td>Implicit object creation vs constant expressions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2470">
<td><a href="https://cplusplus.github.io/CWG/issues/2470.html">2470</a></td>
+ <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>
<td>CD6</td>
<td>Multiple array objects providing storage for one object</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2471">
<td><a href="https://cplusplus.github.io/CWG/issues/2471.html">2471</a></td>
+ <td>[<a href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</a>]</td>
<td>drafting</td>
<td>Nested class template argument deduction</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2472">
<td><a href="https://cplusplus.github.io/CWG/issues/2472.html">2472</a></td>
+ <td>[<a href="https://wg21.link/expr.await">expr.await</a>]</td>
<td>NAD</td>
<td>Value categories in <I>await-expression</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2473">
<td><a href="https://cplusplus.github.io/CWG/issues/2473.html">2473</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.id.dtor">expr.prim.id.dtor</a>]</td>
<td>open</td>
<td>Parentheses in pseudo-destructor calls</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2474">
<td><a href="https://cplusplus.github.io/CWG/issues/2474.html">2474</a></td>
+ <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>
<td>CD6</td>
<td>Cv-qualification and deletion</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2475">
<td><a href="https://cplusplus.github.io/CWG/issues/2475.html">2475</a></td>
+ <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>
<td>C++23</td>
<td>Object declarations of type <I>cv</I> <TT>void</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2476">
<td><a href="https://cplusplus.github.io/CWG/issues/2476.html">2476</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto.general">dcl.spec.auto.general</a>]</td>
<td>CD7</td>
<td><I>placeholder-type-specifier</I>s and function declarators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2477">
<td><a href="https://cplusplus.github.io/CWG/issues/2477.html">2477</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>CD6</td>
<td>Defaulted vs deleted copy constructors/assignment operators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2478">
<td><a href="https://cplusplus.github.io/CWG/issues/2478.html">2478</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>C++23</td>
<td>Properties of explicit specializations of implicitly-instantiated class templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2479">
<td><a href="https://cplusplus.github.io/CWG/issues/2479.html">2479</a></td>
+ <td>[<a href="https://wg21.link/basic.start.main">basic.start.main</a>]</td>
<td>CD6</td>
<td>Missing specifications for <TT>consteval</TT> and <TT>constinit</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2480">
<td><a href="https://cplusplus.github.io/CWG/issues/2480.html">2480</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.general">basic.lookup.general</a>]</td>
<td>drafting</td>
<td>Lookup for enumerators in modules</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2481">
<td><a href="https://cplusplus.github.io/CWG/issues/2481.html">2481</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>CD6</td>
<td>Cv-qualification of temporary to which a reference is bound</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2482">
<td><a href="https://cplusplus.github.io/CWG/issues/2482.html">2482</a></td>
+ <td>[<a href="https://wg21.link/bit.cast">bit.cast</a>]</td>
<td>CD6</td>
<td><TT>bit_cast</TT> and indeterminate values</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2483">
<td><a href="https://cplusplus.github.io/CWG/issues/2483.html">2483</a></td>
+ <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>
<td>C++23</td>
<td>Language linkage of static member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2484">
<td><a href="https://cplusplus.github.io/CWG/issues/2484.html">2484</a></td>
+ <td>[<a href="https://wg21.link/conv.prom">conv.prom</a>]</td>
<td>CD6</td>
<td><TT>char8_t</TT> and <TT>char16_t</TT> in integral promotions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2485">
<td><a href="https://cplusplus.github.io/CWG/issues/2485.html">2485</a></td>
+ <td>[<a href="https://wg21.link/conv.prom">conv.prom</a>]</td>
<td>CD7</td>
<td>Bit-fields in integral promotions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2486">
<td><a href="https://cplusplus.github.io/CWG/issues/2486.html">2486</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>CD6</td>
<td>Call to <TT>noexcept</TT> function via <TT>noexcept(false)</TT> pointer/lvalue</td>
<td class="full" align="center">Clang 4 (C++17 onwards)</td>
</tr>
<tr class="open" id="2487">
<td><a href="https://cplusplus.github.io/CWG/issues/2487.html">2487</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>
<td>drafting</td>
<td>Type dependence of function-style cast to incomplete array type</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2488">
<td><a href="https://cplusplus.github.io/CWG/issues/2488.html">2488</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.scope">basic.scope.scope</a>]</td>
<td>open</td>
<td>Overloading virtual functions and functions with trailing <I>requires-clause</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2489">
<td><a href="https://cplusplus.github.io/CWG/issues/2489.html">2489</a></td>
+ <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>
<td>C++23</td>
<td>Storage provided by array of <TT>char</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2490">
<td><a href="https://cplusplus.github.io/CWG/issues/2490.html">2490</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD6</td>
<td>Restrictions on destruction in constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2491">
<td><a href="https://cplusplus.github.io/CWG/issues/2491.html">2491</a></td>
+ <td>[<a href="https://wg21.link/module.interface">module.interface</a>]</td>
<td>CD6</td>
<td>Export of typedef after its first declaration</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2492">
<td><a href="https://cplusplus.github.io/CWG/issues/2492.html">2492</a></td>
+ <td>[<a href="https://wg21.link/over.ics.list">over.ics.list</a>]</td>
<td>open</td>
<td>Comparing user-defined conversion sequences in list-initialization</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2493">
<td><a href="https://cplusplus.github.io/CWG/issues/2493.html">2493</a></td>
+ <td>[<a href="https://wg21.link/dcl.spec.auto.general">dcl.spec.auto.general</a>]</td>
<td>dup</td>
<td><TT>auto</TT> as a <I>conversion-type-id</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2494">
<td><a href="https://cplusplus.github.io/CWG/issues/2494.html">2494</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD6</td>
<td>Multiple definitions of non-odr-used entities</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2495">
<td><a href="https://cplusplus.github.io/CWG/issues/2495.html">2495</a></td>
+ <td>[<a href="https://wg21.link/stmt.return">stmt.return</a>]</td>
<td>open</td>
<td>Glvalue result of a function call</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2496">
<td><a href="https://cplusplus.github.io/CWG/issues/2496.html">2496</a></td>
+ <td>[<a href="https://wg21.link/class.virtual">class.virtual</a>]</td>
<td>CD6</td>
<td><I>ref-qualifier</I>s and virtual overriding</td>
<td class="full" align="center">Clang 21</td>
</tr>
<tr class="open" id="2497">
<td><a href="https://cplusplus.github.io/CWG/issues/2497.html">2497</a></td>
+ <td>[<a href="https://wg21.link/temp.point">temp.point</a>]</td>
<td>drafting</td>
<td>Points of instantiation for constexpr function templates</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2498">
<td><a href="https://cplusplus.github.io/CWG/issues/2498.html">2498</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.general">temp.deduct.general</a>]</td>
<td>open</td>
<td>Partial specialization failure and the immediate context</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2499">
<td><a href="https://cplusplus.github.io/CWG/issues/2499.html">2499</a></td>
+ <td>[<a href="https://wg21.link/basic.compound">basic.compound</a>]</td>
<td>CD6</td>
<td>Inconsistency in definition of pointer-interconvertibility</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2500">
<td><a href="https://cplusplus.github.io/CWG/issues/2500.html">2500</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>extension</td>
<td><TT>noexcept(false)</TT> functions and <TT>noexcept</TT> expressions</td>
<td align="center">Extension</td>
</tr>
<tr class="open" id="2501">
<td><a href="https://cplusplus.github.io/CWG/issues/2501.html">2501</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>drafting</td>
<td>Explicit instantiation and trailing <I>requires-clause</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2502">
<td><a href="https://cplusplus.github.io/CWG/issues/2502.html">2502</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.block">basic.scope.block</a>]</td>
<td>CD6</td>
<td>Unintended declaration conflicts in nested statement scopes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2503">
<td><a href="https://cplusplus.github.io/CWG/issues/2503.html">2503</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.id">expr.prim.id</a>]</td>
<td>drafting</td>
<td>Unclear relationship among name, qualified name, and unqualified name</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2504">
<td><a href="https://cplusplus.github.io/CWG/issues/2504.html">2504</a></td>
+ <td>[<a href="https://wg21.link/class.inhctor.init">class.inhctor.init</a>]</td>
<td>CD7</td>
<td>Inheriting constructors from virtual base classes</td>
<td class="none" align="center">No</td>
</tr>
<tr class="open" id="2505">
<td><a href="https://cplusplus.github.io/CWG/issues/2505.html">2505</a></td>
+ <td>[<a href="https://wg21.link/namespace.unnamed">namespace.unnamed</a>]</td>
<td>drafting</td>
<td>Nested unnamed namespace of inline unnamed namespace</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2506">
<td><a href="https://cplusplus.github.io/CWG/issues/2506.html">2506</a></td>
+ <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>
<td>CD6</td>
<td>Structured bindings and array cv-qualifiers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2507">
<td><a href="https://cplusplus.github.io/CWG/issues/2507.html">2507</a></td>
+ <td>[<a href="https://wg21.link/over.oper.general">over.oper.general</a>]</td>
<td>CD6</td>
<td>Default arguments for <TT>operator[]</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2508">
<td><a href="https://cplusplus.github.io/CWG/issues/2508.html">2508</a></td>
+ <td>[<a href="https://wg21.link/temp.local">temp.local</a>]</td>
<td>C++23</td>
<td>Restrictions on uses of template parameter names</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2509">
<td><a href="https://cplusplus.github.io/CWG/issues/2509.html">2509</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.general">expr.prim.lambda.general</a>]</td>
<td>CD6</td>
<td><I>decl-specifier-seq</I> in <I>lambda-specifiers</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2510">
<td><a href="https://cplusplus.github.io/CWG/issues/2510.html">2510</a></td>
+ <td>[<a href="https://wg21.link/class.mem.general">class.mem.general</a>]</td>
<td>NAD</td>
<td><I>noexcept-specifier</I> of friend function vs class completeness</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2511">
<td><a href="https://cplusplus.github.io/CWG/issues/2511.html">2511</a></td>
+ <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>
<td>CD6</td>
<td>cv-qualified bit-fields</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2512">
<td><a href="https://cplusplus.github.io/CWG/issues/2512.html">2512</a></td>
+ <td>[<a href="https://wg21.link/expr.typeid">expr.typeid</a>]</td>
<td>NAD</td>
<td><TT>typeid</TT> and incomplete class types</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr class="open" id="2513">
<td><a href="https://cplusplus.github.io/CWG/issues/2513.html">2513</a></td>
+ <td>[<a href="https://wg21.link/class.conv.fct">class.conv.fct</a>]</td>
<td>open</td>
<td>Ambiguity with <I>requires-clause</I> and <I>operator-function-id</I></td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2514">
<td><a href="https://cplusplus.github.io/CWG/issues/2514.html">2514</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>open</td>
<td>Modifying const subobjects</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2515">
<td><a href="https://cplusplus.github.io/CWG/issues/2515.html">2515</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>open</td>
<td>Result of a function call</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2516">
<td><a href="https://cplusplus.github.io/CWG/issues/2516.html">2516</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.pdecl">basic.scope.pdecl</a>]</td>
<td>C++23</td>
<td>Locus of <I>enum-specifier</I> or <I>opaque-enum-declaration</I></td>
<td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="2517">
<td><a href="https://cplusplus.github.io/CWG/issues/2517.html">2517</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.req.nested">expr.prim.req.nested</a>]</td>
<td>C++23</td>
<td>Useless restriction on use of parameter in <I>constraint-expression</I></td>
<td class="full" align="center">Clang 21</td>
</tr>
<tr id="2518">
<td><a href="https://cplusplus.github.io/CWG/issues/2518.html">2518</a></td>
+ <td>[<a href="https://wg21.link/intro.compliance.general">intro.compliance.general</a>]</td>
<td>C++23</td>
<td>Conformance requirements and <TT>#error</TT>/<TT>#warning</TT></td>
<td class="full" align="center">Clang 17</td>
</tr>
<tr id="2519">
<td><a href="https://cplusplus.github.io/CWG/issues/2519.html">2519</a></td>
+ <td>[<a href="https://wg21.link/basic.types.general">basic.types.general</a>]</td>
<td>CD7</td>
<td>Object representation of a bit-field</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2520">
<td><a href="https://cplusplus.github.io/CWG/issues/2520.html">2520</a></td>
+ <td>[<a href="https://wg21.link/defns.signature.templ">defns.signature.templ</a>]</td>
<td>C++23</td>
<td>Template signature and default template arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2521">
<td><a href="https://cplusplus.github.io/CWG/issues/2521.html">2521</a></td>
+ <td>[<a href="https://wg21.link/over.literal">over.literal</a>]</td>
<td>C++23</td>
<td>User-defined literals and reserved identifiers</td>
<td class="full" align="center">Clang 17</td>
</tr>
<tr class="open" id="2522">
<td><a href="https://cplusplus.github.io/CWG/issues/2522.html">2522</a></td>
+ <td>[<a href="https://wg21.link/cpp.concat">cpp.concat</a>]</td>
<td>open</td>
<td>Removing placemarker tokens and retention of whitespace</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2523">
<td><a href="https://cplusplus.github.io/CWG/issues/2523.html">2523</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++23</td>
<td>Undefined behavior via omitted destructor call in constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2524">
<td><a href="https://cplusplus.github.io/CWG/issues/2524.html">2524</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>NAD</td>
<td>Distinguishing user-defined conversion sequences by <I>ref-qualifier</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2525">
<td><a href="https://cplusplus.github.io/CWG/issues/2525.html">2525</a></td>
+ <td>[<a href="https://wg21.link/over.best.ics.general">over.best.ics.general</a>]</td>
<td>open</td>
<td>Incorrect definition of implicit conversion sequence</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2526">
<td><a href="https://cplusplus.github.io/CWG/issues/2526.html">2526</a></td>
+ <td>[<a href="https://wg21.link/expr.rel">expr.rel</a>]</td>
<td>C++23</td>
<td>Relational comparison of <TT>void*</TT> pointers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2527">
<td><a href="https://cplusplus.github.io/CWG/issues/2527.html">2527</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.nouniqueaddr">dcl.attr.nouniqueaddr</a>]</td>
<td>NAD</td>
<td>Non-class potentially-overlapping objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2528">
<td><a href="https://cplusplus.github.io/CWG/issues/2528.html">2528</a></td>
+ <td>[<a href="https://wg21.link/expr.arith.conv">expr.arith.conv</a>]</td>
<td>C++23</td>
<td>Three-way comparison and the usual arithmetic conversions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2529">
<td><a href="https://cplusplus.github.io/CWG/issues/2529.html">2529</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++23</td>
<td>Constant destruction of constexpr references</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2530">
<td><a href="https://cplusplus.github.io/CWG/issues/2530.html">2530</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>C++23</td>
<td>Multiple definitions of enumerators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2531">
<td><a href="https://cplusplus.github.io/CWG/issues/2531.html">2531</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>CD7</td>
<td>Static data members redeclared as constexpr</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2532">
<td><a href="https://cplusplus.github.io/CWG/issues/2532.html">2532</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>open</td>
<td>Kind of pointer value returned by <TT>new T[0]</TT></td>
<td align="center">Not resolved</td>
</tr>
<tr id="2533">
<td><a href="https://cplusplus.github.io/CWG/issues/2533.html">2533</a></td>
+ <td>[<a href="https://wg21.link/basic.stc">basic.stc</a>]</td>
<td>CD7</td>
<td>Storage duration of implicitly created objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2534">
<td><a href="https://cplusplus.github.io/CWG/issues/2534.html">2534</a></td>
+ <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>
<td>CD6</td>
<td>Value category of pseudo-destructor expression</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2535">
<td><a href="https://cplusplus.github.io/CWG/issues/2535.html">2535</a></td>
+ <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>
<td>CD6</td>
<td>Type punning in class member access</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2536">
<td><a href="https://cplusplus.github.io/CWG/issues/2536.html">2536</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>open</td>
<td>Partially initialized variables during constant initialization</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2537">
<td><a href="https://cplusplus.github.io/CWG/issues/2537.html">2537</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>drafting</td>
<td>Overbroad grammar for <I>parameter-declaration</I></td>
<td align="center">Not resolved</td>
</tr>
<tr id="2538">
<td><a href="https://cplusplus.github.io/CWG/issues/2538.html">2538</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>
<td>C++23</td>
<td>Can standard attributes be syntactically ignored?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2539">
<td><a href="https://cplusplus.github.io/CWG/issues/2539.html">2539</a></td>
+ <td>[<a href="https://wg21.link/class.spaceship">class.spaceship</a>]</td>
<td>C++23</td>
<td>Three-way comparison requiring strong ordering for floating-point types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2540">
<td><a href="https://cplusplus.github.io/CWG/issues/2540.html">2540</a></td>
+ <td>[<a href="https://wg21.link/lex.ccon">lex.ccon</a>]</td>
<td>CD6</td>
<td>Unspecified interpretation of <I>numeric-escape-sequence</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2541">
<td><a href="https://cplusplus.github.io/CWG/issues/2541.html">2541</a></td>
+ <td>[<a href="https://wg21.link/module.unit">module.unit</a>]</td>
<td>open</td>
<td>Linkage specifications, module purview, and module attachment</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2542">
<td><a href="https://cplusplus.github.io/CWG/issues/2542.html">2542</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD7</td>
<td>Is a closure type a structural type?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2543">
<td><a href="https://cplusplus.github.io/CWG/issues/2543.html">2543</a></td>
+ <td>[<a href="https://wg21.link/dcl.constinit">dcl.constinit</a>]</td>
<td>C++23</td>
<td><TT>constinit</TT> and optimized dynamic initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2544">
<td><a href="https://cplusplus.github.io/CWG/issues/2544.html">2544</a></td>
+ <td>[<a href="https://wg21.link/basic.compound">basic.compound</a>]</td>
<td>open</td>
<td>Address of past-the-end of a potentially-overlapping subobject</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2545">
<td><a href="https://cplusplus.github.io/CWG/issues/2545.html">2545</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>open</td>
<td>Transparently replacing objects in constant expressions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2546">
<td><a href="https://cplusplus.github.io/CWG/issues/2546.html">2546</a></td>
+ <td>[<a href="https://wg21.link/class.compare.secondary">class.compare.secondary</a>]</td>
<td>CD7</td>
<td>Defaulted secondary comparison operators defined as deleted</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2547">
<td><a href="https://cplusplus.github.io/CWG/issues/2547.html">2547</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>CD7</td>
<td>Defaulted comparison operator function for non-classes</td>
<td class="full" align="center">Clang 20</td>
</tr>
<tr id="2548">
<td><a href="https://cplusplus.github.io/CWG/issues/2548.html">2548</a></td>
+ <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>
<td>NAD</td>
<td>Array prvalues and additive operators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2549">
<td><a href="https://cplusplus.github.io/CWG/issues/2549.html">2549</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.id.qual">expr.prim.id.qual</a>]</td>
<td>CD7</td>
<td>Implicitly moving the operand of a <I>throw-expression</I> in unevaluated contexts</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2550">
<td><a href="https://cplusplus.github.io/CWG/issues/2550.html">2550</a></td>
+ <td>[<a href="https://wg21.link/dcl.ref">dcl.ref</a>]</td>
<td>CD7</td>
<td>Type "reference to <I>cv</I> <TT>void</TT>" outside of a declarator</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2551">
<td><a href="https://cplusplus.github.io/CWG/issues/2551.html">2551</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>review</td>
<td>"Refers to allocated storage" has no meaning</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2552">
<td><a href="https://cplusplus.github.io/CWG/issues/2552.html">2552</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD7</td>
<td>Constant evaluation of non-defining variable declarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2553">
<td><a href="https://cplusplus.github.io/CWG/issues/2553.html">2553</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>review</td>
<td>Restrictions on explicit object member functions</td>
<td align="center">
@@ -15161,6 +17672,7 @@ and <I>POD class</I></td>
</tr>
<tr class="open" id="2554">
<td><a href="https://cplusplus.github.io/CWG/issues/2554.html">2554</a></td>
+ <td>[<a href="https://wg21.link/class.virtual">class.virtual</a>]</td>
<td>review</td>
<td>Overriding virtual functions, also with explicit object parameters</td>
<td align="center">
@@ -15171,66 +17683,77 @@ and <I>POD class</I></td>
</tr>
<tr class="open" id="2555">
<td><a href="https://cplusplus.github.io/CWG/issues/2555.html">2555</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>tentatively ready</td>
<td>Ineffective redeclaration prevention for <I>using-declarator</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2556">
<td><a href="https://cplusplus.github.io/CWG/issues/2556.html">2556</a></td>
+ <td>[<a href="https://wg21.link/stmt.return.coroutine">stmt.return.coroutine</a>]</td>
<td>CD7</td>
<td>Unusable <TT>promise::return_void</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2557">
<td><a href="https://cplusplus.github.io/CWG/issues/2557.html">2557</a></td>
+ <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>
<td>review</td>
<td>Class member access referring to an unrelated class</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2558">
<td><a href="https://cplusplus.github.io/CWG/issues/2558.html">2558</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++23</td>
<td>Uninitialized subobjects as a result of an immediate invocation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2559">
<td><a href="https://cplusplus.github.io/CWG/issues/2559.html">2559</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>open</td>
<td>Defaulted consteval functions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2560">
<td><a href="https://cplusplus.github.io/CWG/issues/2560.html">2560</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.req.general">expr.prim.req.general</a>]</td>
<td>CD7</td>
<td>Parameter type determination in a <I>requirement-parameter-list</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2561">
<td><a href="https://cplusplus.github.io/CWG/issues/2561.html">2561</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD7</td>
<td>Conversion to function pointer for lambda with explicit object parameter</td>
<td class="none" align="center">No</td>
</tr>
<tr class="open" id="2562">
<td><a href="https://cplusplus.github.io/CWG/issues/2562.html">2562</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>
<td>open</td>
<td>Exceptions thrown during coroutine startup</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2563">
<td><a href="https://cplusplus.github.io/CWG/issues/2563.html">2563</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>
<td>review</td>
<td>Initialization of coroutine result object</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2564">
<td><a href="https://cplusplus.github.io/CWG/issues/2564.html">2564</a></td>
+ <td>[<a href="https://wg21.link/over.call.object">over.call.object</a>]</td>
<td>drafting</td>
<td>Conversion to function pointer with an explicit object parameter</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2565">
<td><a href="https://cplusplus.github.io/CWG/issues/2565.html">2565</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.req.general">expr.prim.req.general</a>]</td>
<td>open</td>
<td>Invalid types in the <I>parameter-declaration-clause</I> of a <I>requires-expression</I></td>
<td align="center">
@@ -15241,1231 +17764,1435 @@ and <I>POD class</I></td>
</tr>
<tr class="open" id="2566">
<td><a href="https://cplusplus.github.io/CWG/issues/2566.html">2566</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>review</td>
<td>Matching deallocation for uncaught exception</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2567">
<td><a href="https://cplusplus.github.io/CWG/issues/2567.html">2567</a></td>
+ <td>[<a href="https://wg21.link/class.member.lookup">class.member.lookup</a>]</td>
<td>NAD</td>
<td>Operator lookup ambiguity</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2568">
<td><a href="https://cplusplus.github.io/CWG/issues/2568.html">2568</a></td>
+ <td>[<a href="https://wg21.link/class.compare.default">class.compare.default</a>]</td>
<td>CD7</td>
<td>Access checking during synthesis of defaulted comparison operator</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2569">
<td><a href="https://cplusplus.github.io/CWG/issues/2569.html">2569</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.id.unqual">expr.prim.id.unqual</a>]</td>
<td>CD6</td>
<td>Use of <code>decltype(capture)</code> in a lambda's <I>parameter-declaration-clause</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2570">
<td><a href="https://cplusplus.github.io/CWG/issues/2570.html">2570</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>CD7</td>
<td>Clarify constexpr for defaulted functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2571">
<td><a href="https://cplusplus.github.io/CWG/issues/2571.html">2571</a></td>
+ <td>[<a href="https://wg21.link/expr.sub">expr.sub</a>]</td>
<td>CD6</td>
<td>Evaluation order for subscripting</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2572">
<td><a href="https://cplusplus.github.io/CWG/issues/2572.html">2572</a></td>
+ <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>
<td>review</td>
<td>Address of overloaded function with no target</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2573">
<td><a href="https://cplusplus.github.io/CWG/issues/2573.html">2573</a></td>
+ <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>
<td>CD7</td>
<td>Undefined behavior when splicing results in a <I>universal-character-name</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2574">
<td><a href="https://cplusplus.github.io/CWG/issues/2574.html">2574</a></td>
+ <td>[<a href="https://wg21.link/lex.pptoken">lex.pptoken</a>]</td>
<td>CD7</td>
<td>Undefined behavior when lexing unmatched quotes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2575">
<td><a href="https://cplusplus.github.io/CWG/issues/2575.html">2575</a></td>
+ <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>
<td>open</td>
<td>Undefined behavior when macro-replacing "defined" operator</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2576">
<td><a href="https://cplusplus.github.io/CWG/issues/2576.html">2576</a></td>
+ <td>[<a href="https://wg21.link/cpp.include">cpp.include</a>]</td>
<td>open</td>
<td>Undefined behavior with macro-expanded <TT>#include</TT> directives</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2577">
<td><a href="https://cplusplus.github.io/CWG/issues/2577.html">2577</a></td>
+ <td>[<a href="https://wg21.link/cpp.replace.general">cpp.replace.general</a>]</td>
<td>open</td>
<td>Undefined behavior for preprocessing directives in macro arguments</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2578">
<td><a href="https://cplusplus.github.io/CWG/issues/2578.html">2578</a></td>
+ <td>[<a href="https://wg21.link/cpp.stringize">cpp.stringize</a>]</td>
<td>CD7</td>
<td>Undefined behavior when creating an invalid string literal via stringizing</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2579">
<td><a href="https://cplusplus.github.io/CWG/issues/2579.html">2579</a></td>
+ <td>[<a href="https://wg21.link/cpp.concat">cpp.concat</a>]</td>
<td>CD7</td>
<td>Undefined behavior when token pasting does not create a preprocessing token</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2580">
<td><a href="https://cplusplus.github.io/CWG/issues/2580.html">2580</a></td>
+ <td>[<a href="https://wg21.link/cpp.line">cpp.line</a>]</td>
<td>CD7</td>
<td>Undefined behavior with <TT>#line</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2581">
<td><a href="https://cplusplus.github.io/CWG/issues/2581.html">2581</a></td>
+ <td>[<a href="https://wg21.link/cpp.predefined">cpp.predefined</a>]</td>
<td>open</td>
<td>Undefined behavior for predefined macros</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2582">
<td><a href="https://cplusplus.github.io/CWG/issues/2582.html">2582</a></td>
+ <td>[<a href="https://wg21.link/class.member.lookup">class.member.lookup</a>]</td>
<td>CD6</td>
<td>Differing member lookup from nested classes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2583">
<td><a href="https://cplusplus.github.io/CWG/issues/2583.html">2583</a></td>
+ <td>[<a href="https://wg21.link/class.mem.general">class.mem.general</a>]</td>
<td>C++23</td>
<td>Common initial sequence should consider over-alignment</td>
<td class="full" align="center">Clang 19</td>
</tr>
<tr class="open" id="2584">
<td><a href="https://cplusplus.github.io/CWG/issues/2584.html">2584</a></td>
+ <td>[<a href="https://wg21.link/temp.over.link">temp.over.link</a>]</td>
<td>open</td>
<td>Equivalent types in function template declarations</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2585">
<td><a href="https://cplusplus.github.io/CWG/issues/2585.html">2585</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>
<td>CD6</td>
<td>Name lookup for coroutine allocation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2586">
<td><a href="https://cplusplus.github.io/CWG/issues/2586.html">2586</a></td>
+ <td>[<a href="https://wg21.link/class.compare.default">class.compare.default</a>]</td>
<td>CD6</td>
<td>Explicit object parameter for assignment and comparison</td>
<td class="full" align="center">Clang 20</td>
</tr>
<tr class="open" id="2587">
<td><a href="https://cplusplus.github.io/CWG/issues/2587.html">2587</a></td>
+ <td>[<a href="https://wg21.link/intro.races">intro.races</a>]</td>
<td>review</td>
<td>Visible side effects and initial value of an object</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2588">
<td><a href="https://cplusplus.github.io/CWG/issues/2588.html">2588</a></td>
+ <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>
<td>CD7</td>
<td>friend declarations and module linkage</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2589">
<td><a href="https://cplusplus.github.io/CWG/issues/2589.html">2589</a></td>
+ <td>[<a href="https://wg21.link/temp.constr.atomic">temp.constr.atomic</a>]</td>
<td>review</td>
<td>Context of access checks during constraint satisfaction checking</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2590">
<td><a href="https://cplusplus.github.io/CWG/issues/2590.html">2590</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>C++23</td>
<td>Underlying type should determine size and alignment requirements of an enum</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2591">
<td><a href="https://cplusplus.github.io/CWG/issues/2591.html">2591</a></td>
+ <td>[<a href="https://wg21.link/class.union.general">class.union.general</a>]</td>
<td>CD7</td>
<td>Implicit change of active union member for anonymous union in union</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2592">
<td><a href="https://cplusplus.github.io/CWG/issues/2592.html">2592</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>open</td>
<td>Missing definition for placement allocation/deallocation function</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2593">
<td><a href="https://cplusplus.github.io/CWG/issues/2593.html">2593</a></td>
+ <td>[<a href="https://wg21.link/expr.mptr.oper">expr.mptr.oper</a>]</td>
<td>review</td>
<td>Insufficient base class restriction for pointer-to-member expression</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2594">
<td><a href="https://cplusplus.github.io/CWG/issues/2594.html">2594</a></td>
+ <td>[<a href="https://wg21.link/basic.start.main">basic.start.main</a>]</td>
<td>CD6</td>
<td>Disallowing a global function template <TT>main</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2595">
<td><a href="https://cplusplus.github.io/CWG/issues/2595.html">2595</a></td>
+ <td>[<a href="https://wg21.link/special">special</a>]</td>
<td>CD7</td>
<td>"More constrained" for eligible special member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2596">
<td><a href="https://cplusplus.github.io/CWG/issues/2596.html">2596</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>drafting</td>
<td>Instantiation of constrained non-template friends</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2597">
<td><a href="https://cplusplus.github.io/CWG/issues/2597.html">2597</a></td>
+ <td>[<a href="https://wg21.link/module.unit">module.unit</a>]</td>
<td>CD6</td>
<td>Replaceable allocation and deallocation functions in the global module</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2598">
<td><a href="https://cplusplus.github.io/CWG/issues/2598.html">2598</a></td>
+ <td>[<a href="https://wg21.link/basic.types.general">basic.types.general</a>]</td>
<td>C++23</td>
<td>Unions should not require a non-static data member of literal type</td>
<td class="full" align="center">Clang 18</td>
</tr>
<tr id="2599">
<td><a href="https://cplusplus.github.io/CWG/issues/2599.html">2599</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>C++23</td>
<td>What does initializing a parameter include?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2600">
<td><a href="https://cplusplus.github.io/CWG/issues/2600.html">2600</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>
<td>CD7</td>
<td>Type dependency of placeholder types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2601">
<td><a href="https://cplusplus.github.io/CWG/issues/2601.html">2601</a></td>
+ <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>
<td>C++23</td>
<td>Tracking of created and destroyed subobjects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2602">
<td><a href="https://cplusplus.github.io/CWG/issues/2602.html">2602</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>C++23</td>
<td>consteval defaulted functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2603">
<td><a href="https://cplusplus.github.io/CWG/issues/2603.html">2603</a></td>
+ <td>[<a href="https://wg21.link/temp.over.link">temp.over.link</a>]</td>
<td>C++23</td>
<td>Holistic functional equivalence for function templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2604">
<td><a href="https://cplusplus.github.io/CWG/issues/2604.html">2604</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>C++23</td>
<td>Attributes for an explicit specialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2605">
<td><a href="https://cplusplus.github.io/CWG/issues/2605.html">2605</a></td>
+ <td>[<a href="https://wg21.link/class.prop">class.prop</a>]</td>
<td>C++23</td>
<td>Implicit-lifetime aggregates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2606">
<td><a href="https://cplusplus.github.io/CWG/issues/2606.html">2606</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>CD6</td>
<td><TT>static_cast</TT> from "pointer to void" does not handle similar types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2607">
<td><a href="https://cplusplus.github.io/CWG/issues/2607.html">2607</a></td>
+ <td>[<a href="https://wg21.link/module.interface">module.interface</a>]</td>
<td>drafting</td>
<td>Visibility of enumerator names</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2608">
<td><a href="https://cplusplus.github.io/CWG/issues/2608.html">2608</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.explicit">temp.arg.explicit</a>]</td>
<td>CD6</td>
<td>Omitting an empty template argument list</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2609">
<td><a href="https://cplusplus.github.io/CWG/issues/2609.html">2609</a></td>
+ <td>[<a href="https://wg21.link/expr.sizeof">expr.sizeof</a>]</td>
<td>open</td>
<td>Padding in class types</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2610">
<td><a href="https://cplusplus.github.io/CWG/issues/2610.html">2610</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>C++23</td>
<td>Indirect private base classes in aggregates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2611">
<td><a href="https://cplusplus.github.io/CWG/issues/2611.html">2611</a></td>
+ <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>
<td>C++23</td>
<td>Missing parentheses in expansion of fold-expression could cause syntactic reinterpretation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2612">
<td><a href="https://cplusplus.github.io/CWG/issues/2612.html">2612</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.general">dcl.init.general</a>]</td>
<td>C++23</td>
<td>Incorrect comment in example</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2613">
<td><a href="https://cplusplus.github.io/CWG/issues/2613.html">2613</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>
<td>C++23</td>
<td>Incomplete definition of resumer</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2614">
<td><a href="https://cplusplus.github.io/CWG/issues/2614.html">2614</a></td>
+ <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>
<td>C++23</td>
<td>Unspecified results for class member access</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2615">
<td><a href="https://cplusplus.github.io/CWG/issues/2615.html">2615</a></td>
+ <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>
<td>C++23</td>
<td>Missing <TT>__has_cpp_attribute(assume)</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2616">
<td><a href="https://cplusplus.github.io/CWG/issues/2616.html">2616</a></td>
+ <td>[<a href="https://wg21.link/stmt">stmt</a>]</td>
<td>C++23</td>
<td>Imprecise restrictions on <TT>break</TT> and <TT>continue</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2617">
<td><a href="https://cplusplus.github.io/CWG/issues/2617.html">2617</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>review</td>
<td>Default template arguments for template members of non-template classes</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2618">
<td><a href="https://cplusplus.github.io/CWG/issues/2618.html">2618</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.general">temp.deduct.general</a>]</td>
<td>C++23</td>
<td>Substitution during deduction should exclude exception specifications</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2619">
<td><a href="https://cplusplus.github.io/CWG/issues/2619.html">2619</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>
<td>C++23</td>
<td>Kind of initialization for a <I>designated-initializer-list</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2620">
<td><a href="https://cplusplus.github.io/CWG/issues/2620.html">2620</a></td>
+ <td>[<a href="https://wg21.link/dcl.ambig.res">dcl.ambig.res</a>]</td>
<td>C++23</td>
<td>Nonsensical disambiguation rule</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2621">
<td><a href="https://cplusplus.github.io/CWG/issues/2621.html">2621</a></td>
+ <td>[<a href="https://wg21.link/enum.udecl">enum.udecl</a>]</td>
<td>C++23</td>
<td>Kind of lookup for <TT>using enum</TT> declarations</td>
<td class="full-superseded" align="center">Superseded by <a href="#2877">2877</a></td>
</tr>
<tr id="2622">
<td><a href="https://cplusplus.github.io/CWG/issues/2622.html">2622</a></td>
+ <td>[<a href="https://wg21.link/implimits">implimits</a>]</td>
<td>C++23</td>
<td>Compounding types from function and pointer-to-member types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2623">
<td><a href="https://cplusplus.github.io/CWG/issues/2623.html">2623</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>drafting</td>
<td>Invoking destroying <TT>operator delete</TT> for constructor failure</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2624">
<td><a href="https://cplusplus.github.io/CWG/issues/2624.html">2624</a></td>
+ <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>
<td>C++23</td>
<td>Array delete expression with no array cookie</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2625">
<td><a href="https://cplusplus.github.io/CWG/issues/2625.html">2625</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>C++23</td>
<td>Deletion of pointer to out-of-lifetime object</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2626">
<td><a href="https://cplusplus.github.io/CWG/issues/2626.html">2626</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>
<td>C++23</td>
<td>Rephrase ones' complement using base-2 representation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2627">
<td><a href="https://cplusplus.github.io/CWG/issues/2627.html">2627</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>C++23</td>
<td>Bit-fields and narrowing conversions</td>
<td class="full" align="center">Clang 20</td>
</tr>
<tr id="2628">
<td><a href="https://cplusplus.github.io/CWG/issues/2628.html">2628</a></td>
+ <td>[<a href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</a>]</td>
<td>CD7</td>
<td>Implicit deduction guides should propagate constraints</td>
<td class="full" align="center">Clang 20</td>
</tr>
<tr id="2629">
<td><a href="https://cplusplus.github.io/CWG/issues/2629.html">2629</a></td>
+ <td>[<a href="https://wg21.link/stmt.switch">stmt.switch</a>]</td>
<td>C++23</td>
<td>Variables of floating-point type as <TT>switch</TT> conditions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2630">
<td><a href="https://cplusplus.github.io/CWG/issues/2630.html">2630</a></td>
+ <td>[<a href="https://wg21.link/class.mem.general">class.mem.general</a>]</td>
<td>C++23</td>
<td>Syntactic specification of class completeness</td>
<td class="full" align="center">Clang 9</td>
</tr>
<tr id="2631">
<td><a href="https://cplusplus.github.io/CWG/issues/2631.html">2631</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++23</td>
<td>Immediate function evaluations in default arguments</td>
<td class="full" align="center">Clang 16</td>
</tr>
<tr class="open" id="2632">
<td><a href="https://cplusplus.github.io/CWG/issues/2632.html">2632</a></td>
+ <td>[<a href="https://wg21.link/intro.defs">intro.defs</a>]</td>
<td>drafting</td>
<td>'user-declared' is not defined</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2633">
<td><a href="https://cplusplus.github.io/CWG/issues/2633.html">2633</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>open</td>
<td>typeid of constexpr-unknown dynamic type</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2634">
<td><a href="https://cplusplus.github.io/CWG/issues/2634.html">2634</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.elab">dcl.type.elab</a>]</td>
<td>CD7</td>
<td>Avoid circularity in specification of scope for friend class declarations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2635">
<td><a href="https://cplusplus.github.io/CWG/issues/2635.html">2635</a></td>
+ <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>
<td>C++23</td>
<td>Constrained structured bindings</td>
<td class="full" align="center">Clang 16</td>
</tr>
<tr id="2636">
<td><a href="https://cplusplus.github.io/CWG/issues/2636.html">2636</a></td>
+ <td>[<a href="https://wg21.link/ub">ub</a>]</td>
<td>C++23</td>
<td>Update Annex E based on Unicode 15.0 UAX #31</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="2637">
<td><a href="https://cplusplus.github.io/CWG/issues/2637.html">2637</a></td>
+ <td>[<a href="https://wg21.link/class.pre">class.pre</a>]</td>
<td>CD7</td>
<td>Injected-class-name as a <I>simple-template-id</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2638">
<td><a href="https://cplusplus.github.io/CWG/issues/2638.html">2638</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD7</td>
<td>Improve the example for initializing by initializer list</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2639">
<td><a href="https://cplusplus.github.io/CWG/issues/2639.html">2639</a></td>
+ <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>
<td>C++23</td>
<td>new-lines after phase 1</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2640">
<td><a href="https://cplusplus.github.io/CWG/issues/2640.html">2640</a></td>
+ <td>[<a href="https://wg21.link/lex.charset">lex.charset</a>]</td>
<td>C++23</td>
<td>Allow more characters in an n-char sequence</td>
<td class="full" align="center">Clang 16</td>
</tr>
<tr id="2641">
<td><a href="https://cplusplus.github.io/CWG/issues/2641.html">2641</a></td>
+ <td>[<a href="https://wg21.link/lex.literal">lex.literal</a>]</td>
<td>C++23</td>
<td>Redundant specification of value category of literals</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2642">
<td><a href="https://cplusplus.github.io/CWG/issues/2642.html">2642</a></td>
+ <td>[<a href="https://wg21.link/class.member.lookup">class.member.lookup</a>]</td>
<td>C++23</td>
<td>Inconsistent use of T and C</td>
<td class="na" align="center">N/A</td>
</tr>
<tr id="2643">
<td><a href="https://cplusplus.github.io/CWG/issues/2643.html">2643</a></td>
+ <td>[<a href="https://wg21.link/basic.types.general">basic.types.general</a>]</td>
<td>C++23</td>
<td>Completing a pointer to array of unknown bound</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2644">
<td><a href="https://cplusplus.github.io/CWG/issues/2644.html">2644</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>C++23</td>
<td>Incorrect comment in example</td>
<td class="full" align="center">Clang 8</td>
</tr>
<tr id="2645">
<td><a href="https://cplusplus.github.io/CWG/issues/2645.html">2645</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>C++23</td>
<td>Unused term "default argument promotions"</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2646">
<td><a href="https://cplusplus.github.io/CWG/issues/2646.html">2646</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>C++23</td>
<td>Defaulted special member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2647">
<td><a href="https://cplusplus.github.io/CWG/issues/2647.html">2647</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++23</td>
<td>Fix for "needed for constant evaluation"</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2648">
<td><a href="https://cplusplus.github.io/CWG/issues/2648.html">2648</a></td>
+ <td>[<a href="https://wg21.link/over.call">over.call</a>]</td>
<td>C++23</td>
<td>Correspondence of surrogate call function and conversion function</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2649">
<td><a href="https://cplusplus.github.io/CWG/issues/2649.html">2649</a></td>
+ <td>[<a href="https://wg21.link/over.call.object">over.call.object</a>]</td>
<td>C++23</td>
<td>Incorrect note about implicit conversion sequence</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2650">
<td><a href="https://cplusplus.github.io/CWG/issues/2650.html">2650</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.general">temp.deduct.general</a>]</td>
<td>C++23</td>
<td>Incorrect example for ill-formed non-type template arguments</td>
<td class="full" align="center">Clang 17</td>
</tr>
<tr id="2651">
<td><a href="https://cplusplus.github.io/CWG/issues/2651.html">2651</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.conv">temp.deduct.conv</a>]</td>
<td>C++23</td>
<td>Conversion function templates and "noexcept"</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2652">
<td><a href="https://cplusplus.github.io/CWG/issues/2652.html">2652</a></td>
+ <td>[<a href="https://wg21.link/cpp.predefined">cpp.predefined</a>]</td>
<td>C++23</td>
<td>Overbroad definition of <TT>__STDCPP_BFLOAT16_T__</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2653">
<td><a href="https://cplusplus.github.io/CWG/issues/2653.html">2653</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>C++23</td>
<td>Can an explicit object parameter have a default argument?</td>
<td class="full" align="center">Clang 18</td>
</tr>
<tr id="2654">
<td><a href="https://cplusplus.github.io/CWG/issues/2654.html">2654</a></td>
+ <td>[<a href="https://wg21.link/expr.assign">expr.assign</a>]</td>
<td>C++23</td>
<td>Un-deprecation of compound volatile assignments</td>
<td class="full" align="center">Clang 16</td>
</tr>
<tr id="2655">
<td><a href="https://cplusplus.github.io/CWG/issues/2655.html">2655</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>NAD</td>
<td>Instantiation of default arguments in <I>lambda-expression</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2656">
<td><a href="https://cplusplus.github.io/CWG/issues/2656.html">2656</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>drafting</td>
<td>Converting consteval lambda to function pointer in non-immediate context</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2657">
<td><a href="https://cplusplus.github.io/CWG/issues/2657.html">2657</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>CD7</td>
<td>Cv-qualification adjustment when binding reference to temporary</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2658">
<td><a href="https://cplusplus.github.io/CWG/issues/2658.html">2658</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>C++23</td>
<td>Trivial copying of unions in core constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2659">
<td><a href="https://cplusplus.github.io/CWG/issues/2659.html">2659</a></td>
+ <td>[<a href="https://wg21.link/cpp.predefined">cpp.predefined</a>]</td>
<td>C++23</td>
<td>Missing feature-test macro for lifetime extension in range-for loop</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2660">
<td><a href="https://cplusplus.github.io/CWG/issues/2660.html">2660</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>open</td>
<td>Confusing term "this parameter"</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2661">
<td><a href="https://cplusplus.github.io/CWG/issues/2661.html">2661</a></td>
+ <td>[<a href="https://wg21.link/class.mem.general">class.mem.general</a>]</td>
<td>CD7</td>
<td>Missing disambiguation rule for <I>pure-specifier</I> vs. <I>brace-or-equal-initializer</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2662">
<td><a href="https://cplusplus.github.io/CWG/issues/2662.html">2662</a></td>
+ <td>[<a href="https://wg21.link/class.access.general">class.access.general</a>]</td>
<td>C++23</td>
<td>Example for member access control vs. overload resolution</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2663">
<td><a href="https://cplusplus.github.io/CWG/issues/2663.html">2663</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>CD7</td>
<td>Example for member redeclarations with <I>using-declaration</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2664">
<td><a href="https://cplusplus.github.io/CWG/issues/2664.html">2664</a></td>
+ <td>[<a href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</a>]</td>
<td>C++23</td>
<td>Deduction failure in CTAD for alias templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2665">
<td><a href="https://cplusplus.github.io/CWG/issues/2665.html">2665</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>NAD</td>
<td>Replacing a subobject with a complete object</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2666">
<td><a href="https://cplusplus.github.io/CWG/issues/2666.html">2666</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>open</td>
<td>Lifetime extension through <TT>static_cast</TT></td>
<td align="center">Not resolved</td>
</tr>
<tr id="2667">
<td><a href="https://cplusplus.github.io/CWG/issues/2667.html">2667</a></td>
+ <td>[<a href="https://wg21.link/cpp.import">cpp.import</a>]</td>
<td>C++23</td>
<td>Named module imports do not import macros</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2668">
<td><a href="https://cplusplus.github.io/CWG/issues/2668.html">2668</a></td>
+ <td>[<a href="https://wg21.link/expr.await">expr.await</a>]</td>
<td>CD7</td>
<td><TT>co_await</TT> in a <I>lambda-expression</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2669">
<td><a href="https://cplusplus.github.io/CWG/issues/2669.html">2669</a></td>
+ <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>
<td>open</td>
<td>Lifetime extension for aggregate initialization</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2670">
<td><a href="https://cplusplus.github.io/CWG/issues/2670.html">2670</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>open</td>
<td>Programs and translation units</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2671">
<td><a href="https://cplusplus.github.io/CWG/issues/2671.html">2671</a></td>
+ <td>[<a href="https://wg21.link/dcl.meaning.general">dcl.meaning.general</a>]</td>
<td>open</td>
<td>friend named by a <I>template-id</I></td>
<td align="center">Not resolved</td>
</tr>
<tr id="2672">
<td><a href="https://cplusplus.github.io/CWG/issues/2672.html">2672</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.general">temp.deduct.general</a>]</td>
<td>CD7</td>
<td>Lambda body SFINAE is still required, contrary to intent and note</td>
<td class="full" align="center">Clang 18</td>
</tr>
<tr id="2673">
<td><a href="https://cplusplus.github.io/CWG/issues/2673.html">2673</a></td>
+ <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>
<td>C++23</td>
<td>User-declared spaceship vs. built-in operators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2674">
<td><a href="https://cplusplus.github.io/CWG/issues/2674.html">2674</a></td>
+ <td>[<a href="https://wg21.link/class.ctor.general">class.ctor.general</a>]</td>
<td>C++23</td>
<td>Prohibit explicit object parameters for constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2675">
<td><a href="https://cplusplus.github.io/CWG/issues/2675.html">2675</a></td>
+ <td>[<a href="https://wg21.link/class.union.general">class.union.general</a>]</td>
<td>open</td>
<td><TT>start_lifetime_as</TT>, placement-new, and active union members</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2676">
<td><a href="https://cplusplus.github.io/CWG/issues/2676.html">2676</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>open</td>
<td>Replacing a complete object having base subobjects</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2677">
<td><a href="https://cplusplus.github.io/CWG/issues/2677.html">2677</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>review</td>
<td>Replacing union subobjects</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2678">
<td><a href="https://cplusplus.github.io/CWG/issues/2678.html">2678</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>C++23</td>
<td><TT>std::source_location::current</TT> is unimplementable</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2679">
<td><a href="https://cplusplus.github.io/CWG/issues/2679.html">2679</a></td>
+ <td>[<a href="https://wg21.link/over.best.ics.general">over.best.ics.general</a>]</td>
<td>open</td>
<td>Implicit conversion sequence with a null pointer constant</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2680">
<td><a href="https://cplusplus.github.io/CWG/issues/2680.html">2680</a></td>
+ <td>[<a href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</a>]</td>
<td>open</td>
<td>Class template argument deduction for aggregates with designated initializers</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2681">
<td><a href="https://cplusplus.github.io/CWG/issues/2681.html">2681</a></td>
+ <td>[<a href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</a>]</td>
<td>C++23</td>
<td>Deducing member array type from string literal</td>
<td class="full" align="center">Clang 17</td>
</tr>
<tr id="2682">
<td><a href="https://cplusplus.github.io/CWG/issues/2682.html">2682</a></td>
+ <td>[<a href="https://wg21.link/temp.pre">temp.pre</a>]</td>
<td>C++23</td>
<td>Templated function vs. function template</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2683">
<td><a href="https://cplusplus.github.io/CWG/issues/2683.html">2683</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>CD7</td>
<td>Default arguments for member functions of templated nested classes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2684">
<td><a href="https://cplusplus.github.io/CWG/issues/2684.html">2684</a></td>
+ <td>[<a href="https://wg21.link/basic.start.dynamic">basic.start.dynamic</a>]</td>
<td>open</td>
<td>thread_local dynamic initialization</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2685">
<td><a href="https://cplusplus.github.io/CWG/issues/2685.html">2685</a></td>
+ <td>[<a href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</a>]</td>
<td>C++23</td>
<td>Aggregate CTAD, string, and brace elision</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2686">
<td><a href="https://cplusplus.github.io/CWG/issues/2686.html">2686</a></td>
+ <td>[<a href="https://wg21.link/temp.constr.constr">temp.constr.constr</a>]</td>
<td>open</td>
<td>Pack expansion into a non-pack parameter of a concept</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2687">
<td><a href="https://cplusplus.github.io/CWG/issues/2687.html">2687</a></td>
+ <td>[<a href="https://wg21.link/over.match.call.general">over.match.call.general</a>]</td>
<td>C++23</td>
<td>Calling an explicit object member function via an address-of-overload-set</td>
<td class="full" align="center">Clang 18</td>
</tr>
<tr class="open" id="2688">
<td><a href="https://cplusplus.github.io/CWG/issues/2688.html">2688</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>open</td>
<td>Calling explicit object member functions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2689">
<td><a href="https://cplusplus.github.io/CWG/issues/2689.html">2689</a></td>
+ <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>
<td>CD7</td>
<td>Are cv-qualified <TT>std::nullptr_t</TT> fundamental types?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2690">
<td><a href="https://cplusplus.github.io/CWG/issues/2690.html">2690</a></td>
+ <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>
<td>C++23</td>
<td>Semantics of defaulted move assignment operator for unions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2691">
<td><a href="https://cplusplus.github.io/CWG/issues/2691.html">2691</a></td>
+ <td>[<a href="https://wg21.link/lex.ccon">lex.ccon</a>]</td>
<td>C++23</td>
<td><I>hexadecimal-escape-sequence</I> is too greedy</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2692">
<td><a href="https://cplusplus.github.io/CWG/issues/2692.html">2692</a></td>
+ <td>[<a href="https://wg21.link/over.match.call.general">over.match.call.general</a>]</td>
<td>C++23</td>
<td>Static and explicit object member functions with the same parameter-type-lists</td>
<td class="full" align="center">Clang 19</td>
</tr>
<tr class="open" id="2693">
<td><a href="https://cplusplus.github.io/CWG/issues/2693.html">2693</a></td>
+ <td>[<a href="https://wg21.link/cpp.line">cpp.line</a>]</td>
<td>open</td>
<td>Escape sequences for the <I>string-literal</I> of <TT>#line</TT></td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2694">
<td><a href="https://cplusplus.github.io/CWG/issues/2694.html">2694</a></td>
+ <td>[<a href="https://wg21.link/cpp.pragma.op">cpp.pragma.op</a>]</td>
<td>open</td>
<td><I>string-literal</I>s of the <TT>_Pragma</TT> operator</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2695">
<td><a href="https://cplusplus.github.io/CWG/issues/2695.html">2695</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>
<td>C++23</td>
<td>Semantic ignorability of attributes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2696">
<td><a href="https://cplusplus.github.io/CWG/issues/2696.html">2696</a></td>
+ <td>[<a href="https://wg21.link/expr.rel">expr.rel</a>]</td>
<td>dup</td>
<td>Relational comparisons of pointers to <TT>void</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2697">
<td><a href="https://cplusplus.github.io/CWG/issues/2697.html">2697</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.guide">temp.deduct.guide</a>]</td>
<td>CD7</td>
<td>Deduction guides using abbreviated function syntax</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2698">
<td><a href="https://cplusplus.github.io/CWG/issues/2698.html">2698</a></td>
+ <td>[<a href="https://wg21.link/lex.icon">lex.icon</a>]</td>
<td>CD7</td>
<td>Using extended integer types with <TT>z</TT> suffix</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2699">
<td><a href="https://cplusplus.github.io/CWG/issues/2699.html">2699</a></td>
+ <td>[<a href="https://wg21.link/expr.throw">expr.throw</a>]</td>
<td>CD7</td>
<td>Inconsistency of <I>throw-expression</I> specification</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2700">
<td><a href="https://cplusplus.github.io/CWG/issues/2700.html">2700</a></td>
+ <td>[<a href="https://wg21.link/intro.compliance.general">intro.compliance.general</a>]</td>
<td>CD7</td>
<td><TT>#error</TT> disallows existing implementation practice</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2701">
<td><a href="https://cplusplus.github.io/CWG/issues/2701.html">2701</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>open</td>
<td>Default arguments in multiple scopes / inheritance of array bounds in the same scope</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2702">
<td><a href="https://cplusplus.github.io/CWG/issues/2702.html">2702</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>open</td>
<td>Constant destruction of reference members</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2703">
<td><a href="https://cplusplus.github.io/CWG/issues/2703.html">2703</a></td>
+ <td>[<a href="https://wg21.link/class.spaceship">class.spaceship</a>]</td>
<td>CD7</td>
<td>Three-way comparison requiring strong ordering for floating-point types, take 2</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2704">
<td><a href="https://cplusplus.github.io/CWG/issues/2704.html">2704</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>open</td>
<td>Clarify meaning of "bind directly"</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2705">
<td><a href="https://cplusplus.github.io/CWG/issues/2705.html">2705</a></td>
+ <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>
<td>open</td>
<td>Accessing ambiguous subobjects</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2706">
<td><a href="https://cplusplus.github.io/CWG/issues/2706.html">2706</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>open</td>
<td>Repeated structured binding declarations</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2707">
<td><a href="https://cplusplus.github.io/CWG/issues/2707.html">2707</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.guide">temp.deduct.guide</a>]</td>
<td>CD7</td>
<td>Deduction guides cannot have a trailing <I>requires-clause</I></td>
<td class="full" align="center">Clang 20</td>
</tr>
<tr id="2708">
<td><a href="https://cplusplus.github.io/CWG/issues/2708.html">2708</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.general">dcl.init.general</a>]</td>
<td>CD7</td>
<td>Parenthesized initialization of arrays</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2709">
<td><a href="https://cplusplus.github.io/CWG/issues/2709.html">2709</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.general">dcl.init.general</a>]</td>
<td>NAD</td>
<td>Parenthesized initialization of reference-to-aggregate</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2710">
<td><a href="https://cplusplus.github.io/CWG/issues/2710.html">2710</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD7</td>
<td>Loops in constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2711">
<td><a href="https://cplusplus.github.io/CWG/issues/2711.html">2711</a></td>
+ <td>[<a href="https://wg21.link/expr.throw">expr.throw</a>]</td>
<td>CD7</td>
<td>Source for copy-initializing the exception object</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2712">
<td><a href="https://cplusplus.github.io/CWG/issues/2712.html">2712</a></td>
+ <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>
<td>CD7</td>
<td>Simplify restrictions on built-in assignment operator candidates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2713">
<td><a href="https://cplusplus.github.io/CWG/issues/2713.html">2713</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD7</td>
<td>Initialization of reference-to-aggregate from designated initializer list</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2714">
<td><a href="https://cplusplus.github.io/CWG/issues/2714.html">2714</a></td>
+ <td>[<a href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</a>]</td>
<td>CD7</td>
<td>Implicit deduction guides omit properties from the parameter-declaration-clause of a constructor</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2715">
<td><a href="https://cplusplus.github.io/CWG/issues/2715.html">2715</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>CD7</td>
<td>"calling function" for parameter initialization may not exist</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2716">
<td><a href="https://cplusplus.github.io/CWG/issues/2716.html">2716</a></td>
+ <td>[<a href="https://wg21.link/class.conv.fct">class.conv.fct</a>]</td>
<td>CD7</td>
<td>Rule about self-or-base conversion is normatively redundant</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2717">
<td><a href="https://cplusplus.github.io/CWG/issues/2717.html">2717</a></td>
+ <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>
<td>CD7</td>
<td>Pack expansion for <I>alignment-specifier</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2718">
<td><a href="https://cplusplus.github.io/CWG/issues/2718.html">2718</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>CD7</td>
<td>Type completeness for derived-to-base conversions</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="2719">
<td><a href="https://cplusplus.github.io/CWG/issues/2719.html">2719</a></td>
+ <td>[<a href="https://wg21.link/basic.align">basic.align</a>]</td>
<td>CD7</td>
<td>Creating objects in misaligned storage</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2720">
<td><a href="https://cplusplus.github.io/CWG/issues/2720.html">2720</a></td>
+ <td>[<a href="https://wg21.link/temp.res.general">temp.res.general</a>]</td>
<td>CD7</td>
<td>Template validity rules for templated entities and alias templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2721">
<td><a href="https://cplusplus.github.io/CWG/issues/2721.html">2721</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>CD7</td>
<td>When exactly is storage reused?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2722">
<td><a href="https://cplusplus.github.io/CWG/issues/2722.html">2722</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.noexcept">expr.unary.noexcept</a>]</td>
<td>CD7</td>
<td>Temporary materialization conversion for <TT>noexcept</TT> operator</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2723">
<td><a href="https://cplusplus.github.io/CWG/issues/2723.html">2723</a></td>
+ <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>
<td>CD7</td>
<td>Range of representable values for floating-point types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2724">
<td><a href="https://cplusplus.github.io/CWG/issues/2724.html">2724</a></td>
+ <td>[<a href="https://wg21.link/expr.shift">expr.shift</a>]</td>
<td>CD7</td>
<td>Clarify rounding for arithmetic right shift</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2725">
<td><a href="https://cplusplus.github.io/CWG/issues/2725.html">2725</a></td>
+ <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>
<td>CD7</td>
<td>Overload resolution for non-call of class member access</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2726">
<td><a href="https://cplusplus.github.io/CWG/issues/2726.html">2726</a></td>
+ <td>[<a href="https://wg21.link/lex.digraph">lex.digraph</a>]</td>
<td>review</td>
<td>Alternative tokens appearing as <I>attribute-token</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2727">
<td><a href="https://cplusplus.github.io/CWG/issues/2727.html">2727</a></td>
+ <td>[<a href="https://wg21.link/module.import">module.import</a>]</td>
<td>open</td>
<td>Importing header units synthesized from source files</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2728">
<td><a href="https://cplusplus.github.io/CWG/issues/2728.html">2728</a></td>
+ <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>
<td>CD7</td>
<td>Evaluation of conversions in a <I>delete-expression</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2729">
<td><a href="https://cplusplus.github.io/CWG/issues/2729.html">2729</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>CD7</td>
<td>Meaning of <I>new-type-id</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2730">
<td><a href="https://cplusplus.github.io/CWG/issues/2730.html">2730</a></td>
+ <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>
<td>open</td>
<td>Comparison templates on enumeration types</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2731">
<td><a href="https://cplusplus.github.io/CWG/issues/2731.html">2731</a></td>
+ <td>[<a href="https://wg21.link/over.ics.user">over.ics.user</a>]</td>
<td>open</td>
<td>List-initialization sequence with a user-defined conversion</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2732">
<td><a href="https://cplusplus.github.io/CWG/issues/2732.html">2732</a></td>
+ <td>[<a href="https://wg21.link/module.import">module.import</a>]</td>
<td>CD7</td>
<td>Can importable headers react to preprocessor state from point of import?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2733">
<td><a href="https://cplusplus.github.io/CWG/issues/2733.html">2733</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.unused">dcl.attr.unused</a>]</td>
<td>CD7</td>
<td>Applying <TT>[[maybe_unused]]</TT> to a label</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2734">
<td><a href="https://cplusplus.github.io/CWG/issues/2734.html">2734</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>open</td>
<td>Immediate forward-declared function templates</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2735">
<td><a href="https://cplusplus.github.io/CWG/issues/2735.html">2735</a></td>
+ <td>[<a href="https://wg21.link/over.match.best">over.match.best</a>]</td>
<td>open</td>
<td>List-initialization and conversions in overload resolution</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2736">
<td><a href="https://cplusplus.github.io/CWG/issues/2736.html">2736</a></td>
+ <td>[<a href="https://wg21.link/class.prop">class.prop</a>]</td>
<td>open</td>
<td>Standard layout class with empty base class also in first member</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2737">
<td><a href="https://cplusplus.github.io/CWG/issues/2737.html">2737</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>
<td>review</td>
<td>Temporary lifetime extension for reference init-captures</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2738">
<td><a href="https://cplusplus.github.io/CWG/issues/2738.html">2738</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.id.unqual">expr.prim.id.unqual</a>]</td>
<td>review</td>
<td>"denotes a destructor" is missing specification</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2739">
<td><a href="https://cplusplus.github.io/CWG/issues/2739.html">2739</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.req.nested">expr.prim.req.nested</a>]</td>
<td>open</td>
<td>Nested requirement not a constant expression</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2740">
<td><a href="https://cplusplus.github.io/CWG/issues/2740.html">2740</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>open</td>
<td>Too many objects have constexpr-unknown type</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2741">
<td><a href="https://cplusplus.github.io/CWG/issues/2741.html">2741</a></td>
+ <td>[<a href="https://wg21.link/over.ics.list">over.ics.list</a>]</td>
<td>open</td>
<td>Implicit conversion sequence from empty list to array of unknown bound</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2742">
<td><a href="https://cplusplus.github.io/CWG/issues/2742.html">2742</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>drafting</td>
<td>Guaranteed copy elision for brace-initialization from prvalue</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2743">
<td><a href="https://cplusplus.github.io/CWG/issues/2743.html">2743</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>open</td>
<td>Copying non-trivial objects nested within a union</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2744">
<td><a href="https://cplusplus.github.io/CWG/issues/2744.html">2744</a></td>
+ <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>
<td>open</td>
<td>Multiple objects of the same type at the same address</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2745">
<td><a href="https://cplusplus.github.io/CWG/issues/2745.html">2745</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD7</td>
<td>Dependent odr-use in generic lambdas</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2746">
<td><a href="https://cplusplus.github.io/CWG/issues/2746.html">2746</a></td>
+ <td>[<a href="https://wg21.link/temp.res.general">temp.res.general</a>]</td>
<td>CD7</td>
<td>Checking of default template arguments</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2747">
<td><a href="https://cplusplus.github.io/CWG/issues/2747.html">2747</a></td>
+ <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>
<td>CD7</td>
<td>Cannot depend on an already-deleted splice</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2748">
<td><a href="https://cplusplus.github.io/CWG/issues/2748.html">2748</a></td>
+ <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>
<td>CD7</td>
<td>Accessing static data members via null pointer</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2749">
<td><a href="https://cplusplus.github.io/CWG/issues/2749.html">2749</a></td>
+ <td>[<a href="https://wg21.link/expr.rel">expr.rel</a>]</td>
<td>CD7</td>
<td>Treatment of "pointer to void" for relational comparisons</td>
<td class="full" align="center">Clang 20</td>
</tr>
<tr id="2750">
<td><a href="https://cplusplus.github.io/CWG/issues/2750.html">2750</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD7</td>
<td>construct_at without constructor call</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2751">
<td><a href="https://cplusplus.github.io/CWG/issues/2751.html">2751</a></td>
+ <td>[<a href="https://wg21.link/stmt.dcl">stmt.dcl</a>]</td>
<td>NAD</td>
<td>Order of destruction for parameters for operator functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2752">
<td><a href="https://cplusplus.github.io/CWG/issues/2752.html">2752</a></td>
+ <td>[<a href="https://wg21.link/lex.fcon">lex.fcon</a>]</td>
<td>open</td>
<td>Excess-precision floating-point literals</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2753">
<td><a href="https://cplusplus.github.io/CWG/issues/2753.html">2753</a></td>
+ <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>
<td>CD7</td>
<td>Storage reuse for string literal objects and backing arrays</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2754">
<td><a href="https://cplusplus.github.io/CWG/issues/2754.html">2754</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>
<td>CD7</td>
<td>Using *this in explicit object member functions that are coroutines</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2755">
<td><a href="https://cplusplus.github.io/CWG/issues/2755.html">2755</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD7</td>
<td>Incorrect wording applied by P2738R1</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2756">
<td><a href="https://cplusplus.github.io/CWG/issues/2756.html">2756</a></td>
+ <td>[<a href="https://wg21.link/class.init">class.init</a>]</td>
<td>review</td>
<td>Completion of initialization by delegating constructor</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2757">
<td><a href="https://cplusplus.github.io/CWG/issues/2757.html">2757</a></td>
+ <td>[<a href="https://wg21.link/class.cdtor">class.cdtor</a>]</td>
<td>review</td>
<td>Deleting or deallocating storage of an object during its construction</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2758">
<td><a href="https://cplusplus.github.io/CWG/issues/2758.html">2758</a></td>
+ <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>
<td>CD7</td>
<td>What is "access and ambiguity control"?</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2759">
<td><a href="https://cplusplus.github.io/CWG/issues/2759.html">2759</a></td>
+ <td>[<a href="https://wg21.link/class.mem.general">class.mem.general</a>]</td>
<td>CD7</td>
<td>[[no_unique_address] and common initial sequence</td>
<td class="full" align="center">Clang 19</td>
</tr>
<tr id="2760">
<td><a href="https://cplusplus.github.io/CWG/issues/2760.html">2760</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD7</td>
<td>Defaulted constructor that is an immediate function</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2761">
<td><a href="https://cplusplus.github.io/CWG/issues/2761.html">2761</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>CD7</td>
<td>Implicitly invoking the deleted destructor of an anonymous union member</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2762">
<td><a href="https://cplusplus.github.io/CWG/issues/2762.html">2762</a></td>
+ <td>[<a href="https://wg21.link/over.match.funcs.general">over.match.funcs.general</a>]</td>
<td>CD7</td>
<td>Type of implicit object parameter</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2763">
<td><a href="https://cplusplus.github.io/CWG/issues/2763.html">2763</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD7</td>
<td>Ignorability of [[noreturn]] during constant evaluation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2764">
<td><a href="https://cplusplus.github.io/CWG/issues/2764.html">2764</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.scope">basic.scope.scope</a>]</td>
<td>CD7</td>
<td>Use of placeholders affecting name mangling</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2765">
<td><a href="https://cplusplus.github.io/CWG/issues/2765.html">2765</a></td>
+ <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>
<td>open</td>
<td>Address comparisons between potentially non-unique objects during constant evaluation</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2766">
<td><a href="https://cplusplus.github.io/CWG/issues/2766.html">2766</a></td>
+ <td>[<a href="https://wg21.link/lex.string">lex.string</a>]</td>
<td>open</td>
- <td>Repeated evaluation of a <I>string-literal</I> may yield different
-objects</td>
+ <td>Repeated evaluation of a <I>string-literal</I> may yield different objects</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2767">
<td><a href="https://cplusplus.github.io/CWG/issues/2767.html">2767</a></td>
+ <td>[<a href="https://wg21.link/class.union.anon">class.union.anon</a>]</td>
<td>open</td>
<td>Non-defining declarations of anonymous unions</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2768">
<td><a href="https://cplusplus.github.io/CWG/issues/2768.html">2768</a></td>
+ <td>[<a href="https://wg21.link/expr.assign">expr.assign</a>]</td>
<td>CD7</td>
<td>Assignment to enumeration variable with a <I>braced-init-list</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2769">
<td><a href="https://cplusplus.github.io/CWG/issues/2769.html">2769</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.general">temp.deduct.general</a>]</td>
<td>open</td>
<td>Substitution into template parameters and default template arguments should be interleaved</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2770">
<td><a href="https://cplusplus.github.io/CWG/issues/2770.html">2770</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.general">temp.deduct.general</a>]</td>
<td>open</td>
<td>Trailing <I>requires-clause</I> can refer to function parameters before they are substituted into</td>
<td align="center">
@@ -16476,462 +19203,539 @@ objects</td>
</tr>
<tr id="2771">
<td><a href="https://cplusplus.github.io/CWG/issues/2771.html">2771</a></td>
+ <td>[<a href="https://wg21.link/class.mfct.non.static">class.mfct.non.static</a>]</td>
<td>CD7</td>
<td>Transformation for <I>unqualified-id</I>s in address operator</td>
<td class="full" align="center">Clang 18</td>
</tr>
<tr id="2772">
<td><a href="https://cplusplus.github.io/CWG/issues/2772.html">2772</a></td>
+ <td>[<a href="https://wg21.link/diff.cpp03.dcl.dcl">diff.cpp03.dcl.dcl</a>]</td>
<td>CD7</td>
<td>Missing Annex C entry for linkage effects of <I>linkage-specification</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2773">
<td><a href="https://cplusplus.github.io/CWG/issues/2773.html">2773</a></td>
+ <td>[<a href="https://wg21.link/class.union.anon">class.union.anon</a>]</td>
<td>open</td>
<td>Naming anonymous union members as class members</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2774">
<td><a href="https://cplusplus.github.io/CWG/issues/2774.html">2774</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>
<td>open</td>
<td>Value-dependence of <I>requires-expression</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2775">
<td><a href="https://cplusplus.github.io/CWG/issues/2775.html">2775</a></td>
+ <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>
<td>CD7</td>
<td>Unclear argument type for copy of exception object</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2776">
<td><a href="https://cplusplus.github.io/CWG/issues/2776.html">2776</a></td>
+ <td>[<a href="https://wg21.link/intro.compliance.general">intro.compliance.general</a>]</td>
<td>open</td>
<td>Substitution failure and implementation limits</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2777">
<td><a href="https://cplusplus.github.io/CWG/issues/2777.html">2777</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>CD7</td>
<td>Type of <I>id-expression</I> denoting a template parameter object</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2778">
<td><a href="https://cplusplus.github.io/CWG/issues/2778.html">2778</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>review</td>
<td>Trivial destructor does not imply constant destruction</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2779">
<td><a href="https://cplusplus.github.io/CWG/issues/2779.html">2779</a></td>
+ <td>[<a href="https://wg21.link/lex.charset">lex.charset</a>]</td>
<td>open</td>
<td>Restrictions on the ordinary literal encoding</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2780">
<td><a href="https://cplusplus.github.io/CWG/issues/2780.html">2780</a></td>
+ <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>
<td>CD7</td>
<td><TT>reinterpret_cast</TT> to reference to function types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2781">
<td><a href="https://cplusplus.github.io/CWG/issues/2781.html">2781</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>open</td>
<td>Unclear recursion in the one-definition rule</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2782">
<td><a href="https://cplusplus.github.io/CWG/issues/2782.html">2782</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>open</td>
<td>Treatment of closure types in the one-definition rule</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2783">
<td><a href="https://cplusplus.github.io/CWG/issues/2783.html">2783</a></td>
+ <td>[<a href="https://wg21.link/module.global.frag">module.global.frag</a>]</td>
<td>CD7</td>
<td>Handling of deduction guides in <I>global-module-fragment</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2784">
<td><a href="https://cplusplus.github.io/CWG/issues/2784.html">2784</a></td>
+ <td>[<a href="https://wg21.link/support.types.layout">support.types.layout</a>]</td>
<td>open</td>
<td>Unclear definition of <I>member-designator</I> for <TT>offsetof</TT></td>
<td align="center">Not resolved</td>
</tr>
<tr id="2785">
<td><a href="https://cplusplus.github.io/CWG/issues/2785.html">2785</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>
<td>CD7</td>
<td>Type-dependence of <I>requires-expression</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2786">
<td><a href="https://cplusplus.github.io/CWG/issues/2786.html">2786</a></td>
+ <td>[<a href="https://wg21.link/expr.eq">expr.eq</a>]</td>
<td>open</td>
<td>Comparing pointers to complete objects</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2787">
<td><a href="https://cplusplus.github.io/CWG/issues/2787.html">2787</a></td>
+ <td>[<a href="https://wg21.link/special">special</a>]</td>
<td>open</td>
<td>Kind of explicit object copy/move assignment function</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2788">
<td><a href="https://cplusplus.github.io/CWG/issues/2788.html">2788</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.scope">basic.scope.scope</a>]</td>
<td>open</td>
<td>Correspondence and redeclarations</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2789">
<td><a href="https://cplusplus.github.io/CWG/issues/2789.html">2789</a></td>
+ <td>[<a href="https://wg21.link/over.match.best.general">over.match.best.general</a>]</td>
<td>CD7</td>
<td>Overload resolution with implicit and explicit object member functions</td>
<td class="full" align="center">Clang 18</td>
</tr>
<tr class="open" id="2790">
<td><a href="https://cplusplus.github.io/CWG/issues/2790.html">2790</a></td>
+ <td>[<a href="https://wg21.link/over.ics.list">over.ics.list</a>]</td>
<td>open</td>
<td>Aggregate initialization and user-defined conversion sequence</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2791">
<td><a href="https://cplusplus.github.io/CWG/issues/2791.html">2791</a></td>
+ <td>[<a href="https://wg21.link/stmt.return">stmt.return</a>]</td>
<td>CD7</td>
<td>Unclear phrasing about "returning to the caller"</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2792">
<td><a href="https://cplusplus.github.io/CWG/issues/2792.html">2792</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.noexcept">expr.unary.noexcept</a>]</td>
<td>CD7</td>
<td>Clean up specification of <TT>noexcept</TT> operator</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2793">
<td><a href="https://cplusplus.github.io/CWG/issues/2793.html">2793</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.block">basic.scope.block</a>]</td>
<td>CD7</td>
<td>Block-scope declaration conflicting with parameter name</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2794">
<td><a href="https://cplusplus.github.io/CWG/issues/2794.html">2794</a></td>
+ <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>
<td>open</td>
<td>Uniqueness of lambdas in alias templates</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2795">
<td><a href="https://cplusplus.github.io/CWG/issues/2795.html">2795</a></td>
+ <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>
<td>CD7</td>
<td>Overlapping empty subobjects with different cv-qualification</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2796">
<td><a href="https://cplusplus.github.io/CWG/issues/2796.html">2796</a></td>
+ <td>[<a href="https://wg21.link/expr.rel">expr.rel</a>]</td>
<td>CD7</td>
<td>Function pointer conversions for relational operators</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2797">
<td><a href="https://cplusplus.github.io/CWG/issues/2797.html">2797</a></td>
+ <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>
<td>review</td>
<td>Meaning of "corresponds" for rewritten operator candidates</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2798">
<td><a href="https://cplusplus.github.io/CWG/issues/2798.html">2798</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD7</td>
<td>Manifestly constant evaluation of the <TT>static_assert</TT> message</td>
<td class="full" align="center">Clang 17</td>
</tr>
<tr class="open" id="2799">
<td><a href="https://cplusplus.github.io/CWG/issues/2799.html">2799</a></td>
+ <td>[<a href="https://wg21.link/class.default.ctor">class.default.ctor</a>]</td>
<td>drafting</td>
<td>Inheriting default constructors</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2800">
<td><a href="https://cplusplus.github.io/CWG/issues/2800.html">2800</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>review</td>
<td>Instantiating constexpr variables for potential constant evaluation</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2801">
<td><a href="https://cplusplus.github.io/CWG/issues/2801.html">2801</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>CD7</td>
<td>Reference binding with reference-related types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2802">
<td><a href="https://cplusplus.github.io/CWG/issues/2802.html">2802</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>open</td>
<td>Constrained <TT>auto</TT> and redeclaration with non-abbreviated syntax</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2803">
<td><a href="https://cplusplus.github.io/CWG/issues/2803.html">2803</a></td>
+ <td>[<a href="https://wg21.link/over.ics.ref">over.ics.ref</a>]</td>
<td>CD7</td>
<td>Overload resolution for reference binding of similar types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2804">
<td><a href="https://cplusplus.github.io/CWG/issues/2804.html">2804</a></td>
+ <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>
<td>open</td>
<td>Lookup for determining rewrite targets</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2805">
<td><a href="https://cplusplus.github.io/CWG/issues/2805.html">2805</a></td>
+ <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>
<td>open</td>
<td>Underspecified selection of deallocation function</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2806">
<td><a href="https://cplusplus.github.io/CWG/issues/2806.html">2806</a></td>
+ <td>[<a href="https://wg21.link/temp.res.general">temp.res.general</a>]</td>
<td>CD7</td>
<td>Make a <I>type-requirement</I> a type-only context</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2807">
<td><a href="https://cplusplus.github.io/CWG/issues/2807.html">2807</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>CD7</td>
<td>Destructors declared <TT>consteval</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2808">
<td><a href="https://cplusplus.github.io/CWG/issues/2808.html">2808</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>review</td>
<td>Explicit specialization of defaulted special member function</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2809">
<td><a href="https://cplusplus.github.io/CWG/issues/2809.html">2809</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>CD7</td>
<td>An implicit definition does not redeclare a function</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2810">
<td><a href="https://cplusplus.github.io/CWG/issues/2810.html">2810</a></td>
+ <td>[<a href="https://wg21.link/temp.res.general">temp.res.general</a>]</td>
<td>CD7</td>
<td>Requiring the absence of diagnostics for templates</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2811">
<td><a href="https://cplusplus.github.io/CWG/issues/2811.html">2811</a></td>
+ <td>[<a href="https://wg21.link/basic.start.main">basic.start.main</a>]</td>
<td>CD7</td>
<td>Clarify "use" of main</td>
<td class="full" align="center">Clang 3.5</td>
</tr>
<tr class="open" id="2812">
<td><a href="https://cplusplus.github.io/CWG/issues/2812.html">2812</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>open</td>
<td>Allocation with explicit alignment</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2813">
<td><a href="https://cplusplus.github.io/CWG/issues/2813.html">2813</a></td>
+ <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>
<td>CD7</td>
<td>Class member access with prvalues</td>
<td class="full" align="center">Clang 20</td>
</tr>
<tr id="2814">
<td><a href="https://cplusplus.github.io/CWG/issues/2814.html">2814</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>NAD</td>
<td>Alignment requirement of incomplete class type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2815">
<td><a href="https://cplusplus.github.io/CWG/issues/2815.html">2815</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>CD7</td>
<td>Overload resolution for references/pointers to <TT>noexcept</TT> functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2816">
<td><a href="https://cplusplus.github.io/CWG/issues/2816.html">2816</a></td>
+ <td>[<a href="https://wg21.link/intro.progress">intro.progress</a>]</td>
<td>review</td>
<td>Unclear phrasing "may assume ... eventually"</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2817">
<td><a href="https://cplusplus.github.io/CWG/issues/2817.html">2817</a></td>
+ <td>[<a href="https://wg21.link/expr.sizeof">expr.sizeof</a>]</td>
<td>open</td>
<td>sizeof(abstract class) is underspecified</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2818">
<td><a href="https://cplusplus.github.io/CWG/issues/2818.html">2818</a></td>
+ <td>[<a href="https://wg21.link/lex.name">lex.name</a>]</td>
<td>CD7</td>
<td>Use of predefined reserved identifiers</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2819">
<td><a href="https://cplusplus.github.io/CWG/issues/2819.html">2819</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD7</td>
<td>Cast from null pointer value in a constant expression</td>
<td class="full" align="center">Clang 19 (C++26 onwards)</td>
</tr>
<tr id="2820">
<td><a href="https://cplusplus.github.io/CWG/issues/2820.html">2820</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.general">dcl.init.general</a>]</td>
<td>CD7</td>
<td>Value-initialization and default constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2821">
<td><a href="https://cplusplus.github.io/CWG/issues/2821.html">2821</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>review</td>
<td>Lifetime, zero-initialization, and dynamic initialization</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2822">
<td><a href="https://cplusplus.github.io/CWG/issues/2822.html">2822</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.general">basic.stc.general</a>]</td>
<td>CD7</td>
<td>Side-effect-free pointer zap</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2823">
<td><a href="https://cplusplus.github.io/CWG/issues/2823.html">2823</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>
<td>CD7</td>
<td>Implicit undefined behavior when dereferencing pointers</td>
<td class="none" align="center">No</td>
</tr>
<tr id="2824">
<td><a href="https://cplusplus.github.io/CWG/issues/2824.html">2824</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.general">dcl.init.general</a>]</td>
<td>CD7</td>
<td>Copy-initialization of arrays</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2825">
<td><a href="https://cplusplus.github.io/CWG/issues/2825.html">2825</a></td>
+ <td>[<a href="https://wg21.link/stmt.ranged">stmt.ranged</a>]</td>
<td>CD7</td>
<td>Range-based for statement using a <I>braced-init-list</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2826">
<td><a href="https://cplusplus.github.io/CWG/issues/2826.html">2826</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>drafting</td>
<td>Missing definition of "temporary expression"</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2827">
<td><a href="https://cplusplus.github.io/CWG/issues/2827.html">2827</a></td>
+ <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>
<td>review</td>
<td>Representation of unsigned integral types</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2828">
<td><a href="https://cplusplus.github.io/CWG/issues/2828.html">2828</a></td>
+ <td>[<a href="https://wg21.link/expr.cast">expr.cast</a>]</td>
<td>CD7</td>
<td>Ambiguous interpretation of C-style cast</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2829">
<td><a href="https://cplusplus.github.io/CWG/issues/2829.html">2829</a></td>
+ <td>[<a href="https://wg21.link/over.best.ics.general">over.best.ics.general</a>]</td>
<td>open</td>
<td>Redundant case in restricting user-defined conversion sequences</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2830">
<td><a href="https://cplusplus.github.io/CWG/issues/2830.html">2830</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD7</td>
<td>Top-level cv-qualification should be ignored for list-initialization</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2831">
<td><a href="https://cplusplus.github.io/CWG/issues/2831.html">2831</a></td>
+ <td>[<a href="https://wg21.link/dcl.decl.general">dcl.decl.general</a>]</td>
<td>CD7</td>
<td>Non-templated function definitions and <I>requires-clause</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2832">
<td><a href="https://cplusplus.github.io/CWG/issues/2832.html">2832</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>open</td>
<td>Invented temporary variables and temporary objects</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2833">
<td><a href="https://cplusplus.github.io/CWG/issues/2833.html">2833</a></td>
+ <td>[<a href="https://wg21.link/basic.start.dynamic">basic.start.dynamic</a>]</td>
<td>review</td>
<td>Evaluation of odr-use</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2834">
<td><a href="https://cplusplus.github.io/CWG/issues/2834.html">2834</a></td>
+ <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>
<td>review</td>
<td>Partial ordering and explicit object parameters</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2835">
<td><a href="https://cplusplus.github.io/CWG/issues/2835.html">2835</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.scope">basic.scope.scope</a>]</td>
<td>open</td>
<td>Name-independent declarations</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2836">
<td><a href="https://cplusplus.github.io/CWG/issues/2836.html">2836</a></td>
+ <td>[<a href="https://wg21.link/conv.rank">conv.rank</a>]</td>
<td>CD7</td>
<td>Conversion rank of <TT>long double</TT> and extended floating-point types</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2837">
<td><a href="https://cplusplus.github.io/CWG/issues/2837.html">2837</a></td>
+ <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>
<td>open</td>
<td>Instantiating and inheriting by-value copy constructors</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2838">
<td><a href="https://cplusplus.github.io/CWG/issues/2838.html">2838</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.block">basic.scope.block</a>]</td>
<td>open</td>
<td>Declaration conflicts in <I>lambda-expression</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2839">
<td><a href="https://cplusplus.github.io/CWG/issues/2839.html">2839</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>open</td>
<td>Explicit destruction of base classes</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2840">
<td><a href="https://cplusplus.github.io/CWG/issues/2840.html">2840</a></td>
+ <td>[<a href="https://wg21.link/basic.align">basic.align</a>]</td>
<td>open</td>
<td>Missing requirements for fundamental alignments</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2841">
<td><a href="https://cplusplus.github.io/CWG/issues/2841.html">2841</a></td>
+ <td>[<a href="https://wg21.link/class.ctor.general">class.ctor.general</a>]</td>
<td>open</td>
<td>When do const objects start being const?</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2842">
<td><a href="https://cplusplus.github.io/CWG/issues/2842.html">2842</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>open</td>
<td>Preferring an <TT>initializer_list</TT> over a single value</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2843">
<td><a href="https://cplusplus.github.io/CWG/issues/2843.html">2843</a></td>
+ <td>[<a href="https://wg21.link/intro.refs">intro.refs</a>]</td>
<td>CD7</td>
<td>Undated reference to Unicode makes C++ a moving target</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2844">
<td><a href="https://cplusplus.github.io/CWG/issues/2844.html">2844</a></td>
+ <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>
<td>open</td>
<td>Enumerating a finite set of built-in candidates</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2845">
<td><a href="https://cplusplus.github.io/CWG/issues/2845.html">2845</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD7</td>
<td>Make the closure type of a captureless lambda a structural type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2846">
<td><a href="https://cplusplus.github.io/CWG/issues/2846.html">2846</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>CD7</td>
<td>Out-of-class definitions of explicit object member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2847">
<td><a href="https://cplusplus.github.io/CWG/issues/2847.html">2847</a></td>
+ <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>
<td>review</td>
<td>Constrained explicit specializations of function templates at class scope</td>
<td align="center">
@@ -16942,228 +19746,266 @@ objects</td>
</tr>
<tr id="2848">
<td><a href="https://cplusplus.github.io/CWG/issues/2848.html">2848</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>CD7</td>
<td>Omitting an empty template argument list for explicit instantiation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2849">
<td><a href="https://cplusplus.github.io/CWG/issues/2849.html">2849</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>CD7</td>
<td>Parameter objects are not temporary objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2850">
<td><a href="https://cplusplus.github.io/CWG/issues/2850.html">2850</a></td>
+ <td>[<a href="https://wg21.link/basic.stc">basic.stc</a>]</td>
<td>CD7</td>
<td>Unclear storage duration for function parameter objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2851">
<td><a href="https://cplusplus.github.io/CWG/issues/2851.html">2851</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD7</td>
<td>Allow floating-point conversions in converted constant expressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2852">
<td><a href="https://cplusplus.github.io/CWG/issues/2852.html">2852</a></td>
+ <td>[<a href="https://wg21.link/class.mem.general">class.mem.general</a>]</td>
<td>open</td>
<td>Complete-class contexts and class-scope lambdas</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2853">
<td><a href="https://cplusplus.github.io/CWG/issues/2853.html">2853</a></td>
+ <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>
<td>CD7</td>
<td>Pointer arithmetic with pointer to hypothetical element</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2854">
<td><a href="https://cplusplus.github.io/CWG/issues/2854.html">2854</a></td>
+ <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>
<td>CD7</td>
<td>Storage duration of exception objects</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2855">
<td><a href="https://cplusplus.github.io/CWG/issues/2855.html">2855</a></td>
+ <td>[<a href="https://wg21.link/expr.post.incr">expr.post.incr</a>]</td>
<td>CD7</td>
<td>Undefined behavior in postfix increment</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2856">
<td><a href="https://cplusplus.github.io/CWG/issues/2856.html">2856</a></td>
+ <td>[<a href="https://wg21.link/over.match.list">over.match.list</a>]</td>
<td>CD7</td>
<td>Copy-list-initialization with explicit default constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2857">
<td><a href="https://cplusplus.github.io/CWG/issues/2857.html">2857</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>CD7</td>
<td>Argument-dependent lookup with incomplete class types</td>
<td class="none" align="center">No</td>
</tr>
<tr id="2858">
<td><a href="https://cplusplus.github.io/CWG/issues/2858.html">2858</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.id.qual">expr.prim.id.qual</a>]</td>
<td>CD7</td>
<td>Declarative <I>nested-name-specifier</I>s and <I>pack-index-specifier</I>s</td>
<td class="full" align="center">Clang 19</td>
</tr>
<tr id="2859">
<td><a href="https://cplusplus.github.io/CWG/issues/2859.html">2859</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.general">dcl.init.general</a>]</td>
<td>CD7</td>
<td>Value-initialization with multiple default constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2860">
<td><a href="https://cplusplus.github.io/CWG/issues/2860.html">2860</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>dup</td>
<td>Remove and fix the term "vacuous initialization"</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2861">
<td><a href="https://cplusplus.github.io/CWG/issues/2861.html">2861</a></td>
+ <td>[<a href="https://wg21.link/expr.dynamic.cast">expr.dynamic.cast</a>]</td>
<td>CD7</td>
<td><TT>dynamic_cast</TT> on bad pointer value</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2862">
<td><a href="https://cplusplus.github.io/CWG/issues/2862.html">2862</a></td>
+ <td>[<a href="https://wg21.link/temp.pre">temp.pre</a>]</td>
<td>review</td>
<td>Unclear boundaries of template declarations</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2863">
<td><a href="https://cplusplus.github.io/CWG/issues/2863.html">2863</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>drafting</td>
<td>Unclear synchronization requirements for object lifetime rules</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2864">
<td><a href="https://cplusplus.github.io/CWG/issues/2864.html">2864</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>CD7</td>
<td>Narrowing floating-point conversions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2865">
<td><a href="https://cplusplus.github.io/CWG/issues/2865.html">2865</a></td>
+ <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>
<td>CD7</td>
<td>Regression on result of conditional operator</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2866">
<td><a href="https://cplusplus.github.io/CWG/issues/2866.html">2866</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr">dcl.attr</a>]</td>
<td>open</td>
<td>Observing the effects of <TT>[[no_unique_address]]</TT></td>
<td align="center">Not resolved</td>
</tr>
<tr id="2867">
<td><a href="https://cplusplus.github.io/CWG/issues/2867.html">2867</a></td>
+ <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>
<td>CD7</td>
<td>Order of initialization for structured bindings</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2868">
<td><a href="https://cplusplus.github.io/CWG/issues/2868.html">2868</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>open</td>
<td>Self-references in trivially copyable objects as function return values</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2869">
<td><a href="https://cplusplus.github.io/CWG/issues/2869.html">2869</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.this">expr.prim.this</a>]</td>
<td>CD7</td>
<td><TT>this</TT> in local classes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2870">
<td><a href="https://cplusplus.github.io/CWG/issues/2870.html">2870</a></td>
+ <td>[<a href="https://wg21.link/lex.string">lex.string</a>]</td>
<td>CD7</td>
<td>Combining absent <I>encoding-prefix</I>es</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2871">
<td><a href="https://cplusplus.github.io/CWG/issues/2871.html">2871</a></td>
+ <td>[<a href="https://wg21.link/class.default.ctor">class.default.ctor</a>]</td>
<td>CD7</td>
<td>User-declared constructor templates inhibiting default constructors</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2872">
<td><a href="https://cplusplus.github.io/CWG/issues/2872.html">2872</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>CD7</td>
<td>Linkage and unclear "can be referred to"</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2873">
<td><a href="https://cplusplus.github.io/CWG/issues/2873.html">2873</a></td>
+ <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>
<td>open</td>
<td>Taking the address of a function involving template argument deduction</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2874">
<td><a href="https://cplusplus.github.io/CWG/issues/2874.html">2874</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.elab">dcl.type.elab</a>]</td>
<td>CD7</td>
<td>Qualified declarations of partial specializations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2875">
<td><a href="https://cplusplus.github.io/CWG/issues/2875.html">2875</a></td>
+ <td>[<a href="https://wg21.link/diff.expr">diff.expr</a>]</td>
<td>tentatively ready</td>
<td>Missing support for round-tripping null pointer values through indirection/address operators</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2876">
<td><a href="https://cplusplus.github.io/CWG/issues/2876.html">2876</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.general">dcl.fct.def.general</a>]</td>
<td>CD7</td>
<td>Disambiguation of <TT>T x = delete("text")</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2877">
<td><a href="https://cplusplus.github.io/CWG/issues/2877.html">2877</a></td>
+ <td>[<a href="https://wg21.link/enum.udecl">enum.udecl</a>]</td>
<td>CD7</td>
<td>Type-only lookup for <I>using-enum-declarator</I></td>
<td class="full" align="center">Clang 19</td>
</tr>
<tr class="open" id="2878">
<td><a href="https://cplusplus.github.io/CWG/issues/2878.html">2878</a></td>
+ <td>[<a href="https://wg21.link/expr.cast">expr.cast</a>]</td>
<td>open</td>
<td>C-style casts to reference types</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2879">
<td><a href="https://cplusplus.github.io/CWG/issues/2879.html">2879</a></td>
+ <td>[<a href="https://wg21.link/expr.const.cast">expr.const.cast</a>]</td>
<td>CD7</td>
<td>Undesired outcomes with <TT>const_cast</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2880">
<td><a href="https://cplusplus.github.io/CWG/issues/2880.html">2880</a></td>
+ <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>
<td>CD7</td>
<td>Accessibility check for destructor of incomplete class type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2881">
<td><a href="https://cplusplus.github.io/CWG/issues/2881.html">2881</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>
<td>CD7</td>
<td>Type restrictions for the explicit object parameter of a lambda</td>
<td class="full" align="center">Clang 19</td>
</tr>
<tr id="2882">
<td><a href="https://cplusplus.github.io/CWG/issues/2882.html">2882</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>CD7</td>
<td>Unclear treatment of conversion to <TT>void</TT></td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="2883">
<td><a href="https://cplusplus.github.io/CWG/issues/2883.html">2883</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD7</td>
<td>Definition of "odr-usable" ignores lambda scopes</td>
<td class="none" align="center">No</td>
</tr>
<tr id="2884">
<td><a href="https://cplusplus.github.io/CWG/issues/2884.html">2884</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.elab">dcl.type.elab</a>]</td>
<td>dup</td>
<td>Qualified declarations of partial specializations</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2885">
<td><a href="https://cplusplus.github.io/CWG/issues/2885.html">2885</a></td>
+ <td>[<a href="https://wg21.link/class.default.ctor">class.default.ctor</a>]</td>
<td>review</td>
<td>Non-eligible trivial default constructors</td>
<td align="center">
@@ -17174,192 +20016,224 @@ objects</td>
</tr>
<tr id="2886">
<td><a href="https://cplusplus.github.io/CWG/issues/2886.html">2886</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>CD7</td>
<td>Temporaries and trivial potentially-throwing special member functions</td>
<td class="full" align="center">Clang 9</td>
</tr>
<tr id="2887">
<td><a href="https://cplusplus.github.io/CWG/issues/2887.html">2887</a></td>
+ <td>[<a href="https://wg21.link/diff.cpp03.expr">diff.cpp03.expr</a>]</td>
<td>CD7</td>
<td>Missing compatibility entries for xvalues</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2888">
<td><a href="https://cplusplus.github.io/CWG/issues/2888.html">2888</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>
<td>review</td>
<td>Missing cases for reference and array types for argument-dependent lookup</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2889">
<td><a href="https://cplusplus.github.io/CWG/issues/2889.html">2889</a></td>
+ <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>
<td>open</td>
<td>Requiring an accessible destructor for destroying operator delete</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2890">
<td><a href="https://cplusplus.github.io/CWG/issues/2890.html">2890</a></td>
+ <td>[<a href="https://wg21.link/class.local">class.local</a>]</td>
<td>CD7</td>
<td>Defining members of local classes</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2891">
<td><a href="https://cplusplus.github.io/CWG/issues/2891.html">2891</a></td>
+ <td>[<a href="https://wg21.link/implimits">implimits</a>]</td>
<td>CD7</td>
<td>Normative status of implementation limits</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2892">
<td><a href="https://cplusplus.github.io/CWG/issues/2892.html">2892</a></td>
+ <td>[<a href="https://wg21.link/expr.arith.conv">expr.arith.conv</a>]</td>
<td>CD7</td>
<td>Unclear usual arithmetic conversions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2893">
<td><a href="https://cplusplus.github.io/CWG/issues/2893.html">2893</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>NAD</td>
<td>Instantiations in discarded <TT>if constexpr</TT> substatements</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2894">
<td><a href="https://cplusplus.github.io/CWG/issues/2894.html">2894</a></td>
+ <td>[<a href="https://wg21.link/expr.type.conv">expr.type.conv</a>]</td>
<td>CD7</td>
<td>Functional casts create prvalues of reference type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2895">
<td><a href="https://cplusplus.github.io/CWG/issues/2895.html">2895</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.general">dcl.init.general</a>]</td>
<td>CD7</td>
<td>Initialization should ignore the destination type's cv-qualification</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2896">
<td><a href="https://cplusplus.github.io/CWG/issues/2896.html">2896</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>
<td>review</td>
<td>Template argument deduction involving exception specifications</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2897">
<td><a href="https://cplusplus.github.io/CWG/issues/2897.html">2897</a></td>
+ <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>
<td>open</td>
<td>Copying potentially-overlapping union subobjects</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2898">
<td><a href="https://cplusplus.github.io/CWG/issues/2898.html">2898</a></td>
+ <td>[<a href="https://wg21.link/over.best.ics.general">over.best.ics.general</a>]</td>
<td>CD7</td>
<td>Clarify implicit conversion sequence from <I>cv</I> <TT>T</TT> to <TT>T</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2899">
<td><a href="https://cplusplus.github.io/CWG/issues/2899.html">2899</a></td>
+ <td>[<a href="https://wg21.link/conv.lval">conv.lval</a>]</td>
<td>CD7</td>
<td>Bad value representations should cause undefined behavior</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2900">
<td><a href="https://cplusplus.github.io/CWG/issues/2900.html">2900</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>open</td>
<td>Deduction of non-type template arguments with placeholder types</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2901">
<td><a href="https://cplusplus.github.io/CWG/issues/2901.html">2901</a></td>
+ <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>
<td>CD7</td>
<td>Unclear semantics for near-match aliased access</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2902">
<td><a href="https://cplusplus.github.io/CWG/issues/2902.html">2902</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.id.general">expr.prim.id.general</a>]</td>
<td>review</td>
<td>Implicit <TT>this</TT> transformation outside of permitted contexts</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2903">
<td><a href="https://cplusplus.github.io/CWG/issues/2903.html">2903</a></td>
+ <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>
<td>drafting</td>
<td>Can we omit the <TT>template</TT> disambiguator in <I>nested-name-specifier</I>s in type-only contexts?</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2904">
<td><a href="https://cplusplus.github.io/CWG/issues/2904.html">2904</a></td>
+ <td>[<a href="https://wg21.link/temp.pre">temp.pre</a>]</td>
<td>open</td>
<td>Introducing <I>template-name</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2905">
<td><a href="https://cplusplus.github.io/CWG/issues/2905.html">2905</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>
<td>CD7</td>
<td>Value-dependence of <I>noexcept-expression</I></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2906">
<td><a href="https://cplusplus.github.io/CWG/issues/2906.html">2906</a></td>
+ <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>
<td>CD7</td>
<td>Lvalue-to-rvalue conversion of class types for conditional operator</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2907">
<td><a href="https://cplusplus.github.io/CWG/issues/2907.html">2907</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD7</td>
<td>Constant lvalue-to-rvalue conversion on uninitialized <TT>std::nullptr_t</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2908">
<td><a href="https://cplusplus.github.io/CWG/issues/2908.html">2908</a></td>
+ <td>[<a href="https://wg21.link/cpp.line">cpp.line</a>]</td>
<td>CD7</td>
<td>Counting physical source lines for <TT>__LINE__</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2909">
<td><a href="https://cplusplus.github.io/CWG/issues/2909.html">2909</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD7</td>
<td>Subtle difference between constant-initialized and constexpr</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2910">
<td><a href="https://cplusplus.github.io/CWG/issues/2910.html">2910</a></td>
+ <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>
<td>CD7</td>
<td>Effect of <I>requirement-parameter-list</I>s on odr-usability</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2911">
<td><a href="https://cplusplus.github.io/CWG/issues/2911.html">2911</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.req.general">expr.prim.req.general</a>]</td>
<td>CD7</td>
<td>Unclear meaning of expressions "appearing within" subexpressions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2912">
<td><a href="https://cplusplus.github.io/CWG/issues/2912.html">2912</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>open</td>
<td>Too-large value for size in array new</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2913">
<td><a href="https://cplusplus.github.io/CWG/issues/2913.html">2913</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.guide">temp.deduct.guide</a>]</td>
<td>CD7</td>
<td>Grammar for <I>deduction-guide</I> has <I>requires-clause</I> in the wrong position</td>
<td class="full" align="center">Clang 20</td>
</tr>
<tr class="open" id="2914">
<td><a href="https://cplusplus.github.io/CWG/issues/2914.html">2914</a></td>
+ <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>
<td>review</td>
<td>Unclear order of initialization of static and thread-local variables</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2915">
<td><a href="https://cplusplus.github.io/CWG/issues/2915.html">2915</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>CD7</td>
<td>Explicit object parameters of type <TT>void</TT></td>
<td class="full" align="center">Clang 20</td>
</tr>
<tr class="open" id="2916">
<td><a href="https://cplusplus.github.io/CWG/issues/2916.html">2916</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>
<td>review</td>
<td>Variable template partial specializations should not be declared <TT>static</TT></td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2917">
<td><a href="https://cplusplus.github.io/CWG/issues/2917.html">2917</a></td>
+ <td>[<a href="https://wg21.link/temp.pre">temp.pre</a>]</td>
<td>review</td>
<td>Disallow multiple <I>friend-type-specifier</I>s for a friend template</td>
<td align="center">
@@ -17370,528 +20244,616 @@ objects</td>
</tr>
<tr id="2918">
<td><a href="https://cplusplus.github.io/CWG/issues/2918.html">2918</a></td>
+ <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>
<td>CD7</td>
<td>Consideration of constraints for address of overloaded function</td>
<td class="full" align="center">Clang 21</td>
</tr>
<tr id="2919">
<td><a href="https://cplusplus.github.io/CWG/issues/2919.html">2919</a></td>
+ <td>[<a href="https://wg21.link/over.match.ref">over.match.ref</a>]</td>
<td>CD7</td>
<td>Conversion function candidates for initialization of const lvalue reference</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2920">
<td><a href="https://cplusplus.github.io/CWG/issues/2920.html">2920</a></td>
+ <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>
<td>open</td>
<td>The <TT>template</TT> keyword for base classes</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2921">
<td><a href="https://cplusplus.github.io/CWG/issues/2921.html">2921</a></td>
+ <td>[<a href="https://wg21.link/module.interface">module.interface</a>]</td>
<td>CD7</td>
<td>Exporting redeclarations of entities not attached to a named module</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2922">
<td><a href="https://cplusplus.github.io/CWG/issues/2922.html">2922</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>CD7</td>
<td>constexpr placement-new is too permissive</td>
<td class="full" align="center">Clang 20</td>
</tr>
<tr class="open" id="2923">
<td><a href="https://cplusplus.github.io/CWG/issues/2923.html">2923</a></td>
+ <td>[<a href="https://wg21.link/intro.progress">intro.progress</a>]</td>
<td>tentatively ready</td>
<td>Note about infinite loops and execution steps</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2924">
<td><a href="https://cplusplus.github.io/CWG/issues/2924.html">2924</a></td>
+ <td>[<a href="https://wg21.link/defns.undefined">defns.undefined</a>]</td>
<td>CD7</td>
<td>Undefined behavior during constant evaluation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2925">
<td><a href="https://cplusplus.github.io/CWG/issues/2925.html">2925</a></td>
+ <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>
<td>NAD</td>
<td>Deleting a pointer to an incomplete enumeration type</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2926">
<td><a href="https://cplusplus.github.io/CWG/issues/2926.html">2926</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.qual.general">basic.lookup.qual.general</a>]</td>
<td>drafting</td>
<td>Lookup context for dependent qualified names</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2927">
<td><a href="https://cplusplus.github.io/CWG/issues/2927.html">2927</a></td>
+ <td>[<a href="https://wg21.link/cpp.pre">cpp.pre</a>]</td>
<td>CD7</td>
<td>Unclear status of translation unit with <TT>module</TT> keyword</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2928">
<td><a href="https://cplusplus.github.io/CWG/issues/2928.html">2928</a></td>
+ <td>[<a href="https://wg21.link/basic.start.dynamic">basic.start.dynamic</a>]</td>
<td>open</td>
<td>No ordering for initializing thread-local variables</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2929">
<td><a href="https://cplusplus.github.io/CWG/issues/2929.html">2929</a></td>
+ <td>[<a href="https://wg21.link/basic.start.term">basic.start.term</a>]</td>
<td>review</td>
<td>Lifetime of trivially-destructible static or thread-local objects</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2930">
<td><a href="https://cplusplus.github.io/CWG/issues/2930.html">2930</a></td>
+ <td>[<a href="https://wg21.link/class.copy.elision">class.copy.elision</a>]</td>
<td>CD7</td>
<td>Unclear term "copy/move operation" in specification of copy elision</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2931">
<td><a href="https://cplusplus.github.io/CWG/issues/2931.html">2931</a></td>
+ <td>[<a href="https://wg21.link/over.oper.general">over.oper.general</a>]</td>
<td>CD7</td>
<td>Restrictions on operator functions that are explicit object member functions</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2932">
<td><a href="https://cplusplus.github.io/CWG/issues/2932.html">2932</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>review</td>
<td>Value range of empty enumeration</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2933">
<td><a href="https://cplusplus.github.io/CWG/issues/2933.html">2933</a></td>
+ <td>[<a href="https://wg21.link/expr.type">expr.type</a>]</td>
<td>CD7</td>
<td>Dangling references</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2934">
<td><a href="https://cplusplus.github.io/CWG/issues/2934.html">2934</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>
<td>open</td>
<td>Unclear semantics of exception escaping from <TT>unhandled_exception</TT></td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2935">
<td><a href="https://cplusplus.github.io/CWG/issues/2935.html">2935</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>
<td>open</td>
<td>Destroying the coroutine state when initial-await-resume-called is false</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2936">
<td><a href="https://cplusplus.github.io/CWG/issues/2936.html">2936</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>
<td>CD7</td>
<td>Local classes of templated functions should be part of the current instantiation</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2937">
<td><a href="https://cplusplus.github.io/CWG/issues/2937.html">2937</a></td>
+ <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>
<td>CD7</td>
<td>Grammar for <I>preprocessing-file</I> has no normative effect</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2938">
<td><a href="https://cplusplus.github.io/CWG/issues/2938.html">2938</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>open</td>
<td>Inheriting linkage from a previous declaration</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2939">
<td><a href="https://cplusplus.github.io/CWG/issues/2939.html">2939</a></td>
+ <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>
<td>CD7</td>
<td>Do not allow <TT>reinterpret_cast</TT> from prvalue to rvalue reference</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2940">
<td><a href="https://cplusplus.github.io/CWG/issues/2940.html">2940</a></td>
+ <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>
<td>review</td>
<td>Definition of "object"</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2941">
<td><a href="https://cplusplus.github.io/CWG/issues/2941.html">2941</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>open</td>
<td>Lifetime extension for function-style cast to reference type</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2942">
<td><a href="https://cplusplus.github.io/CWG/issues/2942.html">2942</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>
<td>open</td>
<td>Packs in a function's parameter-type-list</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2943">
<td><a href="https://cplusplus.github.io/CWG/issues/2943.html">2943</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.nodiscard">dcl.attr.nodiscard</a>]</td>
<td>CD7</td>
<td>Discarding a void return value</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="2944">
<td><a href="https://cplusplus.github.io/CWG/issues/2944.html">2944</a></td>
+ <td>[<a href="https://wg21.link/expr.throw">expr.throw</a>]</td>
<td>CD7</td>
<td>Unsequenced <I>throw-expression</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2945">
<td><a href="https://cplusplus.github.io/CWG/issues/2945.html">2945</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>open</td>
<td>Redundant constraints on matching function template declarations</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2946">
<td><a href="https://cplusplus.github.io/CWG/issues/2946.html">2946</a></td>
+ <td>[<a href="https://wg21.link/temp.over.link">temp.over.link</a>]</td>
<td>open</td>
<td>Dependent call equivalence in non-ADL cases</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2947">
<td><a href="https://cplusplus.github.io/CWG/issues/2947.html">2947</a></td>
+ <td>[<a href="https://wg21.link/cpp.module">cpp.module</a>]</td>
<td>open</td>
<td>Limiting macro expansion in <I>pp-module</I></td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2948">
<td><a href="https://cplusplus.github.io/CWG/issues/2948.html">2948</a></td>
+ <td>[<a href="https://wg21.link/temp.spec.partial.general">temp.spec.partial.general</a>]</td>
<td>open</td>
<td>Late ambiguity for partial template specialization</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2949">
<td><a href="https://cplusplus.github.io/CWG/issues/2949.html">2949</a></td>
+ <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>
<td>open</td>
<td>Treatment of ellipsis during partial ordering</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2950">
<td><a href="https://cplusplus.github.io/CWG/issues/2950.html">2950</a></td>
+ <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>
<td>open</td>
<td>Value preservation in enumeration vs. integer bit-fields</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2951">
<td><a href="https://cplusplus.github.io/CWG/issues/2951.html">2951</a></td>
+ <td>[<a href="https://wg21.link/temp.decls.general">temp.decls.general</a>]</td>
<td>open</td>
<td>Distinguishing a primary template</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2952">
<td><a href="https://cplusplus.github.io/CWG/issues/2952.html">2952</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>open</td>
<td>Vacuous initialization for subobjects</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2953">
<td><a href="https://cplusplus.github.io/CWG/issues/2953.html">2953</a></td>
+ <td>[<a href="https://wg21.link/basic.types.general">basic.types.general</a>]</td>
<td>open</td>
<td>Value representation for non-trivially-copyable types</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2954">
<td><a href="https://cplusplus.github.io/CWG/issues/2954.html">2954</a></td>
+ <td>[<a href="https://wg21.link/intro.races">intro.races</a>]</td>
<td>NAD</td>
<td>Simultaneous modifications of an atomic object</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2955">
<td><a href="https://cplusplus.github.io/CWG/issues/2955.html">2955</a></td>
+ <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>
<td>open</td>
<td>Unify rules about conflicting unordered accesses</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2956">
<td><a href="https://cplusplus.github.io/CWG/issues/2956.html">2956</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.qual.general">basic.lookup.qual.general</a>]</td>
<td>open</td>
<td>Missing allowance for pseudo-destructors in qualified lookup</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2957">
<td><a href="https://cplusplus.github.io/CWG/issues/2957.html">2957</a></td>
+ <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>
<td>open</td>
<td>Evaluating a reference member should constitute access</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2958">
<td><a href="https://cplusplus.github.io/CWG/issues/2958.html">2958</a></td>
+ <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>
<td>open</td>
<td>Overload resolution involving lvalue transformation and qualification conversion</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2959">
<td><a href="https://cplusplus.github.io/CWG/issues/2959.html">2959</a></td>
+ <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>
<td>open</td>
<td>Naming enumerators in class member access expressions</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2960">
<td><a href="https://cplusplus.github.io/CWG/issues/2960.html">2960</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>open</td>
<td>Introduce discontiguous object lifetime</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2961">
<td><a href="https://cplusplus.github.io/CWG/issues/2961.html">2961</a></td>
+ <td>[<a href="https://wg21.link/temp.constr">temp.constr</a>]</td>
<td>open</td>
<td>Checking of ill-formed types in <I>constraint-expression</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2962">
<td><a href="https://cplusplus.github.io/CWG/issues/2962.html">2962</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>open</td>
<td>Evaluation of destructor call for variable with constant destruction</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2963">
<td><a href="https://cplusplus.github.io/CWG/issues/2963.html">2963</a></td>
+ <td>[<a href="https://wg21.link/stmt.ambig">stmt.ambig</a>]</td>
<td>open</td>
<td>Paradoxical variable-or-function declaration</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2964">
<td><a href="https://cplusplus.github.io/CWG/issues/2964.html">2964</a></td>
+ <td>[<a href="https://wg21.link/conv.lval">conv.lval</a>]</td>
<td>open</td>
<td>Reading "invalid pointer values"</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2965">
<td><a href="https://cplusplus.github.io/CWG/issues/2965.html">2965</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.temp">basic.scope.temp</a>]</td>
<td>open</td>
<td>Generic lambdas do not have a template parameter scope</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2966">
<td><a href="https://cplusplus.github.io/CWG/issues/2966.html">2966</a></td>
+ <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>
<td>open</td>
<td>Alignment and value representation of <TT>std::nullptr_t</TT></td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2967">
<td><a href="https://cplusplus.github.io/CWG/issues/2967.html">2967</a></td>
+ <td>[<a href="https://wg21.link/over.match.ref">over.match.ref</a>]</td>
<td>open</td>
<td>Explicit conversion functions</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2968">
<td><a href="https://cplusplus.github.io/CWG/issues/2968.html">2968</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.general">basic.lookup.general</a>]</td>
<td>open</td>
<td>Name lookup result for <I>typedef-name</I> vs. <I>class-name</I></td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2969">
<td><a href="https://cplusplus.github.io/CWG/issues/2969.html">2969</a></td>
+ <td>[<a href="https://wg21.link/basic.scope">basic.scope</a>]</td>
<td>open</td>
<td>Scopes in the <I>function-try-block</I> of a constructor</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2970">
<td><a href="https://cplusplus.github.io/CWG/issues/2970.html">2970</a></td>
+ <td>[<a href="https://wg21.link/intro.races">intro.races</a>]</td>
<td>CD7</td>
<td>Races with <TT>volatile sig_atomic_t</TT> bit-fields</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2971">
<td><a href="https://cplusplus.github.io/CWG/issues/2971.html">2971</a></td>
+ <td>[<a href="https://wg21.link/module.global.frag">module.global.frag</a>]</td>
<td>open</td>
<td>Specializations for a class are not decl-reachable</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2972">
<td><a href="https://cplusplus.github.io/CWG/issues/2972.html">2972</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.id.qual">expr.prim.id.qual</a>]</td>
<td>open</td>
<td>Declarative <I>nested-name-specifier</I> naming a partial specialization</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2973">
<td><a href="https://cplusplus.github.io/CWG/issues/2973.html">2973</a></td>
+ <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>
<td>open</td>
<td>Does an <I>alias-declaration</I> introduce a name for linkage purposes?</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2974">
<td><a href="https://cplusplus.github.io/CWG/issues/2974.html">2974</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>
<td>open</td>
<td>Non-deduced context for <I>qualified-id</I> naming a template</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2975">
<td><a href="https://cplusplus.github.io/CWG/issues/2975.html">2975</a></td>
+ <td>[<a href="https://wg21.link/temp.constr.normal">temp.constr.normal</a>]</td>
<td>open</td>
<td>Effect of concept <I>template-head</I> on parameter mappings</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2976">
<td><a href="https://cplusplus.github.io/CWG/issues/2976.html">2976</a></td>
+ <td>[<a href="https://wg21.link/stmt.dcl">stmt.dcl</a>]</td>
<td>review</td>
<td>Transferring control out of a function</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2977">
<td><a href="https://cplusplus.github.io/CWG/issues/2977.html">2977</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.general">dcl.init.general</a>]</td>
<td>review</td>
<td>Initialization with string literals</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2978">
<td><a href="https://cplusplus.github.io/CWG/issues/2978.html">2978</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>
<td>open</td>
<td>Deduction involving reference to similar types</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2979">
<td><a href="https://cplusplus.github.io/CWG/issues/2979.html">2979</a></td>
+ <td>[<a href="https://wg21.link/class.mem.general">class.mem.general</a>]</td>
<td>open</td>
<td>Duplicate declarations of enumerations in class scope</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2980">
<td><a href="https://cplusplus.github.io/CWG/issues/2980.html">2980</a></td>
+ <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>
<td>open</td>
<td>Constraints on template template parameters</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2981">
<td><a href="https://cplusplus.github.io/CWG/issues/2981.html">2981</a></td>
+ <td>[<a href="https://wg21.link/expr.arith.conv">expr.arith.conv</a>]</td>
<td>open</td>
<td>Usual arithmetic conversions and result types</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2982">
<td><a href="https://cplusplus.github.io/CWG/issues/2982.html">2982</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.decl">temp.deduct.decl</a>]</td>
<td>CD7</td>
<td>Deduction in <I>type-constraint</I>s</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2983">
<td><a href="https://cplusplus.github.io/CWG/issues/2983.html">2983</a></td>
+ <td>[<a href="https://wg21.link/basic.pre">basic.pre</a>]</td>
<td>review</td>
<td>Non-type template parameters are not variables</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2984">
<td><a href="https://cplusplus.github.io/CWG/issues/2984.html">2984</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>
<td>open</td>
<td>Value-dependent structured bindings</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2985">
<td><a href="https://cplusplus.github.io/CWG/issues/2985.html">2985</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>
<td>CD7</td>
<td>Unclear rules for reference initialization with conversion</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2986">
<td><a href="https://cplusplus.github.io/CWG/issues/2986.html">2986</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>open</td>
<td>Creating objects within a mutable member of a const object</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2987">
<td><a href="https://cplusplus.github.io/CWG/issues/2987.html">2987</a></td>
+ <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>
<td>CD7</td>
<td>Remove dilapidated wording from <TT>static_cast</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2988">
<td><a href="https://cplusplus.github.io/CWG/issues/2988.html">2988</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>open</td>
<td>Is a closure type from a <I>lambda-expression</I> appearing in a <I>concept-definition</I> a TU-local entity?</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2989">
<td><a href="https://cplusplus.github.io/CWG/issues/2989.html">2989</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.paren">expr.prim.paren</a>]</td>
<td>open</td>
<td>Remove misleading general allowance for parentheses</td>
<td align="center">Not resolved</td>
</tr>
<tr id="2990">
<td><a href="https://cplusplus.github.io/CWG/issues/2990.html">2990</a></td>
+ <td>[<a href="https://wg21.link/module.interface">module.interface</a>]</td>
<td>CD7</td>
<td>Exporting redeclarations of namespaces</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="2991">
<td><a href="https://cplusplus.github.io/CWG/issues/2991.html">2991</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.general">dcl.init.general</a>]</td>
<td>open</td>
<td>"array size" is vague</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2992">
<td><a href="https://cplusplus.github.io/CWG/issues/2992.html">2992</a></td>
+ <td>[<a href="https://wg21.link/basic.pre">basic.pre</a>]</td>
<td>open</td>
<td>Labels do not have names</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2993">
<td><a href="https://cplusplus.github.io/CWG/issues/2993.html">2993</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.general">dcl.fct.def.general</a>]</td>
<td>open</td>
<td>Body of a destructor</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2994">
<td><a href="https://cplusplus.github.io/CWG/issues/2994.html">2994</a></td>
+ <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>
<td>open</td>
<td>Allowing template parameters following template parameter packs that are pack expansions</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2995">
<td><a href="https://cplusplus.github.io/CWG/issues/2995.html">2995</a></td>
+ <td>[<a href="https://wg21.link/stmt.return">stmt.return</a>]</td>
<td>open</td>
<td>Meaning of flowing off the end of a function</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2996">
<td><a href="https://cplusplus.github.io/CWG/issues/2996.html">2996</a></td>
+ <td>[<a href="https://wg21.link/temp.constr.atomic">temp.constr.atomic</a>]</td>
<td>open</td>
<td>Impenetrable definition of atomic constraint</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2997">
<td><a href="https://cplusplus.github.io/CWG/issues/2997.html">2997</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>
<td>open</td>
<td>Defaulted functions with deleted definition</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2998">
<td><a href="https://cplusplus.github.io/CWG/issues/2998.html">2998</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.partial">temp.deduct.partial</a>]</td>
<td>open</td>
<td>Missing deduction consistency check for partial ordering</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="2999">
<td><a href="https://cplusplus.github.io/CWG/issues/2999.html">2999</a></td>
+ <td>[<a href="https://wg21.link/class.default.ctor">class.default.ctor</a>]</td>
<td>open</td>
<td>Trivial unions changing existing behavior</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3000">
<td><a href="https://cplusplus.github.io/CWG/issues/3000.html">3000</a></td>
+ <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>
<td>review</td>
<td>Handling of cv-qualified class types in conditional operator</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3001">
<td><a href="https://cplusplus.github.io/CWG/issues/3001.html">3001</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>tentatively ready</td>
<td>Inconsistent restrictions for <TT>static_cast</TT> on pointers to out-of-lifetime objects</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3002">
<td><a href="https://cplusplus.github.io/CWG/issues/3002.html">3002</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.temp">temp.dep.temp</a>]</td>
<td>tentatively ready</td>
<td>Template parameter/argument confusion</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3003">
<td><a href="https://cplusplus.github.io/CWG/issues/3003.html">3003</a></td>
+ <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>
<td>review</td>
<td>Naming a deducible template for class template argument deduction</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3004">
<td><a href="https://cplusplus.github.io/CWG/issues/3004.html">3004</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>tentatively ready</td>
<td>Pointer arithmetic on array of unknown bound</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3005">
<td><a href="https://cplusplus.github.io/CWG/issues/3005.html">3005</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.scope">basic.scope.scope</a>]</td>
<td>tentatively ready</td>
<td>Function parameters should never be name-independent</td>
<td align="center">
@@ -17902,570 +20864,665 @@ objects</td>
</tr>
<tr class="open" id="3006">
<td><a href="https://cplusplus.github.io/CWG/issues/3006.html">3006</a></td>
+ <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>
<td>review</td>
<td>Vague restrictions for explicit instantiations of class templates</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3007">
<td><a href="https://cplusplus.github.io/CWG/issues/3007.html">3007</a></td>
+ <td>[<a href="https://wg21.link/class.compare.default">class.compare.default</a>]</td>
<td>open</td>
<td>Access checking during synthesis of defaulted comparison operator, take 2</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3008">
<td><a href="https://cplusplus.github.io/CWG/issues/3008.html">3008</a></td>
+ <td>[<a href="https://wg21.link/diff.dcl">diff.dcl</a>]</td>
<td>tentatively ready</td>
<td>Missing Annex C entry for <TT>void</TT> object declarations</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3009">
<td><a href="https://cplusplus.github.io/CWG/issues/3009.html">3009</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>open</td>
<td>Unclear rules for constant initialization</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3010">
<td><a href="https://cplusplus.github.io/CWG/issues/3010.html">3010</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>open</td>
<td>constexpr placement-new should require transparent replaceability</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3011">
<td><a href="https://cplusplus.github.io/CWG/issues/3011.html">3011</a></td>
+ <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>
<td>tentatively ready</td>
<td>Parenthesized aggregate initialization for <I>new-expression</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3012">
<td><a href="https://cplusplus.github.io/CWG/issues/3012.html">3012</a></td>
+ <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>
<td>open</td>
<td>Deviating <TT>constexpr</TT> or <TT>consteval</TT> across translation units</td>
<td align="center">Not resolved</td>
</tr>
<tr id="3013">
<td><a href="https://cplusplus.github.io/CWG/issues/3013.html">3013</a></td>
+ <td>[<a href="https://wg21.link/cpp.embed.gen">cpp.embed.gen</a>]</td>
<td>CD7</td>
<td>Disallowing macros for <TT>#embed</TT> parameters</td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="3014">
<td><a href="https://cplusplus.github.io/CWG/issues/3014.html">3014</a></td>
+ <td>[<a href="https://wg21.link/cpp.embed.gen">cpp.embed.gen</a>]</td>
<td>CD7</td>
<td>Comma-delimited vs. comma-separated output for <TT>#embed</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="3015">
<td><a href="https://cplusplus.github.io/CWG/issues/3015.html">3015</a></td>
+ <td>[<a href="https://wg21.link/cpp.include">cpp.include</a>]</td>
<td>CD7</td>
<td>Handling of <I>header-name</I>s for <TT>#include</TT> and <TT>#embed</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr id="3016">
<td><a href="https://cplusplus.github.io/CWG/issues/3016.html">3016</a></td>
+ <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>
<td>CD7</td>
<td>Satisfying the syntactic requirements of <TT>#include</TT> and <TT>#embed</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="3017">
<td><a href="https://cplusplus.github.io/CWG/issues/3017.html">3017</a></td>
+ <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>
<td>open</td>
<td>Commas in controlling expression of conditional inclusion</td>
<td align="center">Not resolved</td>
</tr>
<tr id="3018">
<td><a href="https://cplusplus.github.io/CWG/issues/3018.html">3018</a></td>
+ <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>
<td>CD7</td>
<td>Validity of <TT>defined</TT> in <TT>__has_embed</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="3019">
<td><a href="https://cplusplus.github.io/CWG/issues/3019.html">3019</a></td>
+ <td>[<a href="https://wg21.link/lex.header">lex.header</a>]</td>
<td>open</td>
<td>Restrictions on character sequences in <I>header-name</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr id="3020">
<td><a href="https://cplusplus.github.io/CWG/issues/3020.html">3020</a></td>
+ <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>
<td>CD7</td>
<td>Missing specification for <TT>__has_cpp_attribute(indeterminate)</TT></td>
<td class="unknown" align="center">Unknown</td>
</tr>
<tr class="open" id="3021">
<td><a href="https://cplusplus.github.io/CWG/issues/3021.html">3021</a></td>
+ <td>[<a href="https://wg21.link/temp.constr.order">temp.constr.order</a>]</td>
<td>drafting</td>
<td>Subsumption rules for fold expanded constraints</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3022">
<td><a href="https://cplusplus.github.io/CWG/issues/3022.html">3022</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>review</td>
<td>Redundant specification of explicit destructor calls</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3023">
<td><a href="https://cplusplus.github.io/CWG/issues/3023.html">3023</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>
<td>open</td>
<td>Default arguments in list-initialization</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3024">
<td><a href="https://cplusplus.github.io/CWG/issues/3024.html">3024</a></td>
+ <td>[<a href="https://wg21.link/dcl.align">dcl.align</a>]</td>
<td>open</td>
<td>Alignment of references</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3025">
<td><a href="https://cplusplus.github.io/CWG/issues/3025.html">3025</a></td>
+ <td>[<a href="https://wg21.link/basic.stc.dynamic.deallocation">basic.stc.dynamic.deallocation</a>]</td>
<td>open</td>
<td>Deallocation functions returning void</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3026">
<td><a href="https://cplusplus.github.io/CWG/issues/3026.html">3026</a></td>
+ <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>
<td>open</td>
<td>Class for pointer-to-member formation</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3027">
<td><a href="https://cplusplus.github.io/CWG/issues/3027.html">3027</a></td>
+ <td>[<a href="https://wg21.link/temp.type">temp.type</a>]</td>
<td>open</td>
<td>Equivalence of <I>pack-index-specifier</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3028">
<td><a href="https://cplusplus.github.io/CWG/issues/3028.html">3028</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>open</td>
<td>A <I>using-declarator</I> should bind a name</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3029">
<td><a href="https://cplusplus.github.io/CWG/issues/3029.html">3029</a></td>
+ <td>[<a href="https://wg21.link/basic.align">basic.align</a>]</td>
<td>drafting</td>
<td>Confusing note about ordinary character types for aligned memory areas</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3030">
<td><a href="https://cplusplus.github.io/CWG/issues/3030.html">3030</a></td>
+ <td>[<a href="https://wg21.link/dcl.array">dcl.array</a>]</td>
<td>open</td>
<td>Initializing array prvalues of unknown bound</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3031">
<td><a href="https://cplusplus.github.io/CWG/issues/3031.html">3031</a></td>
+ <td>[<a href="https://wg21.link/over.match.funcs.general">over.match.funcs.general</a>]</td>
<td>open</td>
<td>Finding declarations for conversion operators for access checking</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3032">
<td><a href="https://cplusplus.github.io/CWG/issues/3032.html">3032</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.general">temp.arg.general</a>]</td>
<td>tentatively ready</td>
<td>Template argument disambiguation</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3033">
<td><a href="https://cplusplus.github.io/CWG/issues/3033.html">3033</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.namespace">basic.scope.namespace</a>]</td>
<td>open</td>
<td>Scope after <I>declarator-id</I> before determining correspondence</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3034">
<td><a href="https://cplusplus.github.io/CWG/issues/3034.html">3034</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>open</td>
<td>Infinite recursion should hit an implementation limit</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3035">
<td><a href="https://cplusplus.github.io/CWG/issues/3035.html">3035</a></td>
+ <td>[<a href="https://wg21.link/class.union.anon">class.union.anon</a>]</td>
<td>open</td>
<td>Lambda expressions in anonymous unions</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3036">
<td><a href="https://cplusplus.github.io/CWG/issues/3036.html">3036</a></td>
+ <td>[<a href="https://wg21.link/basic.extended.fp">basic.extended.fp</a>]</td>
<td>open</td>
<td>Extended floating-point types should not be cv-qualified</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3037">
<td><a href="https://cplusplus.github.io/CWG/issues/3037.html">3037</a></td>
+ <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>
<td>open</td>
<td>Name lookup results for <I>using-declarator</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3038">
<td><a href="https://cplusplus.github.io/CWG/issues/3038.html">3038</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>
<td>open</td>
<td>Ignorability of attributes, again</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3039">
<td><a href="https://cplusplus.github.io/CWG/issues/3039.html">3039</a></td>
+ <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>
<td>open</td>
<td>Undefined behavior from implicit object creation ignores observable checkpoints</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3040">
<td><a href="https://cplusplus.github.io/CWG/issues/3040.html">3040</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>
<td>open</td>
<td>Mishandling of lambda coroutines</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3041">
<td><a href="https://cplusplus.github.io/CWG/issues/3041.html">3041</a></td>
+ <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>
<td>open</td>
<td>Overly aggressive rule for deleting the destructor of a union</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3042">
<td><a href="https://cplusplus.github.io/CWG/issues/3042.html">3042</a></td>
+ <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>
<td>open</td>
<td>Implicit object creation is insufficient to model effective type rule of C</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3043">
<td><a href="https://cplusplus.github.io/CWG/issues/3043.html">3043</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>open</td>
<td>Lifetime extension for temporaries in expansion statements</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3044">
<td><a href="https://cplusplus.github.io/CWG/issues/3044.html">3044</a></td>
+ <td>[<a href="https://wg21.link/stmt.expand">stmt.expand</a>]</td>
<td>tentatively ready</td>
<td>Iterating expansion statements woes</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3045">
<td><a href="https://cplusplus.github.io/CWG/issues/3045.html">3045</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.block">basic.scope.block</a>]</td>
<td>tentatively ready</td>
<td>Regularizing environment interactions of expansion statement</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3046">
<td><a href="https://cplusplus.github.io/CWG/issues/3046.html">3046</a></td>
+ <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>
<td>open</td>
<td>Enumerations as part of the common initial sequence</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3047">
<td><a href="https://cplusplus.github.io/CWG/issues/3047.html">3047</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>open</td>
<td>Calling destructors on out-of-lifetime objects</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3048">
<td><a href="https://cplusplus.github.io/CWG/issues/3048.html">3048</a></td>
+ <td>[<a href="https://wg21.link/stmt.expand">stmt.expand</a>]</td>
<td>tentatively ready</td>
<td>Empty destructuring expansion statements</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3049">
<td><a href="https://cplusplus.github.io/CWG/issues/3049.html">3049</a></td>
+ <td>[<a href="https://wg21.link/class.prop">class.prop</a>]</td>
<td>open</td>
<td>Implicitly deleted move operation should not disable trivial relocation</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3050">
<td><a href="https://cplusplus.github.io/CWG/issues/3050.html">3050</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.deprecated">dcl.attr.deprecated</a>]</td>
<td>open</td>
<td>[[deprecated]] for class template partial specializations</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3051">
<td><a href="https://cplusplus.github.io/CWG/issues/3051.html">3051</a></td>
+ <td>[<a href="https://wg21.link/class.mem.general">class.mem.general</a>]</td>
<td>open</td>
<td>Missing specification for types of member subobjects</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3052">
<td><a href="https://cplusplus.github.io/CWG/issues/3052.html">3052</a></td>
+ <td>[<a href="https://wg21.link/stmt.return">stmt.return</a>]</td>
<td>open</td>
<td>Unclear handling of checks on discarded <TT>return</TT> statements</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3053">
<td><a href="https://cplusplus.github.io/CWG/issues/3053.html">3053</a></td>
+ <td>[<a href="https://wg21.link/cpp.replace.general">cpp.replace.general</a>]</td>
<td>tentatively ready</td>
<td>Allowing <TT>#undef likely</TT></td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3054">
<td><a href="https://cplusplus.github.io/CWG/issues/3054.html">3054</a></td>
+ <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>
<td>open</td>
<td>Use of default arguments depending on shape of <I>postfix-expression</I> in a function call</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3055">
<td><a href="https://cplusplus.github.io/CWG/issues/3055.html">3055</a></td>
+ <td>[<a href="https://wg21.link/over.call.object">over.call.object</a>]</td>
<td>open</td>
<td>Misleading body for surrogate call function</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3056">
<td><a href="https://cplusplus.github.io/CWG/issues/3056.html">3056</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.req.type">expr.prim.req.type</a>]</td>
<td>open</td>
<td>Missing semicolons in grammar for <I>type-requirement</I></td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3057">
<td><a href="https://cplusplus.github.io/CWG/issues/3057.html">3057</a></td>
+ <td>[<a href="https://wg21.link/over.ics.ref">over.ics.ref</a>]</td>
<td>open</td>
<td>Ranking of derived-to-base conversions should ignore reference binding</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3058">
<td><a href="https://cplusplus.github.io/CWG/issues/3058.html">3058</a></td>
+ <td>[<a href="https://wg21.link/basic.lookup.general">basic.lookup.general</a>]</td>
<td>open</td>
<td>"Program point" is not defined</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3059">
<td><a href="https://cplusplus.github.io/CWG/issues/3059.html">3059</a></td>
+ <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>
<td>open</td>
<td><TT>throw;</TT> in constant expressions</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3060">
<td><a href="https://cplusplus.github.io/CWG/issues/3060.html">3060</a></td>
+ <td>[<a href="https://wg21.link/basic.start.main">basic.start.main</a>]</td>
<td>open</td>
<td>Change in behavior for <TT>noexcept</TT> <TT>main</TT></td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3061">
<td><a href="https://cplusplus.github.io/CWG/issues/3061.html">3061</a></td>
+ <td>[<a href="https://wg21.link/stmt.expand">stmt.expand</a>]</td>
<td>tentatively ready</td>
<td>Trailing comma in an <I>expansion-init-list</I></td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3062">
<td><a href="https://cplusplus.github.io/CWG/issues/3062.html">3062</a></td>
+ <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>
<td>open</td>
<td>Overlapping specification of default template arguments</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3063">
<td><a href="https://cplusplus.github.io/CWG/issues/3063.html">3063</a></td>
+ <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>
<td>open</td>
<td>Lifetime extension of temporaries past function return</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3064">
<td><a href="https://cplusplus.github.io/CWG/issues/3064.html">3064</a></td>
+ <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>
<td>open</td>
<td>Mishandling of placement-new in lifetime rules</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3065">
<td><a href="https://cplusplus.github.io/CWG/issues/3065.html">3065</a></td>
+ <td>[<a href="https://wg21.link/basic.types.general">basic.types.general</a>]</td>
<td>open</td>
<td>Reachability and completeness of types</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3066">
<td><a href="https://cplusplus.github.io/CWG/issues/3066.html">3066</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.id.qual">expr.prim.id.qual</a>]</td>
<td>tentatively ready</td>
<td>Declarative <I>nested-name-specifier</I> in explicit instantiation</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3067">
<td><a href="https://cplusplus.github.io/CWG/issues/3067.html">3067</a></td>
+ <td>[<a href="https://wg21.link/conv.array">conv.array</a>]</td>
<td>open</td>
<td>Array-to-pointer conversion with object type mismatch</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3068">
<td><a href="https://cplusplus.github.io/CWG/issues/3068.html">3068</a></td>
+ <td>[<a href="https://wg21.link/class.access.general">class.access.general</a>]</td>
<td>open</td>
<td>Access checking in friends involving <I>qualified-id</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3069">
<td><a href="https://cplusplus.github.io/CWG/issues/3069.html">3069</a></td>
+ <td>[<a href="https://wg21.link/temp.constr.normal">temp.constr.normal</a>]</td>
<td>open</td>
<td>Reference to wrong placeholder</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3070">
<td><a href="https://cplusplus.github.io/CWG/issues/3070.html">3070</a></td>
+ <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>
<td>open</td>
<td>Trivial assignment can skip member subobjects</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3071">
<td><a href="https://cplusplus.github.io/CWG/issues/3071.html">3071</a></td>
+ <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>
<td>open</td>
<td>Negative <TT>tuple_size</TT> in structured bindings</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3072">
<td><a href="https://cplusplus.github.io/CWG/issues/3072.html">3072</a></td>
+ <td>[<a href="https://wg21.link/temp.deduct.general">temp.deduct.general</a>]</td>
<td>open</td>
<td>Incorrect examples for lambda SFINAE</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3073">
<td><a href="https://cplusplus.github.io/CWG/issues/3073.html">3073</a></td>
+ <td>[<a href="https://wg21.link/over.match.ref">over.match.ref</a>]</td>
<td>open</td>
<td>Dependence of <I>R</I> on <TT>T2</TT> is unclear</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3074">
<td><a href="https://cplusplus.github.io/CWG/issues/3074.html">3074</a></td>
+ <td>[<a href="https://wg21.link/cpp.module">cpp.module</a>]</td>
<td>tentatively ready</td>
<td>Redundant ill-formedness for module macros</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3075">
<td><a href="https://cplusplus.github.io/CWG/issues/3075.html">3075</a></td>
+ <td>[<a href="https://wg21.link/cpp.import">cpp.import</a>]</td>
<td>tentatively ready</td>
<td>Unclear matching of import directive</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3076">
<td><a href="https://cplusplus.github.io/CWG/issues/3076.html">3076</a></td>
+ <td>[<a href="https://wg21.link/cpp.include">cpp.include</a>]</td>
<td>tentatively ready</td>
<td>Remove unnecessary IFNDR for malformed <I>header-name-token</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3077">
<td><a href="https://cplusplus.github.io/CWG/issues/3077.html">3077</a></td>
+ <td>[<a href="https://wg21.link/cpp.pre">cpp.pre</a>]</td>
<td>tentatively ready</td>
<td>Undesirable formation of <TT>import</TT> directive with <I>string-literal</I></td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3078">
<td><a href="https://cplusplus.github.io/CWG/issues/3078.html">3078</a></td>
+ <td>[<a href="https://wg21.link/cpp.include">cpp.include</a>]</td>
<td>review</td>
<td>Different treatment of <TT>#include</TT> <I>pp-tokens</I> and <I>header-name-tokens</I></td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3079">
<td><a href="https://cplusplus.github.io/CWG/issues/3079.html">3079</a></td>
+ <td>[<a href="https://wg21.link/class.union.anon">class.union.anon</a>]</td>
<td>open</td>
<td>Allow <I>empty-declaration</I>s in anonymous unions</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3080">
<td><a href="https://cplusplus.github.io/CWG/issues/3080.html">3080</a></td>
+ <td>[<a href="https://wg21.link/temp.arg.template">temp.arg.template</a>]</td>
<td>tentatively ready</td>
<td>Clarify kinds of permitted template template arguments</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3081">
<td><a href="https://cplusplus.github.io/CWG/issues/3081.html">3081</a></td>
+ <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>
<td>review</td>
<td>Require glvalue when splicing direct base class relationship</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3082">
<td><a href="https://cplusplus.github.io/CWG/issues/3082.html">3082</a></td>
+ <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>
<td>tentatively ready</td>
<td>Allow for call-compatible function types in <TT>reinterpret_cast</TT></td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3083">
<td><a href="https://cplusplus.github.io/CWG/issues/3083.html">3083</a></td>
+ <td>[<a href="https://wg21.link/stmt.pre">stmt.pre</a>]</td>
<td>tentatively ready</td>
<td>Remove redundant restrictions on class and enum definitions</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3084">
<td><a href="https://cplusplus.github.io/CWG/issues/3084.html">3084</a></td>
+ <td>[<a href="https://wg21.link/stmt.cont">stmt.cont</a>]</td>
<td>tentatively ready</td>
<td><I>compound-statement</I>s inside <I>iteration-statement</I>s</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3085">
<td><a href="https://cplusplus.github.io/CWG/issues/3085.html">3085</a></td>
+ <td>[<a href="https://wg21.link/stmt.pre">stmt.pre</a>]</td>
<td>tentatively ready</td>
<td>Apply restriction inside for-range-declaration</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3086">
<td><a href="https://cplusplus.github.io/CWG/issues/3086.html">3086</a></td>
+ <td>[<a href="https://wg21.link/cpp.pragma.op">cpp.pragma.op</a>]</td>
<td>tentatively ready</td>
<td>Destringizing should consider all sorts of encoding-prefixes</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3087">
<td><a href="https://cplusplus.github.io/CWG/issues/3087.html">3087</a></td>
+ <td>[<a href="https://wg21.link/cpp.pragma.op">cpp.pragma.op</a>]</td>
<td>open</td>
<td>Destringizing for raw string literals</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3088">
<td><a href="https://cplusplus.github.io/CWG/issues/3088.html">3088</a></td>
+ <td>[<a href="https://wg21.link/cpp.replace.general">cpp.replace.general</a>]</td>
<td>open</td>
<td>Clarify macro treatment of identifiers with special meaning</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3089">
<td><a href="https://cplusplus.github.io/CWG/issues/3089.html">3089</a></td>
+ <td>[<a href="https://wg21.link/dcl.init.general">dcl.init.general</a>]</td>
<td>tentatively ready</td>
<td>const-default-constructible improperly handles std::meta::info</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3090">
<td><a href="https://cplusplus.github.io/CWG/issues/3090.html">3090</a></td>
+ <td>[<a href="https://wg21.link/module.interface">module.interface</a>]</td>
<td>tentatively ready</td>
<td>Internal linkage from header units</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3091">
<td><a href="https://cplusplus.github.io/CWG/issues/3091.html">3091</a></td>
+ <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>
<td>review</td>
<td>Linking of translation units as sequences of tokens</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3092">
<td><a href="https://cplusplus.github.io/CWG/issues/3092.html">3092</a></td>
+ <td>[<a href="https://wg21.link/dcl.attr.annotation">dcl.attr.annotation</a>]</td>
<td>tentatively ready</td>
<td><I>base-specifier</I>s are not "declared"</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3093">
<td><a href="https://cplusplus.github.io/CWG/issues/3093.html">3093</a></td>
+ <td>[<a href="https://wg21.link/expr.prim.splice">expr.prim.splice</a>]</td>
<td>open</td>
<td>Missing integration of direct base class relationships</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3094">
<td><a href="https://cplusplus.github.io/CWG/issues/3094.html">3094</a></td>
+ <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>
<td>review</td>
<td>Rework phases for string literal concatenation and token formation</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3095">
<td><a href="https://cplusplus.github.io/CWG/issues/3095.html">3095</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>
<td>open</td>
<td>Type-dependent packs that are not structured binding packs</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3096">
<td><a href="https://cplusplus.github.io/CWG/issues/3096.html">3096</a></td>
+ <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>
<td>open</td>
<td>Value-dependence of size of structured binding pack with non-dependent initializer</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3097">
<td><a href="https://cplusplus.github.io/CWG/issues/3097.html">3097</a></td>
+ <td>[<a href="https://wg21.link/basic.scope.scope">basic.scope.scope</a>]</td>
<td>tentatively ready</td>
<td>Lambda expression introduces a scope</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3098">
<td><a href="https://cplusplus.github.io/CWG/issues/3098.html">3098</a></td>
+ <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>
<td>tentatively ready</td>
<td>Remove redundancy "names or designates"</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3099">
<td><a href="https://cplusplus.github.io/CWG/issues/3099.html">3099</a></td>
+ <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>
<td>open</td>
<td>Instantiation of type aliases from alias templates is unspecified</td>
<td align="center">Not resolved</td>
</tr>
<tr class="open" id="3100">
<td><a href="https://cplusplus.github.io/CWG/issues/3100.html">3100</a></td>
+ <td>[<a href="https://wg21.link/basic.start.term">basic.start.term</a>]</td>
<td>open</td>
<td>Destruction order for objects with static storage duration</td>
<td align="center">Not resolved</td>
diff --git a/clang/www/make_cxx_dr_status b/clang/www/make_cxx_dr_status
index 485a9a5..3ba12e1 100755
--- a/clang/www/make_cxx_dr_status
+++ b/clang/www/make_cxx_dr_status
@@ -10,26 +10,36 @@ output = os.path.join(clang_www_dir, 'cxx_dr_status.html')
dr_test_dir = os.path.join(clang_www_dir, '../test/CXX/drs')
class DR:
- def __init__(self, section, issue, url, status, title):
- self.section, self.issue, self.url, self.status, self.title = \
- section, issue, url, status, title
+ def __init__(self, *, section_number, section_name, section_link, number, url, status, liaison, title):
+ self.section_number, self.section_name, self.section_link, self.number, self.url, self.status, self.liaison, self.title = \
+ section_number, section_name, section_link, number, url, status, liaison, title
def __repr__(self):
- return '%s (%s): %s' % (self.issue, self.status, self.title)
-
-def parse(dr):
- try:
- section, issue_link, status, liaison, title = [
- col.split('>', 1)[1].split('</TD>')[0]
- for col in dr.split('</TR>', 1)[0].split('<TD')[1:]
- ]
- except Exception as ex:
- print(f"Parse error: {ex}\n{dr}", file=sys.stderr)
- sys.exit(1)
- _, url, issue = issue_link.split('"', 2)
- url = url.strip()
- issue = int(issue.split('>', 1)[1].split('<', 1)[0])
- title = title.replace('<issue_title>', '').replace('</issue_title>', '').replace('\r\n', '\n').strip()
- return DR(section, issue, url, status, title)
+ return '%s (%s): %s' % (self.number, self.status, self.title)
+
+ pattern = re.compile('''
+<TD.*>(?P<section_number>.*) <A href="(?P<section_link>.*)">(?P<section_name>.*)</A>
+</TD>
+<TD.*><A HREF="(?P<url>.*)">(?P<number>.*)</A></TD>
+<TD.*>(?P<status>.*)</TD>
+<TD.*>(?P<liaison>.*)</TD>
+<TD.*><issue_title>(?P<title>[\\w\\W]*)</issue_title></TD>
+</TR>''')
+
+ @classmethod
+ def parse_from_html(cls, html_string):
+ match = cls.pattern.match(html_string)
+ if match is None:
+ print(f"Parse error: {html_string}", file=sys.stderr)
+ exit(1)
+ return cls(
+ section_number=match.group('section_number'),
+ section_name=match.group('section_name'),
+ section_link=match.group('section_link'),
+ number=int(match.group('number')),
+ url=match.group('url'),
+ status=match.group('status'),
+ liaison=match.group('liaison'),
+ title=match.group('title').replace('\n', ' ').strip())
def collect_tests():
status_re = re.compile(r'\bcwg([0-9]+): (.*)')
@@ -68,8 +78,8 @@ def get_issues(path):
print(ex, file=sys.stderr)
sys.exit(1)
- return sorted((parse(dr) for dr in buffer.split('<TR>')[2:]),
- key = lambda dr: dr.issue)
+ return sorted((DR.parse_from_html(dr) for dr in buffer.split('<TR>')[2:]),
+ key = lambda dr: dr.number)
issue_list_path = None
@@ -127,9 +137,10 @@ out_html.append('''\
<p>This page tracks which C++ defect reports are implemented within Clang.</p>
-<table width="689" border="1" cellspacing="0">
+<table width="892" border="1" cellspacing="0">
<tr>
<th>Number</th>
+ <th>Section</th>
<th>Status</th>
<th>Issue title</th>
<th>Available in Clang?</th>
@@ -149,7 +160,7 @@ def availability(issue):
unresolved_status = unresolved_status_match.group(1)
proposed_resolution_match = re.search(r' (open|drafting|review|tentatively ready|ready) (\d{4}-\d{2}(?:-\d{2})?|P\d{4}R\d+)$', status)
if proposed_resolution_match is None:
- raise AvailabilityError('error: issue {}: \'{}\' status should be followed by a paper number (P1234R5) or proposed resolution in YYYY-MM-DD format'.format(dr.issue, unresolved_status))
+ raise AvailabilityError('error: issue {}: \'{}\' status should be followed by a paper number (P1234R5) or proposed resolution in YYYY-MM-DD format'.format(dr.number, unresolved_status))
proposed_resolution = proposed_resolution_match.group(2)
status = status[:-1-len(proposed_resolution)]
status = status[:-1-len(unresolved_status)]
@@ -236,7 +247,7 @@ def availability(issue):
avail = 'Duplicate of <a href="#%s">%s</a>' % (dup, dup)
_, avail_style, _, _ = availability(dup)
else:
- raise AvailabilityError('error: unknown status %s for issue %s' % (status, dr.issue))
+ raise AvailabilityError('error: unknown status %s for issue %s' % (status, dr.number))
return (avail + avail_suffix, avail_style, unresolved_status, details)
count = {}
@@ -254,7 +265,7 @@ for dr in drs:
elif dr.status in ('open', 'drafting', 'review', 'tentatively ready', 'ready'):
row_style = ' class="open"'
try:
- avail, avail_style, unresolved_status, details = availability(dr.issue)
+ avail, avail_style, unresolved_status, details = availability(dr.number)
except AvailabilityError as e:
availability_error_occurred = True
print(e.args[0])
@@ -267,12 +278,12 @@ for dr in drs:
if unresolved_status != dr.status:
availability_error_occurred = True
print("error: issue %s is marked '%s', which differs from CWG index status '%s'" \
- % (dr.issue, unresolved_status, dr.status))
+ % (dr.number, unresolved_status, dr.status))
continue
else:
row_style = ''
try:
- avail, avail_style, unresolved_status, details = availability(dr.issue)
+ avail, avail_style, unresolved_status, details = availability(dr.number)
except AvailabilityError as e:
availability_error_occurred = True
print(e.args[0])
@@ -281,7 +292,7 @@ for dr in drs:
if unresolved_status:
availability_error_occurred = True
print("error: issue %s is marked '%s', even though it is resolved in CWG index" \
- % (dr.issue, unresolved_status))
+ % (dr.number, unresolved_status))
continue
if not avail.startswith('Sup') and not avail.startswith('Dup'):
@@ -297,8 +308,9 @@ for dr in drs:
{details}
</details>'''
out_html.append(f'''
- <tr{row_style} id="{dr.issue}">
- <td><a href="https://cplusplus.github.io/CWG/issues/{dr.issue}.html">{dr.issue}</a></td>
+ <tr{row_style} id="{dr.number}">
+ <td><a href="https://cplusplus.github.io/CWG/issues/{dr.number}.html">{dr.number}</a></td>
+ <td>[<a href="{dr.section_link}">{dr.section_name}</a>]</td>
<td>{dr.status}</td>
<td>{dr.title}</td>
<td{avail_style} align="center">{avail}</td>
diff --git a/compiler-rt/test/hwasan/TestCases/Linux/fixed-shadow.c b/compiler-rt/test/hwasan/TestCases/Linux/fixed-shadow.c
index 421d2339..fc83b21 100644
--- a/compiler-rt/test/hwasan/TestCases/Linux/fixed-shadow.c
+++ b/compiler-rt/test/hwasan/TestCases/Linux/fixed-shadow.c
@@ -3,17 +3,17 @@
// Default compiler instrumentation works with any shadow base (dynamic or fixed).
// RUN: %clang_hwasan %s -o %t
// RUN: %run %t
-// RUN: HWASAN_OPTIONS=fixed_shadow_base=263878495698944 %run %t 2>%t.out || (cat %t.out | FileCheck %s)
-// RUN: HWASAN_OPTIONS=fixed_shadow_base=4398046511104 %run %t
+// RUN: env HWASAN_OPTIONS=fixed_shadow_base=263878495698944 %run %t 2>%t.out || (cat %t.out | FileCheck %s)
+// RUN: env HWASAN_OPTIONS=fixed_shadow_base=4398046511104 %run %t
//
// If -hwasan-mapping-offset is set, then the fixed_shadow_base needs to match.
// RUN: %clang_hwasan %s -mllvm -hwasan-mapping-offset=263878495698944 -o %t
-// RUN: HWASAN_OPTIONS=fixed_shadow_base=263878495698944 %run %t 2>%t.out || (cat %t.out | FileCheck %s)
-// RUN: HWASAN_OPTIONS=fixed_shadow_base=4398046511104 not %run %t
+// RUN: env HWASAN_OPTIONS=fixed_shadow_base=263878495698944 %run %t 2>%t.out || (cat %t.out | FileCheck %s)
+// RUN: env HWASAN_OPTIONS=fixed_shadow_base=4398046511104 not %run %t
// RUN: %clang_hwasan %s -mllvm -hwasan-mapping-offset=4398046511104 -o %t
-// RUN: HWASAN_OPTIONS=fixed_shadow_base=4398046511104 %run %t
-// RUN: HWASAN_OPTIONS=fixed_shadow_base=263878495698944 not %run %t
+// RUN: env HWASAN_OPTIONS=fixed_shadow_base=4398046511104 %run %t
+// RUN: env HWASAN_OPTIONS=fixed_shadow_base=263878495698944 not %run %t
//
// Note: if fixed_shadow_base is not set, compiler-rt will dynamically choose a
// shadow base, which has a tiny but non-zero probability of matching the
diff --git a/compiler-rt/test/tsan/cxa_guard_acquire.cpp b/compiler-rt/test/tsan/cxa_guard_acquire.cpp
index fc40725..6050c24 100644
--- a/compiler-rt/test/tsan/cxa_guard_acquire.cpp
+++ b/compiler-rt/test/tsan/cxa_guard_acquire.cpp
@@ -66,10 +66,17 @@ int main(int argc, char **argv) {
printf("Enter main\n");
// If initialization is contended, the blocked thread should enter a
- // potentially blocking region.
+ // potentially blocking region. Note that we use a DAG check because it is
+ // possible for Thread 1 to acquire the guard, then Thread 2 fail to acquire
+ // the guard then call `OnPotentiallyBlockingRegionBegin` and print "Enter
+ // potentially blocking region\n", before Thread 1 manages to reach "Enter
+ // constructor\n". This is exceptionally rare, but can be replicated by
+ // inserting a `sleep(1)` between `LazyInit() {` and `printf("Enter
+ // constructor\n");`. Due to the barrier it is not possible for the exit logs
+ // to be inverted.
//
- // CHECK-NEXT: Enter constructor
- // CHECK-NEXT: Enter potentially blocking region
+ // CHECK-DAG: Enter constructor
+ // CHECK-DAG: Enter potentially blocking region
// CHECK-NEXT: Exit constructor
// CHECK-NEXT: Exit potentially blocking region
barrier_init(&barrier, 2);
diff --git a/compiler-rt/test/ubsan/TestCases/Misc/Posix/print_stack_trace.cpp b/compiler-rt/test/ubsan/TestCases/Misc/Posix/print_stack_trace.cpp
index 93c6bd6..2eac710 100644
--- a/compiler-rt/test/ubsan/TestCases/Misc/Posix/print_stack_trace.cpp
+++ b/compiler-rt/test/ubsan/TestCases/Misc/Posix/print_stack_trace.cpp
@@ -1,5 +1,5 @@
-// RUN: %clangxx -fsanitize=undefined -O0 %s -o %t && UBSAN_OPTIONS=stack_trace_format=DEFAULT:fast_unwind_on_fatal=1 %run %t 2>&1 | FileCheck %s
-// RUN: %clangxx -fsanitize=undefined -O0 %s -o %t && UBSAN_OPTIONS=stack_trace_format=DEFAULT:fast_unwind_on_fatal=0 %run %t 2>&1 | FileCheck %s
+// RUN: %clangxx -fsanitize=undefined -O0 %s -o %t && env UBSAN_OPTIONS=stack_trace_format=DEFAULT:fast_unwind_on_fatal=1 %run %t 2>&1 | FileCheck %s
+// RUN: %clangxx -fsanitize=undefined -O0 %s -o %t && env UBSAN_OPTIONS=stack_trace_format=DEFAULT:fast_unwind_on_fatal=0 %run %t 2>&1 | FileCheck %s
// This test is temporarily disabled due to broken unwinding on ARM.
// UNSUPPORTED: target={{.*-linux-.*}}
diff --git a/flang/examples/FeatureList/FeatureList.cpp b/flang/examples/FeatureList/FeatureList.cpp
index 225a655..ef58da6 100644
--- a/flang/examples/FeatureList/FeatureList.cpp
+++ b/flang/examples/FeatureList/FeatureList.cpp
@@ -445,6 +445,7 @@ public:
READ_FEATURE(ObjectDecl)
READ_FEATURE(OldParameterStmt)
READ_FEATURE(OmpAlignedClause)
+ READ_FEATURE(OmpAllocateDirective)
READ_FEATURE(OmpBeginDirective)
READ_FEATURE(OmpBeginLoopDirective)
READ_FEATURE(OmpBeginSectionsDirective)
@@ -541,7 +542,6 @@ public:
READ_FEATURE(OpenMPCancellationPointConstruct)
READ_FEATURE(OpenMPConstruct)
READ_FEATURE(OpenMPCriticalConstruct)
- READ_FEATURE(OpenMPDeclarativeAllocate)
READ_FEATURE(OpenMPDeclarativeConstruct)
READ_FEATURE(OpenMPDeclareReductionConstruct)
READ_FEATURE(OpenMPDeclareSimdConstruct)
@@ -550,7 +550,6 @@ public:
READ_FEATURE(OmpAtomicDefaultMemOrderClause)
READ_FEATURE(OpenMPFlushConstruct)
READ_FEATURE(OpenMPLoopConstruct)
- READ_FEATURE(OpenMPExecutableAllocate)
READ_FEATURE(OpenMPAllocatorsConstruct)
READ_FEATURE(OpenMPRequiresConstruct)
READ_FEATURE(OpenMPSimpleStandaloneConstruct)
diff --git a/flang/include/flang/Parser/dump-parse-tree.h b/flang/include/flang/Parser/dump-parse-tree.h
index a7398a4..de27164 100644
--- a/flang/include/flang/Parser/dump-parse-tree.h
+++ b/flang/include/flang/Parser/dump-parse-tree.h
@@ -512,6 +512,7 @@ public:
NODE(parser, OmpAlignModifier)
NODE(parser, OmpAllocateClause)
NODE(OmpAllocateClause, Modifier)
+ NODE(parser, OmpAllocateDirective)
NODE(parser, OmpAllocatorComplexModifier)
NODE(parser, OmpAllocatorSimpleModifier)
NODE(parser, OmpAlwaysModifier)
@@ -739,7 +740,6 @@ public:
NODE(parser, OpenMPCancellationPointConstruct)
NODE(parser, OpenMPConstruct)
NODE(parser, OpenMPCriticalConstruct)
- NODE(parser, OpenMPDeclarativeAllocate)
NODE(parser, OpenMPDeclarativeAssumes)
NODE(parser, OpenMPDeclarativeConstruct)
NODE(parser, OpenMPDeclareMapperConstruct)
@@ -748,7 +748,6 @@ public:
NODE(parser, OpenMPDeclareTargetConstruct)
NODE(parser, OpenMPDepobjConstruct)
NODE(parser, OpenMPDispatchConstruct)
- NODE(parser, OpenMPExecutableAllocate)
NODE(parser, OpenMPFlushConstruct)
NODE(parser, OpenMPGroupprivate)
NODE(parser, OpenMPLoopConstruct)
diff --git a/flang/include/flang/Parser/openmp-utils.h b/flang/include/flang/Parser/openmp-utils.h
index 49db091..8fa4a84 100644
--- a/flang/include/flang/Parser/openmp-utils.h
+++ b/flang/include/flang/Parser/openmp-utils.h
@@ -22,6 +22,7 @@
#include <type_traits>
#include <utility>
#include <variant>
+#include <vector>
namespace Fortran::parser::omp {
@@ -33,23 +34,6 @@ template <typename T> constexpr auto addr_if(const std::optional<T> &x) {
}
namespace detail {
-using D = llvm::omp::Directive;
-
-template <typename Construct> //
-struct ConstructId {
- static constexpr llvm::omp::Directive id{D::OMPD_unknown};
-};
-
-#define MAKE_CONSTR_ID(Construct, Id) \
- template <> struct ConstructId<Construct> { \
- static constexpr llvm::omp::Directive id{Id}; \
- }
-
-MAKE_CONSTR_ID(OpenMPDeclarativeAllocate, D::OMPD_allocate);
-MAKE_CONSTR_ID(OpenMPExecutableAllocate, D::OMPD_allocate);
-
-#undef MAKE_CONSTR_ID
-
struct DirectiveNameScope {
static OmpDirectiveName MakeName(CharBlock source = {},
llvm::omp::Directive id = llvm::omp::Directive::OMPD_unknown) {
@@ -97,9 +81,6 @@ struct DirectiveNameScope {
} else if constexpr (TupleTrait<T>) {
if constexpr (std::is_base_of_v<OmpBlockConstruct, T>) {
return std::get<OmpBeginDirective>(x.t).DirName();
- } else if constexpr (std::is_same_v<T, OpenMPDeclarativeAllocate> ||
- std::is_same_v<T, OpenMPExecutableAllocate>) {
- return MakeName(std::get<Verbatim>(x.t).source, ConstructId<T>::id);
} else {
return GetFromTuple(
x.t, std::make_index_sequence<std::tuple_size_v<decltype(x.t)>>{});
@@ -139,6 +120,9 @@ template <typename T> OmpDirectiveName GetOmpDirectiveName(const T &x) {
return detail::DirectiveNameScope::GetOmpDirectiveName(x);
}
+const OpenMPDeclarativeConstruct *GetOmp(const DeclarationConstruct &x);
+const OpenMPConstruct *GetOmp(const ExecutionPartConstruct &x);
+
const OmpObjectList *GetOmpObjectList(const OmpClause &clause);
template <typename T>
@@ -158,6 +142,13 @@ const OmpCombinerExpression *GetCombinerExpr(
const OmpReductionSpecifier &rspec);
const OmpInitializerExpression *GetInitializerExpr(const OmpClause &init);
+struct OmpAllocateInfo {
+ std::vector<const OmpAllocateDirective *> dirs;
+ const ExecutionPartConstruct *body{nullptr};
+};
+
+OmpAllocateInfo SplitOmpAllocate(const OmpAllocateDirective &x);
+
} // namespace Fortran::parser::omp
#endif // FORTRAN_PARSER_OPENMP_UTILS_H
diff --git a/flang/include/flang/Parser/parse-tree.h b/flang/include/flang/Parser/parse-tree.h
index 375790a..8c7578f 100644
--- a/flang/include/flang/Parser/parse-tree.h
+++ b/flang/include/flang/Parser/parse-tree.h
@@ -5151,17 +5151,42 @@ struct OpenMPThreadprivate {
CharBlock source;
};
-// 2.11.3 allocate -> ALLOCATE (variable-name-list) [clause]
-struct OpenMPDeclarativeAllocate {
- TUPLE_CLASS_BOILERPLATE(OpenMPDeclarativeAllocate);
- CharBlock source;
- std::tuple<Verbatim, OmpObjectList, OmpClauseList> t;
+// Ref: [4.5:310-312], [5.0:156-158], [5.1:181-184], [5.2:176-177],
+// [6.0:310-312]
+//
+// allocate-directive ->
+// ALLOCATE (variable-list-item...) | // since 4.5
+// ALLOCATE (variable-list-item...) // since 5.0, until 5.1
+// ...
+// allocate-stmt
+//
+// The first form is the "declarative-allocate", and is a declarative
+// directive. The second is the "executable-allocate" and is an executable
+// directive. The executable form was deprecated in 5.2.
+//
+// The executable-allocate consists of several ALLOCATE directives. Since
+// in the parse tree every type corresponding to a directive only corresponds
+// to a single directive, the executable form is represented by a sequence
+// of nested OmpAlocateDirectives, e.g.
+// !$OMP ALLOCATE(x)
+// !$OMP ALLOCATE(y)
+// ALLOCATE(x, y)
+// will become
+// OmpAllocateDirective
+// |- ALLOCATE(x) // begin directive
+// `- OmpAllocateDirective // block
+// |- ALLOCATE(y) // begin directive
+// `- ALLOCATE(x, y) // block
+//
+// The block in the declarative-allocate will be empty.
+struct OmpAllocateDirective : public OmpBlockConstruct {
+ INHERITED_TUPLE_CLASS_BOILERPLATE(OmpAllocateDirective, OmpBlockConstruct);
};
struct OpenMPDeclarativeConstruct {
UNION_CLASS_BOILERPLATE(OpenMPDeclarativeConstruct);
CharBlock source;
- std::variant<OpenMPDeclarativeAllocate, OpenMPDeclarativeAssumes,
+ std::variant<OmpAllocateDirective, OpenMPDeclarativeAssumes,
OpenMPDeclareMapperConstruct, OpenMPDeclareReductionConstruct,
OpenMPDeclareSimdConstruct, OpenMPDeclareTargetConstruct,
OmpDeclareVariantDirective, OpenMPGroupprivate, OpenMPThreadprivate,
@@ -5174,19 +5199,6 @@ struct OpenMPCriticalConstruct : public OmpBlockConstruct {
INHERITED_TUPLE_CLASS_BOILERPLATE(OpenMPCriticalConstruct, OmpBlockConstruct);
};
-// 2.11.3 allocate -> ALLOCATE [(variable-name-list)] [clause]
-// [ALLOCATE (variable-name-list) [clause] [...]]
-// allocate-statement
-// clause -> allocator-clause
-struct OpenMPExecutableAllocate {
- TUPLE_CLASS_BOILERPLATE(OpenMPExecutableAllocate);
- CharBlock source;
- std::tuple<Verbatim, std::optional<OmpObjectList>, OmpClauseList,
- std::optional<std::list<OpenMPDeclarativeAllocate>>,
- Statement<AllocateStmt>>
- t;
-};
-
// Ref: [5.2:180-181], [6.0:315]
//
// allocators-construct ->
@@ -5342,9 +5354,9 @@ struct OpenMPConstruct {
UNION_CLASS_BOILERPLATE(OpenMPConstruct);
std::variant<OpenMPStandaloneConstruct, OpenMPSectionsConstruct,
OpenMPSectionConstruct, OpenMPLoopConstruct, OmpBlockConstruct,
- OpenMPAtomicConstruct, OpenMPDeclarativeAllocate, OpenMPDispatchConstruct,
- OpenMPUtilityConstruct, OpenMPExecutableAllocate,
- OpenMPAllocatorsConstruct, OpenMPAssumeConstruct, OpenMPCriticalConstruct>
+ OpenMPAtomicConstruct, OmpAllocateDirective, OpenMPDispatchConstruct,
+ OpenMPUtilityConstruct, OpenMPAllocatorsConstruct, OpenMPAssumeConstruct,
+ OpenMPCriticalConstruct>
u;
};
diff --git a/flang/include/flang/Semantics/openmp-utils.h b/flang/include/flang/Semantics/openmp-utils.h
index 032944d..14a4f0e 100644
--- a/flang/include/flang/Semantics/openmp-utils.h
+++ b/flang/include/flang/Semantics/openmp-utils.h
@@ -72,6 +72,8 @@ const parser::OmpObject *GetArgumentObject(const parser::OmpArgument &argument);
bool IsCommonBlock(const Symbol &sym);
bool IsExtendedListItem(const Symbol &sym);
bool IsVariableListItem(const Symbol &sym);
+bool IsTypeParamInquiry(const Symbol &sym);
+bool IsStructureComponent(const Symbol &sym);
bool IsVarOrFunctionRef(const MaybeExpr &expr);
bool IsMapEnteringType(parser::OmpMapType::Value type);
diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp
index 7106728..ad456d8 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -3503,12 +3503,12 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
lower::pft::Evaluation &eval,
const parser::OpenMPUtilityConstruct &);
-static void
-genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
- semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
- const parser::OpenMPDeclarativeAllocate &declarativeAllocate) {
+static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
+ semantics::SemanticsContext &semaCtx,
+ lower::pft::Evaluation &eval,
+ const parser::OmpAllocateDirective &allocate) {
if (!semaCtx.langOptions().OpenMPSimd)
- TODO(converter.getCurrentLocation(), "OpenMPDeclarativeAllocate");
+ TODO(converter.getCurrentLocation(), "OmpAllocateDirective");
}
static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
@@ -3902,14 +3902,6 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
semantics::SemanticsContext &semaCtx,
lower::pft::Evaluation &eval,
- const parser::OpenMPExecutableAllocate &execAllocConstruct) {
- if (!semaCtx.langOptions().OpenMPSimd)
- TODO(converter.getCurrentLocation(), "OpenMPExecutableAllocate");
-}
-
-static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
- semantics::SemanticsContext &semaCtx,
- lower::pft::Evaluation &eval,
const parser::OpenMPLoopConstruct &loopConstruct) {
const parser::OmpDirectiveSpecification &beginSpec = loopConstruct.BeginDir();
List<Clause> clauses = makeClauses(beginSpec.Clauses(), semaCtx);
diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp
index 4159d2e..4374acb 100644
--- a/flang/lib/Parser/openmp-parsers.cpp
+++ b/flang/lib/Parser/openmp-parsers.cpp
@@ -1778,6 +1778,31 @@ private:
llvm::omp::Directive dir_;
};
+struct OmpDeclarativeAllocateParser {
+ using resultType = OmpAllocateDirective;
+
+ std::optional<resultType> Parse(ParseState &state) const {
+ constexpr llvm::omp::Directive dir{llvm::omp::Directive::OMPD_allocate};
+ if (auto &&begin{attempt(OmpBeginDirectiveParser(dir)).Parse(state)}) {
+ Block empty;
+ auto end{maybe(OmpEndDirectiveParser{dir}).Parse(state)};
+ return OmpAllocateDirective{std::move(*begin), std::move(empty),
+ llvm::transformOptional(std::move(*end),
+ [](auto &&s) { return OmpEndDirective(std::move(s)); })};
+ }
+ return std::nullopt;
+ }
+};
+
+struct OmpExecutableAllocateParser {
+ using resultType = OmpAllocateDirective;
+
+ std::optional<resultType> Parse(ParseState &state) const {
+ OmpStatementConstructParser p{llvm::omp::Directive::OMPD_allocate};
+ return construct<OmpAllocateDirective>(p).Parse(state);
+ }
+};
+
TYPE_PARSER(sourced(construct<OpenMPAllocatorsConstruct>(
OmpStatementConstructParser{llvm::omp::Directive::OMPD_allocators})))
@@ -2044,13 +2069,6 @@ TYPE_PARSER(construct<OmpInitializerExpression>(OmpStylizedExpressionParser{}))
TYPE_PARSER(sourced(construct<OpenMPCriticalConstruct>(
OmpBlockConstructParser{llvm::omp::Directive::OMPD_critical})))
-// 2.11.3 Executable Allocate directive
-TYPE_PARSER(
- sourced(construct<OpenMPExecutableAllocate>(verbatim("ALLOCATE"_tok),
- maybe(parenthesized(Parser<OmpObjectList>{})), Parser<OmpClauseList>{},
- maybe(nonemptyList(Parser<OpenMPDeclarativeAllocate>{})) / endOmpLine,
- statement(allocateStmt))))
-
// 2.8.2 Declare Simd construct
TYPE_PARSER(sourced(construct<OpenMPDeclareSimdConstruct>(
predicated(Parser<OmpDirectiveName>{},
@@ -2076,12 +2094,6 @@ TYPE_PARSER(sourced( //
IsDirective(llvm::omp::Directive::OMPD_threadprivate)) >=
Parser<OmpDirectiveSpecification>{})))
-// 2.11.3 Declarative Allocate directive
-TYPE_PARSER(
- sourced(construct<OpenMPDeclarativeAllocate>(verbatim("ALLOCATE"_tok),
- parenthesized(Parser<OmpObjectList>{}), Parser<OmpClauseList>{})) /
- lookAhead(endOmpLine / !statement(allocateStmt)))
-
// Assumes Construct
TYPE_PARSER(sourced(construct<OpenMPDeclarativeAssumes>(
predicated(OmpDirectiveNameParser{},
@@ -2104,7 +2116,7 @@ TYPE_PARSER(
construct<OpenMPDeclarativeConstruct>(
Parser<OmpDeclareVariantDirective>{}) ||
construct<OpenMPDeclarativeConstruct>(
- Parser<OpenMPDeclarativeAllocate>{}) ||
+ sourced(OmpDeclarativeAllocateParser{})) ||
construct<OpenMPDeclarativeConstruct>(
Parser<OpenMPGroupprivate>{}) ||
construct<OpenMPDeclarativeConstruct>(
@@ -2192,6 +2204,8 @@ TYPE_CONTEXT_PARSER("OpenMP construct"_en_US,
withMessage("expected OpenMP construct"_err_en_US,
first(construct<OpenMPConstruct>(Parser<OpenMPSectionsConstruct>{}),
construct<OpenMPConstruct>(Parser<OpenMPLoopConstruct>{}),
+ construct<OpenMPConstruct>(
+ sourced(OmpExecutableAllocateParser{})),
construct<OpenMPConstruct>(Parser<OmpBlockConstruct>{}),
// OmpBlockConstruct is attempted before
// OpenMPStandaloneConstruct to resolve !$OMP ORDERED
@@ -2199,9 +2213,7 @@ TYPE_CONTEXT_PARSER("OpenMP construct"_en_US,
construct<OpenMPConstruct>(Parser<OpenMPAtomicConstruct>{}),
construct<OpenMPConstruct>(Parser<OpenMPUtilityConstruct>{}),
construct<OpenMPConstruct>(Parser<OpenMPDispatchConstruct>{}),
- construct<OpenMPConstruct>(Parser<OpenMPExecutableAllocate>{}),
construct<OpenMPConstruct>(Parser<OpenMPAllocatorsConstruct>{}),
- construct<OpenMPConstruct>(Parser<OpenMPDeclarativeAllocate>{}),
construct<OpenMPConstruct>(Parser<OpenMPAssumeConstruct>{}),
construct<OpenMPConstruct>(Parser<OpenMPCriticalConstruct>{}))))
diff --git a/flang/lib/Parser/openmp-utils.cpp b/flang/lib/Parser/openmp-utils.cpp
index 95ad3f6..b9d3763c 100644
--- a/flang/lib/Parser/openmp-utils.cpp
+++ b/flang/lib/Parser/openmp-utils.cpp
@@ -22,6 +22,25 @@
namespace Fortran::parser::omp {
+const OpenMPDeclarativeConstruct *GetOmp(const DeclarationConstruct &x) {
+ if (auto *y = std::get_if<SpecificationConstruct>(&x.u)) {
+ if (auto *z{std::get_if<common::Indirection<OpenMPDeclarativeConstruct>>(
+ &y->u)}) {
+ return &z->value();
+ }
+ }
+ return nullptr;
+}
+
+const OpenMPConstruct *GetOmp(const ExecutionPartConstruct &x) {
+ if (auto *y{std::get_if<ExecutableConstruct>(&x.u)}) {
+ if (auto *z{std::get_if<common::Indirection<OpenMPConstruct>>(&y->u)}) {
+ return &z->value();
+ }
+ }
+ return nullptr;
+}
+
const OmpObjectList *GetOmpObjectList(const OmpClause &clause) {
// Clauses with OmpObjectList as its data member
using MemberObjectListClauses = std::tuple<OmpClause::Copyin,
@@ -86,4 +105,24 @@ const OmpInitializerExpression *GetInitializerExpr(const OmpClause &init) {
return nullptr;
}
+static void SplitOmpAllocateHelper(
+ OmpAllocateInfo &n, const OmpAllocateDirective &x) {
+ n.dirs.push_back(&x);
+ const Block &body{std::get<Block>(x.t)};
+ if (!body.empty()) {
+ if (auto *omp{GetOmp(body.front())}) {
+ if (auto *ad{std::get_if<OmpAllocateDirective>(&omp->u)}) {
+ return SplitOmpAllocateHelper(n, *ad);
+ }
+ }
+ n.body = &body.front();
+ }
+}
+
+OmpAllocateInfo SplitOmpAllocate(const OmpAllocateDirective &x) {
+ OmpAllocateInfo info;
+ SplitOmpAllocateHelper(info, x);
+ return info;
+}
+
} // namespace Fortran::parser::omp
diff --git a/flang/lib/Parser/unparse.cpp b/flang/lib/Parser/unparse.cpp
index 9b38cfc..8412303 100644
--- a/flang/lib/Parser/unparse.cpp
+++ b/flang/lib/Parser/unparse.cpp
@@ -2482,32 +2482,8 @@ public:
Unparse(static_cast<const OmpBlockConstruct &>(x));
}
- void Unparse(const OpenMPExecutableAllocate &x) {
- const auto &fields =
- std::get<std::optional<std::list<parser::OpenMPDeclarativeAllocate>>>(
- x.t);
- if (fields) {
- for (const auto &decl : *fields) {
- Walk(decl);
- }
- }
- BeginOpenMP();
- Word("!$OMP ALLOCATE");
- Walk(" (", std::get<std::optional<OmpObjectList>>(x.t), ")");
- Walk(std::get<OmpClauseList>(x.t));
- Put("\n");
- EndOpenMP();
- Walk(std::get<Statement<AllocateStmt>>(x.t));
- }
- void Unparse(const OpenMPDeclarativeAllocate &x) {
- BeginOpenMP();
- Word("!$OMP ALLOCATE");
- Put(" (");
- Walk(std::get<OmpObjectList>(x.t));
- Put(")");
- Walk(std::get<OmpClauseList>(x.t));
- Put("\n");
- EndOpenMP();
+ void Unparse(const OmpAllocateDirective &x) {
+ Unparse(static_cast<const OmpBlockConstruct &>(x));
}
void Unparse(const OpenMPAllocatorsConstruct &x) {
Unparse(static_cast<const OmpBlockConstruct &>(x));
diff --git a/flang/lib/Semantics/canonicalize-omp.cpp b/flang/lib/Semantics/canonicalize-omp.cpp
index c884658..a11c525 100644
--- a/flang/lib/Semantics/canonicalize-omp.cpp
+++ b/flang/lib/Semantics/canonicalize-omp.cpp
@@ -51,8 +51,6 @@ public:
} // Block list
}
- void Post(parser::ExecutionPart &body) { RewriteOmpAllocations(body); }
-
// Pre-visit all constructs that have both a specification part and
// an execution part, and store the connection between the two.
bool Pre(parser::BlockConstruct &x) {
@@ -88,6 +86,7 @@ public:
void Post(parser::SpecificationPart &spec) {
CanonicalizeUtilityConstructs(spec);
+ CanonicalizeAllocateDirectives(spec);
}
void Post(parser::OmpMapClause &map) { CanonicalizeMapModifiers(map); }
@@ -239,33 +238,138 @@ private:
}
}
- void RewriteOmpAllocations(parser::ExecutionPart &body) {
- // Rewrite leading declarative allocations so they are nested
- // within their respective executable allocate directive
- //
- // Original:
- // ExecutionPartConstruct -> OpenMPDeclarativeAllocate
- // ExecutionPartConstruct -> OpenMPDeclarativeAllocate
- // ExecutionPartConstruct -> OpenMPExecutableAllocate
- //
- // After rewriting:
- // ExecutionPartConstruct -> OpenMPExecutableAllocate
- // ExecutionPartConstruct -> OpenMPDeclarativeAllocate
- // ExecutionPartConstruct -> OpenMPDeclarativeAllocate
- for (auto it = body.v.rbegin(); it != body.v.rend();) {
- if (auto *exec = GetOmpIf<parser::OpenMPExecutableAllocate>(*(it++))) {
- parser::OpenMPDeclarativeAllocate *decl;
- std::list<parser::OpenMPDeclarativeAllocate> subAllocates;
- while (it != body.v.rend() &&
- (decl = GetOmpIf<parser::OpenMPDeclarativeAllocate>(*it))) {
- subAllocates.push_front(std::move(*decl));
- it = decltype(it)(body.v.erase(std::next(it).base()));
+ // Canonicalization of allocate directives
+ //
+ // In OpenMP 5.0 and 5.1 the allocate directive could either be a declarative
+ // one or an executable one. As usual in such cases, this poses a problem
+ // when the directive appears at the boundary between the specification part
+ // and the execution part.
+ // The executable form can actually consist of several adjacent directives,
+ // whereas the declarative form is always standalone. Additionally, the
+ // executable form must be associated with an allocate statement.
+ //
+ // The parser tries to parse declarative statements first, so in the
+ // following case, the two directives will be declarative, even though
+ // they should be treated as a single executable form:
+ // integer, allocatable :: x, y ! Specification
+ // !$omp allocate(x)
+ // !$omp allocate(y)
+ // allocate(x, y) ! Execution
+ //
+ void CanonicalizeAllocateDirectives(parser::SpecificationPart &spec) {
+ auto found = blockForSpec_.find(&spec);
+ if (found == blockForSpec_.end()) {
+ // There is no corresponding execution part, so there is nothing to do.
+ return;
+ }
+ parser::Block &block = *found->second;
+
+ auto isAllocateStmt = [](const parser::ExecutionPartConstruct &epc) {
+ if (auto *ec = std::get_if<parser::ExecutableConstruct>(&epc.u)) {
+ if (auto *as =
+ std::get_if<parser::Statement<parser::ActionStmt>>(&ec->u)) {
+ return std::holds_alternative<
+ common::Indirection<parser::AllocateStmt>>(as->statement.u);
+ }
+ }
+ return false;
+ };
+
+ if (!block.empty() && isAllocateStmt(block.front())) {
+ // There are two places where an OpenMP declarative construct can
+ // show up in the tuple in specification part:
+ // (1) in std::list<OpenMPDeclarativeConstruct>, or
+ // (2) in std::list<DeclarationConstruct>.
+ // The case (1) is only possible if the list (2) is empty.
+
+ auto &omps =
+ std::get<std::list<parser::OpenMPDeclarativeConstruct>>(spec.t);
+ auto &decls = std::get<std::list<parser::DeclarationConstruct>>(spec.t);
+
+ if (!decls.empty()) {
+ MakeExecutableAllocateFromDecls(decls, block);
+ } else {
+ MakeExecutableAllocateFromOmps(omps, block);
+ }
+ }
+ }
+
+ parser::ExecutionPartConstruct EmbedInExec(
+ parser::OmpAllocateDirective *alo, parser::ExecutionPartConstruct &&epc) {
+ // Nest current epc inside the allocate directive.
+ std::get<parser::Block>(alo->t).push_front(std::move(epc));
+ // Set the new epc to be the ExecutionPartConstruct made from
+ // the allocate directive.
+ parser::OpenMPConstruct opc(std::move(*alo));
+ common::Indirection<parser::OpenMPConstruct> ind(std::move(opc));
+ parser::ExecutableConstruct ec(std::move(ind));
+ return parser::ExecutionPartConstruct(std::move(ec));
+ }
+
+ void MakeExecutableAllocateFromDecls(
+ std::list<parser::DeclarationConstruct> &decls, parser::Block &body) {
+ using OpenMPDeclarativeConstruct =
+ common::Indirection<parser::OpenMPDeclarativeConstruct>;
+
+ auto getAllocate = [](parser::DeclarationConstruct *dc) {
+ if (auto *sc = std::get_if<parser::SpecificationConstruct>(&dc->u)) {
+ if (auto *odc = std::get_if<OpenMPDeclarativeConstruct>(&sc->u)) {
+ if (auto *alo =
+ std::get_if<parser::OmpAllocateDirective>(&odc->value().u)) {
+ return alo;
+ }
+ }
+ }
+ return static_cast<parser::OmpAllocateDirective *>(nullptr);
+ };
+
+ std::list<parser::DeclarationConstruct>::reverse_iterator rlast = [&]() {
+ for (auto rit = decls.rbegin(), rend = decls.rend(); rit != rend; ++rit) {
+ if (getAllocate(&*rit) == nullptr) {
+ return rit;
}
- if (!subAllocates.empty()) {
- std::get<std::optional<std::list<parser::OpenMPDeclarativeAllocate>>>(
- exec->t) = {std::move(subAllocates)};
+ }
+ return decls.rend();
+ }();
+
+ if (rlast != decls.rbegin()) {
+ // We have already checked that the first statement in body is
+ // ALLOCATE.
+ parser::ExecutionPartConstruct epc(std::move(body.front()));
+ for (auto rit = decls.rbegin(); rit != rlast; ++rit) {
+ epc = EmbedInExec(getAllocate(&*rit), std::move(epc));
+ }
+
+ body.pop_front();
+ body.push_front(std::move(epc));
+ decls.erase(rlast.base(), decls.end());
+ }
+ }
+
+ void MakeExecutableAllocateFromOmps(
+ std::list<parser::OpenMPDeclarativeConstruct> &omps,
+ parser::Block &body) {
+ using OpenMPDeclarativeConstruct = parser::OpenMPDeclarativeConstruct;
+
+ std::list<OpenMPDeclarativeConstruct>::reverse_iterator rlast = [&]() {
+ for (auto rit = omps.rbegin(), rend = omps.rend(); rit != rend; ++rit) {
+ if (!std::holds_alternative<parser::OmpAllocateDirective>(rit->u)) {
+ return rit;
}
}
+ return omps.rend();
+ }();
+
+ if (rlast != omps.rbegin()) {
+ parser::ExecutionPartConstruct epc(std::move(body.front()));
+ for (auto rit = omps.rbegin(); rit != rlast; ++rit) {
+ epc = EmbedInExec(
+ &std::get<parser::OmpAllocateDirective>(rit->u), std::move(epc));
+ }
+
+ body.pop_front();
+ body.push_front(std::move(epc));
+ omps.erase(rlast.base(), omps.end());
}
}
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index aaaf1ec..d7db15d 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -179,29 +179,21 @@ void OmpStructureChecker::Leave(const parser::BlockConstruct &x) {
}
}
-// Use when clause falls under 'struct OmpClause' in 'parse-tree.h'.
-#define CHECK_SIMPLE_CLAUSE(X, Y) \
- void OmpStructureChecker::Enter(const parser::OmpClause::X &) { \
- CheckAllowedClause(llvm::omp::Clause::Y); \
- }
+void OmpStructureChecker::Enter(const parser::SpecificationPart &) {
+ partStack_.push_back(PartKind::SpecificationPart);
+}
-#define CHECK_REQ_CONSTANT_SCALAR_INT_CLAUSE(X, Y) \
- void OmpStructureChecker::Enter(const parser::OmpClause::X &c) { \
- CheckAllowedClause(llvm::omp::Clause::Y); \
- RequiresConstantPositiveParameter(llvm::omp::Clause::Y, c.v); \
- }
+void OmpStructureChecker::Leave(const parser::SpecificationPart &) {
+ partStack_.pop_back();
+}
-#define CHECK_REQ_SCALAR_INT_CLAUSE(X, Y) \
- void OmpStructureChecker::Enter(const parser::OmpClause::X &c) { \
- CheckAllowedClause(llvm::omp::Clause::Y); \
- RequiresPositiveParameter(llvm::omp::Clause::Y, c.v); \
- }
+void OmpStructureChecker::Enter(const parser::ExecutionPart &) {
+ partStack_.push_back(PartKind::ExecutionPart);
+}
-// Use when clause don't falls under 'struct OmpClause' in 'parse-tree.h'.
-#define CHECK_SIMPLE_PARSER_CLAUSE(X, Y) \
- void OmpStructureChecker::Enter(const parser::X &) { \
- CheckAllowedClause(llvm::omp::Y); \
- }
+void OmpStructureChecker::Leave(const parser::ExecutionPart &) {
+ partStack_.pop_back();
+}
// 'OmpWorkshareBlockChecker' is used to check the validity of the assignment
// statements and the expressions enclosed in an OpenMP Workshare construct
@@ -667,49 +659,6 @@ void OmpStructureChecker::HasInvalidTeamsNesting(
}
}
-void OmpStructureChecker::CheckPredefinedAllocatorRestriction(
- const parser::CharBlock &source, const parser::Name &name) {
- if (const auto *symbol{name.symbol}) {
- const auto *commonBlock{FindCommonBlockContaining(*symbol)};
- const auto &scope{context_.FindScope(symbol->name())};
- const Scope &containingScope{GetProgramUnitContaining(scope)};
- if (!isPredefinedAllocator &&
- (IsSaved(*symbol) || commonBlock ||
- containingScope.kind() == Scope::Kind::Module)) {
- context_.Say(source,
- "If list items within the %s directive have the "
- "SAVE attribute, are a common block name, or are "
- "declared in the scope of a module, then only "
- "predefined memory allocator parameters can be used "
- "in the allocator clause"_err_en_US,
- ContextDirectiveAsFortran());
- }
- }
-}
-
-void OmpStructureChecker::CheckPredefinedAllocatorRestriction(
- const parser::CharBlock &source,
- const parser::OmpObjectList &ompObjectList) {
- for (const auto &ompObject : ompObjectList.v) {
- common::visit(
- common::visitors{
- [&](const parser::Designator &designator) {
- if (const auto *dataRef{
- std::get_if<parser::DataRef>(&designator.u)}) {
- if (const auto *name{std::get_if<parser::Name>(&dataRef->u)}) {
- CheckPredefinedAllocatorRestriction(source, *name);
- }
- }
- },
- [&](const parser::Name &name) {
- CheckPredefinedAllocatorRestriction(source, name);
- },
- [&](const parser::OmpObject::Invalid &invalid) {},
- },
- ompObject.u);
- }
-}
-
void OmpStructureChecker::Enter(const parser::OmpClause::Hint &x) {
CheckAllowedClause(llvm::omp::Clause::OMPC_hint);
auto &dirCtx{GetContext()};
@@ -763,18 +712,10 @@ template <typename Checker> struct DirectiveSpellingVisitor {
return std::get<parser::OmpBeginDirective>(t).DirName();
}
- bool Pre(const parser::OpenMPDeclarativeAllocate &x) {
- checker_(std::get<parser::Verbatim>(x.t).source, Directive::OMPD_allocate);
- return false;
- }
bool Pre(const parser::OpenMPDispatchConstruct &x) {
checker_(GetDirName(x.t).source, Directive::OMPD_dispatch);
return false;
}
- bool Pre(const parser::OpenMPExecutableAllocate &x) {
- checker_(std::get<parser::Verbatim>(x.t).source, Directive::OMPD_allocate);
- return false;
- }
bool Pre(const parser::OpenMPAllocatorsConstruct &x) {
checker_(GetDirName(x.t).source, Directive::OMPD_allocators);
return false;
@@ -1710,12 +1651,39 @@ void OmpStructureChecker::Leave(const parser::OpenMPRequiresConstruct &) {
dirContext_.pop_back();
}
-void OmpStructureChecker::CheckAllocateDirective(parser::CharBlock source,
- const parser::OmpObjectList &objects,
- const parser::OmpClauseList &clauses) {
- const Scope &thisScope{context_.FindScope(source)};
- SymbolSourceMap symbols;
- GetSymbolsInObjectList(objects, symbols);
+static std::pair<const parser::AllocateStmt *, parser::CharBlock>
+getAllocateStmtAndSource(const parser::ExecutionPartConstruct *epc) {
+ if (SourcedActionStmt as{GetActionStmt(epc)}) {
+ using IndirectionAllocateStmt = common::Indirection<parser::AllocateStmt>;
+ if (auto *indirect{std::get_if<IndirectionAllocateStmt>(&as.stmt->u)}) {
+ return {&indirect->value(), as.source};
+ }
+ }
+ return {nullptr, ""};
+}
+
+// Collect symbols that correspond to non-component objects on the
+// ALLOCATE statement.
+static UnorderedSymbolSet GetNonComponentSymbols(
+ const parser::AllocateStmt &stmt) {
+ UnorderedSymbolSet symbols;
+ for (auto &alloc : std::get<std::list<parser::Allocation>>(stmt.t)) {
+ auto &object{std::get<parser::AllocateObject>(alloc.t)};
+ if (auto *name{std::get_if<parser::Name>(&object.u)}) {
+ if (name->symbol) {
+ symbols.insert(name->symbol->GetUltimate());
+ }
+ }
+ }
+ return symbols;
+}
+
+void OmpStructureChecker::CheckIndividualAllocateDirective(
+ const parser::OmpAllocateDirective &x, bool isExecutable) {
+ const parser::OmpDirectiveSpecification &beginSpec{x.BeginDir()};
+ const parser::OmpDirectiveName &dirName{beginSpec.DirName()};
+
+ const Scope &thisScope{context_.FindScope(dirName.source)};
auto maybeHasPredefinedAllocator{[&](const parser::OmpClause *calloc) {
// Return "true" if the ALLOCATOR clause was provided with an argument
@@ -1741,73 +1709,200 @@ void OmpStructureChecker::CheckAllocateDirective(parser::CharBlock source,
return true;
}};
- const auto *allocator{FindClause(llvm::omp::Clause::OMPC_allocator)};
+ const auto *allocator{[&]() {
+ // Can't use FindClause in Enter (because clauses haven't been visited
+ // yet).
+ for (const parser::OmpClause &c : beginSpec.Clauses().v) {
+ if (c.Id() == llvm::omp::Clause::OMPC_allocator) {
+ return &c;
+ }
+ }
+ return static_cast<const parser::OmpClause *>(nullptr);
+ }()};
+
if (InTargetRegion()) {
bool hasDynAllocators{
HasRequires(llvm::omp::Clause::OMPC_dynamic_allocators)};
if (!allocator && !hasDynAllocators) {
- context_.Say(source,
+ context_.Say(dirName.source,
"An ALLOCATE directive in a TARGET region must specify an ALLOCATOR clause or REQUIRES(DYNAMIC_ALLOCATORS) must be specified"_err_en_US);
}
}
auto maybePredefined{maybeHasPredefinedAllocator(allocator)};
- for (auto &[symbol, source] : symbols) {
- if (!inExecutableAllocate_) {
- if (symbol->owner() != thisScope) {
+ unsigned version{context_.langOptions().OpenMPVersion};
+ std::string condStr{version == 50
+ ? "a named common block, has SAVE attribute or is declared in the "
+ "scope of a module"
+ : "a named common block or has SAVE attribute"};
+
+ auto checkSymbol{[&](const Symbol &symbol, parser::CharBlock source) {
+ if (!isExecutable) {
+ // For structure members, the scope is the derived type, which is
+ // never "this" scope. Ignore this check for members, they will be
+ // flagged anyway.
+ if (symbol.owner() != thisScope && !IsStructureComponent(symbol)) {
context_.Say(source,
"A list item on a declarative ALLOCATE must be declared in the same scope in which the directive appears"_err_en_US);
}
- if (IsPointer(*symbol) || IsAllocatable(*symbol)) {
+ if (IsPointer(symbol) || IsAllocatable(symbol)) {
context_.Say(source,
"A list item in a declarative ALLOCATE cannot have the ALLOCATABLE or POINTER attribute"_err_en_US);
}
}
- if (symbol->GetUltimate().has<AssocEntityDetails>()) {
+ if (symbol.GetUltimate().has<AssocEntityDetails>()) {
context_.Say(source,
"A list item in a declarative ALLOCATE cannot be an associate name"_err_en_US);
}
- if (symbol->attrs().test(Attr::SAVE) || IsCommonBlock(*symbol)) {
+ bool inModule{
+ version == 50 && symbol.owner().kind() == Scope::Kind::Module};
+ if (symbol.attrs().test(Attr::SAVE) || IsCommonBlock(symbol) || inModule) {
if (!allocator) {
context_.Say(source,
- "If a list item is a named common block or has SAVE attribute, an ALLOCATOR clause must be present with a predefined allocator"_err_en_US);
+ "If a list item is %s, an ALLOCATOR clause must be present with a predefined allocator"_err_en_US,
+ condStr);
} else if (!maybePredefined) {
context_.Say(source,
- "If a list item is a named common block or has SAVE attribute, only a predefined allocator may be used on the ALLOCATOR clause"_err_en_US);
+ "If a list item is %s, only a predefined allocator may be used on the ALLOCATOR clause"_err_en_US,
+ condStr);
}
}
- if (FindCommonBlockContaining(*symbol)) {
+ if (FindCommonBlockContaining(symbol)) {
context_.Say(source,
"A variable that is part of a common block may not be specified as a list item in an ALLOCATE directive, except implicitly via the named common block"_err_en_US);
}
+ }};
+
+ for (const parser::OmpArgument &arg : beginSpec.Arguments().v) {
+ const parser::OmpObject *object{GetArgumentObject(arg)};
+ if (!object) {
+ context_.Say(arg.source,
+ "An argument to ALLOCATE directive must be a variable list item"_err_en_US);
+ continue;
+ }
+
+ if (const Symbol *symbol{GetObjectSymbol(*object)}) {
+ if (!IsTypeParamInquiry(*symbol)) {
+ checkSymbol(*symbol, arg.source);
+ }
+ CheckVarIsNotPartOfAnotherVar(dirName.source, *object);
+ }
}
- CheckVarIsNotPartOfAnotherVar(source, objects);
}
-void OmpStructureChecker::Enter(const parser::OpenMPDeclarativeAllocate &x) {
- const auto &dir{std::get<parser::Verbatim>(x.t)};
- PushContextAndClauseSets(dir.source, llvm::omp::Directive::OMPD_allocate);
+void OmpStructureChecker::CheckExecutableAllocateDirective(
+ const parser::OmpAllocateDirective &x) {
+ parser::omp::OmpAllocateInfo info{SplitOmpAllocate(x)};
+
+ auto [allocStmt, allocSource]{getAllocateStmtAndSource(info.body)};
+ if (!allocStmt) {
+ // This has been diagnosed already.
+ return;
+ }
+
+ UnorderedSymbolSet allocateSyms{GetNonComponentSymbols(*allocStmt)};
+ SymbolSourceMap directiveSyms;
+ bool hasEmptyList{false};
+
+ for (const parser::OmpAllocateDirective *ompAlloc : info.dirs) {
+ const parser::OmpDirectiveSpecification &spec{DEREF(ompAlloc).BeginDir()};
+ if (spec.Arguments().v.empty()) {
+ if (hasEmptyList && info.dirs.size() > 1) {
+ context_.Say(spec.DirName().source,
+ "If multiple directives are present in an executable ALLOCATE directive, at most one of them may specify no list items"_err_en_US);
+ }
+ hasEmptyList = true;
+ }
+ for (const parser::OmpArgument &arg : spec.Arguments().v) {
+ if (auto *sym{GetArgumentSymbol(arg)}) {
+ // Ignore these checks for structure members. They are not allowed
+ // in the first place, so don't tell the users that they need to
+ // be specified somewhere,
+ if (IsStructureComponent(*sym)) {
+ continue;
+ }
+ if (auto f{directiveSyms.find(sym)}; f != directiveSyms.end()) {
+ parser::MessageFormattedText txt(
+ "A list item on an executable ALLOCATE may only be specified once"_err_en_US);
+ parser::Message message(arg.source, txt);
+ message.Attach(f->second, "The list item was specified here"_en_US);
+ context_.Say(std::move(message));
+ } else {
+ directiveSyms.insert(std::make_pair(sym, arg.source));
+ }
+
+ if (auto f{allocateSyms.find(*sym)}; f == allocateSyms.end()) {
+ context_
+ .Say(arg.source,
+ "A list item on an executable ALLOCATE must be specified on the associated ALLOCATE statement"_err_en_US)
+ .Attach(allocSource, "The ALLOCATE statement"_en_US);
+ }
+ }
+ }
+ }
}
-void OmpStructureChecker::Leave(const parser::OpenMPDeclarativeAllocate &x) {
- if (!inExecutableAllocate_) {
- const auto &dir{std::get<parser::Verbatim>(x.t)};
- const auto &clauseList{std::get<parser::OmpClauseList>(x.t)};
- const auto &objectList{std::get<parser::OmpObjectList>(x.t)};
+void OmpStructureChecker::Enter(const parser::OmpAllocateDirective &x) {
+ const parser::OmpDirectiveSpecification &beginSpec{x.BeginDir()};
+ const parser::OmpDirectiveName &dirName{beginSpec.DirName()};
+ PushContextAndClauseSets(dirName.source, dirName.v);
+ ++allocateDirectiveLevel;
- isPredefinedAllocator = true;
- CheckAllocateDirective(dir.source, objectList, clauseList);
+ bool isExecutable{partStack_.back() == PartKind::ExecutionPart};
+
+ unsigned version{context_.langOptions().OpenMPVersion};
+ if (isExecutable && allocateDirectiveLevel == 1 && version >= 52) {
+ context_.Warn(common::UsageWarning::OpenMPUsage, dirName.source,
+ "The executable form of the OpenMP ALLOCATE directive has been deprecated, please use ALLOCATORS instead"_warn_en_US);
}
+
+ CheckIndividualAllocateDirective(x, isExecutable);
+
+ if (isExecutable) {
+ auto isOmpAllocate{[](const parser::ExecutionPartConstruct &epc) {
+ if (auto *omp{GetOmp(epc)}) {
+ auto odn{GetOmpDirectiveName(*omp)};
+ return odn.v == llvm::omp::Directive::OMPD_allocate;
+ }
+ return false;
+ }};
+
+ auto &body{std::get<parser::Block>(x.t)};
+ // The parser should put at most one statement in the body.
+ assert(body.size() <= 1 && "Multiple statements in allocate");
+ if (body.empty()) {
+ context_.Say(dirName.source,
+ "An executable ALLOCATE directive must be associated with an ALLOCATE statement"_err_en_US);
+ } else {
+ const parser::ExecutionPartConstruct &first{body.front()};
+ auto [allocStmt, _]{getAllocateStmtAndSource(&body.front())};
+ if (!isOmpAllocate(first) && !allocStmt) {
+ parser::CharBlock source{[&]() {
+ if (auto &&maybeSource{parser::GetSource(first)}) {
+ return *maybeSource;
+ }
+ return dirName.source;
+ }()};
+ context_.Say(source,
+ "The statement associated with executable ALLOCATE directive must be an ALLOCATE statement"_err_en_US);
+ }
+ }
+ }
+}
+
+void OmpStructureChecker::Leave(const parser::OmpAllocateDirective &x) {
+ bool isExecutable{partStack_.back() == PartKind::ExecutionPart};
+ if (isExecutable && allocateDirectiveLevel == 1) {
+ CheckExecutableAllocateDirective(x);
+ }
+
+ --allocateDirectiveLevel;
dirContext_.pop_back();
}
void OmpStructureChecker::Enter(const parser::OmpClause::Allocator &x) {
CheckAllowedClause(llvm::omp::Clause::OMPC_allocator);
- // Note: Predefined allocators are stored in ScalarExpr as numbers
- // whereas custom allocators are stored as strings, so if the ScalarExpr
- // actually has an int value, then it must be a predefined allocator
- isPredefinedAllocator = GetIntValue(x.v).has_value();
RequiresPositiveParameter(llvm::omp::Clause::OMPC_allocator, x.v);
}
@@ -1823,16 +1918,6 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Allocate &x) {
"The alignment value should be a constant positive integer"_err_en_US);
}
}
- // The simple and complex modifiers have the same structure. They only
- // differ in their syntax.
- if (auto *alloc{OmpGetUniqueModifier<parser::OmpAllocatorComplexModifier>(
- modifiers)}) {
- isPredefinedAllocator = GetIntValue(alloc->v).has_value();
- }
- if (auto *alloc{OmpGetUniqueModifier<parser::OmpAllocatorSimpleModifier>(
- modifiers)}) {
- isPredefinedAllocator = GetIntValue(alloc->v).has_value();
- }
}
}
@@ -2115,168 +2200,88 @@ void OmpStructureChecker::Enter(const parser::OmpClause::At &x) {
}
}
-// Goes through the names in an OmpObjectList and checks if each name appears
-// in the given allocate statement
-void OmpStructureChecker::CheckAllNamesInAllocateStmt(
- const parser::CharBlock &source, const parser::OmpObjectList &ompObjectList,
- const parser::AllocateStmt &allocate) {
- for (const auto &obj : ompObjectList.v) {
- if (const auto *d{std::get_if<parser::Designator>(&obj.u)}) {
- if (const auto *ref{std::get_if<parser::DataRef>(&d->u)}) {
- if (const auto *n{std::get_if<parser::Name>(&ref->u)}) {
- CheckNameInAllocateStmt(source, *n, allocate);
- }
- }
- }
- }
-}
-
-void OmpStructureChecker::CheckNameInAllocateStmt(
- const parser::CharBlock &source, const parser::Name &name,
- const parser::AllocateStmt &allocate) {
- for (const auto &allocation :
- std::get<std::list<parser::Allocation>>(allocate.t)) {
- const auto &allocObj = std::get<parser::AllocateObject>(allocation.t);
- if (const auto *n{std::get_if<parser::Name>(&allocObj.u)}) {
- if (n->source == name.source) {
- return;
- }
- }
- }
- unsigned version{context_.langOptions().OpenMPVersion};
- context_.Say(source,
- "Object '%s' in %s directive not "
- "found in corresponding ALLOCATE statement"_err_en_US,
- name.ToString(),
- parser::ToUpperCaseLetters(
- llvm::omp::getOpenMPDirectiveName(GetContext().directive, version)
- .str()));
-}
-
-void OmpStructureChecker::Enter(const parser::OpenMPExecutableAllocate &x) {
- inExecutableAllocate_ = true;
- const auto &dir{std::get<parser::Verbatim>(x.t)};
- PushContextAndClauseSets(dir.source, llvm::omp::Directive::OMPD_allocate);
-
- unsigned version{context_.langOptions().OpenMPVersion};
- if (version >= 52) {
- context_.Warn(common::UsageWarning::OpenMPUsage, x.source,
- "The executable form of the OpenMP ALLOCATE directive has been deprecated, please use ALLOCATORS instead"_warn_en_US);
- }
-
- const auto &allocateStmt =
- std::get<parser::Statement<parser::AllocateStmt>>(x.t).statement;
- if (const auto &list{std::get<std::optional<parser::OmpObjectList>>(x.t)}) {
- CheckAllNamesInAllocateStmt(
- std::get<parser::Verbatim>(x.t).source, *list, allocateStmt);
- }
- if (const auto &subDirs{
- std::get<std::optional<std::list<parser::OpenMPDeclarativeAllocate>>>(
- x.t)}) {
- for (const auto &dalloc : *subDirs) {
- CheckAllNamesInAllocateStmt(std::get<parser::Verbatim>(dalloc.t).source,
- std::get<parser::OmpObjectList>(dalloc.t), allocateStmt);
- }
- }
-
- isPredefinedAllocator = true;
-}
+void OmpStructureChecker::Enter(const parser::OpenMPAllocatorsConstruct &x) {
+ const parser::OmpDirectiveSpecification &beginSpec{x.BeginDir()};
+ const parser::OmpDirectiveName &dirName{beginSpec.DirName()};
+ PushContextAndClauseSets(
+ dirName.source, llvm::omp::Directive::OMPD_allocators);
-void OmpStructureChecker::Leave(const parser::OpenMPExecutableAllocate &x) {
- parser::OmpObjectList empty{std::list<parser::OmpObject>{}};
- auto &objects{[&]() -> const parser::OmpObjectList & {
- if (auto &objects{std::get<std::optional<parser::OmpObjectList>>(x.t)}) {
- return *objects;
- } else {
- return empty;
+ for (const auto &clause : beginSpec.Clauses().v) {
+ auto *alloc{std::get_if<parser::OmpClause::Allocate>(&clause.u)};
+ if (!alloc) {
+ continue;
}
- }()};
- auto &clauses{std::get<parser::OmpClauseList>(x.t)};
- CheckAllocateDirective(
- std::get<parser::Verbatim>(x.t).source, objects, clauses);
-
- if (const auto &subDirs{
- std::get<std::optional<std::list<parser::OpenMPDeclarativeAllocate>>>(
- x.t)}) {
- for (const auto &dalloc : *subDirs) {
- const auto &dir{std::get<parser::Verbatim>(x.t)};
- const auto &clauses{std::get<parser::OmpClauseList>(dalloc.t)};
- const auto &objects{std::get<parser::OmpObjectList>(dalloc.t)};
- CheckAllocateDirective(dir.source, objects, clauses);
+ using OmpAllocatorSimpleModifier = parser::OmpAllocatorSimpleModifier;
+ using OmpAllocatorComplexModifier = parser::OmpAllocatorComplexModifier;
+
+ if (InTargetRegion()) {
+ auto &modifiers{OmpGetModifiers(alloc->v)};
+ bool hasAllocator{
+ OmpGetUniqueModifier<OmpAllocatorSimpleModifier>(modifiers) ||
+ OmpGetUniqueModifier<OmpAllocatorComplexModifier>(modifiers)};
+ bool hasDynAllocators{
+ HasRequires(llvm::omp::Clause::OMPC_dynamic_allocators)};
+ if (!hasAllocator && !hasDynAllocators) {
+ context_.Say(clause.source,
+ "An ALLOCATE clause in a TARGET region must specify an allocator or REQUIRES(DYNAMIC_ALLOCATORS) must be specified"_err_en_US);
+ }
}
}
- dirContext_.pop_back();
- inExecutableAllocate_ = false;
-}
-
-void OmpStructureChecker::Enter(const parser::OpenMPAllocatorsConstruct &x) {
- isPredefinedAllocator = true;
-
- const parser::OmpDirectiveSpecification &dirSpec{x.BeginDir()};
- auto &block{std::get<parser::Block>(x.t)};
- PushContextAndClauseSets(
- dirSpec.DirName().source, llvm::omp::Directive::OMPD_allocators);
-
- if (block.empty()) {
- context_.Say(dirSpec.source,
- "The ALLOCATORS construct should contain a single ALLOCATE statement"_err_en_US);
+ auto &body{std::get<parser::Block>(x.t)};
+ // The parser should put at most one statement in the body.
+ assert(body.size() <= 1 && "Malformed body in allocators");
+ if (body.empty()) {
+ context_.Say(dirName.source,
+ "The body of an ALLOCATORS construct should be an ALLOCATE statement"_err_en_US);
return;
}
- omp::SourcedActionStmt action{omp::GetActionStmt(block)};
- const auto *allocate{
- action ? parser::Unwrap<parser::AllocateStmt>(action.stmt) : nullptr};
-
- if (allocate) {
- for (const auto &clause : dirSpec.Clauses().v) {
- if (auto *alloc{std::get_if<parser::OmpClause::Allocate>(&clause.u)}) {
- CheckAllNamesInAllocateStmt(
- x.source, std::get<parser::OmpObjectList>(alloc->v.t), *allocate);
-
- using OmpAllocatorSimpleModifier = parser::OmpAllocatorSimpleModifier;
- using OmpAllocatorComplexModifier = parser::OmpAllocatorComplexModifier;
-
- auto &modifiers{OmpGetModifiers(alloc->v)};
- bool hasAllocator{
- OmpGetUniqueModifier<OmpAllocatorSimpleModifier>(modifiers) ||
- OmpGetUniqueModifier<OmpAllocatorComplexModifier>(modifiers)};
-
- // TODO: As with allocate directive, exclude the case when a requires
- // directive with the dynamic_allocators clause is present in
- // the same compilation unit (OMP5.0 2.11.3).
- if (IsNestedInDirective(llvm::omp::Directive::OMPD_target) &&
- !hasAllocator) {
- context_.Say(x.source,
- "ALLOCATORS directives that appear in a TARGET region must specify an allocator"_err_en_US);
- }
+ auto [allocStmt, allocSource]{getAllocateStmtAndSource(&body.front())};
+ if (!allocStmt) {
+ parser::CharBlock source{[&]() {
+ if (auto &&maybeSource{parser::GetSource(body.front())}) {
+ return *maybeSource;
}
- }
- } else {
- const parser::CharBlock &source = action ? action.source : x.source;
+ return dirName.source;
+ }()};
context_.Say(source,
- "The body of the ALLOCATORS construct should be an ALLOCATE statement"_err_en_US);
+ "The body of an ALLOCATORS construct should be an ALLOCATE statement"_err_en_US);
+ return;
}
- for (const auto &clause : dirSpec.Clauses().v) {
- if (const auto *allocClause{
- parser::Unwrap<parser::OmpClause::Allocate>(clause)}) {
- CheckVarIsNotPartOfAnotherVar(
- dirSpec.source, std::get<parser::OmpObjectList>(allocClause->v.t));
+ UnorderedSymbolSet allocateSyms{GetNonComponentSymbols(*allocStmt)};
+ for (const auto &clause : beginSpec.Clauses().v) {
+ auto *alloc{std::get_if<parser::OmpClause::Allocate>(&clause.u)};
+ if (!alloc) {
+ continue;
+ }
+ for (auto &object : DEREF(GetOmpObjectList(clause)).v) {
+ CheckVarIsNotPartOfAnotherVar(dirName.source, object);
+ if (auto *symbol{GetObjectSymbol(object)}) {
+ if (IsStructureComponent(*symbol)) {
+ continue;
+ }
+ parser::CharBlock source{[&]() {
+ if (auto &&objectSource{GetObjectSource(object)}) {
+ return *objectSource;
+ }
+ return clause.source;
+ }()};
+ if (!IsTypeParamInquiry(*symbol)) {
+ if (auto f{allocateSyms.find(*symbol)}; f == allocateSyms.end()) {
+ context_
+ .Say(source,
+ "A list item in an ALLOCATORS construct must be specified on the associated ALLOCATE statement"_err_en_US)
+ .Attach(allocSource, "The ALLOCATE statement"_en_US);
+ }
+ }
+ }
}
}
}
void OmpStructureChecker::Leave(const parser::OpenMPAllocatorsConstruct &x) {
- const parser::OmpDirectiveSpecification &dirSpec{x.BeginDir()};
-
- for (const auto &clause : dirSpec.Clauses().v) {
- if (const auto *allocClause{
- std::get_if<parser::OmpClause::Allocate>(&clause.u)}) {
- CheckPredefinedAllocatorRestriction(
- dirSpec.source, std::get<parser::OmpObjectList>(allocClause->v.t));
- }
- }
dirContext_.pop_back();
}
@@ -3362,88 +3367,6 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Sizes &c) {
/*paramName=*/"parameter", /*allowZero=*/false);
}
-// Following clauses do not have a separate node in parse-tree.h.
-CHECK_SIMPLE_CLAUSE(Absent, OMPC_absent)
-CHECK_SIMPLE_CLAUSE(Affinity, OMPC_affinity)
-CHECK_SIMPLE_CLAUSE(Capture, OMPC_capture)
-CHECK_SIMPLE_CLAUSE(Contains, OMPC_contains)
-CHECK_SIMPLE_CLAUSE(Default, OMPC_default)
-CHECK_SIMPLE_CLAUSE(Depobj, OMPC_depobj)
-CHECK_SIMPLE_CLAUSE(DeviceType, OMPC_device_type)
-CHECK_SIMPLE_CLAUSE(DistSchedule, OMPC_dist_schedule)
-CHECK_SIMPLE_CLAUSE(DynGroupprivate, OMPC_dyn_groupprivate)
-CHECK_SIMPLE_CLAUSE(Exclusive, OMPC_exclusive)
-CHECK_SIMPLE_CLAUSE(Final, OMPC_final)
-CHECK_SIMPLE_CLAUSE(Flush, OMPC_flush)
-CHECK_SIMPLE_CLAUSE(Full, OMPC_full)
-CHECK_SIMPLE_CLAUSE(Grainsize, OMPC_grainsize)
-CHECK_SIMPLE_CLAUSE(GraphId, OMPC_graph_id)
-CHECK_SIMPLE_CLAUSE(GraphReset, OMPC_graph_reset)
-CHECK_SIMPLE_CLAUSE(Holds, OMPC_holds)
-CHECK_SIMPLE_CLAUSE(Inclusive, OMPC_inclusive)
-CHECK_SIMPLE_CLAUSE(Initializer, OMPC_initializer)
-CHECK_SIMPLE_CLAUSE(Match, OMPC_match)
-CHECK_SIMPLE_CLAUSE(Nontemporal, OMPC_nontemporal)
-CHECK_SIMPLE_CLAUSE(NumTasks, OMPC_num_tasks)
-CHECK_SIMPLE_CLAUSE(Order, OMPC_order)
-CHECK_SIMPLE_CLAUSE(Read, OMPC_read)
-CHECK_SIMPLE_CLAUSE(Threadprivate, OMPC_threadprivate)
-CHECK_SIMPLE_CLAUSE(Groupprivate, OMPC_groupprivate)
-CHECK_SIMPLE_CLAUSE(Threads, OMPC_threads)
-CHECK_SIMPLE_CLAUSE(Threadset, OMPC_threadset)
-CHECK_SIMPLE_CLAUSE(Inbranch, OMPC_inbranch)
-CHECK_SIMPLE_CLAUSE(Link, OMPC_link)
-CHECK_SIMPLE_CLAUSE(Indirect, OMPC_indirect)
-CHECK_SIMPLE_CLAUSE(Mergeable, OMPC_mergeable)
-CHECK_SIMPLE_CLAUSE(NoOpenmp, OMPC_no_openmp)
-CHECK_SIMPLE_CLAUSE(NoOpenmpRoutines, OMPC_no_openmp_routines)
-CHECK_SIMPLE_CLAUSE(NoOpenmpConstructs, OMPC_no_openmp_constructs)
-CHECK_SIMPLE_CLAUSE(NoParallelism, OMPC_no_parallelism)
-CHECK_SIMPLE_CLAUSE(Nogroup, OMPC_nogroup)
-CHECK_SIMPLE_CLAUSE(Notinbranch, OMPC_notinbranch)
-CHECK_SIMPLE_CLAUSE(Partial, OMPC_partial)
-CHECK_SIMPLE_CLAUSE(ProcBind, OMPC_proc_bind)
-CHECK_SIMPLE_CLAUSE(Simd, OMPC_simd)
-CHECK_SIMPLE_CLAUSE(Permutation, OMPC_permutation)
-CHECK_SIMPLE_CLAUSE(Uniform, OMPC_uniform)
-CHECK_SIMPLE_CLAUSE(Unknown, OMPC_unknown)
-CHECK_SIMPLE_CLAUSE(Untied, OMPC_untied)
-CHECK_SIMPLE_CLAUSE(UsesAllocators, OMPC_uses_allocators)
-CHECK_SIMPLE_CLAUSE(Write, OMPC_write)
-CHECK_SIMPLE_CLAUSE(Init, OMPC_init)
-CHECK_SIMPLE_CLAUSE(Use, OMPC_use)
-CHECK_SIMPLE_CLAUSE(Novariants, OMPC_novariants)
-CHECK_SIMPLE_CLAUSE(Nocontext, OMPC_nocontext)
-CHECK_SIMPLE_CLAUSE(Severity, OMPC_severity)
-CHECK_SIMPLE_CLAUSE(Message, OMPC_message)
-CHECK_SIMPLE_CLAUSE(Filter, OMPC_filter)
-CHECK_SIMPLE_CLAUSE(Otherwise, OMPC_otherwise)
-CHECK_SIMPLE_CLAUSE(AdjustArgs, OMPC_adjust_args)
-CHECK_SIMPLE_CLAUSE(AppendArgs, OMPC_append_args)
-CHECK_SIMPLE_CLAUSE(MemoryOrder, OMPC_memory_order)
-CHECK_SIMPLE_CLAUSE(Bind, OMPC_bind)
-CHECK_SIMPLE_CLAUSE(Compare, OMPC_compare)
-CHECK_SIMPLE_CLAUSE(OmpxAttribute, OMPC_ompx_attribute)
-CHECK_SIMPLE_CLAUSE(Weak, OMPC_weak)
-CHECK_SIMPLE_CLAUSE(AcqRel, OMPC_acq_rel)
-CHECK_SIMPLE_CLAUSE(Acquire, OMPC_acquire)
-CHECK_SIMPLE_CLAUSE(Relaxed, OMPC_relaxed)
-CHECK_SIMPLE_CLAUSE(Release, OMPC_release)
-CHECK_SIMPLE_CLAUSE(Replayable, OMPC_replayable)
-CHECK_SIMPLE_CLAUSE(Transparent, OMPC_transparent)
-CHECK_SIMPLE_CLAUSE(SeqCst, OMPC_seq_cst)
-CHECK_SIMPLE_CLAUSE(Fail, OMPC_fail)
-
-CHECK_REQ_SCALAR_INT_CLAUSE(NumTeams, OMPC_num_teams)
-CHECK_REQ_SCALAR_INT_CLAUSE(NumThreads, OMPC_num_threads)
-CHECK_REQ_SCALAR_INT_CLAUSE(OmpxDynCgroupMem, OMPC_ompx_dyn_cgroup_mem)
-CHECK_REQ_SCALAR_INT_CLAUSE(Priority, OMPC_priority)
-CHECK_REQ_SCALAR_INT_CLAUSE(ThreadLimit, OMPC_thread_limit)
-
-CHECK_REQ_CONSTANT_SCALAR_INT_CLAUSE(Collapse, OMPC_collapse)
-CHECK_REQ_CONSTANT_SCALAR_INT_CLAUSE(Safelen, OMPC_safelen)
-CHECK_REQ_CONSTANT_SCALAR_INT_CLAUSE(Simdlen, OMPC_simdlen)
-
void OmpStructureChecker::Enter(const parser::OmpClause::Looprange &x) {
context_.Say(GetContext().clauseSource,
"LOOPRANGE clause is not implemented yet"_err_en_US,
@@ -5516,4 +5439,104 @@ void OmpStructureChecker::CheckAllowedRequiresClause(llvmOmpClause clause) {
}
}
+// Use when clause falls under 'struct OmpClause' in 'parse-tree.h'.
+#define CHECK_SIMPLE_CLAUSE(X, Y) \
+ void OmpStructureChecker::Enter(const parser::OmpClause::X &) { \
+ CheckAllowedClause(llvm::omp::Clause::Y); \
+ }
+
+#define CHECK_REQ_CONSTANT_SCALAR_INT_CLAUSE(X, Y) \
+ void OmpStructureChecker::Enter(const parser::OmpClause::X &c) { \
+ CheckAllowedClause(llvm::omp::Clause::Y); \
+ RequiresConstantPositiveParameter(llvm::omp::Clause::Y, c.v); \
+ }
+
+#define CHECK_REQ_SCALAR_INT_CLAUSE(X, Y) \
+ void OmpStructureChecker::Enter(const parser::OmpClause::X &c) { \
+ CheckAllowedClause(llvm::omp::Clause::Y); \
+ RequiresPositiveParameter(llvm::omp::Clause::Y, c.v); \
+ }
+
+// Following clauses do not have a separate node in parse-tree.h.
+CHECK_SIMPLE_CLAUSE(Absent, OMPC_absent)
+CHECK_SIMPLE_CLAUSE(AcqRel, OMPC_acq_rel)
+CHECK_SIMPLE_CLAUSE(Acquire, OMPC_acquire)
+CHECK_SIMPLE_CLAUSE(AdjustArgs, OMPC_adjust_args)
+CHECK_SIMPLE_CLAUSE(Affinity, OMPC_affinity)
+CHECK_SIMPLE_CLAUSE(AppendArgs, OMPC_append_args)
+CHECK_SIMPLE_CLAUSE(Bind, OMPC_bind)
+CHECK_SIMPLE_CLAUSE(Capture, OMPC_capture)
+CHECK_SIMPLE_CLAUSE(Compare, OMPC_compare)
+CHECK_SIMPLE_CLAUSE(Contains, OMPC_contains)
+CHECK_SIMPLE_CLAUSE(Default, OMPC_default)
+CHECK_SIMPLE_CLAUSE(Depobj, OMPC_depobj)
+CHECK_SIMPLE_CLAUSE(DeviceType, OMPC_device_type)
+CHECK_SIMPLE_CLAUSE(DistSchedule, OMPC_dist_schedule)
+CHECK_SIMPLE_CLAUSE(DynGroupprivate, OMPC_dyn_groupprivate)
+CHECK_SIMPLE_CLAUSE(Exclusive, OMPC_exclusive)
+CHECK_SIMPLE_CLAUSE(Fail, OMPC_fail)
+CHECK_SIMPLE_CLAUSE(Filter, OMPC_filter)
+CHECK_SIMPLE_CLAUSE(Final, OMPC_final)
+CHECK_SIMPLE_CLAUSE(Flush, OMPC_flush)
+CHECK_SIMPLE_CLAUSE(Full, OMPC_full)
+CHECK_SIMPLE_CLAUSE(Grainsize, OMPC_grainsize)
+CHECK_SIMPLE_CLAUSE(GraphId, OMPC_graph_id)
+CHECK_SIMPLE_CLAUSE(GraphReset, OMPC_graph_reset)
+CHECK_SIMPLE_CLAUSE(Groupprivate, OMPC_groupprivate)
+CHECK_SIMPLE_CLAUSE(Holds, OMPC_holds)
+CHECK_SIMPLE_CLAUSE(Inbranch, OMPC_inbranch)
+CHECK_SIMPLE_CLAUSE(Inclusive, OMPC_inclusive)
+CHECK_SIMPLE_CLAUSE(Indirect, OMPC_indirect)
+CHECK_SIMPLE_CLAUSE(Initializer, OMPC_initializer)
+CHECK_SIMPLE_CLAUSE(Init, OMPC_init)
+CHECK_SIMPLE_CLAUSE(Link, OMPC_link)
+CHECK_SIMPLE_CLAUSE(Match, OMPC_match)
+CHECK_SIMPLE_CLAUSE(MemoryOrder, OMPC_memory_order)
+CHECK_SIMPLE_CLAUSE(Mergeable, OMPC_mergeable)
+CHECK_SIMPLE_CLAUSE(Message, OMPC_message)
+CHECK_SIMPLE_CLAUSE(Nocontext, OMPC_nocontext)
+CHECK_SIMPLE_CLAUSE(Nogroup, OMPC_nogroup)
+CHECK_SIMPLE_CLAUSE(Nontemporal, OMPC_nontemporal)
+CHECK_SIMPLE_CLAUSE(NoOpenmpConstructs, OMPC_no_openmp_constructs)
+CHECK_SIMPLE_CLAUSE(NoOpenmp, OMPC_no_openmp)
+CHECK_SIMPLE_CLAUSE(NoOpenmpRoutines, OMPC_no_openmp_routines)
+CHECK_SIMPLE_CLAUSE(NoParallelism, OMPC_no_parallelism)
+CHECK_SIMPLE_CLAUSE(Notinbranch, OMPC_notinbranch)
+CHECK_SIMPLE_CLAUSE(Novariants, OMPC_novariants)
+CHECK_SIMPLE_CLAUSE(NumTasks, OMPC_num_tasks)
+CHECK_SIMPLE_CLAUSE(OmpxAttribute, OMPC_ompx_attribute)
+CHECK_SIMPLE_CLAUSE(Order, OMPC_order)
+CHECK_SIMPLE_CLAUSE(Otherwise, OMPC_otherwise)
+CHECK_SIMPLE_CLAUSE(Partial, OMPC_partial)
+CHECK_SIMPLE_CLAUSE(Permutation, OMPC_permutation)
+CHECK_SIMPLE_CLAUSE(ProcBind, OMPC_proc_bind)
+CHECK_SIMPLE_CLAUSE(Read, OMPC_read)
+CHECK_SIMPLE_CLAUSE(Relaxed, OMPC_relaxed)
+CHECK_SIMPLE_CLAUSE(Release, OMPC_release)
+CHECK_SIMPLE_CLAUSE(Replayable, OMPC_replayable)
+CHECK_SIMPLE_CLAUSE(SeqCst, OMPC_seq_cst)
+CHECK_SIMPLE_CLAUSE(Severity, OMPC_severity)
+CHECK_SIMPLE_CLAUSE(Simd, OMPC_simd)
+CHECK_SIMPLE_CLAUSE(Threadprivate, OMPC_threadprivate)
+CHECK_SIMPLE_CLAUSE(Threadset, OMPC_threadset)
+CHECK_SIMPLE_CLAUSE(Threads, OMPC_threads)
+CHECK_SIMPLE_CLAUSE(Transparent, OMPC_transparent)
+CHECK_SIMPLE_CLAUSE(Uniform, OMPC_uniform)
+CHECK_SIMPLE_CLAUSE(Unknown, OMPC_unknown)
+CHECK_SIMPLE_CLAUSE(Untied, OMPC_untied)
+CHECK_SIMPLE_CLAUSE(Use, OMPC_use)
+CHECK_SIMPLE_CLAUSE(UsesAllocators, OMPC_uses_allocators)
+CHECK_SIMPLE_CLAUSE(Weak, OMPC_weak)
+CHECK_SIMPLE_CLAUSE(Write, OMPC_write)
+
+CHECK_REQ_SCALAR_INT_CLAUSE(NumTeams, OMPC_num_teams)
+CHECK_REQ_SCALAR_INT_CLAUSE(NumThreads, OMPC_num_threads)
+CHECK_REQ_SCALAR_INT_CLAUSE(OmpxDynCgroupMem, OMPC_ompx_dyn_cgroup_mem)
+CHECK_REQ_SCALAR_INT_CLAUSE(Priority, OMPC_priority)
+CHECK_REQ_SCALAR_INT_CLAUSE(ThreadLimit, OMPC_thread_limit)
+
+CHECK_REQ_CONSTANT_SCALAR_INT_CLAUSE(Collapse, OMPC_collapse)
+CHECK_REQ_CONSTANT_SCALAR_INT_CLAUSE(Safelen, OMPC_safelen)
+CHECK_REQ_CONSTANT_SCALAR_INT_CLAUSE(Simdlen, OMPC_simdlen)
+
} // namespace Fortran::semantics
diff --git a/flang/lib/Semantics/check-omp-structure.h b/flang/lib/Semantics/check-omp-structure.h
index 7426559..1b84bc5 100644
--- a/flang/lib/Semantics/check-omp-structure.h
+++ b/flang/lib/Semantics/check-omp-structure.h
@@ -82,6 +82,11 @@ public:
bool Enter(const parser::BlockConstruct &);
void Leave(const parser::BlockConstruct &);
+ void Enter(const parser::SpecificationPart &);
+ void Leave(const parser::SpecificationPart &);
+ void Enter(const parser::ExecutionPart &);
+ void Leave(const parser::ExecutionPart &);
+
void Enter(const parser::OpenMPConstruct &);
void Leave(const parser::OpenMPConstruct &);
void Enter(const parser::OpenMPInteropConstruct &);
@@ -113,8 +118,8 @@ public:
void Leave(const parser::OmpDeclareVariantDirective &);
void Enter(const parser::OpenMPDeclareSimdConstruct &);
void Leave(const parser::OpenMPDeclareSimdConstruct &);
- void Enter(const parser::OpenMPDeclarativeAllocate &);
- void Leave(const parser::OpenMPDeclarativeAllocate &);
+ void Enter(const parser::OmpAllocateDirective &);
+ void Leave(const parser::OmpAllocateDirective &);
void Enter(const parser::OpenMPDeclareMapperConstruct &);
void Leave(const parser::OpenMPDeclareMapperConstruct &);
void Enter(const parser::OpenMPDeclareReductionConstruct &);
@@ -129,8 +134,6 @@ public:
void Leave(const parser::OmpErrorDirective &);
void Enter(const parser::OmpNothingDirective &);
void Leave(const parser::OmpNothingDirective &);
- void Enter(const parser::OpenMPExecutableAllocate &);
- void Leave(const parser::OpenMPExecutableAllocate &);
void Enter(const parser::OpenMPAllocatorsConstruct &);
void Leave(const parser::OpenMPAllocatorsConstruct &);
void Enter(const parser::OpenMPRequiresConstruct &);
@@ -263,9 +266,9 @@ private:
bool CheckTargetBlockOnlyTeams(const parser::Block &);
void CheckWorkshareBlockStmts(const parser::Block &, parser::CharBlock);
void CheckWorkdistributeBlockStmts(const parser::Block &, parser::CharBlock);
- void CheckAllocateDirective(parser::CharBlock source,
- const parser::OmpObjectList &objects,
- const parser::OmpClauseList &clauses);
+ void CheckIndividualAllocateDirective(
+ const parser::OmpAllocateDirective &x, bool isExecutable);
+ void CheckExecutableAllocateDirective(const parser::OmpAllocateDirective &x);
void CheckIteratorRange(const parser::OmpIteratorSpecifier &x);
void CheckIteratorModifier(const parser::OmpIterator &x);
@@ -325,11 +328,6 @@ private:
const std::optional<parser::OmpClauseList> &maybeClauses);
void CheckCancellationNest(
const parser::CharBlock &source, llvm::omp::Directive type);
- void CheckAllNamesInAllocateStmt(const parser::CharBlock &source,
- const parser::OmpObjectList &ompObjectList,
- const parser::AllocateStmt &allocate);
- void CheckNameInAllocateStmt(const parser::CharBlock &source,
- const parser::Name &ompObject, const parser::AllocateStmt &allocate);
std::int64_t GetOrdCollapseLevel(const parser::OpenMPLoopConstruct &x);
void CheckReductionObjects(
const parser::OmpObjectList &objects, llvm::omp::Clause clauseId);
@@ -353,11 +351,6 @@ private:
const parser::OmpObjectList &ompObjectList);
void CheckIfContiguous(const parser::OmpObject &object);
const parser::Name *GetObjectName(const parser::OmpObject &object);
- void CheckPredefinedAllocatorRestriction(const parser::CharBlock &source,
- const parser::OmpObjectList &ompObjectList);
- void CheckPredefinedAllocatorRestriction(
- const parser::CharBlock &source, const parser::Name &name);
- bool isPredefinedAllocator{false};
void CheckAllowedRequiresClause(llvmOmpClause clause);
bool deviceConstructFound_{false};
@@ -383,7 +376,7 @@ private:
};
int directiveNest_[LastType + 1] = {0};
- bool inExecutableAllocate_{false};
+ int allocateDirectiveLevel{0};
parser::CharBlock visitedAtomicSource_;
SymbolSourceMap deferredNonVariables_;
@@ -392,6 +385,14 @@ private:
std::vector<LoopConstruct> loopStack_;
// Scopes for scoping units.
std::vector<const Scope *> scopeStack_;
+
+ enum class PartKind : int {
+ // There are also other "parts", such as internal-subprogram-part, etc,
+ // but we're keeping track of these two for now.
+ SpecificationPart,
+ ExecutionPart,
+ };
+ std::vector<PartKind> partStack_;
};
/// Find a duplicate entry in the range, and return an iterator to it.
diff --git a/flang/lib/Semantics/openmp-utils.cpp b/flang/lib/Semantics/openmp-utils.cpp
index 6b304b6..4a40d6e 100644
--- a/flang/lib/Semantics/openmp-utils.cpp
+++ b/flang/lib/Semantics/openmp-utils.cpp
@@ -186,6 +186,23 @@ bool IsExtendedListItem(const Symbol &sym) {
return IsVariableListItem(sym) || sym.IsSubprogram();
}
+bool IsTypeParamInquiry(const Symbol &sym) {
+ return common::visit( //
+ common::visitors{
+ [&](const MiscDetails &d) {
+ return d.kind() == MiscDetails::Kind::KindParamInquiry ||
+ d.kind() == MiscDetails::Kind::LenParamInquiry;
+ },
+ [&](const TypeParamDetails &s) { return true; },
+ [&](auto &&) { return false; },
+ },
+ sym.details());
+}
+
+bool IsStructureComponent(const Symbol &sym) {
+ return sym.owner().kind() == Scope::Kind::DerivedType;
+}
+
bool IsVarOrFunctionRef(const MaybeExpr &expr) {
if (expr) {
return evaluate::UnwrapProcedureRef(*expr) != nullptr ||
diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp
index 628068f..deb57e0 100644
--- a/flang/lib/Semantics/resolve-directives.cpp
+++ b/flang/lib/Semantics/resolve-directives.cpp
@@ -415,6 +415,18 @@ public:
return true;
}
+ bool Pre(const parser::SpecificationPart &) {
+ partStack_.push_back(PartKind::SpecificationPart);
+ return true;
+ }
+ void Post(const parser::SpecificationPart &) { partStack_.pop_back(); }
+
+ bool Pre(const parser::ExecutionPart &) {
+ partStack_.push_back(PartKind::ExecutionPart);
+ return true;
+ }
+ void Post(const parser::ExecutionPart &) { partStack_.pop_back(); }
+
bool Pre(const parser::InternalSubprogram &) {
// Clear the labels being tracked in the previous scope
ClearLabels();
@@ -639,8 +651,7 @@ public:
bool Pre(const parser::OpenMPThreadprivate &);
void Post(const parser::OpenMPThreadprivate &) { PopContext(); }
- bool Pre(const parser::OpenMPDeclarativeAllocate &);
- void Post(const parser::OpenMPDeclarativeAllocate &) { PopContext(); }
+ bool Pre(const parser::OmpAllocateDirective &);
bool Pre(const parser::OpenMPAssumeConstruct &);
void Post(const parser::OpenMPAssumeConstruct &) { PopContext(); }
@@ -651,9 +662,6 @@ public:
bool Pre(const parser::OpenMPDispatchConstruct &);
void Post(const parser::OpenMPDispatchConstruct &) { PopContext(); }
- bool Pre(const parser::OpenMPExecutableAllocate &);
- void Post(const parser::OpenMPExecutableAllocate &);
-
bool Pre(const parser::OpenMPAllocatorsConstruct &);
void Post(const parser::OpenMPAllocatorsConstruct &);
@@ -998,6 +1006,14 @@ private:
targetLabels_;
parser::CharBlock currentStatementSource_;
+ enum class PartKind : int {
+ // There are also other "parts", such as internal-subprogram-part, etc,
+ // but we're keeping track of these two for now.
+ SpecificationPart,
+ ExecutionPart,
+ };
+ std::vector<PartKind> partStack_;
+
void AddAllocateName(const parser::Name *&object) {
allocateNames_.push_back(object);
}
@@ -2558,10 +2574,24 @@ bool OmpAttributeVisitor::Pre(const parser::OpenMPThreadprivate &x) {
return true;
}
-bool OmpAttributeVisitor::Pre(const parser::OpenMPDeclarativeAllocate &x) {
+bool OmpAttributeVisitor::Pre(const parser::OmpAllocateDirective &x) {
PushContext(x.source, llvm::omp::Directive::OMPD_allocate);
- const auto &list{std::get<parser::OmpObjectList>(x.t)};
- ResolveOmpObjectList(list, Symbol::Flag::OmpDeclarativeAllocateDirective);
+ assert(!partStack_.empty() && "Misplaced directive");
+
+ auto ompFlag{partStack_.back() == PartKind::SpecificationPart
+ ? Symbol::Flag::OmpDeclarativeAllocateDirective
+ : Symbol::Flag::OmpExecutableAllocateDirective};
+
+ parser::omp::OmpAllocateInfo info{parser::omp::SplitOmpAllocate(x)};
+ for (const parser::OmpAllocateDirective *ad : info.dirs) {
+ for (const parser::OmpArgument &arg : ad->BeginDir().Arguments().v) {
+ if (auto *object{omp::GetArgumentObject(arg)}) {
+ ResolveOmpObject(*object, ompFlag);
+ }
+ }
+ }
+
+ PopContext();
return false;
}
@@ -2580,15 +2610,6 @@ bool OmpAttributeVisitor::Pre(const parser::OpenMPDispatchConstruct &x) {
return true;
}
-bool OmpAttributeVisitor::Pre(const parser::OpenMPExecutableAllocate &x) {
- PushContext(x.source, llvm::omp::Directive::OMPD_allocate);
- const auto &list{std::get<std::optional<parser::OmpObjectList>>(x.t)};
- if (list) {
- ResolveOmpObjectList(*list, Symbol::Flag::OmpExecutableAllocateDirective);
- }
- return true;
-}
-
bool OmpAttributeVisitor::Pre(const parser::OpenMPAllocatorsConstruct &x) {
const parser::OmpDirectiveSpecification &dirSpec{x.BeginDir()};
PushContext(x.source, dirSpec.DirId());
@@ -2660,10 +2681,6 @@ bool OmpAttributeVisitor::IsNestedInDirective(llvm::omp::Directive directive) {
return false;
}
-void OmpAttributeVisitor::Post(const parser::OpenMPExecutableAllocate &x) {
- PopContext();
-}
-
void OmpAttributeVisitor::Post(const parser::OpenMPAllocatorsConstruct &x) {
PopContext();
}
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 220f1c9..a2062ef 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -1700,12 +1700,12 @@ public:
void Post(const parser::OpenMPDeclareTargetConstruct &) {
SkipImplicitTyping(false);
}
- bool Pre(const parser::OpenMPDeclarativeAllocate &x) {
+ bool Pre(const parser::OmpAllocateDirective &x) {
AddOmpSourceRange(x.source);
SkipImplicitTyping(true);
return true;
}
- void Post(const parser::OpenMPDeclarativeAllocate &) {
+ void Post(const parser::OmpAllocateDirective &) {
SkipImplicitTyping(false);
messageHandler().set_currStmtSource(std::nullopt);
}
diff --git a/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtbegin.o b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtbegin.o
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtbegin.o
diff --git a/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtend.o b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtend.o
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtend.o
diff --git a/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crti.o b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crti.o
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crti.o
diff --git a/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtn.o b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtn.o
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtn.o
diff --git a/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtbegin.o b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtbegin.o
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtbegin.o
diff --git a/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtend.o b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtend.o
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtend.o
diff --git a/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crti.o b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crti.o
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crti.o
diff --git a/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtn.o b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtn.o
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtn.o
diff --git a/flang/test/Driver/gcc-triple.f90 b/flang/test/Driver/gcc-triple.f90
new file mode 100644
index 0000000..027d78a
--- /dev/null
+++ b/flang/test/Driver/gcc-triple.f90
@@ -0,0 +1,18 @@
+!! UNSUPPORTED: system-windows
+
+!! Test that --gcc-triple option is working as expected.
+
+! RUN: %flang -v --sysroot=%S/Inputs/fedora_39_tree 2>&1 | FileCheck %s --dump-input=always --check-prefix=DEFAULT_TRIPLE
+! DEFAULT_TRIPLE: {{^}}Found candidate GCC installation:
+! DEFAULT_TRIPLE: fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13
+! DEFAULT_TRIPLE: {{^}}Found candidate GCC installation:
+! DEFAULT_TRIPLE: fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13
+! DEFAULT_TRIPLE: {{^}}Selected GCC installation:
+! DEFAULT_TRIPLE: fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13
+
+! RUN: %flang -v --sysroot=%S/Inputs/fedora_39_tree --gcc-triple=x86_64-redhat-linux 2>&1 | FileCheck %s --check-prefix=TRIPLE_EXISTS
+! TRIPLE_EXISTS: {{^}}Selected GCC installation:
+! TRIPLE_EXISTS: fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13
+
+! RUN: %flang -v --sysroot=%S/Inputs/fedora_39_tree --gcc-triple=x86_64-foo-linux 2>&1 | FileCheck %s --check-prefix=TRIPLE_DOES_NOT_EXISTS
+! TRIPLE_DOES_NOT_EXISTS-NOT: x86_64-foo-linux \ No newline at end of file
diff --git a/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate-align.f90 b/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate-align.f90
index 8daf20e..fec146a 100644
--- a/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate-align.f90
+++ b/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate-align.f90
@@ -5,6 +5,6 @@
program main
integer :: x
- ! CHECK: not yet implemented: OpenMPDeclarativeAllocate
+ ! CHECK: not yet implemented: OmpAllocateDirective
!$omp allocate(x) align(32)
end
diff --git a/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90 b/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90
index e83b433..3307eb2 100644
--- a/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90
+++ b/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90
@@ -5,6 +5,6 @@
program main
integer :: x, y
- ! CHECK: not yet implemented: OpenMPDeclarativeAllocate
+ ! CHECK: not yet implemented: OmpAllocateDirective
!$omp allocate(x, y)
end
diff --git a/flang/test/Parser/OpenMP/allocate-align-tree.f90 b/flang/test/Parser/OpenMP/allocate-align-tree.f90
index 0d247cd..d799aa1 100644
--- a/flang/test/Parser/OpenMP/allocate-align-tree.f90
+++ b/flang/test/Parser/OpenMP/allocate-align-tree.f90
@@ -16,27 +16,33 @@ program allocate_align_tree
allocate(j(z), xarray(t))
end program allocate_align_tree
-!CHECK: | | DeclarationConstruct -> SpecificationConstruct -> TypeDeclarationStmt
-!CHECK-NEXT: | | | DeclarationTypeSpec -> IntrinsicTypeSpec -> IntegerTypeSpec ->
-!CHECK-NEXT: | | | AttrSpec -> Allocatable
-!CHECK-NEXT: | | | EntityDecl
-!CHECK-NEXT: | | | | Name = 'j'
+!CHECK: DeclarationConstruct -> SpecificationConstruct -> TypeDeclarationStmt
+!CHECK-NEXT: | DeclarationTypeSpec -> IntrinsicTypeSpec -> IntegerTypeSpec ->
+!CHECK-NEXT: | AttrSpec -> Allocatable
+!CHECK-NEXT: | EntityDecl
+!CHECK-NEXT: | | Name = 'j'
+!CHECK: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpAllocateDirective
+!CHECK-NEXT: | OmpBeginDirective
+!CHECK-NEXT: | | OmpDirectiveName -> llvm::omp::Directive = allocate
+!CHECK-NEXT: | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'j'
+!CHECK-NEXT: | | OmpClauseList -> OmpClause -> Align -> OmpAlignClause -> Scalar -> Integer -> Constant -> Expr = '16_4'
+!CHECK-NEXT: | | | LiteralConstant -> IntLiteralConstant = '16'
+!CHECK-NEXT: | | Flags = None
+!CHECK-NEXT: | Block
+!CHECK-NEXT: | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpAllocateDirective
+!CHECK-NEXT: | | | OmpBeginDirective
+!CHECK-NEXT: | | | | OmpDirectiveName -> llvm::omp::Directive = allocate
+!CHECK-NEXT: | | | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'xarray'
+!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Align -> OmpAlignClause -> Scalar -> Integer -> Constant -> Expr = '32_4'
+!CHECK-NEXT: | | | | | LiteralConstant -> IntLiteralConstant = '32'
+!CHECK-NEXT: | | | | OmpClause -> Allocator -> Scalar -> Integer -> Expr = '2_8'
+!CHECK-NEXT: | | | | | Designator -> DataRef -> Name = 'omp_large_cap_mem_alloc'
+!CHECK-NEXT: | | | | Flags = None
+!CHECK-NEXT: | | | Block
+!CHECK-NEXT: | | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AllocateStmt
-!CHECK: | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPExecutableAllocate
-!CHECK-NEXT: | | | Verbatim
-!CHECK-NEXT: | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'xarray'
-!CHECK-NEXT: | | | OmpClauseList -> OmpClause -> Align -> OmpAlignClause -> Scalar -> Integer -> Constant -> Expr = '32_4'
-!CHECK-NEXT: | | | | LiteralConstant -> IntLiteralConstant = '32'
-!CHECK-NEXT: | | | OmpClause -> Allocator -> Scalar -> Integer -> Expr = '2_8'
-!CHECK-NEXT: | | | | Designator -> DataRef -> Name = 'omp_large_cap_mem_alloc'
-!CHECK-NEXT: | | | OpenMPDeclarativeAllocate
-!CHECK-NEXT: | | | | Verbatim
-!CHECK-NEXT: | | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'j'
-!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Align -> OmpAlignClause -> Scalar -> Integer -> Constant -> Expr = '16_4'
-!CHECK-NEXT: | | | | | LiteralConstant -> IntLiteralConstant = '16'
-!CHECK-NEXT: | | | AllocateStmt
+!UNPARSE: !$OMP ALLOCATE(j) ALIGN(16_4)
+!UNPARSE-NEXT: !$OMP ALLOCATE(xarray) ALIGN(32_4) ALLOCATOR(2_8)
+!UNPARSE-NEXT: ALLOCATE(j(z), xarray(t))
-!UNPARSE: !$OMP ALLOCATE (j) ALIGN(16_4)
-!UNPARSE: !$OMP ALLOCATE (xarray) ALIGN(32_4) ALLOCATOR(2_8)
-!UNPARSE-NEXT: ALLOCATE(j(z), xarray(t))
diff --git a/flang/test/Parser/OpenMP/allocate-tree-spec-part.f90 b/flang/test/Parser/OpenMP/allocate-tree-spec-part.f90
index afcaf44..800e4a5 100644
--- a/flang/test/Parser/OpenMP/allocate-tree-spec-part.f90
+++ b/flang/test/Parser/OpenMP/allocate-tree-spec-part.f90
@@ -17,33 +17,48 @@ program allocate_tree
allocate (w, xarray(4), zarray(5, f))
end program allocate_tree
-!CHECK: | | DeclarationConstruct -> SpecificationConstruct -> OpenMPDeclarativeConstruct -> OpenMPDeclarativeAllocate
-!CHECK-NEXT: | | | Verbatim
-!CHECK-NEXT: | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'f'
-!CHECK-NEXT: | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr =
-!CHECK-NEXT: | | | | Designator -> DataRef -> Name =
+!CHECK: | | DeclarationConstruct -> SpecificationConstruct -> OpenMPDeclarativeConstruct -> OmpAllocateDirective
+!CHECK-NEXT: | | | OmpBeginDirective
+!CHECK-NEXT: | | | | OmpDirectiveName -> llvm::omp::Directive = allocate
+!CHECK-NEXT: | | | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'f'
+!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = '1_8'
+!CHECK-NEXT: | | | | | Designator -> DataRef -> Name = 'omp_default_mem_alloc'
+!CHECK-NEXT: | | | | Flags = None
+!CHECK-NEXT: | | | Block
!CHECK-NEXT: | ExecutionPart -> Block
!CHECK-NEXT: | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'f=2_4'
!CHECK-NEXT: | | | Variable = 'f'
!CHECK-NEXT: | | | | Designator -> DataRef -> Name = 'f'
!CHECK-NEXT: | | | Expr = '2_4'
!CHECK-NEXT: | | | | LiteralConstant -> IntLiteralConstant = '2'
-!CHECK-NEXT: | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPExecutableAllocate
-!CHECK-NEXT: | | | Verbatim
-!CHECK-NEXT: | | | OmpClauseList ->
-!CHECK-NEXT: | | | OpenMPDeclarativeAllocate
-!CHECK-NEXT: | | | | Verbatim
-!CHECK-NEXT: | | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'w'
-!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr =
-!CHECK-NEXT: | | | | | Designator -> DataRef -> Name =
-!CHECK-NEXT: | | | OpenMPDeclarativeAllocate
-!CHECK-NEXT: | | | | Verbatim
-!CHECK-NEXT: | | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'xarray'
-!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr =
-!CHECK-NEXT: | | | | | Designator -> DataRef -> Name =
-!CHECK-NEXT: | | | OpenMPDeclarativeAllocate
-!CHECK-NEXT: | | | | Verbatim
-!CHECK-NEXT: | | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'zarray'
-!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr =
-!CHECK-NEXT: | | | | | Designator -> DataRef -> Name =
-!CHECK-NEXT: | | | AllocateStmt
+!CHECK-NEXT: | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpAllocateDirective
+!CHECK-NEXT: | | | OmpBeginDirective
+!CHECK-NEXT: | | | | OmpDirectiveName -> llvm::omp::Directive = allocate
+!CHECK-NEXT: | | | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'w'
+!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = '3_8'
+!CHECK-NEXT: | | | | | Designator -> DataRef -> Name = 'omp_const_mem_alloc'
+!CHECK-NEXT: | | | | Flags = None
+!CHECK-NEXT: | | | Block
+!CHECK-NEXT: | | | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpAllocateDirective
+!CHECK-NEXT: | | | | | OmpBeginDirective
+!CHECK-NEXT: | | | | | | OmpDirectiveName -> llvm::omp::Directive = allocate
+!CHECK-NEXT: | | | | | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'xarray'
+!CHECK-NEXT: | | | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = '2_8'
+!CHECK-NEXT: | | | | | | | Designator -> DataRef -> Name = 'omp_large_cap_mem_alloc'
+!CHECK-NEXT: | | | | | | Flags = None
+!CHECK-NEXT: | | | | | Block
+!CHECK-NEXT: | | | | | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpAllocateDirective
+!CHECK-NEXT: | | | | | | | OmpBeginDirective
+!CHECK-NEXT: | | | | | | | | OmpDirectiveName -> llvm::omp::Directive = allocate
+!CHECK-NEXT: | | | | | | | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'zarray'
+!CHECK-NEXT: | | | | | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = '1_8'
+!CHECK-NEXT: | | | | | | | | | Designator -> DataRef -> Name = 'omp_default_mem_alloc'
+!CHECK-NEXT: | | | | | | | | Flags = None
+!CHECK-NEXT: | | | | | | | Block
+!CHECK-NEXT: | | | | | | | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpAllocateDirective
+!CHECK-NEXT: | | | | | | | | | OmpBeginDirective
+!CHECK-NEXT: | | | | | | | | | | OmpDirectiveName -> llvm::omp::Directive = allocate
+!CHECK-NEXT: | | | | | | | | | | OmpClauseList ->
+!CHECK-NEXT: | | | | | | | | | | Flags = None
+!CHECK-NEXT: | | | | | | | | | Block
+!CHECK-NEXT: | | | | | | | | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AllocateStmt
diff --git a/flang/test/Parser/OpenMP/allocate-tree.f90 b/flang/test/Parser/OpenMP/allocate-tree.f90
index bf413d5..021d810 100644
--- a/flang/test/Parser/OpenMP/allocate-tree.f90
+++ b/flang/test/Parser/OpenMP/allocate-tree.f90
@@ -7,52 +7,54 @@
program allocate_tree
use omp_lib
- integer, allocatable :: w, xarray(:), zarray(:, :)
- integer :: z, t
+ integer, allocatable :: xarray(:), zarray(:, :)
+ integer :: z, t, w
+!$omp allocate(w) allocator(omp_const_mem_alloc)
t = 2
z = 3
-!$omp allocate(w) allocator(omp_const_mem_alloc)
!$omp allocate(xarray) allocator(omp_large_cap_mem_alloc)
!$omp allocate(zarray) allocator(omp_default_mem_alloc)
!$omp allocate
- allocate(w, xarray(4), zarray(t, z))
+ allocate(xarray(4), zarray(t, z))
end program allocate_tree
-!CHECK: | | DeclarationConstruct -> SpecificationConstruct -> TypeDeclarationStmt
-!CHECK-NEXT: | | | DeclarationTypeSpec -> IntrinsicTypeSpec -> IntegerTypeSpec ->
-!CHECK-NEXT: | | | AttrSpec -> Allocatable
-!CHECK-NEXT: | | | EntityDecl
-!CHECK-NEXT: | | | | Name = 'w'
-!CHECK-NEXT: | | | EntityDecl
-!CHECK-NEXT: | | | | Name = 'xarray'
-!CHECK-NEXT: | | | | ArraySpec -> DeferredShapeSpecList -> int = '1'
-!CHECK-NEXT: | | | EntityDecl
-!CHECK-NEXT: | | | | Name = 'zarray'
-!CHECK-NEXT: | | | | ArraySpec -> DeferredShapeSpecList -> int = '2'
-
+!CHECK: DeclarationConstruct -> SpecificationConstruct -> OpenMPDeclarativeConstruct -> OmpAllocateDirective
+!CHECK-NEXT: | OmpBeginDirective
+!CHECK-NEXT: | | OmpDirectiveName -> llvm::omp::Directive = allocate
+!CHECK-NEXT: | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'w'
+!CHECK-NEXT: | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = '3_8'
+!CHECK-NEXT: | | | Designator -> DataRef -> Name = 'omp_const_mem_alloc'
+!CHECK-NEXT: | | Flags = None
+!CHECK-NEXT: | Block
-!CHECK: | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPExecutableAllocate
-!CHECK-NEXT: | | | Verbatim
-!CHECK-NEXT: | | | OmpClauseList ->
-!CHECK-NEXT: | | | OpenMPDeclarativeAllocate
-!CHECK-NEXT: | | | | Verbatim
-!CHECK-NEXT: | | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'w'
-!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr =
-!CHECK-NEXT: | | | | | Designator -> DataRef -> Name =
-!CHECK-NEXT: | | | OpenMPDeclarativeAllocate
-!CHECK-NEXT: | | | | Verbatim
-!CHECK-NEXT: | | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'xarray'
-!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr =
-!CHECK-NEXT: | | | | | Designator -> DataRef -> Name =
-!CHECK-NEXT: | | | OpenMPDeclarativeAllocate
-!CHECK-NEXT: | | | | Verbatim
-!CHECK-NEXT: | | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'zarray'
-!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr =
-!CHECK-NEXT: | | | | | Designator -> DataRef -> Name =
-!CHECK-NEXT: | | | AllocateStmt
+!CHECK: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpAllocateDirective
+!CHECK-NEXT: | OmpBeginDirective
+!CHECK-NEXT: | | OmpDirectiveName -> llvm::omp::Directive = allocate
+!CHECK-NEXT: | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'xarray'
+!CHECK-NEXT: | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = '2_8'
+!CHECK-NEXT: | | | Designator -> DataRef -> Name = 'omp_large_cap_mem_alloc'
+!CHECK-NEXT: | | Flags = None
+!CHECK-NEXT: | Block
+!CHECK-NEXT: | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpAllocateDirective
+!CHECK-NEXT: | | | OmpBeginDirective
+!CHECK-NEXT: | | | | OmpDirectiveName -> llvm::omp::Directive = allocate
+!CHECK-NEXT: | | | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'zarray'
+!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = '1_8'
+!CHECK-NEXT: | | | | | Designator -> DataRef -> Name = 'omp_default_mem_alloc'
+!CHECK-NEXT: | | | | Flags = None
+!CHECK-NEXT: | | | Block
+!CHECK-NEXT: | | | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpAllocateDirective
+!CHECK-NEXT: | | | | | OmpBeginDirective
+!CHECK-NEXT: | | | | | | OmpDirectiveName -> llvm::omp::Directive = allocate
+!CHECK-NEXT: | | | | | | OmpClauseList ->
+!CHECK-NEXT: | | | | | | Flags = None
+!CHECK-NEXT: | | | | | Block
+!CHECK-NEXT: | | | | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AllocateStmt
-!UNPARSE: !$OMP ALLOCATE (w) ALLOCATOR(3_8)
-!UNPARSE-NEXT: !$OMP ALLOCATE (xarray) ALLOCATOR(2_8)
-!UNPARSE-NEXT: !$OMP ALLOCATE (zarray) ALLOCATOR(1_8)
+!UNPARSE: !$OMP ALLOCATE(w) ALLOCATOR(3_8)
+!UNPARSE-NEXT: t=2_4
+!UNPARSE-NEXT: z=3_4
+!UNPARSE-NEXT: !$OMP ALLOCATE(xarray) ALLOCATOR(2_8)
+!UNPARSE-NEXT: !$OMP ALLOCATE(zarray) ALLOCATOR(1_8)
!UNPARSE-NEXT: !$OMP ALLOCATE
-!UNPARSE-NEXT: ALLOCATE(w, xarray(4_4), zarray(t,z))
+!UNPARSE-NEXT: ALLOCATE(xarray(4_4), zarray(t,z))
diff --git a/flang/test/Parser/OpenMP/allocate-unparse.f90 b/flang/test/Parser/OpenMP/allocate-unparse.f90
index 94bc2ad..b61a971 100644
--- a/flang/test/Parser/OpenMP/allocate-unparse.f90
+++ b/flang/test/Parser/OpenMP/allocate-unparse.f90
@@ -9,6 +9,7 @@ integer :: a, b, j, m, n, t, x, y, z
! 2.11.3 declarative allocate
+!$omp allocate
!$omp allocate(x, y)
!$omp allocate(x, y) allocator(omp_default_mem_alloc)
@@ -28,19 +29,24 @@ integer :: a, b, j, m, n, t, x, y, z
!$omp allocate(j) align(16)
allocate ( darray(z, t) )
+!$omp allocate
+ allocate ( darray(a, b) )
end program allocate_unparse
-!CHECK:!$OMP ALLOCATE (x,y)
-!CHECK:!$OMP ALLOCATE (x,y) ALLOCATOR(omp_default_mem_alloc)
-!CHECK:!$OMP ALLOCATE (a,b)
+!CHECK:!$OMP ALLOCATE{{[ ]*$}}
+!CHECK:!$OMP ALLOCATE(x, y)
+!CHECK:!$OMP ALLOCATE(x, y) ALLOCATOR(omp_default_mem_alloc)
+!CHECK:!$OMP ALLOCATE(a, b)
!CHECK:ALLOCATE(darray(a,b))
!CHECK:!$OMP ALLOCATE ALLOCATOR(omp_default_mem_alloc)
!CHECK:ALLOCATE(darray(a,b))
-!CHECK:!$OMP ALLOCATE (a,b) ALLOCATOR(omp_default_mem_alloc)
+!CHECK:!$OMP ALLOCATE(a, b) ALLOCATOR(omp_default_mem_alloc)
!CHECK:ALLOCATE(darray(a,b))
-!CHECK:!$OMP ALLOCATE (t) ALLOCATOR(omp_const_mem_alloc)
-!CHECK:!$OMP ALLOCATE (z) ALLOCATOR(omp_default_mem_alloc)
-!CHECK:!$OMP ALLOCATE (m) ALLOCATOR(omp_default_mem_alloc)
-!CHECK:!$OMP ALLOCATE (n)
-!CHECK:!$OMP ALLOCATE (j) ALIGN(16)
+!CHECK:!$OMP ALLOCATE(t) ALLOCATOR(omp_const_mem_alloc)
+!CHECK:!$OMP ALLOCATE(z) ALLOCATOR(omp_default_mem_alloc)
+!CHECK:!$OMP ALLOCATE(m) ALLOCATOR(omp_default_mem_alloc)
+!CHECK:!$OMP ALLOCATE(n)
+!CHECK:!$OMP ALLOCATE(j) ALIGN(16)
!CHECK:ALLOCATE(darray(z,t))
+!CHECK:!$OMP ALLOCATE{{[ ]*$}}
+!CHECK:ALLOCATE(darray(a,b))
diff --git a/flang/test/Semantics/OpenMP/allocate-align01.f90 b/flang/test/Semantics/OpenMP/allocate-align01.f90
index 88bcd6d..4a1e60c 100644
--- a/flang/test/Semantics/OpenMP/allocate-align01.f90
+++ b/flang/test/Semantics/OpenMP/allocate-align01.f90
@@ -11,9 +11,9 @@ program allocate_align_tree
integer :: z, t, xx
t = 2
z = 3
+ !WARNING: The executable form of the OpenMP ALLOCATE directive has been deprecated, please use ALLOCATORS instead [-Wopen-mp-usage]
!ERROR: Must be a constant value
!$omp allocate(j) align(xx)
- !WARNING: The executable form of the OpenMP ALLOCATE directive has been deprecated, please use ALLOCATORS instead [-Wopen-mp-usage]
!ERROR: The alignment should be positive
!$omp allocate(xarray) align(-32) allocator(omp_large_cap_mem_alloc)
allocate(j(z), xarray(t))
diff --git a/flang/test/Semantics/OpenMP/allocate-directive.f90 b/flang/test/Semantics/OpenMP/allocate-directive.f90
index 18a14b8..e34125b 100644
--- a/flang/test/Semantics/OpenMP/allocate-directive.f90
+++ b/flang/test/Semantics/OpenMP/allocate-directive.f90
@@ -11,7 +11,7 @@ integer :: x, y
integer, allocatable :: a, b, m, n, t, z
!$omp allocate(x, y)
!$omp allocate(x, y) allocator(omp_default_mem_alloc)
-
+ continue
!$omp allocate(a, b)
allocate ( a, b )
diff --git a/flang/test/Semantics/OpenMP/allocate01.f90 b/flang/test/Semantics/OpenMP/allocate01.f90
index 229fd4d..5fe4efd 100644
--- a/flang/test/Semantics/OpenMP/allocate01.f90
+++ b/flang/test/Semantics/OpenMP/allocate01.f90
@@ -17,7 +17,7 @@ use omp_lib
!ERROR: A list item on a declarative ALLOCATE must be declared in the same scope in which the directive appears
!$omp allocate(y)
- print *, a
+ print *, a
!WARNING: The executable form of the OpenMP ALLOCATE directive has been deprecated, please use ALLOCATORS instead [-Wopen-mp-usage]
!$omp allocate(x) allocator(omp_default_mem_alloc)
diff --git a/flang/test/Semantics/OpenMP/allocate02.f90 b/flang/test/Semantics/OpenMP/allocate02.f90
index 8f0579e..a1e6847 100644
--- a/flang/test/Semantics/OpenMP/allocate02.f90
+++ b/flang/test/Semantics/OpenMP/allocate02.f90
@@ -16,6 +16,7 @@ use omp_lib
!ERROR: At most one ALLOCATOR clause can appear on the ALLOCATE directive
!$omp allocate(x, y) allocator(omp_default_mem_alloc) allocator(omp_default_mem_alloc)
+ continue
!$omp allocate(darray) allocator(omp_default_mem_alloc)
allocate ( darray(a, b) )
diff --git a/flang/test/Semantics/OpenMP/allocate03.f90 b/flang/test/Semantics/OpenMP/allocate03.f90
index e35115f..3609f38 100644
--- a/flang/test/Semantics/OpenMP/allocate03.f90
+++ b/flang/test/Semantics/OpenMP/allocate03.f90
@@ -17,6 +17,7 @@ use omp_lib
!ERROR: A variable that is part of another variable (as an array or structure element) cannot appear on the ALLOCATE directive
!$omp allocate(my_var%array)
+ continue
!ERROR: A variable that is part of another variable (as an array or structure element) cannot appear on the ALLOCATE directive
!$omp allocate(darray, my_var%array) allocator(omp_default_mem_alloc)
diff --git a/flang/test/Semantics/OpenMP/allocate06.f90 b/flang/test/Semantics/OpenMP/allocate06.f90
index 9b57322..272094a 100644
--- a/flang/test/Semantics/OpenMP/allocate06.f90
+++ b/flang/test/Semantics/OpenMP/allocate06.f90
@@ -13,7 +13,7 @@ use omp_lib
!ERROR: A list item in a declarative ALLOCATE cannot have the ALLOCATABLE or POINTER attribute
!$omp allocate(darray) allocator(omp_default_mem_alloc)
-
+ continue
!$omp allocate(darray) allocator(omp_default_mem_alloc)
allocate(darray(a, b))
diff --git a/flang/test/Semantics/OpenMP/allocate08.f90 b/flang/test/Semantics/OpenMP/allocate08.f90
index f4f11e2..3f59493 100644
--- a/flang/test/Semantics/OpenMP/allocate08.f90
+++ b/flang/test/Semantics/OpenMP/allocate08.f90
@@ -1,11 +1,11 @@
! REQUIRES: openmp_runtime
-! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags
-! OpenMP Version 5.0
+! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=51
+! OpenMP Version 5.1
! 2.11.3 allocate Directive
! If list items within the ALLOCATE directive have the SAVE attribute, are a
-! common block name, or are declared in the scope of a module, then only
-! predefined memory allocator parameters can be used in the allocator clause
+! common block name, then only predefined memory allocator parameters can be
+! used in the allocator clause
module AllocateModule
INTEGER :: z
diff --git a/flang/test/Semantics/OpenMP/allocate09.f90 b/flang/test/Semantics/OpenMP/allocate09.f90
index 0f93a34..8b8d07c 100644
--- a/flang/test/Semantics/OpenMP/allocate09.f90
+++ b/flang/test/Semantics/OpenMP/allocate09.f90
@@ -23,11 +23,11 @@ use omp_lib
!$omp allocate
allocate(e(5), f(6), g(7))
- !ERROR: Object 'i' in ALLOCATE directive not found in corresponding ALLOCATE statement
+ !ERROR: A list item on an executable ALLOCATE must be specified on the associated ALLOCATE statement
!$omp allocate(h, i) allocator(omp_default_mem_alloc)
allocate(h(8))
- !ERROR: Object 'j' in ALLOCATE directive not found in corresponding ALLOCATE statement
+ !ERROR: A list item on an executable ALLOCATE must be specified on the associated ALLOCATE statement
!$omp allocate(j, k) allocator(omp_default_mem_alloc)
!$omp allocate(l) allocator(omp_default_mem_alloc)
allocate(k(9), l(10))
diff --git a/flang/test/Semantics/OpenMP/allocate10.f90 b/flang/test/Semantics/OpenMP/allocate10.f90
new file mode 100644
index 0000000..0a9e85b
--- /dev/null
+++ b/flang/test/Semantics/OpenMP/allocate10.f90
@@ -0,0 +1,11 @@
+!RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=51
+
+subroutine f00
+ integer, allocatable :: x, y
+
+ continue
+ !$omp allocate
+ !ERROR: If multiple directives are present in an executable ALLOCATE directive, at most one of them may specify no list items
+ !$omp allocate
+ allocate(x, y)
+end
diff --git a/flang/test/Semantics/OpenMP/allocate11.f90 b/flang/test/Semantics/OpenMP/allocate11.f90
new file mode 100644
index 0000000..89beaa0
--- /dev/null
+++ b/flang/test/Semantics/OpenMP/allocate11.f90
@@ -0,0 +1,27 @@
+! REQUIRES: openmp_runtime
+
+! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=50
+! OpenMP Version 5.0
+! 2.11.3 allocate Directive
+! If list items within the ALLOCATE directive have the SAVE attribute, are a
+! common block name, or are declared in the scope of a module, then only
+! predefined memory allocator parameters can be used in the allocator clause
+
+module AllocateModule
+ INTEGER :: z
+ !ERROR: If a list item is a named common block, has SAVE attribute or is declared in the scope of a module, an ALLOCATOR clause must be present with a predefined allocator
+ !$omp allocate(z)
+end module
+
+subroutine allocate(custom_allocator)
+use omp_lib
+use AllocateModule
+ integer, SAVE :: x
+ integer :: w
+ COMMON /CommonName/ y
+
+ integer(kind=omp_allocator_handle_kind) :: custom_allocator
+
+ !ERROR: If a list item is a named common block, has SAVE attribute or is declared in the scope of a module, an ALLOCATOR clause must be present with a predefined allocator
+ !$omp allocate(x)
+end subroutine allocate
diff --git a/flang/test/Semantics/OpenMP/allocate12.f90 b/flang/test/Semantics/OpenMP/allocate12.f90
new file mode 100644
index 0000000..2b3b510f
--- /dev/null
+++ b/flang/test/Semantics/OpenMP/allocate12.f90
@@ -0,0 +1,16 @@
+!RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=51
+
+subroutine f00
+ integer, allocatable :: x
+ continue
+ !ERROR: An executable ALLOCATE directive must be associated with an ALLOCATE statement
+ !$omp allocate(x)
+end
+
+subroutine f01
+ integer, allocatable :: x
+ continue
+ !$omp allocate(x)
+ !ERROR: The statement associated with executable ALLOCATE directive must be an ALLOCATE statement
+ continue
+end
diff --git a/flang/test/Semantics/OpenMP/allocators01.f90 b/flang/test/Semantics/OpenMP/allocators01.f90
index ff92fa3..a334206 100644
--- a/flang/test/Semantics/OpenMP/allocators01.f90
+++ b/flang/test/Semantics/OpenMP/allocators01.f90
@@ -16,7 +16,7 @@ use omp_lib
allocate(arr3(3), arr4(4, 4))
!$omp end allocators
- !ERROR: Object 'arr1' in ALLOCATORS directive not found in corresponding ALLOCATE statement
+ !ERROR: A list item in an ALLOCATORS construct must be specified on the associated ALLOCATE statement
!$omp allocators allocate(omp_default_mem_alloc: arr1, arr2)
allocate(arr2(2, 2))
diff --git a/flang/test/Semantics/OpenMP/allocators04.f90 b/flang/test/Semantics/OpenMP/allocators04.f90
deleted file mode 100644
index 212e48f..0000000
--- a/flang/test/Semantics/OpenMP/allocators04.f90
+++ /dev/null
@@ -1,31 +0,0 @@
-! REQUIRES: openmp_runtime
-
-! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=50
-! OpenMP Version 5.2
-! Inherited from 2.11.3 allocate Directive
-! If list items within the ALLOCATE directive have the SAVE attribute, are a common block name, or are declared in the scope of a
-! module, then only predefined memory allocator parameters can be used in the allocator clause
-! SAVE and common block names can't be declared as allocatable, only module scope variables are tested
-
-module AllocateModule
- integer, allocatable :: a, b
-end module
-
-subroutine allocate()
- use omp_lib
- use AllocateModule
-
- integer(kind=omp_allocator_handle_kind) :: custom_allocator
- type(omp_alloctrait) :: trait(1)
-
- trait(1)%key = fallback
- trait(1)%value = default_mem_fb
- custom_allocator = omp_init_allocator(omp_default_mem_space, 1, trait)
-
- !$omp allocators allocate(omp_default_mem_alloc: a)
- allocate(a)
-
- !ERROR: If list items within the ALLOCATORS directive have the SAVE attribute, are a common block name, or are declared in the scope of a module, then only predefined memory allocator parameters can be used in the allocator clause
- !$omp allocators allocate(custom_allocator: b)
- allocate(b)
-end subroutine
diff --git a/flang/test/Semantics/OpenMP/allocators05.f90 b/flang/test/Semantics/OpenMP/allocators05.f90
index efacdfa..f49182f 100644
--- a/flang/test/Semantics/OpenMP/allocators05.f90
+++ b/flang/test/Semantics/OpenMP/allocators05.f90
@@ -17,7 +17,7 @@ subroutine allocate()
!$omp target private(a, b)
!$omp allocators allocate(omp_default_mem_alloc: a)
allocate(a(LEN))
- !ERROR: ALLOCATORS directives that appear in a TARGET region must specify an allocator
+ !ERROR: An ALLOCATE clause in a TARGET region must specify an allocator or REQUIRES(DYNAMIC_ALLOCATORS) must be specified
!$omp allocators allocate(b)
allocate(b(LEN))
!$omp end target
diff --git a/flang/test/Semantics/OpenMP/allocators07.f90 b/flang/test/Semantics/OpenMP/allocators07.f90
index a28f706..baaacee 100644
--- a/flang/test/Semantics/OpenMP/allocators07.f90
+++ b/flang/test/Semantics/OpenMP/allocators07.f90
@@ -5,7 +5,7 @@ subroutine f00
integer, allocatable :: a(:)
!$omp allocators allocate(a)
-!ERROR: The body of the ALLOCATORS construct should be an ALLOCATE statement
+!ERROR: The body of an ALLOCATORS construct should be an ALLOCATE statement
continue
end
@@ -13,7 +13,7 @@ subroutine f01
implicit none
integer, allocatable :: a(:)
-!ERROR: The ALLOCATORS construct should contain a single ALLOCATE statement
+!ERROR: The body of an ALLOCATORS construct should be an ALLOCATE statement
!$omp allocators allocate(a)
!$omp end allocators
end
@@ -22,6 +22,6 @@ subroutine f02
implicit none
integer, allocatable :: a(:)
-!ERROR: The ALLOCATORS construct should contain a single ALLOCATE statement
+!ERROR: The body of an ALLOCATORS construct should be an ALLOCATE statement
!$omp allocators allocate(a)
end
diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt
index ae555a25..4e6b419 100644
--- a/libc/CMakeLists.txt
+++ b/libc/CMakeLists.txt
@@ -47,8 +47,6 @@ set(LIBC_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR})
set(LIBC_ENABLE_USE_BY_CLANG OFF CACHE BOOL "Whether or not to place libc in a build directory findable by a just built clang")
-set(LIBC_KERNEL_HEADERS "/usr/include" CACHE STRING "Path to Linux kernel headers")
-
# Defining a global namespace to enclose all libc functions.
set(default_namespace "__llvm_libc")
if(LLVM_VERSION_MAJOR)
@@ -146,6 +144,11 @@ option(LLVM_LIBC_ALL_HEADERS "Outputs all functions in header files, regardless
option(LIBC_CONFIG_PATH "The path to user provided folder that configures the build for the target system." OFF)
+if(LIBC_TARGET_OS_IS_LINUX)
+ set(kernel_headers "/usr/include")
+endif()
+set(LIBC_KERNEL_HEADERS "${kernel_headers}" CACHE STRING "Path to Linux kernel headers")
+
set(LIBC_ENABLE_UNITTESTS ON)
set(LIBC_ENABLE_HERMETIC_TESTS ${LLVM_LIBC_FULL_BUILD})
diff --git a/libcxx/docs/FeatureTestMacroTable.rst b/libcxx/docs/FeatureTestMacroTable.rst
index dd9bf8a..d5ed918 100644
--- a/libcxx/docs/FeatureTestMacroTable.rst
+++ b/libcxx/docs/FeatureTestMacroTable.rst
@@ -478,7 +478,7 @@ Status
---------------------------------------------------------- -----------------
``__cpp_lib_is_virtual_base_of`` ``202406L``
---------------------------------------------------------- -----------------
- ``__cpp_lib_is_within_lifetime`` *unimplemented*
+ ``__cpp_lib_is_within_lifetime`` ``202306L``
---------------------------------------------------------- -----------------
``__cpp_lib_linalg`` *unimplemented*
---------------------------------------------------------- -----------------
diff --git a/libcxx/docs/ReleaseNotes/22.rst b/libcxx/docs/ReleaseNotes/22.rst
index 980390c..58e0ee9 100644
--- a/libcxx/docs/ReleaseNotes/22.rst
+++ b/libcxx/docs/ReleaseNotes/22.rst
@@ -43,6 +43,8 @@ Implemented Papers
- P3044R2: sub-``string_view`` from ``string`` (`Github <https://llvm.org/PR148140>`__)
- P3223R2: Making ``std::istream::ignore`` less surprising (`Github <https://llvm.org/PR148178>`__)
- P3060R3: Add ``std::views::indices(n)`` (`Github <https://llvm.org/PR148175>`__)
+- P2641R4: Checking if a ``union`` alternative is active (``std::is_within_lifetime``)
+ (`Github <https://llvm.org/PR105381>`__)
- P2835R7: Expose ``std::atomic_ref``'s object address (`Github <https://llvm.org/PR118377>`__)
- P2944R3: Comparisons for ``reference_wrapper`` (`Github <https://llvm.org/PR105424>`__)
- P3168R2: Give ``std::optional`` Range Support (`Github <https://llvm.org/PR105430>`__)
diff --git a/libcxx/docs/Status/Cxx2cPapers.csv b/libcxx/docs/Status/Cxx2cPapers.csv
index a5423ac..e0e47b8 100644
--- a/libcxx/docs/Status/Cxx2cPapers.csv
+++ b/libcxx/docs/Status/Cxx2cPapers.csv
@@ -18,7 +18,7 @@
"`P2874R2 <https://wg21.link/P2874R2>`__","P2874R2: Mandating Annex D Require No More","2023-06 (Varna)","|Complete|","12","`#105377 <https://github.com/llvm/llvm-project/issues/105377>`__",""
"`P2757R3 <https://wg21.link/P2757R3>`__","Type-checking format args","2023-06 (Varna)","","","`#105378 <https://github.com/llvm/llvm-project/issues/105378>`__",""
"`P2637R3 <https://wg21.link/P2637R3>`__","Member ``visit``","2023-06 (Varna)","|Complete|","19","`#105380 <https://github.com/llvm/llvm-project/issues/105380>`__","Change of ``__cpp_lib_variant`` is completed in LLVM 20. Change of ``__cpp_lib_format`` is blocked by `P2419R2 <https://wg21.link/P2419R2>`__."
-"`P2641R4 <https://wg21.link/P2641R4>`__","Checking if a ``union`` alternative is active","2023-06 (Varna)","","","`#105381 <https://github.com/llvm/llvm-project/issues/105381>`__",""
+"`P2641R4 <https://wg21.link/P2641R4>`__","Checking if a ``union`` alternative is active","2023-06 (Varna)","|Complete|","22","`#105381 <https://github.com/llvm/llvm-project/issues/105381>`__",""
"`P1759R6 <https://wg21.link/P1759R6>`__","Native handles and file streams","2023-06 (Varna)","|Complete|","18","`#105382 <https://github.com/llvm/llvm-project/issues/105382>`__",""
"`P2697R1 <https://wg21.link/P2697R1>`__","Interfacing ``bitset`` with ``string_view``","2023-06 (Varna)","|Complete|","18","`#105384 <https://github.com/llvm/llvm-project/issues/105384>`__",""
"`P1383R2 <https://wg21.link/P1383R2>`__","More ``constexpr`` for ``<cmath>`` and ``<complex>``","2023-06 (Varna)","","","`#105385 <https://github.com/llvm/llvm-project/issues/105385>`__",""
diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt
index de9819c..57032ce 100644
--- a/libcxx/include/CMakeLists.txt
+++ b/libcxx/include/CMakeLists.txt
@@ -878,6 +878,7 @@ set(files
__type_traits/is_valid_expansion.h
__type_traits/is_void.h
__type_traits/is_volatile.h
+ __type_traits/is_within_lifetime.h
__type_traits/lazy.h
__type_traits/make_32_64_or_128_bit.h
__type_traits/make_const_lvalue_ref.h
diff --git a/libcxx/include/__configuration/availability.h b/libcxx/include/__configuration/availability.h
index d0414ec..5433df8 100644
--- a/libcxx/include/__configuration/availability.h
+++ b/libcxx/include/__configuration/availability.h
@@ -118,14 +118,40 @@
# define _LIBCPP_INTRODUCED_IN_LLVM_21_ATTRIBUTE __attribute__((unavailable))
// LLVM 20
-// TODO: Fill this in
-# define _LIBCPP_INTRODUCED_IN_LLVM_20 0
-# define _LIBCPP_INTRODUCED_IN_LLVM_20_ATTRIBUTE __attribute__((unavailable))
+//
+// Note that versions for most Apple OSes were bumped forward and aligned in that release.
+# if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 260000) || \
+ (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 260000) || \
+ (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 260000) || \
+ (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 260000) || \
+ (defined(__ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__ < 100000)
+# define _LIBCPP_INTRODUCED_IN_LLVM_20 0
+# else
+# define _LIBCPP_INTRODUCED_IN_LLVM_20 1
+# endif
+# define _LIBCPP_INTRODUCED_IN_LLVM_20_ATTRIBUTE \
+ __attribute__((availability(macos, strict, introduced = 26.0))) \
+ __attribute__((availability(ios, strict, introduced = 26.0))) \
+ __attribute__((availability(tvos, strict, introduced = 26.0))) \
+ __attribute__((availability(watchos, strict, introduced = 26.0))) \
+ __attribute__((availability(bridgeos, strict, introduced = 10.0)))
// LLVM 19
-// TODO: Fill this in
-# define _LIBCPP_INTRODUCED_IN_LLVM_19 0
-# define _LIBCPP_INTRODUCED_IN_LLVM_19_ATTRIBUTE __attribute__((unavailable))
+# if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 150400) || \
+ (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 180400) || \
+ (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 180400) || \
+ (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 110400) || \
+ (defined(__ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__ < 90400)
+# define _LIBCPP_INTRODUCED_IN_LLVM_19 0
+# else
+# define _LIBCPP_INTRODUCED_IN_LLVM_19 1
+# endif
+# define _LIBCPP_INTRODUCED_IN_LLVM_19_ATTRIBUTE \
+ __attribute__((availability(macos, strict, introduced = 15.4))) \
+ __attribute__((availability(ios, strict, introduced = 18.4))) \
+ __attribute__((availability(tvos, strict, introduced = 18.4))) \
+ __attribute__((availability(watchos, strict, introduced = 11.4))) \
+ __attribute__((availability(bridgeos, strict, introduced = 9.4)))
// LLVM 18
# if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 150000) || \
diff --git a/libcxx/include/__format/formatter_output.h b/libcxx/include/__format/formatter_output.h
index d53b6ce..63dd7fc 100644
--- a/libcxx/include/__format/formatter_output.h
+++ b/libcxx/include/__format/formatter_output.h
@@ -151,45 +151,41 @@ _LIBCPP_HIDE_FROM_ABI _OutIt __fill(_OutIt __out_it, size_t __n, _CharT __value)
}
}
-# if _LIBCPP_HAS_UNICODE
template <__fmt_char_type _CharT, output_iterator<const _CharT&> _OutIt>
- requires(same_as<_CharT, char>)
_LIBCPP_HIDE_FROM_ABI _OutIt __fill(_OutIt __out_it, size_t __n, __format_spec::__code_point<_CharT> __value) {
- std::size_t __bytes = std::countl_one(static_cast<unsigned char>(__value.__data[0]));
- if (__bytes == 0)
- return __formatter::__fill(std::move(__out_it), __n, __value.__data[0]);
-
- for (size_t __i = 0; __i < __n; ++__i)
- __out_it = __formatter::__copy(
- std::addressof(__value.__data[0]), std::addressof(__value.__data[0]) + __bytes, std::move(__out_it));
- return __out_it;
-}
-
+# if _LIBCPP_HAS_UNICODE
+ if constexpr (same_as<_CharT, char>) {
+ std::size_t __bytes = std::countl_one(static_cast<unsigned char>(__value.__data[0]));
+ if (__bytes == 0)
+ return __formatter::__fill(std::move(__out_it), __n, __value.__data[0]);
+
+ for (size_t __i = 0; __i < __n; ++__i)
+ __out_it = __formatter::__copy(
+ std::addressof(__value.__data[0]), std::addressof(__value.__data[0]) + __bytes, std::move(__out_it));
+ return __out_it;
# if _LIBCPP_HAS_WIDE_CHARACTERS
-template <__fmt_char_type _CharT, output_iterator<const _CharT&> _OutIt>
- requires(same_as<_CharT, wchar_t> && sizeof(wchar_t) == 2)
-_LIBCPP_HIDE_FROM_ABI _OutIt __fill(_OutIt __out_it, size_t __n, __format_spec::__code_point<_CharT> __value) {
- if (!__unicode::__is_high_surrogate(__value.__data[0]))
- return __formatter::__fill(std::move(__out_it), __n, __value.__data[0]);
-
- for (size_t __i = 0; __i < __n; ++__i)
- __out_it = __formatter::__copy(
- std::addressof(__value.__data[0]), std::addressof(__value.__data[0]) + 2, std::move(__out_it));
- return __out_it;
-}
-
-template <__fmt_char_type _CharT, output_iterator<const _CharT&> _OutIt>
- requires(same_as<_CharT, wchar_t> && sizeof(wchar_t) == 4)
-_LIBCPP_HIDE_FROM_ABI _OutIt __fill(_OutIt __out_it, size_t __n, __format_spec::__code_point<_CharT> __value) {
- return __formatter::__fill(std::move(__out_it), __n, __value.__data[0]);
-}
+ } else if constexpr (same_as<_CharT, wchar_t>) {
+ if constexpr (sizeof(wchar_t) == 2) {
+ if (!__unicode::__is_high_surrogate(__value.__data[0]))
+ return __formatter::__fill(std::move(__out_it), __n, __value.__data[0]);
+
+ for (size_t __i = 0; __i < __n; ++__i)
+ __out_it = __formatter::__copy(
+ std::addressof(__value.__data[0]), std::addressof(__value.__data[0]) + 2, std::move(__out_it));
+ return __out_it;
+ } else if constexpr (sizeof(wchar_t) == 4) {
+ return __formatter::__fill(std::move(__out_it), __n, __value.__data[0]);
+ } else {
+ static_assert(false, "expected sizeof(wchar_t) to be 2 or 4");
+ }
# endif // _LIBCPP_HAS_WIDE_CHARACTERS
-# else // _LIBCPP_HAS_UNICODE
-template <__fmt_char_type _CharT, output_iterator<const _CharT&> _OutIt>
-_LIBCPP_HIDE_FROM_ABI _OutIt __fill(_OutIt __out_it, size_t __n, __format_spec::__code_point<_CharT> __value) {
+ } else {
+ static_assert(false, "Unexpected CharT");
+ }
+# else // _LIBCPP_HAS_UNICODE
return __formatter::__fill(std::move(__out_it), __n, __value.__data[0]);
+# endif // _LIBCPP_HAS_UNICODE
}
-# endif // _LIBCPP_HAS_UNICODE
/// Writes the input to the output with the required padding.
///
diff --git a/libcxx/include/__functional/identity.h b/libcxx/include/__functional/identity.h
index 1b1c6cf..02dde2b 100644
--- a/libcxx/include/__functional/identity.h
+++ b/libcxx/include/__functional/identity.h
@@ -44,7 +44,7 @@ struct __is_identity<reference_wrapper<const __identity> > : true_type {};
struct identity {
template <class _Tp>
- [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr _Tp&& operator()(_Tp&& __t) const noexcept {
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr _Tp&& operator()(_LIBCPP_LIFETIMEBOUND _Tp&& __t) const noexcept {
return std::forward<_Tp>(__t);
}
diff --git a/libcxx/include/__new/align_val_t.h b/libcxx/include/__new/align_val_t.h
index 03ab7cb..d8ce528 100644
--- a/libcxx/include/__new/align_val_t.h
+++ b/libcxx/include/__new/align_val_t.h
@@ -16,6 +16,12 @@
# pragma GCC system_header
#endif
+// <vcruntime_exception.h> defines its own std::align_val_t type,
+// which we use in order to be ABI-compatible with other STLs on Windows.
+#if _LIBCPP_HAS_LIBRARY_ALIGNED_ALLOCATION && defined(_LIBCPP_ABI_VCRUNTIME)
+# include <vcruntime_new.h>
+#endif
+
_LIBCPP_BEGIN_UNVERSIONED_NAMESPACE_STD
#if _LIBCPP_HAS_LIBRARY_ALIGNED_ALLOCATION && !defined(_LIBCPP_ABI_VCRUNTIME)
# ifndef _LIBCPP_CXX03_LANG
diff --git a/libcxx/include/__new/exceptions.h b/libcxx/include/__new/exceptions.h
index 8695181..483e5e3 100644
--- a/libcxx/include/__new/exceptions.h
+++ b/libcxx/include/__new/exceptions.h
@@ -17,6 +17,12 @@
# pragma GCC system_header
#endif
+// <vcruntime_exception.h> defines its own std::bad_alloc type,
+// which we use in order to be ABI-compatible with other STLs on Windows.
+#if defined(_LIBCPP_ABI_VCRUNTIME)
+# include <vcruntime_exception.h>
+#endif
+
_LIBCPP_BEGIN_UNVERSIONED_NAMESPACE_STD
#if !defined(_LIBCPP_ABI_VCRUNTIME)
diff --git a/libcxx/include/__type_traits/is_within_lifetime.h b/libcxx/include/__type_traits/is_within_lifetime.h
new file mode 100644
index 0000000..242f2ad
--- /dev/null
+++ b/libcxx/include/__type_traits/is_within_lifetime.h
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef _LIBCPP___TYPE_TRAITS_IS_WITHIN_LIFETIME_H
+#define _LIBCPP___TYPE_TRAITS_IS_WITHIN_LIFETIME_H
+
+#include <__config>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+# pragma GCC system_header
+#endif
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+#if _LIBCPP_STD_VER >= 26 && __has_builtin(__builtin_is_within_lifetime)
+template <class _Tp>
+_LIBCPP_HIDE_FROM_ABI consteval bool is_within_lifetime(const _Tp* __p) noexcept {
+ return __builtin_is_within_lifetime(__p);
+}
+#endif
+
+_LIBCPP_END_NAMESPACE_STD
+
+#endif // _LIBCPP___TYPE_TRAITS_IS_WITHIN_LIFETIME_H
diff --git a/libcxx/include/deque b/libcxx/include/deque
index 3e7ee8d85..ab41b9d 100644
--- a/libcxx/include/deque
+++ b/libcxx/include/deque
@@ -193,7 +193,6 @@ template <class T, class Allocator, class Predicate>
# include <__algorithm/move_backward.h>
# include <__algorithm/remove.h>
# include <__algorithm/remove_if.h>
-# include <__algorithm/unwrap_iter.h>
# include <__assert>
# include <__config>
# include <__debug_utils/sanitizers.h>
@@ -220,11 +219,9 @@ template <class T, class Allocator, class Predicate>
# include <__ranges/concepts.h>
# include <__ranges/container_compatible_range.h>
# include <__ranges/from_range.h>
-# include <__ranges/size.h>
# include <__split_buffer>
# include <__type_traits/conditional.h>
# include <__type_traits/container_traits.h>
-# include <__type_traits/disjunction.h>
# include <__type_traits/enable_if.h>
# include <__type_traits/is_allocator.h>
# include <__type_traits/is_convertible.h>
diff --git a/libcxx/include/forward_list b/libcxx/include/forward_list
index 88d863f..272e52d 100644
--- a/libcxx/include/forward_list
+++ b/libcxx/include/forward_list
@@ -223,14 +223,12 @@ template <class T, class Allocator, class Predicate>
# include <__ranges/concepts.h>
# include <__ranges/container_compatible_range.h>
# include <__ranges/from_range.h>
-# include <__type_traits/conditional.h>
# include <__type_traits/container_traits.h>
# include <__type_traits/enable_if.h>
# include <__type_traits/is_allocator.h>
# include <__type_traits/is_const.h>
# include <__type_traits/is_nothrow_assignable.h>
# include <__type_traits/is_nothrow_constructible.h>
-# include <__type_traits/is_pointer.h>
# include <__type_traits/is_same.h>
# include <__type_traits/is_swappable.h>
# include <__type_traits/remove_cv.h>
diff --git a/libcxx/include/list b/libcxx/include/list
index 0ff85d2..2898a45 100644
--- a/libcxx/include/list
+++ b/libcxx/include/list
@@ -228,13 +228,11 @@ template <class T, class Allocator, class Predicate>
# include <__ranges/concepts.h>
# include <__ranges/container_compatible_range.h>
# include <__ranges/from_range.h>
-# include <__type_traits/conditional.h>
# include <__type_traits/container_traits.h>
# include <__type_traits/enable_if.h>
# include <__type_traits/is_allocator.h>
# include <__type_traits/is_nothrow_assignable.h>
# include <__type_traits/is_nothrow_constructible.h>
-# include <__type_traits/is_pointer.h>
# include <__type_traits/is_same.h>
# include <__type_traits/type_identity.h>
# include <__utility/exception_guard.h>
diff --git a/libcxx/include/map b/libcxx/include/map
index 3ff849a..cc8b876 100644
--- a/libcxx/include/map
+++ b/libcxx/include/map
@@ -600,9 +600,7 @@ erase_if(multimap<Key, T, Compare, Allocator>& c, Predicate pred); // C++20
# include <__ranges/from_range.h>
# include <__tree>
# include <__type_traits/container_traits.h>
-# include <__type_traits/desugars_to.h>
# include <__type_traits/is_allocator.h>
-# include <__type_traits/is_convertible.h>
# include <__type_traits/make_transparent.h>
# include <__type_traits/remove_const.h>
# include <__type_traits/type_identity.h>
diff --git a/libcxx/include/module.modulemap.in b/libcxx/include/module.modulemap.in
index 11ab61d..24a2fe7 100644
--- a/libcxx/include/module.modulemap.in
+++ b/libcxx/include/module.modulemap.in
@@ -350,6 +350,7 @@ module std_core [system] {
header "__type_traits/is_volatile.h"
export std_core.type_traits.integral_constant
}
+ module is_within_lifetime { header "__type_traits/is_within_lifetime.h" }
module lazy { header "__type_traits/lazy.h" }
module make_32_64_or_128_bit { header "__type_traits/make_32_64_or_128_bit.h" }
module make_const_lvalue_ref { header "__type_traits/make_const_lvalue_ref.h" }
diff --git a/libcxx/include/set b/libcxx/include/set
index 59ed015..d58b6e9 100644
--- a/libcxx/include/set
+++ b/libcxx/include/set
@@ -524,7 +524,6 @@ erase_if(multiset<Key, Compare, Allocator>& c, Predicate pred); // C++20
# include <__functional/operations.h>
# include <__iterator/erase_if_container.h>
# include <__iterator/iterator_traits.h>
-# include <__iterator/ranges_iterator_traits.h>
# include <__iterator/reverse_iterator.h>
# include <__memory/allocator.h>
# include <__memory/allocator_traits.h>
@@ -538,7 +537,6 @@ erase_if(multiset<Key, Compare, Allocator>& c, Predicate pred); // C++20
# include <__type_traits/container_traits.h>
# include <__type_traits/enable_if.h>
# include <__type_traits/is_allocator.h>
-# include <__type_traits/is_nothrow_assignable.h>
# include <__type_traits/is_nothrow_constructible.h>
# include <__type_traits/is_same.h>
# include <__type_traits/is_swappable.h>
diff --git a/libcxx/include/string b/libcxx/include/string
index 8f80afbc..ede4246 100644
--- a/libcxx/include/string
+++ b/libcxx/include/string
@@ -644,6 +644,7 @@ basic_string<char32_t> operator""s( const char32_t *str, size_t len );
# include <__utility/forward.h>
# include <__utility/is_pointer_in_range.h>
# include <__utility/move.h>
+# include <__utility/no_destroy.h>
# include <__utility/scope_guard.h>
# include <__utility/swap.h>
# include <climits>
@@ -914,6 +915,11 @@ private:
union __rep {
__short __s;
__long __l;
+
+ __rep() = default;
+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __rep(__short __r) : __s(__r) {}
+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __rep(__long __r) : __l(__r) {}
+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __rep(__uninitialized_tag) {}
};
_LIBCPP_COMPRESSED_PAIR(__rep, __rep_, allocator_type, __alloc_);
@@ -1206,7 +1212,10 @@ public:
}
# endif // _LIBCPP_CXX03_LANG
- inline _LIBCPP_CONSTEXPR_SINCE_CXX20 ~basic_string() { __reset_internal_buffer(); }
+ // TODO(boomanaiden154): Once we mark this in destructors as dead on return,
+ // we can use a normal call to __reset_internal_buffer and remove the extra
+ // __rep constructor.
+ inline _LIBCPP_CONSTEXPR_SINCE_CXX20 ~basic_string() { __reset_internal_buffer(__rep(__uninitialized_tag())); }
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 operator __self_view() const _NOEXCEPT {
return __self_view(typename __self_view::__assume_valid(), data(), size());
@@ -2259,18 +2268,12 @@ private:
return __long(__buffer, __capacity);
}
- // Deallocate the long buffer if it exists and clear the short buffer so we are an empty string
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __reset_internal_buffer() {
+ // Replace the current buffer with __new_rep. Deallocate the old long buffer if it exists.
+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __reset_internal_buffer(__rep __new_rep = __short()) {
__annotate_delete();
if (__is_long())
__alloc_traits::deallocate(__alloc_, __get_long_pointer(), __get_long_cap());
- __rep_.__s = __short();
- }
-
- // Replace the current buffer with __alloc; the first __size elements constitute a string
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __replace_internal_buffer(__long __alloc) {
- __reset_internal_buffer();
- __rep_.__l = __alloc;
+ __rep_ = __new_rep;
}
// Initialize the internal buffer to hold __size elements
@@ -2444,7 +2447,7 @@ private:
__annotate_delete();
auto __guard = std::__make_scope_guard(__annotate_new_size(*this));
auto __alloc = __str.__alloc_;
- __replace_internal_buffer(__allocate_long_buffer(__alloc, __str.size()));
+ __reset_internal_buffer(__allocate_long_buffer(__alloc, __str.size()));
__alloc_ = std::move(__alloc);
}
}
@@ -2710,7 +2713,7 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 void basic_string<_CharT, _Traits, _Allocator>::__
__sec_cp_sz);
__buffer.__size_ = __n_copy + __n_add + __sec_cp_sz;
traits_type::assign(__buffer.__data_[__buffer.__size_], value_type());
- __replace_internal_buffer(__buffer);
+ __reset_internal_buffer(__buffer);
}
// __grow_by is deprecated because it does not set the size. It may not update the size when the size is changed, and it
@@ -2746,7 +2749,7 @@ _LIBCPP_DEPRECATED_("use __grow_by_without_replace") basic_string<_CharT, _Trait
// This is -1 to make sure the caller sets the size properly, since old versions of this function didn't set the size
// at all.
__buffer.__size_ = -1;
- __replace_internal_buffer(__buffer);
+ __reset_internal_buffer(__buffer);
}
template <class _CharT, class _Traits, class _Allocator>
@@ -3394,7 +3397,7 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 void basic_string<_CharT, _Traits, _Allocator>::re
__long __buffer = __allocate_long_buffer(__alloc_, __requested_capacity);
__buffer.__size_ = size();
traits_type::copy(std::__to_address(__buffer.__data_), data(), __buffer.__size_ + 1);
- __replace_internal_buffer(__buffer);
+ __reset_internal_buffer(__buffer);
}
template <class _CharT, class _Traits, class _Allocator>
@@ -3433,7 +3436,7 @@ inline _LIBCPP_CONSTEXPR_SINCE_CXX20 void basic_string<_CharT, _Traits, _Allocat
}
traits_type::copy(std::__to_address(__buffer.__data_), std::__to_address(__get_long_pointer()), __size + 1);
- __replace_internal_buffer(__buffer);
+ __reset_internal_buffer(__buffer);
# if _LIBCPP_HAS_EXCEPTIONS
} catch (...) {
return;
diff --git a/libcxx/include/type_traits b/libcxx/include/type_traits
index a6e0c18..dab0c06 100644
--- a/libcxx/include/type_traits
+++ b/libcxx/include/type_traits
@@ -454,6 +454,10 @@ namespace std
template<class B> inline constexpr bool negation_v
= negation<B>::value; // since C++17
+ // [meta.const.eval], constant evaluation context
+ constexpr bool is_constant_evaluated() noexcept; // C++20
+ template<class T>
+ consteval bool is_within_lifetime(const T*) noexcept; // C++26
}
*/
@@ -559,6 +563,10 @@ namespace std
# include <__type_traits/reference_converts_from_temporary.h>
# endif
+# if _LIBCPP_STD_VER >= 26
+# include <__type_traits/is_within_lifetime.h>
+# endif
+
# include <version>
# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
diff --git a/libcxx/include/unordered_set b/libcxx/include/unordered_set
index 4d0e2ac..9873f1e 100644
--- a/libcxx/include/unordered_set
+++ b/libcxx/include/unordered_set
@@ -544,8 +544,6 @@ template <class Value, class Hash, class Pred, class Alloc>
# include <__iterator/distance.h>
# include <__iterator/erase_if_container.h>
# include <__iterator/iterator_traits.h>
-# include <__iterator/ranges_iterator_traits.h>
-# include <__memory/addressof.h>
# include <__memory/allocator.h>
# include <__memory/allocator_traits.h>
# include <__memory_resource/polymorphic_allocator.h>
@@ -558,7 +556,6 @@ template <class Value, class Hash, class Pred, class Alloc>
# include <__type_traits/invoke.h>
# include <__type_traits/is_allocator.h>
# include <__type_traits/is_integral.h>
-# include <__type_traits/is_nothrow_assignable.h>
# include <__type_traits/is_nothrow_constructible.h>
# include <__type_traits/is_same.h>
# include <__type_traits/is_swappable.h>
diff --git a/libcxx/include/version b/libcxx/include/version
index b41cc9e..b003060 100644
--- a/libcxx/include/version
+++ b/libcxx/include/version
@@ -586,7 +586,9 @@ __cpp_lib_void_t 201411L <type_traits>
# if __has_builtin(__builtin_is_virtual_base_of)
# define __cpp_lib_is_virtual_base_of 202406L
# endif
-// # define __cpp_lib_is_within_lifetime 202306L
+# if __has_builtin(__builtin_is_within_lifetime)
+# define __cpp_lib_is_within_lifetime 202306L
+# endif
// # define __cpp_lib_linalg 202311L
# undef __cpp_lib_mdspan
# define __cpp_lib_mdspan 202406L
diff --git a/libcxx/modules/std/type_traits.inc b/libcxx/modules/std/type_traits.inc
index 6823c86..4e49ed8 100644
--- a/libcxx/modules/std/type_traits.inc
+++ b/libcxx/modules/std/type_traits.inc
@@ -330,6 +330,9 @@ export namespace std {
// [meta.const.eval], constant evaluation context
using std::is_constant_evaluated;
+#if _LIBCPP_STD_VER >= 26 && __has_builtin(__builtin_is_within_lifetime)
+ using std::is_within_lifetime;
+#endif
// [depr.meta.types]
using std::aligned_storage;
diff --git a/libcxx/test/libcxx/input.output/iostreams.base/ios.base/ios.base.cons/dtor.uninitialized.pass.cpp b/libcxx/test/libcxx/input.output/iostreams.base/ios.base/ios.base.cons/dtor.uninitialized.pass.cpp
index 16d66e3..e5d48a3 100644
--- a/libcxx/test/libcxx/input.output/iostreams.base/ios.base/ios.base.cons/dtor.uninitialized.pass.cpp
+++ b/libcxx/test/libcxx/input.output/iostreams.base/ios.base/ios.base.cons/dtor.uninitialized.pass.cpp
@@ -10,8 +10,7 @@
// The fix for issue 57964 requires an updated dylib due to explicit
// instantiations. That means Apple backdeployment targets remain broken.
-// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added
-// XFAIL: using-built-library-before-llvm-19 && !darwin
+// XFAIL: using-built-library-before-llvm-19
// <ios>
diff --git a/libcxx/test/libcxx/utilities/function.objects/lifetimebound.verify.cpp b/libcxx/test/libcxx/utilities/function.objects/lifetimebound.verify.cpp
new file mode 100644
index 0000000..5c66bc1
--- /dev/null
+++ b/libcxx/test/libcxx/utilities/function.objects/lifetimebound.verify.cpp
@@ -0,0 +1,20 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// ADDITIONAL_COMPILE_FLAGS: -Wno-pessimizing-move -Wno-unused-variable
+
+#include <functional>
+
+#include "test_macros.h"
+
+// clang-format off
+
+void func() {
+ auto&& v1 = std::identity()(1); // expected-warning {{temporary bound to local reference 'v1' will be destroyed at the end of the full-expression}}
+}
diff --git a/libcxx/test/libcxx/utilities/meta/is_within_lifetime.verify.cpp b/libcxx/test/libcxx/utilities/meta/is_within_lifetime.verify.cpp
new file mode 100644
index 0000000..ff3ecfb
--- /dev/null
+++ b/libcxx/test/libcxx/utilities/meta/is_within_lifetime.verify.cpp
@@ -0,0 +1,26 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23
+// UNSUPPORTED: gcc-15, apple-clang-17
+
+// <type_traits>
+
+// LWG4138 <https://cplusplus.github.io/LWG/issue4138>
+// std::is_within_lifetime shouldn't work when a function type is
+// explicitly specified, even if it isn't evaluated
+
+#include <type_traits>
+
+template <class T>
+consteval bool checked_is_within_lifetime(T* p) {
+ return p ? std::is_within_lifetime<T>(p) : false;
+}
+static_assert(!checked_is_within_lifetime<int>(nullptr));
+static_assert(!checked_is_within_lifetime<void()>(nullptr));
+// expected-error@*:* {{function pointer argument to '__builtin_is_within_lifetime' is not allowed}}
diff --git a/libcxx/test/std/input.output/file.streams/fstreams/filebuf.virtuals/setbuf.pass.cpp b/libcxx/test/std/input.output/file.streams/fstreams/filebuf.virtuals/setbuf.pass.cpp
index 00aa97a..72af0a2 100644
--- a/libcxx/test/std/input.output/file.streams/fstreams/filebuf.virtuals/setbuf.pass.cpp
+++ b/libcxx/test/std/input.output/file.streams/fstreams/filebuf.virtuals/setbuf.pass.cpp
@@ -12,8 +12,7 @@
// This test requires the fix to https://llvm.org/PR60509 in the dylib,
// which landed in 5afb937d8a30445642ccaf33866ee4cdd0713222.
-// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added
-// XFAIL: using-built-library-before-llvm-19 && !darwin
+// XFAIL: using-built-library-before-llvm-19
#include <fstream>
#include <cstddef>
diff --git a/libcxx/test/std/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp b/libcxx/test/std/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp
index b04d2c0..79d20ce 100644
--- a/libcxx/test/std/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp
+++ b/libcxx/test/std/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp
@@ -13,8 +13,7 @@
// The fix for bug 51497 and bug 51499 require and updated dylib due to
// explicit instantiations. That means Apple backdeployment targets remain
// broken.
-// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added
-// XFAIL: using-built-library-before-llvm-19 && !darwin
+// XFAIL: using-built-library-before-llvm-19
#include <istream>
#include <cassert>
diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.elem/arrow.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.elem/arrow.pass.cpp
index 665a1a8..a238b75 100644
--- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.elem/arrow.pass.cpp
+++ b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iter.elem/arrow.pass.cpp
@@ -17,10 +17,10 @@
// LWG 198 was superseded by LWG 2360
// http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2360
-
+#include <cassert>
#include <iterator>
#include <list>
-#include <cassert>
+#include <type_traits>
#include "test_macros.h"
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/type_traits.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/type_traits.version.compile.pass.cpp
index 0074f3b..cb5c008 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/type_traits.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/type_traits.version.compile.pass.cpp
@@ -918,7 +918,7 @@
# endif
# endif
-# if !defined(_LIBCPP_VERSION)
+# if __has_builtin(__builtin_is_within_lifetime)
# ifndef __cpp_lib_is_within_lifetime
# error "__cpp_lib_is_within_lifetime should be defined in c++26"
# endif
@@ -927,7 +927,7 @@
# endif
# else
# ifdef __cpp_lib_is_within_lifetime
-# error "__cpp_lib_is_within_lifetime should not be defined because it is unimplemented in libc++!"
+# error "__cpp_lib_is_within_lifetime should not be defined when the requirement '__has_builtin(__builtin_is_within_lifetime)' is not met!"
# endif
# endif
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp
index a9552c2..8189c5c 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp
@@ -7310,7 +7310,7 @@
# endif
# endif
-# if !defined(_LIBCPP_VERSION)
+# if __has_builtin(__builtin_is_within_lifetime)
# ifndef __cpp_lib_is_within_lifetime
# error "__cpp_lib_is_within_lifetime should be defined in c++26"
# endif
@@ -7319,7 +7319,7 @@
# endif
# else
# ifdef __cpp_lib_is_within_lifetime
-# error "__cpp_lib_is_within_lifetime should not be defined because it is unimplemented in libc++!"
+# error "__cpp_lib_is_within_lifetime should not be defined when the requirement '__has_builtin(__builtin_is_within_lifetime)' is not met!"
# endif
# endif
diff --git a/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_double.pass.cpp b/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_double.pass.cpp
index 31682fea..a388c0b 100644
--- a/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_double.pass.cpp
+++ b/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_double.pass.cpp
@@ -8,8 +8,7 @@
// The fix for LWG2381 (https://github.com/llvm/llvm-project/pull/77948) changed behavior of
// FP parsing. This requires 3e15c97fa3812993bdc319827a5c6d867b765ae8 in the dylib.
-// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added
-// XFAIL: using-built-library-before-llvm-19 && !darwin
+// XFAIL: using-built-library-before-llvm-19
// <locale>
diff --git a/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_float.pass.cpp b/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_float.pass.cpp
index 57eedc8..596d81c 100644
--- a/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_float.pass.cpp
+++ b/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_float.pass.cpp
@@ -8,8 +8,7 @@
// The fix for LWG2381 (https://github.com/llvm/llvm-project/pull/77948) changed behavior of
// FP parsing. This requires 3e15c97fa3812993bdc319827a5c6d867b765ae8 in the dylib.
-// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added
-// XFAIL: using-built-library-before-llvm-19 && !darwin
+// XFAIL: using-built-library-before-llvm-19
// <locale>
diff --git a/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_long_double.pass.cpp b/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_long_double.pass.cpp
index 8324ee3..8a9fd41 100644
--- a/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_long_double.pass.cpp
+++ b/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_long_double.pass.cpp
@@ -8,8 +8,7 @@
// The fix for LWG2381 (https://github.com/llvm/llvm-project/pull/77948) changed behavior of
// FP parsing. This requires 3e15c97fa3812993bdc319827a5c6d867b765ae8 in the dylib.
-// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added
-// XFAIL: using-built-library-before-llvm-19 && !darwin
+// XFAIL: using-built-library-before-llvm-19
// <locale>
diff --git a/libcxx/test/std/strings/basic.string/string.capacity/over_max_size.pass.cpp b/libcxx/test/std/strings/basic.string/string.capacity/over_max_size.pass.cpp
index 5eb3240..8e59195 100644
--- a/libcxx/test/std/strings/basic.string/string.capacity/over_max_size.pass.cpp
+++ b/libcxx/test/std/strings/basic.string/string.capacity/over_max_size.pass.cpp
@@ -8,11 +8,13 @@
// UNSUPPORTED: no-exceptions
-// After changing the alignment of the allocated pointer from 16 to 8, the exception
-// thrown is no longer `bad_alloc` but instead length_error on systems using new
-// headers but a dylib that doesn't contain 04ce0ba.
+// This test fails when using a built library that does not contain
+// 15860446a8c3, which changed the return value of max_size(). Without
+// that change, the built library believes the max size to be one greater
+// than it really is, and we fail to throw `length_error` from `string::resize()`,
+// which is explicitly instantiated in the built library.
//
-// XFAIL: using-built-library-before-llvm-19
+// XFAIL: using-built-library-before-llvm-21
// <string>
diff --git a/libcxx/test/std/utilities/meta/meta.const.eval/is_within_lifetime.compile.pass.cpp b/libcxx/test/std/utilities/meta/meta.const.eval/is_within_lifetime.compile.pass.cpp
new file mode 100644
index 0000000..40c2273
--- /dev/null
+++ b/libcxx/test/std/utilities/meta/meta.const.eval/is_within_lifetime.compile.pass.cpp
@@ -0,0 +1,148 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23
+// UNSUPPORTED: gcc-15, apple-clang-17
+
+// <type_traits>
+
+// template <class T>
+// consteval bool is_within_lifetime(const T*) noexcept; // C++26
+
+#include <cassert>
+#include <type_traits>
+#include <utility>
+
+#include "test_macros.h"
+
+ASSERT_SAME_TYPE(decltype(std::is_within_lifetime(std::declval<int*>())), bool);
+ASSERT_SAME_TYPE(decltype(std::is_within_lifetime(std::declval<const int*>())), bool);
+ASSERT_SAME_TYPE(decltype(std::is_within_lifetime(std::declval<void*>())), bool);
+ASSERT_SAME_TYPE(decltype(std::is_within_lifetime(std::declval<const void*>())), bool);
+
+ASSERT_NOEXCEPT(std::is_within_lifetime(std::declval<int*>()));
+ASSERT_NOEXCEPT(std::is_within_lifetime(std::declval<const int*>()));
+ASSERT_NOEXCEPT(std::is_within_lifetime(std::declval<void*>()));
+ASSERT_NOEXCEPT(std::is_within_lifetime(std::declval<const void*>()));
+
+template <class T>
+concept is_within_lifetime_exists = requires(T t) { std::is_within_lifetime(t); };
+
+struct S {};
+
+static_assert(is_within_lifetime_exists<int*>);
+static_assert(is_within_lifetime_exists<const int*>);
+static_assert(is_within_lifetime_exists<void*>);
+static_assert(is_within_lifetime_exists<const void*>);
+static_assert(!is_within_lifetime_exists<int>); // Not a pointer
+static_assert(!is_within_lifetime_exists<decltype(nullptr)>); // Not a pointer
+static_assert(!is_within_lifetime_exists<void() const>); // Not a pointer
+static_assert(!is_within_lifetime_exists<int S::*>); // Doesn't accept pointer-to-data-member
+static_assert(!is_within_lifetime_exists<void (S::*)()>); // Doesn't accept pointer-to-member-function
+static_assert(!is_within_lifetime_exists<void (*)()>); // Doesn't match `const T*`
+
+consteval bool f() {
+ // Test that it works with global variables whose lifetime is in a
+ // different constant expression
+ {
+ static constexpr int i = 0;
+ static_assert(std::is_within_lifetime(&i));
+ // (Even when cast to a different type)
+ static_assert(std::is_within_lifetime(const_cast<int*>(&i)));
+ static_assert(std::is_within_lifetime(static_cast<const void*>(&i)));
+ static_assert(std::is_within_lifetime(static_cast<void*>(const_cast<int*>(&i))));
+ static_assert(std::is_within_lifetime<const int>(&i));
+ static_assert(std::is_within_lifetime<int>(const_cast<int*>(&i)));
+ static_assert(std::is_within_lifetime<const void>(static_cast<const void*>(&i)));
+ static_assert(std::is_within_lifetime<void>(static_cast<void*>(const_cast<int*>(&i))));
+ }
+
+ {
+ static constexpr union {
+ int member1;
+ int member2;
+ } u{.member2 = 1};
+ static_assert(!std::is_within_lifetime(&u.member1) && std::is_within_lifetime(&u.member2));
+ }
+
+ // Test that it works for varibles inside the same constant expression
+ {
+ int i = 0;
+ assert(std::is_within_lifetime(&i));
+ // (Even when cast to a different type)
+ assert(std::is_within_lifetime(const_cast<int*>(&i)));
+ assert(std::is_within_lifetime(static_cast<const void*>(&i)));
+ assert(std::is_within_lifetime(static_cast<void*>(const_cast<int*>(&i))));
+ assert(std::is_within_lifetime<const int>(&i));
+ assert(std::is_within_lifetime<int>(const_cast<int*>(&i)));
+ assert(std::is_within_lifetime<const void>(static_cast<const void*>(&i)));
+ assert(std::is_within_lifetime<void>(static_cast<void*>(const_cast<int*>(&i))));
+ }
+ // Anonymous union
+ {
+ union {
+ int member1;
+ int member2;
+ };
+ assert(!std::is_within_lifetime(&member1) && !std::is_within_lifetime(&member2));
+ member1 = 1;
+ assert(std::is_within_lifetime(&member1) && !std::is_within_lifetime(&member2));
+ member2 = 1;
+ assert(!std::is_within_lifetime(&member1) && std::is_within_lifetime(&member2));
+ }
+ // Variant members
+ {
+ struct X {
+ union {
+ int member1;
+ int member2;
+ };
+ } x;
+ assert(!std::is_within_lifetime(&x.member1) && !std::is_within_lifetime(&x.member2));
+ x.member1 = 1;
+ assert(std::is_within_lifetime(&x.member1) && !std::is_within_lifetime(&x.member2));
+ x.member2 = 1;
+ assert(!std::is_within_lifetime(&x.member1) && std::is_within_lifetime(&x.member2));
+ }
+ // Unions
+ {
+ union X {
+ int member1;
+ int member2;
+ } x;
+ assert(!std::is_within_lifetime(&x.member1) && !std::is_within_lifetime(&x.member2));
+ x.member1 = 1;
+ assert(std::is_within_lifetime(&x.member1) && !std::is_within_lifetime(&x.member2));
+ x.member2 = 1;
+ assert(!std::is_within_lifetime(&x.member1) && std::is_within_lifetime(&x.member2));
+ }
+ {
+ S s; // uninitialised
+ assert(std::is_within_lifetime(&s));
+ }
+
+ return true;
+}
+static_assert(f());
+
+// Check that it is a consteval (and consteval-propagating) function
+// (i.e., taking the address of below will fail because it will be an immediate function)
+template <typename T>
+constexpr void does_escalate(T p) {
+ std::is_within_lifetime(p);
+}
+template <typename T, void (*)(T) = &does_escalate<T>>
+constexpr bool check_escalated(int) {
+ return false;
+}
+template <typename T>
+constexpr bool check_escalated(long) {
+ return true;
+}
+static_assert(check_escalated<int*>(0), "");
+static_assert(check_escalated<void*>(0), "");
diff --git a/libcxx/utils/generate_feature_test_macro_components.py b/libcxx/utils/generate_feature_test_macro_components.py
index 3d39130..22209f5 100644
--- a/libcxx/utils/generate_feature_test_macro_components.py
+++ b/libcxx/utils/generate_feature_test_macro_components.py
@@ -873,7 +873,8 @@ feature_test_macros = [
"c++26": 202306 # P2641R4 Checking if a union alternative is active
},
"headers": ["type_traits"],
- "unimplemented": True,
+ "test_suite_guard": "__has_builtin(__builtin_is_within_lifetime)",
+ "libcxx_guard": "__has_builtin(__builtin_is_within_lifetime)",
},
{
"name": "__cpp_lib_jthread",
diff --git a/libcxx/utils/libcxx/test/features.py b/libcxx/utils/libcxx/test/features.py
index 7d6e78d..5da1d9a 100644
--- a/libcxx/utils/libcxx/test/features.py
+++ b/libcxx/utils/libcxx/test/features.py
@@ -734,16 +734,44 @@ DEFAULT_FEATURES += [
# Those are used for backdeployment features below, do not use directly in tests.
DEFAULT_FEATURES += [
Feature(
+ name="_target-has-llvm-22",
+ when=lambda cfg: BooleanExpression.evaluate(
+ "TBD",
+ cfg.available_features,
+ ),
+ ),
+ Feature(
+ name="_target-has-llvm-21",
+ when=lambda cfg: BooleanExpression.evaluate(
+ "TBD",
+ cfg.available_features,
+ ),
+ ),
+ Feature(
+ name="_target-has-llvm-20",
+ when=lambda cfg: BooleanExpression.evaluate(
+ "_target-has-llvm-21 || target={{.+}}-apple-macosx{{26.[0-9](.\d+)?}}",
+ cfg.available_features,
+ ),
+ ),
+ Feature(
+ name="_target-has-llvm-19",
+ when=lambda cfg: BooleanExpression.evaluate(
+ "_target-has-llvm-20 || target={{.+}}-apple-macosx{{15.[4-9](.\d+)?}}",
+ cfg.available_features,
+ ),
+ ),
+ Feature(
name="_target-has-llvm-18",
when=lambda cfg: BooleanExpression.evaluate(
- "target={{.+}}-apple-macosx{{15(.[0-9]+)?(.[0-9]+)?}}",
+ "_target-has-llvm-19 || target={{.+}}-apple-macosx{{15.[0-3](.\d+)?}}",
cfg.available_features,
),
),
Feature(
name="_target-has-llvm-17",
when=lambda cfg: BooleanExpression.evaluate(
- "_target-has-llvm-18 || target={{.+}}-apple-macosx{{14.[4-9](.[0-9]+)?}} || target={{.+}}-apple-macosx{{1[5-9]([.].+)?}}",
+ "_target-has-llvm-18 || target={{.+}}-apple-macosx{{14.[4-9](.\d+)?}}",
cfg.available_features,
),
),
@@ -821,7 +849,7 @@ DEFAULT_FEATURES += [
# a libc++ flavor that enables availability markup. Similarly, a test could fail when
# run against the system library of an older version of FreeBSD, even though FreeBSD
# doesn't provide availability markup at the time of writing this.
-for version in ("12", "13", "14", "15", "16", "17", "18", "19", "20"):
+for version in ("12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22"):
DEFAULT_FEATURES.append(
Feature(
name="using-built-library-before-llvm-{}".format(version),
diff --git a/libcxxabi/src/demangle/Utility.h b/libcxxabi/src/demangle/Utility.h
index 8829f3f..76243f5 100644
--- a/libcxxabi/src/demangle/Utility.h
+++ b/libcxxabi/src/demangle/Utility.h
@@ -81,7 +81,7 @@ public:
OutputBuffer(const OutputBuffer &) = delete;
OutputBuffer &operator=(const OutputBuffer &) = delete;
- virtual ~OutputBuffer() {}
+ virtual ~OutputBuffer() = default;
operator std::string_view() const {
return std::string_view(Buffer, CurrentPosition);
diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp
index 858347b..6790d70 100644
--- a/libcxxabi/test/test_demangle.pass.cpp
+++ b/libcxxabi/test/test_demangle.pass.cpp
@@ -13,6 +13,10 @@
// dd8b266ef.
// UNSUPPORTED: using-built-library-before-llvm-20
+// This test exercises support for BitInt demangling introduced in
+// 20f56d140909a01c74e9981835373eaab6021af9.
+// UNSUPPORTED: using-built-library-before-llvm-21
+
// XFAIL: win32-broken-printf-a-precision
#include "support/timer.h"
diff --git a/libcxxabi/test/uncaught_exception.pass.cpp b/libcxxabi/test/uncaught_exception.pass.cpp
index e977320..cace88a 100644
--- a/libcxxabi/test/uncaught_exception.pass.cpp
+++ b/libcxxabi/test/uncaught_exception.pass.cpp
@@ -15,8 +15,7 @@
// to undefined symbols when linking against a libc++ that re-exports the symbols,
// but running against a libc++ that doesn't. Fortunately, usage of __cxa_uncaught_exception()
// in the wild seems to be close to non-existent.
-// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added
-// XFAIL: using-built-library-before-llvm-19 && !darwin
+// XFAIL: using-built-library-before-llvm-19
#include <cxxabi.h>
#include <cassert>
diff --git a/lld/docs/ld.lld.1 b/lld/docs/ld.lld.1
index bb1a53a..cfdde0a 100644
--- a/lld/docs/ld.lld.1
+++ b/lld/docs/ld.lld.1
@@ -719,6 +719,19 @@ a given pattern are handled as if they were given as arguments of
Creates a separate output section for every orphan input section.
.It Fl -unresolved-symbols Ns = Ns Ar value
Determine how to handle unresolved symbols.
+.Ar value
+may be:
+.Pp
+.Bl -tag -width 2n -compact
+.It Cm report-all
+Report unresolved symbols (default).
+.It Cm ignore-in-object-files
+Only report unresolved symbols contained in shared libraries.
+.It Cm ignore-in-shared-libs
+Only report unresolved symbols contained in object files.
+.It Cm ignore-all
+Do not report unresolved symbols.
+.El
.It Fl -use-android-relr-tags
Use SHT_ANDROID_RELR / DT_ANDROID_RELR* tags instead of SHT_RELR / DT_RELR*.
.It Fl v , Fl V
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
index 49841e7..e06e69f 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -2735,9 +2735,8 @@ static void ApplyELF64ABS64Relocation(Symtab *symtab, ELFRelocation &rel,
// ObjectFileELF creates a WritableDataBuffer in CreateInstance.
WritableDataBuffer *data_buffer =
llvm::cast<WritableDataBuffer>(data_buffer_sp.get());
- uint64_t *dst = reinterpret_cast<uint64_t *>(
- data_buffer->GetBytes() + rel_section->GetFileOffset() +
- ELFRelocation::RelocOffset64(rel));
+ void *const dst = data_buffer->GetBytes() + rel_section->GetFileOffset() +
+ ELFRelocation::RelocOffset64(rel);
uint64_t val_offset = value + ELFRelocation::RelocAddend64(rel);
memcpy(dst, &val_offset, sizeof(uint64_t));
}
@@ -2762,9 +2761,8 @@ static void ApplyELF64ABS32Relocation(Symtab *symtab, ELFRelocation &rel,
// ObjectFileELF creates a WritableDataBuffer in CreateInstance.
WritableDataBuffer *data_buffer =
llvm::cast<WritableDataBuffer>(data_buffer_sp.get());
- uint32_t *dst = reinterpret_cast<uint32_t *>(
- data_buffer->GetBytes() + rel_section->GetFileOffset() +
- ELFRelocation::RelocOffset32(rel));
+ void *const dst = data_buffer->GetBytes() + rel_section->GetFileOffset() +
+ ELFRelocation::RelocOffset32(rel);
memcpy(dst, &truncated_addr, sizeof(uint32_t));
}
}
diff --git a/llvm/docs/MIRLangRef.rst b/llvm/docs/MIRLangRef.rst
index 3f4c3cd..f7647c8 100644
--- a/llvm/docs/MIRLangRef.rst
+++ b/llvm/docs/MIRLangRef.rst
@@ -86,25 +86,25 @@ Tests are more accessible and future proof when simplified:
- Use the ``-simplify-mir`` option with llc.
- Machine function attributes often have default values or the test works just
- as well with default values. Typical candidates for this are: `alignment:`,
- `exposesReturnsTwice`, `legalized`, `regBankSelected`, `selected`.
+ as well with default values. Typical candidates for this are: ``alignment:``,
+ ``exposesReturnsTwice``, ``legalized``, ``regBankSelected``, ``selected``.
The whole `frameInfo` section is often unnecessary if there is no special
- frame usage in the function. `tracksRegLiveness` on the other hand is often
+ frame usage in the function. ``tracksRegLiveness`` on the other hand is often
necessary for some passes that care about block livein lists.
-- The (global) `liveins:` list is typically only interesting for early
+- The (global) ``liveins:`` list is typically only interesting for early
instruction selection passes and can be removed when testing later passes.
- The per-block `liveins:` on the other hand are necessary if
+ The per-block ``liveins:`` on the other hand are necessary if
`tracksRegLiveness` is true.
-- Branch probability data in block `successors:` lists can be dropped if the
+- Branch probability data in block ``successors:`` lists can be dropped if the
test doesn't depend on it. Example:
- `successors: %bb.1(0x40000000), %bb.2(0x40000000)` can be replaced with
- `successors: %bb.1, %bb.2`.
+ ``successors: %bb.1(0x40000000), %bb.2(0x40000000)`` can be replaced with
+ ``successors: %bb.1, %bb.2``.
- MIR code contains a whole IR module. This is necessary because there are
no equivalents in MIR for global variables, references to external functions,
- function attributes, metadata, debug info. Instead some MIR data references
+ function attributes, metadata, debug info. Instead, some MIR data references
the IR constructs. You can often remove them if the test doesn't depend on
them.
@@ -114,16 +114,16 @@ Tests are more accessible and future proof when simplified:
dropped: `:: (load 8)`
- MIR blocks can reference IR blocks for debug printing, profile information,
- or debug locations. Example: `bb.42.myblock` in MIR references the IR block
- `myblock`. It is usually possible to drop the `.myblock` reference and simply
- use `bb.42`.
+ or debug locations. Example: ``bb.42.myblock`` in MIR references the IR block
+ ``myblock``. It is usually possible to drop the ``.myblock`` reference and simply
+ use ``bb.42``.
- If there are no memory operands or blocks referencing the IR, then the
IR function can be replaced by a parameterless dummy function like
- `define @func() { ret void }`.
+ ``define @func() { ret void }``.
- It is possible to drop the whole IR section of the MIR file if it only
- contains dummy functions (see above). The .mir loader will create the
+ contains dummy functions (see above). The ``.mir`` loader will create the
IR functions automatically in this case.
.. _limitations:
@@ -131,7 +131,7 @@ Tests are more accessible and future proof when simplified:
Limitations
-----------
-Currently the MIR format has several limitations in terms of which state it
+Currently, the MIR format has several limitations in terms of which state it
can serialize:
- The target-specific state in the target-specific ``MachineFunctionInfo``
@@ -150,7 +150,7 @@ These limitations impose restrictions on what you can test with the MIR format.
For now, tests that would like to test some behaviour that depends on the state
of temporary or local ``MCSymbol`` operands or the exception handling state in
MMI, can't use the MIR format. As well as that, tests that test some behaviour
-that depends on the state of the target specific ``MachineFunctionInfo`` or
+that depends on the state of the target-specific ``MachineFunctionInfo`` or
``MachineConstantPoolValue`` subclasses can't use the MIR format at the moment.
High Level Structure
@@ -286,7 +286,7 @@ Example:
Successors
^^^^^^^^^^
-The machine basic block's successors have to be specified before any of the
+The machine basic block's successors must be specified before any of the
instructions:
.. code-block:: text
@@ -489,13 +489,13 @@ In case this is true, the Machine Operand is printed according to the target.
For example:
-In AArch64RegisterInfo.td:
+In ``AArch64RegisterInfo.td``:
.. code-block:: text
def sub_32 : SubRegIndex<32>;
-If the third operand is an immediate with the value ``15`` (target-dependent
+If the third operand is an immediate with the value ``15`` (a target-dependent
value), based on the instruction's opcode and the operand's index the operand
will be printed as ``%subreg.sub_32``:
@@ -503,7 +503,7 @@ will be printed as ``%subreg.sub_32``:
%1:gpr64 = SUBREG_TO_REG 0, %0, %subreg.sub_32
-For integers > 64 bits, we use a special machine operand, ``MO_CImmediate``,
+For integers larger than 64 bits, we use a special machine operand, ``MO_CImmediate``,
which stores the immediate in a ``ConstantInt`` using an ``APInt`` (LLVM's
arbitrary-precision integers).
@@ -552,7 +552,7 @@ corresponding internal ``llvm::RegState`` representation:
* - ``implicit``
- ``RegState::Implicit``
- - Not emitted register (e.g. carry, or temporary result).
+ - Not emitted register (e.g., carry, or temporary result).
* - ``implicit-def``
- ``RegState::ImplicitDefine``
@@ -625,7 +625,7 @@ For a CPI with the index 0 and offset -12:
%1:gr64 = MOV64ri %const.0 - 12
-A constant pool entry is bound to a LLVM IR ``Constant`` or a target-specific
+A constant pool entry is bound to an LLVM IR ``Constant`` or a target-specific
``MachineConstantPoolValue``. When serializing all the function's constants, the
following format is used:
@@ -670,12 +670,12 @@ a global value operand named ``G``:
$rax = MOV64rm $rip, 1, _, @G, _
-The named global values are represented using an identifier with the '@' prefix.
+The named global values are represented using an identifier with the ``@`` prefix.
If the identifier doesn't match the regular expression
-`[-a-zA-Z$._][-a-zA-Z$._0-9]*`, then this identifier must be quoted.
+``[-a-zA-Z$._][-a-zA-Z$._0-9]*``, then this identifier must be quoted.
The unnamed global values are represented using an unsigned numeric value with
-the '@' prefix, like in the following examples: ``@0``, ``@989``.
+the ``@`` prefix, as in the following examples: ``@0``, ``@989``.
Target-dependent Index Operands
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -741,7 +741,7 @@ Example:
MCSymbol Operands
^^^^^^^^^^^^^^^^^
-A MCSymbol operand holds a pointer to a ``MCSymbol``. For the limitations
+An ``MCSymbol`` operand holds a pointer to an ``MCSymbol``. For the limitations
of this operand in MIR, see :ref:`limitations <limitations>`.
The syntax is:
@@ -825,7 +825,7 @@ Comments
^^^^^^^^
Machine operands can have C/C++ style comments, which are annotations enclosed
-between ``/*`` and ``*/`` to improve readability of e.g. immediate operands.
+between ``/*`` and ``*/`` to improve readability of e.g., immediate operands.
In the example below, ARM instructions EOR and BCC and immediate operands
``14`` and ``0`` have been annotated with their condition codes (CC)
definitions, i.e. the ``always`` and ``eq`` condition codes:
@@ -920,7 +920,7 @@ Instruction referencing locations
This experimental feature aims to separate the specification of variable
*values* from the program point where a variable takes on that value. Changes
-in variable value occur in the same manner as ``DBG_VALUE`` meta instructions
+in a variable value occur in the same manner as ``DBG_VALUE`` meta instructions
but using ``DBG_INSTR_REF``. Variable values are identified by a pair of
instruction number and operand number. Consider the example below:
diff --git a/llvm/docs/ProgrammersManual.rst b/llvm/docs/ProgrammersManual.rst
index 7b7a1ce..270a635 100644
--- a/llvm/docs/ProgrammersManual.rst
+++ b/llvm/docs/ProgrammersManual.rst
@@ -113,7 +113,7 @@ rarely have to include this file directly).
``isa<>``:
The ``isa<>`` operator works exactly like the Java "``instanceof``" operator.
- It returns true or false depending on whether a reference or pointer points to
+ It returns ``true`` or ``false`` depending on whether a reference or pointer points to
an instance of the specified class. This can be very useful for constraint
checking of various sorts (example below).
@@ -167,7 +167,7 @@ rarely have to include this file directly).
``isa_and_present<>``:
The ``isa_and_present<>`` operator works just like the ``isa<>`` operator,
except that it allows for a null pointer as an argument (which it then
- returns false). This can sometimes be useful, allowing you to combine several
+ returns ``false``). This can sometimes be useful, allowing you to combine several
null checks into one.
``cast_if_present<>``:
@@ -402,7 +402,7 @@ doxygen documentation or by looking at the unit test suite.
Error handling
--------------
-Proper error handling helps us identify bugs in our code, and helps end-users
+Proper error handling helps us identify bugs in our code, and helps end users
understand errors in their tool usage. Errors fall into two broad categories:
*programmatic* and *recoverable*, with different strategies for handling and
reporting.
@@ -449,10 +449,10 @@ violations even in builds that do not enable assertions:
Recoverable Errors
^^^^^^^^^^^^^^^^^^
-Recoverable errors represent an error in the program's environment, for example
+Recoverable errors represent an error in the program's environment, for example,
a resource failure (a missing file, a dropped network connection, etc.), or
malformed input. These errors should be detected and communicated to a level of
-the program where they can be handled appropriately. Handling the error may be
+the program that can handle them appropriately. Handling the error may be
as simple as reporting the issue to the user, or it may involve attempts at
recovery.
@@ -668,7 +668,7 @@ Since the list of handlers passed to ``handleErrors`` may not cover every error
type that can occur, the ``handleErrors`` function also returns an Error value
that must be checked or propagated. If the error value that is passed to
``handleErrors`` does not match any of the handlers it will be returned from
-handleErrors. Idiomatic use of ``handleErrors`` thus looks like:
+``handleErrors``. Idiomatic use of ``handleErrors`` thus looks like:
.. code-block:: c++
@@ -683,18 +683,18 @@ handleErrors. Idiomatic use of ``handleErrors`` thus looks like:
}))
return Err;
-In cases where you truly know that the handler list is exhaustive the
+In cases where you truly know that the handler list is exhaustive, the
``handleAllErrors`` function can be used instead. This is identical to
``handleErrors`` except that it will terminate the program if an unhandled
error is passed in, and can therefore return void. The ``handleAllErrors``
function should generally be avoided: the introduction of a new error type
elsewhere in the program can easily turn a formerly exhaustive list of errors
into a non-exhaustive list, risking unexpected program termination. Where
-possible, use handleErrors and propagate unknown errors up the stack instead.
+possible, use ``handleErrors`` and propagate unknown errors up the stack instead.
For tool code, where errors can be handled by printing an error message then
exiting with an error code, the :ref:`ExitOnError <err_exitonerr>` utility
-may be a better choice than handleErrors, as it simplifies control flow when
+may be a better choice than ``handleErrors``, as it simplifies control flow when
calling fallible functions.
In situations where it is known that a particular call to a fallible function
@@ -706,9 +706,9 @@ simplifying control flow.
StringError
"""""""""""
-Many kinds of errors have no recovery strategy, the only action that can be
+Many kinds of errors have no recovery strategy; the only action that can be
taken is to report them to the user so that the user can attempt to fix the
-environment. In this case representing the error as a string makes perfect
+environment. In this case, representing the error as a string makes perfect
sense. LLVM provides the ``StringError`` class for this purpose. It takes two
arguments: A string error message, and an equivalent ``std::error_code`` for
interoperability. It also provides a ``createStringError`` function to simplify
@@ -721,7 +721,7 @@ common usage of this class:
createStringError(errc::executable_format_error, "Bad executable");
If you're certain that the error you're building will never need to be converted
-to a ``std::error_code`` you can use the ``inconvertibleErrorCode()`` function:
+to a ``std::error_code``, you can use the ``inconvertibleErrorCode()`` function:
.. code-block:: c++
@@ -791,18 +791,18 @@ actually recognises three different forms of handler signature:
Error(std::unique_ptr<UserDefinedError> E);
Any error returned from a handler will be returned from the ``handleErrors``
-function so that it can be handled itself, or propagated up the stack.
+function so that it can be handled itself or propagated up the stack.
.. _err_exitonerr:
Using ExitOnError to simplify tool code
"""""""""""""""""""""""""""""""""""""""
-Library code should never call ``exit`` for a recoverable error, however in tool
+Library code should never call ``exit`` for a recoverable error; however, in tool
code (especially command line tools) this can be a reasonable approach. Calling
``exit`` upon encountering an error dramatically simplifies control flow as the
error no longer needs to be propagated up the stack. This allows code to be
-written in straight-line style, as long as each fallible call is wrapped in a
+written in a straight-line style, as long as each fallible call is wrapped in a
check and call to exit. The ``ExitOnError`` class supports this pattern by
providing call operators that inspect ``Error`` values, stripping the error away
in the success case and logging to ``stderr`` then exiting in the failure case.
@@ -827,7 +827,7 @@ turning them into non-failing calls:
}
On failure, the error's log message will be written to ``stderr``, optionally
-preceded by a string "banner" that can be set by calling the setBanner method. A
+preceded by a string "banner" that can be set by calling the ``setBanner`` method. A
mapping can also be supplied from ``Error`` values to exit codes using the
``setExitCodeMapper`` method:
@@ -854,8 +854,8 @@ Some functions may only fail for a subset of their inputs, so calls using known
safe inputs can be assumed to succeed.
The cantFail functions encapsulate this by wrapping an assertion that their
-argument is a success value and, in the case of Expected<T>, unwrapping the
-T value:
+argument is a success value and, in the case of ``Expected<T>``, unwrapping the
+``T`` value:
.. code-block:: c++
@@ -868,16 +868,16 @@ T value:
...
}
-Like the ExitOnError utility, cantFail simplifies control flow. Their treatment
+Like the ExitOnError utility, ``cantFail`` simplifies control flow. Their treatment
of error cases is very different, however: Where ExitOnError is guaranteed to
-terminate the program on an error input, cantFail simply asserts that the result
+terminate the program on an error input, ``cantFail`` simply asserts that the result
is success. In debug builds this will result in an assertion failure if an error
-is encountered. In release builds, the behavior of cantFail for failure values is
-undefined. As such, care must be taken in the use of cantFail: clients must be
-certain that a cantFail wrapped call really can not fail with the given
+is encountered. In release builds, the behavior of ``cantFail`` for failure values is
+undefined. As such, care must be taken in the use of ``cantFail``: clients must be
+certain that a ``cantFail`` wrapped call really can not fail with the given
arguments.
-Use of the cantFail functions should be rare in library code, but they are
+Use of the ``cantFail`` functions should be rare in library code, but they are
likely to be of more use in tool and unit-test code where inputs and/or
mocked-up classes or functions may be known to be safe.
@@ -979,7 +979,7 @@ completing the walk over the archive they could use the ``joinErrors`` utility:
}
The ``joinErrors`` routine builds a special error type called ``ErrorList``,
-which holds a list of user defined errors. The ``handleErrors`` routine
+which holds a list of user-defined errors. The ``handleErrors`` routine
recognizes this type and will attempt to handle each of the contained errors in
order. If all contained errors can be handled, ``handleErrors`` will return
``Error::success()``; otherwise, ``handleErrors`` will concatenate the remaining
@@ -1146,7 +1146,7 @@ be passed by value.
The ``LDBG`` and ``LLVM_DEBUG()`` macros and ``-debug`` option
--------------------------------------------------------------
-Often when working on your pass you will put a bunch of debugging printouts and
+Often, when working on your pass, you will put a bunch of debugging printouts and
other code into your pass. After you get it working, you want to remove it, but
you may need it again in the future (to work out new bugs that you run across).
@@ -1183,7 +1183,7 @@ The debug output can be enabled by passing the ``-debug`` command line argument.
$ opt < a.bc > /dev/null -mypass -debug
[my-pass MyPass.cpp:123 2] I am here!
-While `LDBG()` is useful to add debug output to your code, there are cases
+While ``LDBG()`` is useful to add debug output to your code, there are cases
where you may need to guard a block of code with a debug check. The
``llvm/Support/Debug.h`` (`doxygen
<https://llvm.org/doxygen/Debug_8h_source.html>`__) file provides a macro named
@@ -1220,7 +1220,7 @@ with ``-debug``.
Fine grained debug info with ``DEBUG_TYPE`` and the ``-debug-only`` option
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-Sometimes you may find yourself in a situation where enabling ``-debug`` just
+Sometimes, you may find yourself in a situation where enabling ``-debug`` just
turns on **too much** information (such as when working on the code generator).
If you want to enable debug information with more fine-grained control, you
can control the debug type and level with associate with each logging statement
@@ -1389,7 +1389,7 @@ maintainable and useful.
Adding debug counters to aid in debugging your code
---------------------------------------------------
-Sometimes, when writing new passes, or trying to track down bugs, it
+Sometimes, when writing new passes or trying to track down bugs, it
is useful to be able to control whether certain things in your pass
happen or not. For example, there are times the minimization tooling
can only easily give you large testcases. You would like to narrow
@@ -1729,17 +1729,17 @@ page and one extra indirection when accessing elements with their positional
index.
In order to minimise the memory footprint of this container, it's important to
-balance the ``PageSize`` so that it's not too small (otherwise the overhead of the
-pointer per page might become too high) and not too big (otherwise the memory
+balance the ``PageSize`` so that it's not too small (otherwise, the overhead of the
+pointer per page might become too high) and not too big (otherwise, the memory
is wasted if the page is not fully used).
Moreover, while retaining the order of the elements based on their insertion
index, like a vector, iterating over the elements via ``begin()`` and ``end()``
-is not provided in the API, due to the fact accessing the elements in order
+is not provided in the API, due to the fact that accessing the elements in order
would allocate all the iterated pages, defeating memory savings and the purpose
of the ``PagedVector``.
-Finally a ``materialized_begin()`` and ``materialized_end`` iterators are
+Finally, ``materialized_begin()`` and ``materialized_end`` iterators are
provided to access the elements associated to the accessed pages, which could
speed up operations that need to iterate over initialized elements in a
non-ordered manner.
@@ -1782,9 +1782,9 @@ loop.
^^^^^^^
``std::deque`` is, in some senses, a generalized version of ``std::vector``.
-Like ``std::vector``, it provides constant time random access and other similar
+Like ``std::vector``, it provides constant-time random access and other similar
properties, but it also provides efficient access to the front of the list. It
-does not guarantee continuity of elements within memory.
+does not guarantee the continuity of elements within memory.
In exchange for this extra flexibility, ``std::deque`` has significantly higher
constant factor costs than ``std::vector``. If possible, use ``std::vector`` or
@@ -1843,7 +1843,7 @@ Related classes of interest are explained in the following subsections:
llvm/ADT/PackedVector.h
^^^^^^^^^^^^^^^^^^^^^^^
-Useful for storing a vector of values using only a few number of bits for each
+Useful for storing a vector of values using only a few bits for each
value. Apart from the standard operations of a vector-like container, it can
also perform an 'or' set operation.
@@ -1901,13 +1901,13 @@ non-empty ``ilist``\ s.
The only sensible solution to this problem is to allocate a so-called *sentinel*
along with the intrusive list, which serves as the ``end`` iterator, providing
-the back-link to the last element. However conforming to the C++ convention it
+the back-link to the last element. However, conforming to the C++ convention it
is illegal to ``operator++`` beyond the sentinel and it also must not be
dereferenced.
These constraints allow for some implementation freedom to the ``ilist`` how to
allocate and store the sentinel. The corresponding policy is dictated by
-``ilist_traits<T>``. By default a ``T`` gets heap-allocated whenever the need
+``ilist_traits<T>``. By default, a ``T`` gets heap-allocated whenever the need
for a sentinel arises.
While the default policy is sufficient in most cases, it may break down when
@@ -1941,7 +1941,7 @@ String-like containers
There are a variety of ways to pass around and use strings in C and C++, and
LLVM adds a few new options to choose from. Pick the first option on this list
-that will do what you need, they are ordered according to their relative cost.
+that will do what you need; they are ordered according to their relative cost.
Note that it is generally preferred to *not* pass strings around as ``const
char*``'s. These have a number of problems, including the fact that they
@@ -1973,12 +1973,12 @@ either because they are C string literals, ``std::string``, a C array, or a
``StringRef`` has a few major limitations which make more powerful string containers
useful:
-#. You cannot directly convert a ``StringRef`` to a 'const char*' because there is
+#. You cannot directly convert a ``StringRef`` to a ``const char*`` because there is
no way to add a trailing nul (unlike the ``.c_str()`` method on various stronger
classes).
#. ``StringRef`` doesn't own or keep alive the underlying string bytes.
- As such it can easily lead to dangling pointers, and is not suitable for
+ As such, it can easily lead to dangling pointers, and is not suitable for
embedding in datastructures in most cases (instead, use an ``std::string`` or
something like that).
diff --git a/llvm/examples/Kaleidoscope/Chapter9/toy.cpp b/llvm/examples/Kaleidoscope/Chapter9/toy.cpp
index 51457a3..14081fb 100644
--- a/llvm/examples/Kaleidoscope/Chapter9/toy.cpp
+++ b/llvm/examples/Kaleidoscope/Chapter9/toy.cpp
@@ -203,7 +203,7 @@ class ExprAST {
public:
ExprAST(SourceLocation Loc = CurLoc) : Loc(Loc) {}
- virtual ~ExprAST() {}
+ virtual ~ExprAST() = default;
virtual Value *codegen() = 0;
int getLine() const { return Loc.Line; }
int getCol() const { return Loc.Col; }
diff --git a/llvm/examples/OptSubcommand/llvm-hello-sub.cpp b/llvm/examples/OptSubcommand/llvm-hello-sub.cpp
index 8071f56..bcf433f 100644
--- a/llvm/examples/OptSubcommand/llvm-hello-sub.cpp
+++ b/llvm/examples/OptSubcommand/llvm-hello-sub.cpp
@@ -46,7 +46,7 @@ public:
HelloSubOptTable()
: GenericOptTable(OptionStrTable, OptionPrefixesTable, InfoTable,
/*IgnoreCase=*/false, OptionSubCommands,
- OptionSubCommandIDsTable) {}
+ OptionSubCommandIDsTable) {};
};
} // namespace
diff --git a/llvm/include/llvm/ADT/APFloat.h b/llvm/include/llvm/ADT/APFloat.h
index bccdb89..82ac9a3 100644
--- a/llvm/include/llvm/ADT/APFloat.h
+++ b/llvm/include/llvm/ADT/APFloat.h
@@ -152,7 +152,7 @@ public:
static constexpr unsigned integerPartWidth = APInt::APINT_BITS_PER_WORD;
/// A signed type to represent a floating point numbers unbiased exponent.
- typedef int32_t ExponentType;
+ using ExponentType = int32_t;
/// \name Floating Point Semantics.
/// @{
@@ -938,8 +938,8 @@ LLVM_ABI DoubleAPFloat frexp(const DoubleAPFloat &X, int &Exp, roundingMode);
// This is a interface class that is currently forwarding functionalities from
// detail::IEEEFloat.
class APFloat : public APFloatBase {
- typedef detail::IEEEFloat IEEEFloat;
- typedef detail::DoubleAPFloat DoubleAPFloat;
+ using IEEEFloat = detail::IEEEFloat;
+ using DoubleAPFloat = detail::DoubleAPFloat;
static_assert(std::is_standard_layout<IEEEFloat>::value);
diff --git a/llvm/include/llvm/ADT/APInt.h b/llvm/include/llvm/ADT/APInt.h
index 9fa98ad..26283d2 100644
--- a/llvm/include/llvm/ADT/APInt.h
+++ b/llvm/include/llvm/ADT/APInt.h
@@ -77,7 +77,7 @@ inline APInt operator-(APInt);
///
class [[nodiscard]] APInt {
public:
- typedef uint64_t WordType;
+ using WordType = uint64_t;
/// Byte size of a word.
static constexpr unsigned APINT_WORD_SIZE = sizeof(WordType);
diff --git a/llvm/include/llvm/ADT/BitVector.h b/llvm/include/llvm/ADT/BitVector.h
index 9e81a4b..cc3f3a9 100644
--- a/llvm/include/llvm/ADT/BitVector.h
+++ b/llvm/include/llvm/ADT/BitVector.h
@@ -99,7 +99,7 @@ public:
};
class BitVector {
- typedef uintptr_t BitWord;
+ using BitWord = uintptr_t;
enum { BITWORD_SIZE = (unsigned)sizeof(BitWord) * CHAR_BIT };
@@ -147,8 +147,8 @@ public:
}
};
- typedef const_set_bits_iterator_impl<BitVector> const_set_bits_iterator;
- typedef const_set_bits_iterator set_iterator;
+ using const_set_bits_iterator = const_set_bits_iterator_impl<BitVector>;
+ using set_iterator = const_set_bits_iterator;
const_set_bits_iterator set_bits_begin() const {
return const_set_bits_iterator(*this);
diff --git a/llvm/include/llvm/ADT/GenericSSAContext.h b/llvm/include/llvm/ADT/GenericSSAContext.h
index e9f99ba..426a083 100644
--- a/llvm/include/llvm/ADT/GenericSSAContext.h
+++ b/llvm/include/llvm/ADT/GenericSSAContext.h
@@ -25,7 +25,7 @@ template <typename, bool> class DominatorTreeBase;
template <typename> class SmallVectorImpl;
namespace Intrinsic {
-typedef unsigned ID;
+using ID = unsigned;
}
// Specializations of this template should provide the types used by the
diff --git a/llvm/include/llvm/ADT/STLExtras.h b/llvm/include/llvm/ADT/STLExtras.h
index a9841c6..8de8eb5 100644
--- a/llvm/include/llvm/ADT/STLExtras.h
+++ b/llvm/include/llvm/ADT/STLExtras.h
@@ -1516,8 +1516,8 @@ template <class Iterator, class RNG>
void shuffle(Iterator first, Iterator last, RNG &&g) {
// It would be better to use a std::uniform_int_distribution,
// but that would be stdlib dependent.
- typedef
- typename std::iterator_traits<Iterator>::difference_type difference_type;
+ using difference_type =
+ typename std::iterator_traits<Iterator>::difference_type;
for (auto size = last - first; size > 1; ++first, (void)--size) {
difference_type offset = g() % size;
// Avoid self-assignment due to incorrect assertions in libstdc++
diff --git a/llvm/include/llvm/ADT/StringSwitch.h b/llvm/include/llvm/ADT/StringSwitch.h
index 4868153..53ebec1 100644
--- a/llvm/include/llvm/ADT/StringSwitch.h
+++ b/llvm/include/llvm/ADT/StringSwitch.h
@@ -14,7 +14,6 @@
#define LLVM_ADT_STRINGSWITCH_H
#include "llvm/ADT/StringRef.h"
-#include "llvm/Support/Compiler.h"
#include "llvm/Support/ErrorHandling.h"
#include <cassert>
#include <cstring>
@@ -42,6 +41,8 @@ namespace llvm {
/// .Cases({"violet", "purple"}, Violet)
/// .Default(UnknownColor);
/// \endcode
+///
+/// When multiple matches are found, the value of the first match is returned.
template<typename T, typename R = T>
class StringSwitch {
/// The string we are matching.
@@ -64,7 +65,7 @@ public:
void operator=(const StringSwitch &) = delete;
void operator=(StringSwitch &&) = delete;
- // Case-sensitive case matchers
+ // Case-sensitive case matchers.
StringSwitch &Case(StringLiteral S, T Value) {
CaseImpl(S, Value);
return *this;
@@ -89,6 +90,7 @@ public:
return CasesImpl(CaseStrings, Value);
}
+ [[deprecated("Pass cases in std::initializer_list instead")]]
StringSwitch &Cases(StringLiteral S0, StringLiteral S1, T Value) {
return CasesImpl({S0, S1}, Value);
}
@@ -213,23 +215,30 @@ public:
[[nodiscard]] operator R() { return DefaultUnreachable(); }
private:
- // Returns true when `Str` matches the `S` argument, and stores the result.
+ // Returns true when a match is found. If `Str` matches the `S` argument,
+ // stores the result.
bool CaseImpl(StringLiteral S, T &Value) {
- if (!Result && Str == S) {
- Result = std::move(Value);
+ if (Result)
return true;
- }
- return false;
+
+ if (Str != S)
+ return false;
+
+ Result = std::move(Value);
+ return true;
}
- // Returns true when `Str` matches the `S` argument (case-insensitive), and
- // stores the result.
+ // Returns true when a match is found. If `Str` matches the `S` argument
+ // (case-insensitive), stores the result.
bool CaseLowerImpl(StringLiteral S, T &Value) {
- if (!Result && Str.equals_insensitive(S)) {
- Result = std::move(Value);
+ if (Result)
return true;
- }
- return false;
+
+ if (!Str.equals_insensitive(S))
+ return false;
+
+ Result = std::move(Value);
+ return true;
}
StringSwitch &CasesImpl(std::initializer_list<StringLiteral> Cases,
diff --git a/llvm/include/llvm/ADT/ilist.h b/llvm/include/llvm/ADT/ilist.h
index aed19cc..6439290 100644
--- a/llvm/include/llvm/ADT/ilist.h
+++ b/llvm/include/llvm/ADT/ilist.h
@@ -108,21 +108,21 @@ template <typename Ty> struct ilist_traits<const Ty> {};
/// list.
template <class IntrusiveListT, class TraitsT>
class iplist_impl : public TraitsT, IntrusiveListT {
- typedef IntrusiveListT base_list_type;
+ using base_list_type = IntrusiveListT;
public:
- typedef typename base_list_type::pointer pointer;
- typedef typename base_list_type::const_pointer const_pointer;
- typedef typename base_list_type::reference reference;
- typedef typename base_list_type::const_reference const_reference;
- typedef typename base_list_type::value_type value_type;
- typedef typename base_list_type::size_type size_type;
- typedef typename base_list_type::difference_type difference_type;
- typedef typename base_list_type::iterator iterator;
- typedef typename base_list_type::const_iterator const_iterator;
- typedef typename base_list_type::reverse_iterator reverse_iterator;
- typedef
- typename base_list_type::const_reverse_iterator const_reverse_iterator;
+ using pointer = typename base_list_type::pointer;
+ using const_pointer = typename base_list_type::const_pointer;
+ using reference = typename base_list_type::reference;
+ using const_reference = typename base_list_type::const_reference;
+ using value_type = typename base_list_type::value_type;
+ using size_type = typename base_list_type::size_type;
+ using difference_type = typename base_list_type::difference_type;
+ using iterator = typename base_list_type::iterator;
+ using const_iterator = typename base_list_type::const_iterator;
+ using reverse_iterator = typename base_list_type::reverse_iterator;
+ using const_reverse_iterator =
+ typename base_list_type::const_reverse_iterator;
private:
static bool op_less(const_reference L, const_reference R) { return L < R; }
diff --git a/llvm/include/llvm/ADT/ilist_node_options.h b/llvm/include/llvm/ADT/ilist_node_options.h
index 003d5da..53719b0 100644
--- a/llvm/include/llvm/ADT/ilist_node_options.h
+++ b/llvm/include/llvm/ADT/ilist_node_options.h
@@ -58,8 +58,8 @@ namespace ilist_detail {
template <bool IsExplicit> struct explicitness {
static const bool is_explicit = IsExplicit;
};
-typedef explicitness<true> is_explicit;
-typedef explicitness<false> is_implicit;
+using is_explicit = explicitness<true>;
+using is_implicit = explicitness<false>;
/// Check whether an option is valid.
///
@@ -103,12 +103,12 @@ struct is_valid_option<ilist_sentinel_tracking<EnableSentinelTracking>>
template <class... Options> struct extract_tag;
template <class Tag, class... Options>
struct extract_tag<ilist_tag<Tag>, Options...> {
- typedef Tag type;
+ using type = Tag;
};
template <class Option1, class... Options>
struct extract_tag<Option1, Options...> : extract_tag<Options...> {};
template <> struct extract_tag<> {
- typedef void type;
+ using type = void;
};
template <class Tag> struct is_valid_option<ilist_tag<Tag>> : std::true_type {};
@@ -134,11 +134,13 @@ struct is_valid_option<ilist_iterator_bits<IteratorBits>> : std::true_type {};
template <class... Options> struct extract_parent;
template <class ParentTy, class... Options>
struct extract_parent<ilist_parent<ParentTy>, Options...> {
- typedef ParentTy type;
+ using type = ParentTy;
};
template <class Option1, class... Options>
struct extract_parent<Option1, Options...> : extract_parent<Options...> {};
-template <> struct extract_parent<> { typedef void type; };
+template <> struct extract_parent<> {
+ using type = void;
+};
template <class ParentTy>
struct is_valid_option<ilist_parent<ParentTy>> : std::true_type {};
@@ -154,28 +156,27 @@ struct check_options : std::conjunction<is_valid_option<Options>...> {};
template <class T, bool EnableSentinelTracking, bool IsSentinelTrackingExplicit,
class TagT, bool HasIteratorBits, class ParentTy>
struct node_options {
- typedef T value_type;
- typedef T *pointer;
- typedef T &reference;
- typedef const T *const_pointer;
- typedef const T &const_reference;
+ using value_type = T;
+ using pointer = T *;
+ using reference = T &;
+ using const_pointer = const T *;
+ using const_reference = const T &;
static const bool enable_sentinel_tracking = EnableSentinelTracking;
static const bool is_sentinel_tracking_explicit = IsSentinelTrackingExplicit;
static const bool has_iterator_bits = HasIteratorBits;
- typedef TagT tag;
- typedef ParentTy parent_ty;
- typedef ilist_node_base<enable_sentinel_tracking, parent_ty> node_base_type;
- typedef ilist_base<enable_sentinel_tracking, parent_ty> list_base_type;
+ using tag = TagT;
+ using parent_ty = ParentTy;
+ using node_base_type = ilist_node_base<enable_sentinel_tracking, parent_ty>;
+ using list_base_type = ilist_base<enable_sentinel_tracking, parent_ty>;
};
template <class T, class... Options> struct compute_node_options {
- typedef node_options<T, extract_sentinel_tracking<Options...>::value,
- extract_sentinel_tracking<Options...>::is_explicit,
- typename extract_tag<Options...>::type,
- extract_iterator_bits<Options...>::value,
- typename extract_parent<Options...>::type>
- type;
+ using type = node_options<T, extract_sentinel_tracking<Options...>::value,
+ extract_sentinel_tracking<Options...>::is_explicit,
+ typename extract_tag<Options...>::type,
+ extract_iterator_bits<Options...>::value,
+ typename extract_parent<Options...>::type>;
};
} // end namespace ilist_detail
diff --git a/llvm/include/llvm/Analysis/AliasAnalysis.h b/llvm/include/llvm/Analysis/AliasAnalysis.h
index 1681079..878b7e7 100644
--- a/llvm/include/llvm/Analysis/AliasAnalysis.h
+++ b/llvm/include/llvm/Analysis/AliasAnalysis.h
@@ -861,7 +861,7 @@ protected:
// Provide all the copy and move constructors so that derived types aren't
// constrained.
- AAResultBase(const AAResultBase &Arg) {}
+ AAResultBase(const AAResultBase &Arg) = default;
AAResultBase(AAResultBase &&Arg) {}
public:
diff --git a/llvm/include/llvm/Analysis/ConstantFolding.h b/llvm/include/llvm/Analysis/ConstantFolding.h
index 5f91f97..ea22ed4 100644
--- a/llvm/include/llvm/Analysis/ConstantFolding.h
+++ b/llvm/include/llvm/Analysis/ConstantFolding.h
@@ -119,12 +119,6 @@ ConstantFoldFPInstOperands(unsigned Opcode, Constant *LHS, Constant *RHS,
LLVM_ABI Constant *FlushFPConstant(Constant *Operand, const Instruction *I,
bool IsOutput);
-/// Attempt to constant fold a select instruction with the specified
-/// operands. The constant result is returned if successful; if not, null is
-/// returned.
-LLVM_ABI Constant *ConstantFoldSelectInstruction(Constant *Cond, Constant *V1,
- Constant *V2);
-
/// Attempt to constant fold a cast with the specified operand. If it
/// fails, it returns a constant expression of the specified operand.
LLVM_ABI Constant *ConstantFoldCastOperand(unsigned Opcode, Constant *C,
@@ -135,40 +129,6 @@ LLVM_ABI Constant *ConstantFoldCastOperand(unsigned Opcode, Constant *C,
LLVM_ABI Constant *ConstantFoldIntegerCast(Constant *C, Type *DestTy,
bool IsSigned, const DataLayout &DL);
-/// ConstantFoldInsertValueInstruction - Attempt to constant fold an insertvalue
-/// instruction with the specified operands and indices. The constant result is
-/// returned if successful; if not, null is returned.
-LLVM_ABI Constant *ConstantFoldInsertValueInstruction(Constant *Agg,
- Constant *Val,
- ArrayRef<unsigned> Idxs);
-
-/// Attempt to constant fold an extractvalue instruction with the
-/// specified operands and indices. The constant result is returned if
-/// successful; if not, null is returned.
-LLVM_ABI Constant *ConstantFoldExtractValueInstruction(Constant *Agg,
- ArrayRef<unsigned> Idxs);
-
-/// Attempt to constant fold an insertelement instruction with the
-/// specified operands and indices. The constant result is returned if
-/// successful; if not, null is returned.
-LLVM_ABI Constant *ConstantFoldInsertElementInstruction(Constant *Val,
- Constant *Elt,
- Constant *Idx);
-
-/// Attempt to constant fold an extractelement instruction with the
-/// specified operands and indices. The constant result is returned if
-/// successful; if not, null is returned.
-LLVM_ABI Constant *ConstantFoldExtractElementInstruction(Constant *Val,
- Constant *Idx);
-
-/// Attempt to constant fold a shufflevector instruction with the
-/// specified operands and mask. See class ShuffleVectorInst for a description
-/// of the mask representation. The constant result is returned if successful;
-/// if not, null is returned.
-LLVM_ABI Constant *ConstantFoldShuffleVectorInstruction(Constant *V1,
- Constant *V2,
- ArrayRef<int> Mask);
-
/// Extract value of C at the given Offset reinterpreted as Ty. If bits past
/// the end of C are accessed, they are assumed to be poison.
LLVM_ABI Constant *ConstantFoldLoadFromConst(Constant *C, Type *Ty,
diff --git a/llvm/include/llvm/Analysis/ConstraintSystem.h b/llvm/include/llvm/Analysis/ConstraintSystem.h
index 307ad50..1d9ac49 100644
--- a/llvm/include/llvm/Analysis/ConstraintSystem.h
+++ b/llvm/include/llvm/Analysis/ConstraintSystem.h
@@ -64,7 +64,7 @@ class ConstraintSystem {
SmallVector<std::string> getVarNamesList() const;
public:
- ConstraintSystem() {}
+ ConstraintSystem() = default;
ConstraintSystem(ArrayRef<Value *> FunctionArgs) {
NumVariables += FunctionArgs.size();
for (auto *Arg : FunctionArgs) {
diff --git a/llvm/include/llvm/Analysis/DDG.h b/llvm/include/llvm/Analysis/DDG.h
index 1c53291..120bb46 100644
--- a/llvm/include/llvm/Analysis/DDG.h
+++ b/llvm/include/llvm/Analysis/DDG.h
@@ -60,11 +60,7 @@ public:
DDGNode(DDGNode &&N) : DDGNodeBase(std::move(N)), Kind(N.Kind) {}
virtual ~DDGNode() = 0;
- DDGNode &operator=(const DDGNode &N) {
- DGNode::operator=(N);
- Kind = N.Kind;
- return *this;
- }
+ DDGNode &operator=(const DDGNode &N) = default;
DDGNode &operator=(DDGNode &&N) {
DGNode::operator=(std::move(N));
diff --git a/llvm/include/llvm/Analysis/DOTGraphTraitsPass.h b/llvm/include/llvm/Analysis/DOTGraphTraitsPass.h
index ba5ee1d..19a202f 100644
--- a/llvm/include/llvm/Analysis/DOTGraphTraitsPass.h
+++ b/llvm/include/llvm/Analysis/DOTGraphTraitsPass.h
@@ -80,7 +80,7 @@ protected:
/// virtual destructor needed. Making this dtor protected stops accidental
/// invocation when the derived class destructor should have been called.
/// Those derived classes sould be marked final to avoid the warning.
- ~DOTGraphTraitsViewer() {}
+ ~DOTGraphTraitsViewer() = default;
private:
StringRef Name;
@@ -161,7 +161,7 @@ protected:
/// virtual destructor needed. Making this dtor protected stops accidental
/// invocation when the derived class destructor should have been called.
/// Those derived classes sould be marked final to avoid the warning.
- ~DOTGraphTraitsPrinter() {}
+ ~DOTGraphTraitsPrinter() = default;
private:
StringRef Name;
diff --git a/llvm/include/llvm/Analysis/IR2Vec.h b/llvm/include/llvm/Analysis/IR2Vec.h
index e3a0b3f..7a68773 100644
--- a/llvm/include/llvm/Analysis/IR2Vec.h
+++ b/llvm/include/llvm/Analysis/IR2Vec.h
@@ -110,8 +110,8 @@ public:
return Data[Itr];
}
- using iterator = typename std::vector<double>::iterator;
- using const_iterator = typename std::vector<double>::const_iterator;
+ using iterator = std::vector<double>::iterator;
+ using const_iterator = std::vector<double>::const_iterator;
iterator begin() { return Data.begin(); }
iterator end() { return Data.end(); }
diff --git a/llvm/include/llvm/Analysis/LoopIterator.h b/llvm/include/llvm/Analysis/LoopIterator.h
index 523d2a2..1ac8e68 100644
--- a/llvm/include/llvm/Analysis/LoopIterator.h
+++ b/llvm/include/llvm/Analysis/LoopIterator.h
@@ -45,12 +45,12 @@ struct LoopBodyTraits {
class WrappedSuccIterator
: public iterator_adaptor_base<
WrappedSuccIterator, succ_iterator,
- typename std::iterator_traits<succ_iterator>::iterator_category,
- NodeRef, std::ptrdiff_t, NodeRef *, NodeRef> {
+ std::iterator_traits<succ_iterator>::iterator_category, NodeRef,
+ std::ptrdiff_t, NodeRef *, NodeRef> {
using BaseT = iterator_adaptor_base<
WrappedSuccIterator, succ_iterator,
- typename std::iterator_traits<succ_iterator>::iterator_category,
- NodeRef, std::ptrdiff_t, NodeRef *, NodeRef>;
+ std::iterator_traits<succ_iterator>::iterator_category, NodeRef,
+ std::ptrdiff_t, NodeRef *, NodeRef>;
const Loop *L;
diff --git a/llvm/include/llvm/Analysis/MemorySSA.h b/llvm/include/llvm/Analysis/MemorySSA.h
index cbb942f..07d39ab 100644
--- a/llvm/include/llvm/Analysis/MemorySSA.h
+++ b/llvm/include/llvm/Analysis/MemorySSA.h
@@ -1247,7 +1247,7 @@ public:
return DefIterator == Other.DefIterator;
}
- typename std::iterator_traits<BaseT>::reference operator*() const {
+ std::iterator_traits<BaseT>::reference operator*() const {
assert(DefIterator != OriginalAccess->defs_end() &&
"Tried to access past the end of our iterator");
return CurrentPair;
diff --git a/llvm/include/llvm/Analysis/TargetFolder.h b/llvm/include/llvm/Analysis/TargetFolder.h
index d27455c..cbce482 100644
--- a/llvm/include/llvm/Analysis/TargetFolder.h
+++ b/llvm/include/llvm/Analysis/TargetFolder.h
@@ -20,6 +20,7 @@
#include "llvm/ADT/ArrayRef.h"
#include "llvm/Analysis/ConstantFolding.h"
+#include "llvm/IR/ConstantFold.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/IRBuilderFolder.h"
#include "llvm/IR/Operator.h"
diff --git a/llvm/include/llvm/Analysis/TargetTransformInfo.h b/llvm/include/llvm/Analysis/TargetTransformInfo.h
index 7b7dc1b..0f17312 100644
--- a/llvm/include/llvm/Analysis/TargetTransformInfo.h
+++ b/llvm/include/llvm/Analysis/TargetTransformInfo.h
@@ -1764,7 +1764,7 @@ public:
/// \param Types List of types to check.
LLVM_ABI bool areTypesABICompatible(const Function *Caller,
const Function *Callee,
- const ArrayRef<Type *> &Types) const;
+ ArrayRef<Type *> Types) const;
/// The type of load/store indexing.
enum MemIndexedMode {
diff --git a/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h b/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
index 4cd607c..aacb88d 100644
--- a/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
+++ b/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
@@ -1028,7 +1028,7 @@ public:
virtual bool areTypesABICompatible(const Function *Caller,
const Function *Callee,
- const ArrayRef<Type *> &Types) const {
+ ArrayRef<Type *> Types) const {
return (Caller->getFnAttribute("target-cpu") ==
Callee->getFnAttribute("target-cpu")) &&
(Caller->getFnAttribute("target-features") ==
diff --git a/llvm/include/llvm/CAS/ActionCache.h b/llvm/include/llvm/CAS/ActionCache.h
index 69ee4dd..7f5b112 100644
--- a/llvm/include/llvm/CAS/ActionCache.h
+++ b/llvm/include/llvm/CAS/ActionCache.h
@@ -75,6 +75,9 @@ public:
CanBeDistributed);
}
+ /// Validate the ActionCache contents.
+ virtual Error validate() const = 0;
+
virtual ~ActionCache() = default;
protected:
@@ -97,6 +100,9 @@ private:
/// Create an action cache in memory.
std::unique_ptr<ActionCache> createInMemoryActionCache();
+/// Create an action cache on disk.
+Expected<std::unique_ptr<ActionCache>> createOnDiskActionCache(StringRef Path);
+
} // end namespace llvm::cas
#endif // LLVM_CAS_ACTIONCACHE_H
diff --git a/llvm/include/llvm/CAS/BuiltinUnifiedCASDatabases.h b/llvm/include/llvm/CAS/BuiltinUnifiedCASDatabases.h
new file mode 100644
index 0000000..6c165c4
--- /dev/null
+++ b/llvm/include/llvm/CAS/BuiltinUnifiedCASDatabases.h
@@ -0,0 +1,59 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CAS_BUILTINUNIFIEDCASDATABASES_H
+#define LLVM_CAS_BUILTINUNIFIEDCASDATABASES_H
+
+#include "llvm/Support/Error.h"
+
+namespace llvm::cas {
+
+class ActionCache;
+class ObjectStore;
+
+/// Create on-disk \c ObjectStore and \c ActionCache instances based on
+/// \c ondisk::UnifiedOnDiskCache, with built-in hashing.
+Expected<std::pair<std::unique_ptr<ObjectStore>, std::unique_ptr<ActionCache>>>
+createOnDiskUnifiedCASDatabases(StringRef Path);
+
+/// Represents the result of validating the contents using
+/// \c validateOnDiskUnifiedCASDatabasesIfNeeded.
+///
+/// Note: invalid results are handled as an \c Error.
+enum class ValidationResult {
+ /// The data is already valid.
+ Valid,
+ /// The data was invalid, but was recovered.
+ Recovered,
+ /// Validation was skipped, as it was not needed.
+ Skipped,
+};
+
+/// Validate the data in \p Path, if needed to ensure correctness.
+///
+/// \param Path directory for the on-disk database.
+/// \param CheckHash Whether to validate hashes match the data.
+/// \param AllowRecovery Whether to automatically recover from invalid data by
+/// marking the files for garbage collection.
+/// \param ForceValidation Whether to force validation to occur even if it
+/// should not be necessary.
+/// \param LLVMCasBinaryPath If provided, validation is performed out-of-process
+/// using the given \c llvm-cas executable which protects against crashes
+/// during validation. Otherwise validation is performed in-process.
+///
+/// \returns \c Valid if the data is already valid, \c Recovered if data
+/// was invalid but has been cleared, \c Skipped if validation is not needed,
+/// or an \c Error if validation cannot be performed or if the data is left
+/// in an invalid state because \p AllowRecovery is false.
+Expected<ValidationResult> validateOnDiskUnifiedCASDatabasesIfNeeded(
+ StringRef Path, bool CheckHash, bool AllowRecovery, bool ForceValidation,
+ std::optional<StringRef> LLVMCasBinaryPath);
+
+} // namespace llvm::cas
+
+#endif // LLVM_CAS_BUILTINUNIFIEDCASDATABASES_H
diff --git a/llvm/include/llvm/CAS/ObjectStore.h b/llvm/include/llvm/CAS/ObjectStore.h
index 6db5dd3..29950fe 100644
--- a/llvm/include/llvm/CAS/ObjectStore.h
+++ b/llvm/include/llvm/CAS/ObjectStore.h
@@ -5,6 +5,11 @@
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This file contains the declaration of the ObjectStore class.
+///
+//===----------------------------------------------------------------------===//
#ifndef LLVM_CAS_OBJECTSTORE_H
#define LLVM_CAS_OBJECTSTORE_H
@@ -111,7 +116,10 @@ public:
virtual Expected<bool> isMaterialized(ObjectRef Ref) const = 0;
/// Validate the underlying object referred by CASID.
- virtual Error validate(const CASID &ID) = 0;
+ virtual Error validateObject(const CASID &ID) = 0;
+
+ /// Validate the entire ObjectStore.
+ virtual Error validate(bool CheckHash) const = 0;
protected:
/// Load the object referenced by \p Ref.
@@ -215,9 +223,39 @@ public:
return Data.size();
}
+ /// Set the size for limiting growth of on-disk storage. This has an effect
+ /// for when the instance is closed.
+ ///
+ /// Implementations may leave this unimplemented.
+ virtual Error setSizeLimit(std::optional<uint64_t> SizeLimit) {
+ return Error::success();
+ }
+
+ /// \returns the storage size of the on-disk CAS data.
+ ///
+ /// Implementations that don't have an implementation for this should return
+ /// \p std::nullopt.
+ virtual Expected<std::optional<uint64_t>> getStorageSize() const {
+ return std::nullopt;
+ }
+
+ /// Prune local storage to reduce its size according to the desired size
+ /// limit. Pruning can happen concurrently with other operations.
+ ///
+ /// Implementations may leave this unimplemented.
+ virtual Error pruneStorageData() { return Error::success(); }
+
/// Validate the whole node tree.
Error validateTree(ObjectRef Ref);
+ /// Import object from another CAS. This will import the full tree from the
+ /// other CAS.
+ Expected<ObjectRef> importObject(ObjectStore &Upstream, ObjectRef Other);
+
+ /// Print the ObjectStore internals for debugging purpose.
+ virtual void print(raw_ostream &) const {}
+ void dump() const;
+
/// Get CASContext
const CASContext &getContext() const { return Context; }
@@ -290,8 +328,15 @@ private:
ObjectHandle H;
};
+/// Create an in memory CAS.
std::unique_ptr<ObjectStore> createInMemoryCAS();
+/// \returns true if \c LLVM_ENABLE_ONDISK_CAS configuration was enabled.
+bool isOnDiskCASEnabled();
+
+/// Create a persistent on-disk path at \p Path.
+Expected<std::unique_ptr<ObjectStore>> createOnDiskCAS(const Twine &Path);
+
} // namespace cas
} // namespace llvm
diff --git a/llvm/include/llvm/CAS/OnDiskGraphDB.h b/llvm/include/llvm/CAS/OnDiskGraphDB.h
index 5f0ee0e..76cc528 100644
--- a/llvm/include/llvm/CAS/OnDiskGraphDB.h
+++ b/llvm/include/llvm/CAS/OnDiskGraphDB.h
@@ -340,13 +340,16 @@ public:
/// \param HashByteSize Size for the object digest hash bytes.
/// \param UpstreamDB Optional on-disk store to be used for faulting-in nodes
/// if they don't exist in the primary store. The upstream store is only used
- /// for reading nodes, new nodes are only written to the primary store.
+ /// for reading nodes, new nodes are only written to the primary store. User
+ /// need to make sure \p UpstreamDB outlives current instance of
+ /// OnDiskGraphDB and the common usage is to have an \p UnifiedOnDiskCache to
+ /// manage both.
/// \param Policy If \p UpstreamDB is provided, controls how nodes are copied
/// to primary store. This is recorded at creation time and subsequent opens
/// need to pass the same policy otherwise the \p open will fail.
static Expected<std::unique_ptr<OnDiskGraphDB>>
open(StringRef Path, StringRef HashName, unsigned HashByteSize,
- std::unique_ptr<OnDiskGraphDB> UpstreamDB = nullptr,
+ OnDiskGraphDB *UpstreamDB = nullptr,
FaultInPolicy Policy = FaultInPolicy::FullTree);
~OnDiskGraphDB();
@@ -438,8 +441,7 @@ private:
// Private constructor.
OnDiskGraphDB(StringRef RootPath, OnDiskTrieRawHashMap Index,
- OnDiskDataAllocator DataPool,
- std::unique_ptr<OnDiskGraphDB> UpstreamDB,
+ OnDiskDataAllocator DataPool, OnDiskGraphDB *UpstreamDB,
FaultInPolicy Policy);
/// Mapping from hash to object reference.
@@ -459,7 +461,7 @@ private:
std::string RootPath;
/// Optional on-disk store to be used for faulting-in nodes.
- std::unique_ptr<OnDiskGraphDB> UpstreamDB;
+ OnDiskGraphDB *UpstreamDB = nullptr;
/// The policy used to fault in data from upstream.
FaultInPolicy FIPolicy;
diff --git a/llvm/include/llvm/CAS/OnDiskKeyValueDB.h b/llvm/include/llvm/CAS/OnDiskKeyValueDB.h
index b762518..17ae52f 100644
--- a/llvm/include/llvm/CAS/OnDiskKeyValueDB.h
+++ b/llvm/include/llvm/CAS/OnDiskKeyValueDB.h
@@ -19,6 +19,8 @@
namespace llvm::cas::ondisk {
+class UnifiedOnDiskCache;
+
/// An on-disk key-value data store with the following properties:
/// * Keys are fixed length binary hashes with expected normal distribution.
/// * Values are buffers of the same size, specified at creation time.
@@ -59,9 +61,13 @@ public:
/// \param KeySize Size for the key hash bytes.
/// \param ValueName Identifier name for the values.
/// \param ValueSize Size for the value bytes.
+ /// \param UnifiedCache An optional UnifiedOnDiskCache that manages the size
+ /// and lifetime of the CAS instance and it must owns current initializing
+ /// KeyValueDB after initialized.
static Expected<std::unique_ptr<OnDiskKeyValueDB>>
open(StringRef Path, StringRef HashName, unsigned KeySize,
- StringRef ValueName, size_t ValueSize);
+ StringRef ValueName, size_t ValueSize,
+ UnifiedOnDiskCache *UnifiedCache = nullptr);
using CheckValueT =
function_ref<Error(FileOffset Offset, ArrayRef<char> Data)>;
@@ -70,11 +76,14 @@ public:
Error validate(CheckValueT CheckValue) const;
private:
- OnDiskKeyValueDB(size_t ValueSize, OnDiskTrieRawHashMap Cache)
- : ValueSize(ValueSize), Cache(std::move(Cache)) {}
+ OnDiskKeyValueDB(size_t ValueSize, OnDiskTrieRawHashMap Cache,
+ UnifiedOnDiskCache *UnifiedCache)
+ : ValueSize(ValueSize), Cache(std::move(Cache)),
+ UnifiedCache(UnifiedCache) {}
const size_t ValueSize;
OnDiskTrieRawHashMap Cache;
+ UnifiedOnDiskCache *UnifiedCache = nullptr;
};
} // namespace llvm::cas::ondisk
diff --git a/llvm/include/llvm/CAS/UnifiedOnDiskCache.h b/llvm/include/llvm/CAS/UnifiedOnDiskCache.h
new file mode 100644
index 0000000..6e0878a
--- /dev/null
+++ b/llvm/include/llvm/CAS/UnifiedOnDiskCache.h
@@ -0,0 +1,172 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CAS_UNIFIEDONDISKCACHE_H
+#define LLVM_CAS_UNIFIEDONDISKCACHE_H
+
+#include "llvm/CAS/BuiltinUnifiedCASDatabases.h"
+#include "llvm/CAS/OnDiskGraphDB.h"
+#include <atomic>
+
+namespace llvm::cas::ondisk {
+
+class OnDiskKeyValueDB;
+
+/// A unified CAS nodes and key-value database, using on-disk storage for both.
+/// It manages storage growth and provides APIs for garbage collection.
+///
+/// High-level properties:
+/// * While \p UnifiedOnDiskCache is open on a directory, by any process, the
+/// storage size in that directory will keep growing unrestricted. For data to
+/// become eligible for garbage-collection there should be no open instances
+/// of \p UnifiedOnDiskCache for that directory, by any process.
+/// * Garbage-collection needs to be triggered explicitly by the client. It can
+/// be triggered on a directory concurrently, at any time and by any process,
+/// without affecting any active readers/writers, in the same process or other
+/// processes.
+///
+/// Usage patterns should be that an instance of \p UnifiedOnDiskCache is open
+/// for a limited period of time, e.g. for the duration of a build operation.
+/// For long-living processes that need periodic access to a
+/// \p UnifiedOnDiskCache, the client should devise a scheme where access is
+/// performed within some defined period. For example, if a service is designed
+/// to continuously wait for requests that access a \p UnifiedOnDiskCache, it
+/// could keep the instance alive while new requests are coming in but close it
+/// after a time period in which there are no new requests.
+class UnifiedOnDiskCache {
+public:
+ /// The \p OnDiskGraphDB instance for the open directory.
+ OnDiskGraphDB &getGraphDB() { return *PrimaryGraphDB; }
+
+ /// The \p OnDiskGraphDB instance for the open directory.
+ OnDiskKeyValueDB &getKeyValueDB() { return *PrimaryKVDB; }
+
+ /// Open a \p UnifiedOnDiskCache instance for a directory.
+ ///
+ /// \param Path directory for the on-disk database. The directory will be
+ /// created if it doesn't exist.
+ /// \param SizeLimit Optional size for limiting growth. This has an effect for
+ /// when the instance is closed.
+ /// \param HashName Identifier name for the hashing algorithm that is going to
+ /// be used.
+ /// \param HashByteSize Size for the object digest hash bytes.
+ /// \param FaultInPolicy Controls how nodes are copied to primary store. This
+ /// is recorded at creation time and subsequent opens need to pass the same
+ /// policy otherwise the \p open will fail.
+ static Expected<std::unique_ptr<UnifiedOnDiskCache>>
+ open(StringRef Path, std::optional<uint64_t> SizeLimit, StringRef HashName,
+ unsigned HashByteSize,
+ OnDiskGraphDB::FaultInPolicy FaultInPolicy =
+ OnDiskGraphDB::FaultInPolicy::FullTree);
+
+ /// Validate the data in \p Path, if needed to ensure correctness.
+ ///
+ /// Note: if invalid data is detected and \p AllowRecovery is true, then
+ /// recovery requires exclusive access to the CAS and it is an error to
+ /// attempt recovery if there is concurrent use of the CAS.
+ ///
+ /// \param Path directory for the on-disk database.
+ /// \param HashName Identifier name for the hashing algorithm that is going to
+ /// be used.
+ /// \param HashByteSize Size for the object digest hash bytes.
+ /// \param CheckHash Whether to validate hashes match the data.
+ /// \param AllowRecovery Whether to automatically recover from invalid data by
+ /// marking the files for garbage collection.
+ /// \param ForceValidation Whether to force validation to occur even if it
+ /// should not be necessary.
+ /// \param LLVMCasBinary If provided, validation is performed out-of-process
+ /// using the given \c llvm-cas executable which protects against crashes
+ /// during validation. Otherwise validation is performed in-process.
+ ///
+ /// \returns \c Valid if the data is already valid, \c Recovered if data
+ /// was invalid but has been cleared, \c Skipped if validation is not needed,
+ /// or an \c Error if validation cannot be performed or if the data is left
+ /// in an invalid state because \p AllowRecovery is false.
+ static Expected<ValidationResult>
+ validateIfNeeded(StringRef Path, StringRef HashName, unsigned HashByteSize,
+ bool CheckHash, bool AllowRecovery, bool ForceValidation,
+ std::optional<StringRef> LLVMCasBinary);
+
+ /// This is called implicitly at destruction time, so it is not required for a
+ /// client to call this. After calling \p close the only method that is valid
+ /// to call is \p needsGarbageCollection.
+ ///
+ /// \param CheckSizeLimit if true it will check whether the primary store has
+ /// exceeded its intended size limit. If false the check is skipped even if a
+ /// \p SizeLimit was passed to the \p open call.
+ Error close(bool CheckSizeLimit = true);
+
+ /// Set the size for limiting growth. This has an effect for when the instance
+ /// is closed.
+ void setSizeLimit(std::optional<uint64_t> SizeLimit);
+
+ /// \returns the storage size of the cache data.
+ uint64_t getStorageSize() const;
+
+ /// \returns whether the primary store has exceeded the intended size limit.
+ /// This can return false even if the overall size of the opened directory is
+ /// over the \p SizeLimit passed to \p open. To know whether garbage
+ /// collection needs to be triggered or not, call \p needsGarbaseCollection.
+ bool hasExceededSizeLimit() const;
+
+ /// \returns whether there are unused data that can be deleted using a
+ /// \p collectGarbage call.
+ bool needsGarbageCollection() const { return NeedsGarbageCollection; }
+
+ /// Remove any unused data from the directory at \p Path. If there are no such
+ /// data the operation is a no-op.
+ ///
+ /// This can be called concurrently, regardless of whether there is an open
+ /// \p UnifiedOnDiskCache instance or not; it has no effect on readers/writers
+ /// in the same process or other processes.
+ ///
+ /// It is recommended that garbage-collection is triggered concurrently in the
+ /// background, so that it has minimal effect on the workload of the process.
+ static Error collectGarbage(StringRef Path);
+
+ /// Remove unused data from the current UnifiedOnDiskCache.
+ Error collectGarbage();
+
+ /// Helper function to convert the value stored in KeyValueDB and ObjectID.
+ static ObjectID getObjectIDFromValue(ArrayRef<char> Value);
+
+ using ValueBytes = std::array<char, sizeof(uint64_t)>;
+ static ValueBytes getValueFromObjectID(ObjectID ID);
+
+ ~UnifiedOnDiskCache();
+
+private:
+ friend class OnDiskGraphDB;
+ friend class OnDiskKeyValueDB;
+
+ UnifiedOnDiskCache();
+
+ Expected<std::optional<ArrayRef<char>>>
+ faultInFromUpstreamKV(ArrayRef<uint8_t> Key);
+
+ /// \returns the storage size of the primary directory.
+ uint64_t getPrimaryStorageSize() const;
+
+ std::string RootPath;
+ std::atomic<uint64_t> SizeLimit;
+
+ int LockFD = -1;
+
+ std::atomic<bool> NeedsGarbageCollection;
+ std::string PrimaryDBDir;
+
+ std::unique_ptr<OnDiskGraphDB> UpstreamGraphDB;
+ std::unique_ptr<OnDiskGraphDB> PrimaryGraphDB;
+
+ std::unique_ptr<OnDiskKeyValueDB> UpstreamKVDB;
+ std::unique_ptr<OnDiskKeyValueDB> PrimaryKVDB;
+};
+
+} // namespace llvm::cas::ondisk
+
+#endif // LLVM_CAS_UNIFIEDONDISKCACHE_H
diff --git a/llvm/include/llvm/CodeGen/BasicBlockSectionsProfileReader.h b/llvm/include/llvm/CodeGen/BasicBlockSectionsProfileReader.h
index 8237530..7b1a5f5 100644
--- a/llvm/include/llvm/CodeGen/BasicBlockSectionsProfileReader.h
+++ b/llvm/include/llvm/CodeGen/BasicBlockSectionsProfileReader.h
@@ -66,7 +66,7 @@ public:
BasicBlockSectionsProfileReader(const MemoryBuffer *Buf)
: MBuf(Buf), LineIt(*Buf, /*SkipBlanks=*/true, /*CommentMarker=*/'#'){};
- BasicBlockSectionsProfileReader(){};
+ BasicBlockSectionsProfileReader() = default;
// Returns true if basic block sections profile exist for function \p
// FuncName.
diff --git a/llvm/include/llvm/CodeGen/DIE.h b/llvm/include/llvm/CodeGen/DIE.h
index 32f4651..92265fd 100644
--- a/llvm/include/llvm/CodeGen/DIE.h
+++ b/llvm/include/llvm/CodeGen/DIE.h
@@ -653,7 +653,7 @@ public:
public:
const_iterator() = default;
// Placate MSVC by explicitly scoping 'iterator'.
- const_iterator(typename IntrusiveBackList<T>::iterator X) : N(X.N) {}
+ const_iterator(IntrusiveBackList<T>::iterator X) : N(X.N) {}
explicit const_iterator(const T *N) : N(N) {}
const_iterator &operator++() {
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h b/llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h
index 36cb90b..96cb7cd 100644
--- a/llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h
+++ b/llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h
@@ -293,7 +293,7 @@ public:
SmallVectorImpl<Register> &Ops) const;
/// Replace \p MI with a concat_vectors with \p Ops.
void applyCombineShuffleVector(MachineInstr &MI,
- const ArrayRef<Register> Ops) const;
+ ArrayRef<Register> Ops) const;
/// Optimize memcpy intrinsics et al, e.g. constant len calls.
/// /p MaxLen if non-zero specifies the max length of a mem libcall to inline.
diff --git a/llvm/include/llvm/CodeGen/GlobalMergeFunctions.h b/llvm/include/llvm/CodeGen/GlobalMergeFunctions.h
index caea5b6..54ea68a 100644
--- a/llvm/include/llvm/CodeGen/GlobalMergeFunctions.h
+++ b/llvm/include/llvm/CodeGen/GlobalMergeFunctions.h
@@ -58,7 +58,7 @@ public:
/// The suffix used to identify the merged function that parameterizes
/// the constant values. Note that the original function, without this suffix,
/// becomes a thunk supplying contexts to the merged function via parameters.
- static constexpr const char MergingInstanceSuffix[] = ".Tgm";
+ static constexpr char MergingInstanceSuffix[] = ".Tgm";
GlobalMergeFunc(const ModuleSummaryIndex *Index) : Index(Index) {};
diff --git a/llvm/include/llvm/CodeGen/MachineScheduler.h b/llvm/include/llvm/CodeGen/MachineScheduler.h
index 5a2aee2..6c5c27c 100644
--- a/llvm/include/llvm/CodeGen/MachineScheduler.h
+++ b/llvm/include/llvm/CodeGen/MachineScheduler.h
@@ -829,7 +829,7 @@ private:
public:
// constructor for empty set
- explicit ResourceSegments(){};
+ explicit ResourceSegments() = default;
bool empty() const { return _Intervals.empty(); }
explicit ResourceSegments(const std::list<IntervalTy> &Intervals)
: _Intervals(Intervals) {
diff --git a/llvm/include/llvm/CodeGen/RDFRegisters.h b/llvm/include/llvm/CodeGen/RDFRegisters.h
index 82027ca..3b7454e 100644
--- a/llvm/include/llvm/CodeGen/RDFRegisters.h
+++ b/llvm/include/llvm/CodeGen/RDFRegisters.h
@@ -294,7 +294,7 @@ struct RegisterAggr {
ref_iterator ref_begin() const { return ref_iterator(*this, false); }
ref_iterator ref_end() const { return ref_iterator(*this, true); }
- using unit_iterator = typename BitVector::const_set_bits_iterator;
+ using unit_iterator = BitVector::const_set_bits_iterator;
unit_iterator unit_begin() const { return Units.set_bits_begin(); }
unit_iterator unit_end() const { return Units.set_bits_end(); }
diff --git a/llvm/include/llvm/CodeGen/RegAllocRegistry.h b/llvm/include/llvm/CodeGen/RegAllocRegistry.h
index cd81e08..db62640 100644
--- a/llvm/include/llvm/CodeGen/RegAllocRegistry.h
+++ b/llvm/include/llvm/CodeGen/RegAllocRegistry.h
@@ -67,7 +67,7 @@ public:
/// RegisterRegAlloc's global Registry tracks allocator registration.
template <class T>
MachinePassRegistry<typename RegisterRegAllocBase<T>::FunctionPassCtor>
-RegisterRegAllocBase<T>::Registry;
+ RegisterRegAllocBase<T>::Registry;
} // end namespace llvm
diff --git a/llvm/include/llvm/CodeGen/SDPatternMatch.h b/llvm/include/llvm/CodeGen/SDPatternMatch.h
index 9a6bf5f..511cb56 100644
--- a/llvm/include/llvm/CodeGen/SDPatternMatch.h
+++ b/llvm/include/llvm/CodeGen/SDPatternMatch.h
@@ -1311,7 +1311,7 @@ template <typename... PatternTs> struct ReassociatableOpc_match {
}
[[nodiscard]] inline bool
- reassociatableMatchHelper(const ArrayRef<SmallBitVector> Matches,
+ reassociatableMatchHelper(ArrayRef<SmallBitVector> Matches,
SmallBitVector &Used, size_t Curr = 0) {
if (Curr == Matches.size())
return true;
diff --git a/llvm/include/llvm/CodeGen/WindowScheduler.h b/llvm/include/llvm/CodeGen/WindowScheduler.h
index 476d5ad..97776de 100644
--- a/llvm/include/llvm/CodeGen/WindowScheduler.h
+++ b/llvm/include/llvm/CodeGen/WindowScheduler.h
@@ -105,7 +105,7 @@ protected:
public:
WindowScheduler(MachineSchedContext *C, MachineLoop &ML);
- virtual ~WindowScheduler() {}
+ virtual ~WindowScheduler() = default;
bool run();
diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h
index be78647..b7d6e72 100644
--- a/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h
+++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h
@@ -136,8 +136,8 @@ class DWARFUnitVector final : public SmallVector<std::unique_ptr<DWARFUnit>, 1>
public:
using UnitVector = SmallVectorImpl<std::unique_ptr<DWARFUnit>>;
- using iterator = typename UnitVector::iterator;
- using iterator_range = llvm::iterator_range<typename UnitVector::iterator>;
+ using iterator = UnitVector::iterator;
+ using iterator_range = llvm::iterator_range<UnitVector::iterator>;
using compile_unit_range =
decltype(make_filter_range(std::declval<iterator_range>(), isCompileUnit));
diff --git a/llvm/include/llvm/DebugInfo/PDB/Native/DbiModuleList.h b/llvm/include/llvm/DebugInfo/PDB/Native/DbiModuleList.h
index 8992fae..bbed56b 100644
--- a/llvm/include/llvm/DebugInfo/PDB/Native/DbiModuleList.h
+++ b/llvm/include/llvm/DebugInfo/PDB/Native/DbiModuleList.h
@@ -32,7 +32,7 @@ struct FileInfoSubstreamHeader;
class DbiModuleSourceFilesIterator
: public iterator_facade_base<DbiModuleSourceFilesIterator,
std::random_access_iterator_tag, StringRef> {
- using BaseType = typename DbiModuleSourceFilesIterator::iterator_facade_base;
+ using BaseType = DbiModuleSourceFilesIterator::iterator_facade_base;
public:
LLVM_ABI DbiModuleSourceFilesIterator(const DbiModuleList &Modules,
diff --git a/llvm/include/llvm/Demangle/Utility.h b/llvm/include/llvm/Demangle/Utility.h
index 002a1f5..6e6203d 100644
--- a/llvm/include/llvm/Demangle/Utility.h
+++ b/llvm/include/llvm/Demangle/Utility.h
@@ -81,7 +81,7 @@ public:
OutputBuffer(const OutputBuffer &) = delete;
OutputBuffer &operator=(const OutputBuffer &) = delete;
- virtual ~OutputBuffer() {}
+ virtual ~OutputBuffer() = default;
operator std::string_view() const {
return std::string_view(Buffer, CurrentPosition);
diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h b/llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h
index 98170f6..9479c10 100644
--- a/llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h
+++ b/llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h
@@ -175,7 +175,7 @@ struct HalfWords {
/// FixupInfo base class is required for dynamic lookups.
struct FixupInfoBase {
LLVM_ABI static const FixupInfoBase *getDynFixupInfo(Edge::Kind K);
- virtual ~FixupInfoBase() {}
+ virtual ~FixupInfoBase() = default;
};
/// FixupInfo checks for Arm edge kinds work on 32-bit words
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/MachOBuilder.h b/llvm/include/llvm/ExecutionEngine/Orc/MachOBuilder.h
index dd41025..1296e24 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/MachOBuilder.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/MachOBuilder.h
@@ -36,7 +36,7 @@ size_t writeMachOStruct(MutableArrayRef<char> Buf, size_t Offset, MachOStruct S,
/// Base type for MachOBuilder load command wrappers.
struct MachOBuilderLoadCommandBase {
- virtual ~MachOBuilderLoadCommandBase() {}
+ virtual ~MachOBuilderLoadCommandBase() = default;
virtual size_t size() const = 0;
virtual size_t write(MutableArrayRef<char> Buf, size_t Offset,
bool SwapStruct) = 0;
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.h b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.h
index 2c385de..8f87650 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.h
@@ -29,7 +29,7 @@ namespace rt_bootstrap {
class LLVM_ABI ExecutorSharedMemoryMapperService final
: public ExecutorBootstrapService {
public:
- ~ExecutorSharedMemoryMapperService() override {};
+ ~ExecutorSharedMemoryMapperService() override = default;
Expected<std::pair<ExecutorAddr, std::string>> reserve(uint64_t Size);
Expected<ExecutorAddr> initialize(ExecutorAddr Reservation,
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/LibraryResolver.h b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/LibraryResolver.h
index 9182995..7cc78d4 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/LibraryResolver.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/LibraryResolver.h
@@ -100,7 +100,7 @@ public:
class FilteredView {
public:
using Map = StringMap<std::shared_ptr<LibraryInfo>>;
- using Iterator = typename Map::const_iterator;
+ using Iterator = Map::const_iterator;
class FilterIterator {
public:
FilterIterator(Iterator it_, Iterator end_, LibState S, PathType K)
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
index 5331cb5..b3d7ab4 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
+++ b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
@@ -2383,7 +2383,7 @@ public:
/// runtime library for debugging
Value *MapNamesArray = nullptr;
- explicit TargetDataRTArgs() {}
+ explicit TargetDataRTArgs() = default;
explicit TargetDataRTArgs(Value *BasePointersArray, Value *PointersArray,
Value *SizesArray, Value *MapTypesArray,
Value *MapTypesArrayEnd, Value *MappersArray,
@@ -2451,7 +2451,7 @@ public:
bool HasNoWait = false;
// Constructors for TargetKernelArgs.
- TargetKernelArgs() {}
+ TargetKernelArgs() = default;
TargetKernelArgs(unsigned NumTargetItems, TargetDataRTArgs RTArgs,
Value *NumIterations, ArrayRef<Value *> NumTeams,
ArrayRef<Value *> NumThreads, Value *DynCGGroupMem,
@@ -2494,7 +2494,7 @@ public:
/// Whether the `target ... data` directive has a `nowait` clause.
bool HasNoWait = false;
- explicit TargetDataInfo() {}
+ explicit TargetDataInfo() = default;
explicit TargetDataInfo(bool RequiresDevicePointerInfo,
bool SeparateBeginEndCalls)
: RequiresDevicePointerInfo(RequiresDevicePointerInfo),
diff --git a/llvm/include/llvm/IR/ConstantFold.h b/llvm/include/llvm/IR/ConstantFold.h
index 01bb128..4056f1f 100644
--- a/llvm/include/llvm/IR/ConstantFold.h
+++ b/llvm/include/llvm/IR/ConstantFold.h
@@ -37,18 +37,43 @@ ConstantFoldCastInstruction(unsigned opcode, ///< The opcode of the cast
Constant *V, ///< The source constant
Type *DestTy ///< The destination type
);
+
+/// Attempt to constant fold a select instruction with the specified
+/// operands. The constant result is returned if successful; if not, null is
+/// returned.
LLVM_ABI Constant *ConstantFoldSelectInstruction(Constant *Cond, Constant *V1,
Constant *V2);
+
+/// Attempt to constant fold an extractelement instruction with the
+/// specified operands and indices. The constant result is returned if
+/// successful; if not, null is returned.
LLVM_ABI Constant *ConstantFoldExtractElementInstruction(Constant *Val,
Constant *Idx);
+
+/// Attempt to constant fold an insertelement instruction with the
+/// specified operands and indices. The constant result is returned if
+/// successful; if not, null is returned.
LLVM_ABI Constant *ConstantFoldInsertElementInstruction(Constant *Val,
Constant *Elt,
Constant *Idx);
+
+/// Attempt to constant fold a shufflevector instruction with the
+/// specified operands and mask. See class ShuffleVectorInst for a description
+/// of the mask representation. The constant result is returned if successful;
+/// if not, null is returned.
LLVM_ABI Constant *ConstantFoldShuffleVectorInstruction(Constant *V1,
Constant *V2,
ArrayRef<int> Mask);
+
+/// Attempt to constant fold an extractvalue instruction with the
+/// specified operands and indices. The constant result is returned if
+/// successful; if not, null is returned.
LLVM_ABI Constant *ConstantFoldExtractValueInstruction(Constant *Agg,
ArrayRef<unsigned> Idxs);
+
+/// Attempt to constant fold an insertvalue instruction with the specified
+/// operands and indices. The constant result is returned if successful; if
+/// not, null is returned.
LLVM_ABI Constant *ConstantFoldInsertValueInstruction(Constant *Agg,
Constant *Val,
ArrayRef<unsigned> Idxs);
diff --git a/llvm/include/llvm/IR/DebugProgramInstruction.h b/llvm/include/llvm/IR/DebugProgramInstruction.h
index 457c60e3b..66f44fe 100644
--- a/llvm/include/llvm/IR/DebugProgramInstruction.h
+++ b/llvm/include/llvm/IR/DebugProgramInstruction.h
@@ -589,7 +589,7 @@ filterDbgVars(iterator_range<simple_ilist<DbgRecord>::iterator> R) {
/// date.
class DbgMarker {
public:
- DbgMarker() {}
+ DbgMarker() = default;
/// Link back to the Instruction that owns this marker. Can be null during
/// operations that move a marker from one instruction to another.
Instruction *MarkedInstr = nullptr;
diff --git a/llvm/include/llvm/IR/DroppedVariableStats.h b/llvm/include/llvm/IR/DroppedVariableStats.h
index 42e86dd..8a1dbd6a 100644
--- a/llvm/include/llvm/IR/DroppedVariableStats.h
+++ b/llvm/include/llvm/IR/DroppedVariableStats.h
@@ -42,7 +42,7 @@ class DroppedVariableStats {
public:
LLVM_ABI DroppedVariableStats(bool DroppedVarStatsEnabled);
- virtual ~DroppedVariableStats() {}
+ virtual ~DroppedVariableStats() = default;
// We intend this to be unique per-compilation, thus no copies.
DroppedVariableStats(const DroppedVariableStats &) = delete;
diff --git a/llvm/include/llvm/IR/IntrinsicsHexagonDep.td b/llvm/include/llvm/IR/IntrinsicsHexagonDep.td
index fe95377..dde4132 100644
--- a/llvm/include/llvm/IR/IntrinsicsHexagonDep.td
+++ b/llvm/include/llvm/IR/IntrinsicsHexagonDep.td
@@ -6835,6 +6835,180 @@ Hexagon_v64i32_v32i32v32i32_Intrinsic<"HEXAGON_V6_vsub_hf_f8_128B">;
// V81 HVX Instructions.
+def int_hexagon_V6_vabs_qf16_hf :
+Hexagon_v16i32_v16i32_Intrinsic<"HEXAGON_V6_vabs_qf16_hf">;
+
+def int_hexagon_V6_vabs_qf16_hf_128B :
+Hexagon_v32i32_v32i32_Intrinsic<"HEXAGON_V6_vabs_qf16_hf_128B">;
+
+def int_hexagon_V6_vabs_qf16_qf16 :
+Hexagon_v16i32_v16i32_Intrinsic<"HEXAGON_V6_vabs_qf16_qf16">;
+
+def int_hexagon_V6_vabs_qf16_qf16_128B :
+Hexagon_v32i32_v32i32_Intrinsic<"HEXAGON_V6_vabs_qf16_qf16_128B">;
+
+def int_hexagon_V6_vabs_qf32_qf32 :
+Hexagon_v16i32_v16i32_Intrinsic<"HEXAGON_V6_vabs_qf32_qf32">;
+
+def int_hexagon_V6_vabs_qf32_qf32_128B :
+Hexagon_v32i32_v32i32_Intrinsic<"HEXAGON_V6_vabs_qf32_qf32_128B">;
+
+def int_hexagon_V6_vabs_qf32_sf :
+Hexagon_v16i32_v16i32_Intrinsic<"HEXAGON_V6_vabs_qf32_sf">;
+
+def int_hexagon_V6_vabs_qf32_sf_128B :
+Hexagon_v32i32_v32i32_Intrinsic<"HEXAGON_V6_vabs_qf32_sf_128B">;
+
+def int_hexagon_V6_valign4 :
+Hexagon_v16i32_v16i32v16i32i32_Intrinsic<"HEXAGON_V6_valign4">;
+
+def int_hexagon_V6_valign4_128B :
+Hexagon_v32i32_v32i32v32i32i32_Intrinsic<"HEXAGON_V6_valign4_128B">;
+
+def int_hexagon_V6_vconv_bf_qf32 :
+Hexagon_v16i32_v32i32_Intrinsic<"HEXAGON_V6_vconv_bf_qf32">;
+
+def int_hexagon_V6_vconv_bf_qf32_128B :
+Hexagon_v32i32_v64i32_Intrinsic<"HEXAGON_V6_vconv_bf_qf32_128B">;
+
+def int_hexagon_V6_vconv_f8_qf16 :
+Hexagon_v16i32_v16i32_Intrinsic<"HEXAGON_V6_vconv_f8_qf16">;
+
+def int_hexagon_V6_vconv_f8_qf16_128B :
+Hexagon_v32i32_v32i32_Intrinsic<"HEXAGON_V6_vconv_f8_qf16_128B">;
+
+def int_hexagon_V6_vconv_h_hf_rnd :
+Hexagon_v16i32_v16i32_Intrinsic<"HEXAGON_V6_vconv_h_hf_rnd">;
+
+def int_hexagon_V6_vconv_h_hf_rnd_128B :
+Hexagon_v32i32_v32i32_Intrinsic<"HEXAGON_V6_vconv_h_hf_rnd_128B">;
+
+def int_hexagon_V6_vconv_qf16_f8 :
+Hexagon_v32i32_v16i32_Intrinsic<"HEXAGON_V6_vconv_qf16_f8">;
+
+def int_hexagon_V6_vconv_qf16_f8_128B :
+Hexagon_v64i32_v32i32_Intrinsic<"HEXAGON_V6_vconv_qf16_f8_128B">;
+
+def int_hexagon_V6_vconv_qf16_hf :
+Hexagon_v16i32_v16i32_Intrinsic<"HEXAGON_V6_vconv_qf16_hf">;
+
+def int_hexagon_V6_vconv_qf16_hf_128B :
+Hexagon_v32i32_v32i32_Intrinsic<"HEXAGON_V6_vconv_qf16_hf_128B">;
+
+def int_hexagon_V6_vconv_qf16_qf16 :
+Hexagon_v16i32_v16i32_Intrinsic<"HEXAGON_V6_vconv_qf16_qf16">;
+
+def int_hexagon_V6_vconv_qf16_qf16_128B :
+Hexagon_v32i32_v32i32_Intrinsic<"HEXAGON_V6_vconv_qf16_qf16_128B">;
+
+def int_hexagon_V6_vconv_qf32_qf32 :
+Hexagon_v16i32_v16i32_Intrinsic<"HEXAGON_V6_vconv_qf32_qf32">;
+
+def int_hexagon_V6_vconv_qf32_qf32_128B :
+Hexagon_v32i32_v32i32_Intrinsic<"HEXAGON_V6_vconv_qf32_qf32_128B">;
+
+def int_hexagon_V6_vconv_qf32_sf :
+Hexagon_v16i32_v16i32_Intrinsic<"HEXAGON_V6_vconv_qf32_sf">;
+
+def int_hexagon_V6_vconv_qf32_sf_128B :
+Hexagon_v32i32_v32i32_Intrinsic<"HEXAGON_V6_vconv_qf32_sf_128B">;
+
+def int_hexagon_V6_veqhf :
+Hexagon_v64i1_v16i32v16i32_Intrinsic<"HEXAGON_V6_veqhf">;
+
+def int_hexagon_V6_veqhf_128B :
+Hexagon_v128i1_v32i32v32i32_Intrinsic<"HEXAGON_V6_veqhf_128B">;
+
+def int_hexagon_V6_veqhf_and :
+Hexagon_v64i1_v64i1v16i32v16i32_Intrinsic<"HEXAGON_V6_veqhf_and">;
+
+def int_hexagon_V6_veqhf_and_128B :
+Hexagon_v128i1_v128i1v32i32v32i32_Intrinsic<"HEXAGON_V6_veqhf_and_128B">;
+
+def int_hexagon_V6_veqhf_or :
+Hexagon_v64i1_v64i1v16i32v16i32_Intrinsic<"HEXAGON_V6_veqhf_or">;
+
+def int_hexagon_V6_veqhf_or_128B :
+Hexagon_v128i1_v128i1v32i32v32i32_Intrinsic<"HEXAGON_V6_veqhf_or_128B">;
+
+def int_hexagon_V6_veqhf_xor :
+Hexagon_v64i1_v64i1v16i32v16i32_Intrinsic<"HEXAGON_V6_veqhf_xor">;
+
+def int_hexagon_V6_veqhf_xor_128B :
+Hexagon_v128i1_v128i1v32i32v32i32_Intrinsic<"HEXAGON_V6_veqhf_xor_128B">;
+
+def int_hexagon_V6_veqsf :
+Hexagon_v64i1_v16i32v16i32_Intrinsic<"HEXAGON_V6_veqsf">;
+
+def int_hexagon_V6_veqsf_128B :
+Hexagon_v128i1_v32i32v32i32_Intrinsic<"HEXAGON_V6_veqsf_128B">;
+
+def int_hexagon_V6_veqsf_and :
+Hexagon_v64i1_v64i1v16i32v16i32_Intrinsic<"HEXAGON_V6_veqsf_and">;
+
+def int_hexagon_V6_veqsf_and_128B :
+Hexagon_v128i1_v128i1v32i32v32i32_Intrinsic<"HEXAGON_V6_veqsf_and_128B">;
+
+def int_hexagon_V6_veqsf_or :
+Hexagon_v64i1_v64i1v16i32v16i32_Intrinsic<"HEXAGON_V6_veqsf_or">;
+
+def int_hexagon_V6_veqsf_or_128B :
+Hexagon_v128i1_v128i1v32i32v32i32_Intrinsic<"HEXAGON_V6_veqsf_or_128B">;
+
+def int_hexagon_V6_veqsf_xor :
+Hexagon_v64i1_v64i1v16i32v16i32_Intrinsic<"HEXAGON_V6_veqsf_xor">;
+
+def int_hexagon_V6_veqsf_xor_128B :
+Hexagon_v128i1_v128i1v32i32v32i32_Intrinsic<"HEXAGON_V6_veqsf_xor_128B">;
+
+def int_hexagon_V6_vilog2_hf :
+Hexagon_v16i32_v16i32_Intrinsic<"HEXAGON_V6_vilog2_hf">;
+
+def int_hexagon_V6_vilog2_hf_128B :
+Hexagon_v32i32_v32i32_Intrinsic<"HEXAGON_V6_vilog2_hf_128B">;
+
+def int_hexagon_V6_vilog2_qf16 :
+Hexagon_v16i32_v16i32_Intrinsic<"HEXAGON_V6_vilog2_qf16">;
+
+def int_hexagon_V6_vilog2_qf16_128B :
+Hexagon_v32i32_v32i32_Intrinsic<"HEXAGON_V6_vilog2_qf16_128B">;
+
+def int_hexagon_V6_vilog2_qf32 :
+Hexagon_v16i32_v16i32_Intrinsic<"HEXAGON_V6_vilog2_qf32">;
+
+def int_hexagon_V6_vilog2_qf32_128B :
+Hexagon_v32i32_v32i32_Intrinsic<"HEXAGON_V6_vilog2_qf32_128B">;
+
+def int_hexagon_V6_vilog2_sf :
+Hexagon_v16i32_v16i32_Intrinsic<"HEXAGON_V6_vilog2_sf">;
+
+def int_hexagon_V6_vilog2_sf_128B :
+Hexagon_v32i32_v32i32_Intrinsic<"HEXAGON_V6_vilog2_sf_128B">;
+
+def int_hexagon_V6_vneg_qf16_hf :
+Hexagon_v16i32_v16i32_Intrinsic<"HEXAGON_V6_vneg_qf16_hf">;
+
+def int_hexagon_V6_vneg_qf16_hf_128B :
+Hexagon_v32i32_v32i32_Intrinsic<"HEXAGON_V6_vneg_qf16_hf_128B">;
+
+def int_hexagon_V6_vneg_qf16_qf16 :
+Hexagon_v16i32_v16i32_Intrinsic<"HEXAGON_V6_vneg_qf16_qf16">;
+
+def int_hexagon_V6_vneg_qf16_qf16_128B :
+Hexagon_v32i32_v32i32_Intrinsic<"HEXAGON_V6_vneg_qf16_qf16_128B">;
+
+def int_hexagon_V6_vneg_qf32_qf32 :
+Hexagon_v16i32_v16i32_Intrinsic<"HEXAGON_V6_vneg_qf32_qf32">;
+
+def int_hexagon_V6_vneg_qf32_qf32_128B :
+Hexagon_v32i32_v32i32_Intrinsic<"HEXAGON_V6_vneg_qf32_qf32_128B">;
+
+def int_hexagon_V6_vneg_qf32_sf :
+Hexagon_v16i32_v16i32_Intrinsic<"HEXAGON_V6_vneg_qf32_sf">;
+
+def int_hexagon_V6_vneg_qf32_sf_128B :
+Hexagon_v32i32_v32i32_Intrinsic<"HEXAGON_V6_vneg_qf32_sf_128B">;
+
def int_hexagon_V6_vsub_hf_mix :
Hexagon_v16i32_v16i32v16i32_Intrinsic<"HEXAGON_V6_vsub_hf_mix">;
diff --git a/llvm/include/llvm/IR/TrackingMDRef.h b/llvm/include/llvm/IR/TrackingMDRef.h
index d737739..7ad7225 100644
--- a/llvm/include/llvm/IR/TrackingMDRef.h
+++ b/llvm/include/llvm/IR/TrackingMDRef.h
@@ -111,17 +111,14 @@ public:
explicit TypedTrackingMDRef(T *MD) : Ref(static_cast<Metadata *>(MD)) {}
TypedTrackingMDRef(TypedTrackingMDRef &&X) : Ref(std::move(X.Ref)) {}
- TypedTrackingMDRef(const TypedTrackingMDRef &X) : Ref(X.Ref) {}
+ TypedTrackingMDRef(const TypedTrackingMDRef &X) = default;
TypedTrackingMDRef &operator=(TypedTrackingMDRef &&X) {
Ref = std::move(X.Ref);
return *this;
}
- TypedTrackingMDRef &operator=(const TypedTrackingMDRef &X) {
- Ref = X.Ref;
- return *this;
- }
+ TypedTrackingMDRef &operator=(const TypedTrackingMDRef &X) = default;
T *get() const { return (T *)Ref.get(); }
operator T *() const { return get(); }
diff --git a/llvm/include/llvm/MC/MCAssembler.h b/llvm/include/llvm/MC/MCAssembler.h
index 6e1d642..bbb8bee 100644
--- a/llvm/include/llvm/MC/MCAssembler.h
+++ b/llvm/include/llvm/MC/MCAssembler.h
@@ -198,8 +198,8 @@ public:
const_iterator end() const { return Sections.end(); }
SmallVectorImpl<const MCSymbol *> &getSymbols() { return Symbols; }
- iterator_range<pointee_iterator<
- typename SmallVector<const MCSymbol *, 0>::const_iterator>>
+ iterator_range<
+ pointee_iterator<SmallVector<const MCSymbol *, 0>::const_iterator>>
symbols() const {
return make_pointee_range(Symbols);
}
diff --git a/llvm/include/llvm/MC/MCRegisterInfo.h b/llvm/include/llvm/MC/MCRegisterInfo.h
index e6fc707..f611edd 100644
--- a/llvm/include/llvm/MC/MCRegisterInfo.h
+++ b/llvm/include/llvm/MC/MCRegisterInfo.h
@@ -272,7 +272,7 @@ public:
friend class MCRegUnitRootIterator;
friend class MCRegAliasIterator;
- virtual ~MCRegisterInfo() {}
+ virtual ~MCRegisterInfo() = default;
/// Initialize MCRegisterInfo, called by TableGen
/// auto-generated routines. *DO NOT USE*.
diff --git a/llvm/include/llvm/MCA/SourceMgr.h b/llvm/include/llvm/MCA/SourceMgr.h
index 16a60d1..300961c 100644
--- a/llvm/include/llvm/MCA/SourceMgr.h
+++ b/llvm/include/llvm/MCA/SourceMgr.h
@@ -50,7 +50,7 @@ struct SourceMgr {
/// Advance to the next \a SourceRef.
virtual void updateNext() = 0;
- virtual ~SourceMgr() {}
+ virtual ~SourceMgr() = default;
};
/// The default implementation of \a SourceMgr. It always takes a fixed number
diff --git a/llvm/include/llvm/ObjCopy/ConfigManager.h b/llvm/include/llvm/ObjCopy/ConfigManager.h
index 1568799..45f847f 100644
--- a/llvm/include/llvm/ObjCopy/ConfigManager.h
+++ b/llvm/include/llvm/ObjCopy/ConfigManager.h
@@ -23,7 +23,7 @@ namespace llvm {
namespace objcopy {
struct LLVM_ABI ConfigManager : public MultiFormatConfig {
- ~ConfigManager() override {}
+ ~ConfigManager() override = default;
const CommonConfig &getCommonConfig() const override { return Common; }
diff --git a/llvm/include/llvm/ObjCopy/MultiFormatConfig.h b/llvm/include/llvm/ObjCopy/MultiFormatConfig.h
index bb93f64..91baf9b 100644
--- a/llvm/include/llvm/ObjCopy/MultiFormatConfig.h
+++ b/llvm/include/llvm/ObjCopy/MultiFormatConfig.h
@@ -24,7 +24,7 @@ struct DXContainerConfig;
class MultiFormatConfig {
public:
- virtual ~MultiFormatConfig() {}
+ virtual ~MultiFormatConfig() = default;
virtual const CommonConfig &getCommonConfig() const = 0;
virtual Expected<const ELFConfig &> getELFConfig() const = 0;
diff --git a/llvm/include/llvm/Object/ELF.h b/llvm/include/llvm/Object/ELF.h
index 03d5ee2..cc1e5f9 100644
--- a/llvm/include/llvm/Object/ELF.h
+++ b/llvm/include/llvm/Object/ELF.h
@@ -261,6 +261,8 @@ public:
ELFFile(const ELFFile &) = default;
ELFFile &operator=(const ELFFile &) = default;
+ ELFFile(ELFFile &&) = default;
+
// This is a callback that can be passed to a number of functions.
// It can be used to ignore non-critical errors (warnings), which is
// useful for dumpers, like llvm-readobj.
diff --git a/llvm/include/llvm/Object/ELFObjectFile.h b/llvm/include/llvm/Object/ELFObjectFile.h
index ced1afd..ca41357 100644
--- a/llvm/include/llvm/Object/ELFObjectFile.h
+++ b/llvm/include/llvm/Object/ELFObjectFile.h
@@ -1218,12 +1218,12 @@ ELFObjectFile<ELFT>::ELFObjectFile(MemoryBufferRef Object, ELFFile<ELFT> EF,
: ELFObjectFileBase(getELFType(ELFT::Endianness == llvm::endianness::little,
ELFT::Is64Bits),
Object),
- EF(EF), DotDynSymSec(DotDynSymSec), DotSymtabSec(DotSymtabSec),
+ EF(std::move(EF)), DotDynSymSec(DotDynSymSec), DotSymtabSec(DotSymtabSec),
DotSymtabShndxSec(DotSymtabShndx) {}
template <class ELFT>
ELFObjectFile<ELFT>::ELFObjectFile(ELFObjectFile<ELFT> &&Other)
- : ELFObjectFile(Other.Data, Other.EF, Other.DotDynSymSec,
+ : ELFObjectFile(Other.Data, std::move(Other.EF), Other.DotDynSymSec,
Other.DotSymtabSec, Other.DotSymtabShndxSec) {}
template <class ELFT>
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index b5b110d..fbfe306 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -115,7 +115,7 @@ struct RootParameterHeaderYaml {
dxbc::ShaderVisibility Visibility;
uint32_t Offset;
- RootParameterHeaderYaml(){};
+ RootParameterHeaderYaml() = default;
RootParameterHeaderYaml(dxbc::RootParameterType T) : Type(T) {}
};
@@ -123,7 +123,7 @@ struct RootParameterLocationYaml {
RootParameterHeaderYaml Header;
std::optional<size_t> IndexInSignature;
- RootParameterLocationYaml(){};
+ RootParameterLocationYaml() = default;
explicit RootParameterLocationYaml(RootParameterHeaderYaml Header)
: Header(Header) {}
};
diff --git a/llvm/include/llvm/ProfileData/DataAccessProf.h b/llvm/include/llvm/ProfileData/DataAccessProf.h
index 608306f..ea256ef 100644
--- a/llvm/include/llvm/ProfileData/DataAccessProf.h
+++ b/llvm/include/llvm/ProfileData/DataAccessProf.h
@@ -42,7 +42,7 @@ struct SourceLocation {
: FileName(FileNameRef.str()), Line(Line) {}
// Empty constructor is used in yaml conversion.
- SourceLocation() {}
+ SourceLocation() = default;
/// The filename where the data is located.
std::string FileName;
/// The line number in the source code.
diff --git a/llvm/include/llvm/SandboxIR/Context.h b/llvm/include/llvm/SandboxIR/Context.h
index 7d8b2c8..a8966db 100644
--- a/llvm/include/llvm/SandboxIR/Context.h
+++ b/llvm/include/llvm/SandboxIR/Context.h
@@ -51,7 +51,7 @@ public:
// Uses a 64-bit integer so we don't have to worry about the unlikely case
// of overflowing a 32-bit counter.
using ValTy = uint64_t;
- static constexpr const ValTy InvalidVal = 0;
+ static constexpr ValTy InvalidVal = 0;
private:
// Default initialization results in an invalid ID.
diff --git a/llvm/include/llvm/SandboxIR/Instruction.h b/llvm/include/llvm/SandboxIR/Instruction.h
index e1c1ca0..5e369a4 100644
--- a/llvm/include/llvm/SandboxIR/Instruction.h
+++ b/llvm/include/llvm/SandboxIR/Instruction.h
@@ -1866,7 +1866,7 @@ class SwitchInst : public SingleLLVMInstructionImpl<llvm::SwitchInst> {
friend class Context; // For accessing the constructor in create*()
public:
- static constexpr const unsigned DefaultPseudoIndex =
+ static constexpr unsigned DefaultPseudoIndex =
llvm::SwitchInst::DefaultPseudoIndex;
LLVM_ABI static SwitchInst *create(Value *V, BasicBlock *Dest,
diff --git a/llvm/include/llvm/SandboxIR/Pass.h b/llvm/include/llvm/SandboxIR/Pass.h
index 267389a..eb84f21 100644
--- a/llvm/include/llvm/SandboxIR/Pass.h
+++ b/llvm/include/llvm/SandboxIR/Pass.h
@@ -56,7 +56,7 @@ public:
"A pass name should not contain whitespaces!");
assert(!Name.starts_with('-') && "A pass name should not start with '-'!");
}
- virtual ~Pass() {}
+ virtual ~Pass() = default;
/// \Returns the name of the pass.
StringRef getName() const { return Name; }
#ifndef NDEBUG
diff --git a/llvm/include/llvm/SandboxIR/PassManager.h b/llvm/include/llvm/SandboxIR/PassManager.h
index 93ca710..a8117aa 100644
--- a/llvm/include/llvm/SandboxIR/PassManager.h
+++ b/llvm/include/llvm/SandboxIR/PassManager.h
@@ -59,10 +59,10 @@ public:
Passes.push_back(std::move(Pass));
}
- static constexpr const char EndToken = '\0';
- static constexpr const char BeginArgsToken = '<';
- static constexpr const char EndArgsToken = '>';
- static constexpr const char PassDelimToken = ',';
+ static constexpr char EndToken = '\0';
+ static constexpr char BeginArgsToken = '<';
+ static constexpr char EndArgsToken = '>';
+ static constexpr char PassDelimToken = ',';
/// Parses \p Pipeline as a comma-separated sequence of pass names and sets
/// the pass pipeline, using \p CreatePass to instantiate passes by name.
diff --git a/llvm/include/llvm/Support/Allocator.h b/llvm/include/llvm/Support/Allocator.h
index bc02659..fffcbd9 100644
--- a/llvm/include/llvm/Support/Allocator.h
+++ b/llvm/include/llvm/Support/Allocator.h
@@ -380,7 +380,7 @@ private:
/// The standard BumpPtrAllocator which just uses the default template
/// parameters.
-typedef BumpPtrAllocatorImpl<> BumpPtrAllocator;
+using BumpPtrAllocator = BumpPtrAllocatorImpl<>;
/// A BumpPtrAllocator that allows only elements of a specific type to be
/// allocated.
diff --git a/llvm/include/llvm/Support/Atomic.h b/llvm/include/llvm/Support/Atomic.h
index c2d9ae2..3c62672 100644
--- a/llvm/include/llvm/Support/Atomic.h
+++ b/llvm/include/llvm/Support/Atomic.h
@@ -30,9 +30,9 @@ namespace llvm {
LLVM_ABI void MemoryFence();
#ifdef _MSC_VER
- typedef long cas_flag;
+ using cas_flag = long;
#else
- typedef uint32_t cas_flag;
+ using cas_flag = uint32_t;
#endif
LLVM_ABI cas_flag CompareAndSwap(volatile cas_flag *ptr, cas_flag new_value,
cas_flag old_value);
diff --git a/llvm/include/llvm/Support/BinaryStreamArray.h b/llvm/include/llvm/Support/BinaryStreamArray.h
index ef2233c..a7d03f6 100644
--- a/llvm/include/llvm/Support/BinaryStreamArray.h
+++ b/llvm/include/llvm/Support/BinaryStreamArray.h
@@ -93,7 +93,7 @@ class VarStreamArray {
friend class VarStreamArrayIterator<ValueType, Extractor>;
public:
- typedef VarStreamArrayIterator<ValueType, Extractor> Iterator;
+ using Iterator = VarStreamArrayIterator<ValueType, Extractor>;
VarStreamArray() = default;
@@ -156,8 +156,8 @@ template <typename ValueType, typename Extractor>
class VarStreamArrayIterator
: public iterator_facade_base<VarStreamArrayIterator<ValueType, Extractor>,
std::forward_iterator_tag, const ValueType> {
- typedef VarStreamArrayIterator<ValueType, Extractor> IterType;
- typedef VarStreamArray<ValueType, Extractor> ArrayType;
+ using IterType = VarStreamArrayIterator<ValueType, Extractor>;
+ using ArrayType = VarStreamArray<ValueType, Extractor>;
public:
VarStreamArrayIterator(const ArrayType &Array, const Extractor &E,
@@ -260,7 +260,7 @@ template <typename T> class FixedStreamArray {
friend class FixedStreamArrayIterator<T>;
public:
- typedef FixedStreamArrayIterator<T> Iterator;
+ using Iterator = FixedStreamArrayIterator<T>;
FixedStreamArray() = default;
explicit FixedStreamArray(BinaryStreamRef Stream) : Stream(Stream) {
diff --git a/llvm/include/llvm/Support/Chrono.h b/llvm/include/llvm/Support/Chrono.h
index 5b8102d..e5f98249 100644
--- a/llvm/include/llvm/Support/Chrono.h
+++ b/llvm/include/llvm/Support/Chrono.h
@@ -150,10 +150,10 @@ template <> struct unit<std::nano> {
template <typename Rep, typename Period>
struct format_provider<std::chrono::duration<Rep, Period>> {
private:
- typedef std::chrono::duration<Rep, Period> Dur;
- typedef std::conditional_t<std::chrono::treat_as_floating_point<Rep>::value,
- double, intmax_t>
- InternalRep;
+ using Dur = std::chrono::duration<Rep, Period>;
+ using InternalRep =
+ std::conditional_t<std::chrono::treat_as_floating_point<Rep>::value,
+ double, intmax_t>;
template <typename AsPeriod> static InternalRep getAs(const Dur &D) {
using namespace std::chrono;
diff --git a/llvm/include/llvm/Support/CommandLine.h b/llvm/include/llvm/Support/CommandLine.h
index 5a5f00e..d737fbc 100644
--- a/llvm/include/llvm/Support/CommandLine.h
+++ b/llvm/include/llvm/Support/CommandLine.h
@@ -2099,7 +2099,7 @@ getRegisteredOptions(SubCommand &Sub = SubCommand::getTopLevel());
///
/// This interface is useful for defining subcommands in libraries and
/// the dispatch from a single point (like in the main function).
-LLVM_ABI iterator_range<typename SmallPtrSet<SubCommand *, 4>::iterator>
+LLVM_ABI iterator_range<SmallPtrSet<SubCommand *, 4>::iterator>
getRegisteredSubcommands();
//===----------------------------------------------------------------------===//
diff --git a/llvm/include/llvm/Support/ConvertUTF.h b/llvm/include/llvm/Support/ConvertUTF.h
index bb17235..ddf7057 100644
--- a/llvm/include/llvm/Support/ConvertUTF.h
+++ b/llvm/include/llvm/Support/ConvertUTF.h
@@ -126,10 +126,10 @@ namespace llvm {
bit mask & shift operations.
------------------------------------------------------------------------ */
-typedef unsigned int UTF32; /* at least 32 bits */
-typedef unsigned short UTF16; /* at least 16 bits */
-typedef unsigned char UTF8; /* typically 8 bits */
-typedef unsigned char Boolean; /* 0 or 1 */
+using UTF32 = unsigned int; /* at least 32 bits */
+using UTF16 = unsigned short; /* at least 16 bits */
+using UTF8 = unsigned char; /* typically 8 bits */
+using Boolean = unsigned char; /* 0 or 1 */
/* Some fundamental constants */
#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD
@@ -146,17 +146,14 @@ typedef unsigned char Boolean; /* 0 or 1 */
#define UNI_UTF32_BYTE_ORDER_MARK_NATIVE 0x0000FEFF
#define UNI_UTF32_BYTE_ORDER_MARK_SWAPPED 0xFFFE0000
-typedef enum {
- conversionOK, /* conversion successful */
- sourceExhausted, /* partial character in source, but hit end */
- targetExhausted, /* insuff. room in target for conversion */
- sourceIllegal /* source sequence is illegal/malformed */
-} ConversionResult;
-
-typedef enum {
- strictConversion = 0,
- lenientConversion
-} ConversionFlags;
+enum ConversionResult {
+ conversionOK, /* conversion successful */
+ sourceExhausted, /* partial character in source, but hit end */
+ targetExhausted, /* insuff. room in target for conversion */
+ sourceIllegal /* source sequence is illegal/malformed */
+};
+
+enum ConversionFlags { strictConversion = 0, lenientConversion };
LLVM_ABI ConversionResult ConvertUTF8toUTF16(const UTF8 **sourceStart,
const UTF8 *sourceEnd,
diff --git a/llvm/include/llvm/Support/DebugCounter.h b/llvm/include/llvm/Support/DebugCounter.h
index 39a08d4..9904a0d 100644
--- a/llvm/include/llvm/Support/DebugCounter.h
+++ b/llvm/include/llvm/Support/DebugCounter.h
@@ -140,7 +140,7 @@ public:
}
// Iterate through the registered counters
- typedef UniqueVector<std::string> CounterVector;
+ using CounterVector = UniqueVector<std::string>;
CounterVector::const_iterator begin() const {
return RegisteredCounters.begin();
}
diff --git a/llvm/include/llvm/Support/ErrorHandling.h b/llvm/include/llvm/Support/ErrorHandling.h
index 4c17b6e8..a4fd008 100644
--- a/llvm/include/llvm/Support/ErrorHandling.h
+++ b/llvm/include/llvm/Support/ErrorHandling.h
@@ -21,8 +21,8 @@ class StringRef;
class Twine;
/// An error handler callback.
-typedef void (*fatal_error_handler_t)(void *user_data, const char *reason,
- bool gen_crash_diag);
+using fatal_error_handler_t = void (*)(void *user_data, const char *reason,
+ bool gen_crash_diag);
/// install_fatal_error_handler - Installs a new error handler to be used
/// whenever a serious (non-recoverable) error is encountered by LLVM.
diff --git a/llvm/include/llvm/Support/FormatVariadicDetails.h b/llvm/include/llvm/Support/FormatVariadicDetails.h
index 0fdc7b6..c0b245e 100644
--- a/llvm/include/llvm/Support/FormatVariadicDetails.h
+++ b/llvm/include/llvm/Support/FormatVariadicDetails.h
@@ -63,8 +63,8 @@ template <typename T> class missing_format_adapter;
template <class T> class has_FormatProvider {
public:
using Decayed = std::decay_t<T>;
- typedef void (*Signature_format)(const Decayed &, llvm::raw_ostream &,
- StringRef);
+ using Signature_format = void (*)(const Decayed &, llvm::raw_ostream &,
+ StringRef);
template <typename U> using check = SameType<Signature_format, &U::format>;
diff --git a/llvm/include/llvm/Support/GenericLoopInfo.h b/llvm/include/llvm/Support/GenericLoopInfo.h
index b6bb360..9e2f61f 100644
--- a/llvm/include/llvm/Support/GenericLoopInfo.h
+++ b/llvm/include/llvm/Support/GenericLoopInfo.h
@@ -150,9 +150,9 @@ public:
assert(!isInvalid() && "Loop not in a valid state!");
return SubLoops;
}
- typedef typename std::vector<LoopT *>::const_iterator iterator;
- typedef
- typename std::vector<LoopT *>::const_reverse_iterator reverse_iterator;
+ using iterator = typename std::vector<LoopT *>::const_iterator;
+ using reverse_iterator =
+ typename std::vector<LoopT *>::const_reverse_iterator;
iterator begin() const { return getSubLoops().begin(); }
iterator end() const { return getSubLoops().end(); }
reverse_iterator rbegin() const { return getSubLoops().rbegin(); }
@@ -174,7 +174,7 @@ public:
assert(!isInvalid() && "Loop not in a valid state!");
return Blocks;
}
- typedef typename ArrayRef<BlockT *>::const_iterator block_iterator;
+ using block_iterator = typename ArrayRef<BlockT *>::const_iterator;
block_iterator block_begin() const { return getBlocks().begin(); }
block_iterator block_end() const { return getBlocks().end(); }
inline iterator_range<block_iterator> blocks() const {
@@ -302,7 +302,7 @@ public:
bool hasNoExitBlocks() const;
/// Edge type.
- typedef std::pair<BlockT *, BlockT *> Edge;
+ using Edge = std::pair<BlockT *, BlockT *>;
/// Return all pairs of (_inside_block_,_outside_block_).
void getExitEdges(SmallVectorImpl<Edge> &ExitEdges) const;
@@ -575,9 +575,9 @@ public:
/// iterator/begin/end - The interface to the top-level loops in the current
/// function.
///
- typedef typename std::vector<LoopT *>::const_iterator iterator;
- typedef
- typename std::vector<LoopT *>::const_reverse_iterator reverse_iterator;
+ using iterator = typename std::vector<LoopT *>::const_iterator;
+ using reverse_iterator =
+ typename std::vector<LoopT *>::const_reverse_iterator;
iterator begin() const { return TopLevelLoops.begin(); }
iterator end() const { return TopLevelLoops.end(); }
reverse_iterator rbegin() const { return TopLevelLoops.rbegin(); }
diff --git a/llvm/include/llvm/Support/GenericLoopInfoImpl.h b/llvm/include/llvm/Support/GenericLoopInfoImpl.h
index 5416780..c830f0a 100644
--- a/llvm/include/llvm/Support/GenericLoopInfoImpl.h
+++ b/llvm/include/llvm/Support/GenericLoopInfoImpl.h
@@ -459,7 +459,7 @@ template <class BlockT, class LoopT>
static void discoverAndMapSubloop(LoopT *L, ArrayRef<BlockT *> Backedges,
LoopInfoBase<BlockT, LoopT> *LI,
const DomTreeBase<BlockT> &DomTree) {
- typedef GraphTraits<Inverse<BlockT *>> InvBlockTraits;
+ using InvBlockTraits = GraphTraits<Inverse<BlockT *>>;
unsigned NumBlocks = 0;
unsigned NumSubloops = 0;
@@ -513,8 +513,8 @@ static void discoverAndMapSubloop(LoopT *L, ArrayRef<BlockT *> Backedges,
/// Populate all loop data in a stable order during a single forward DFS.
template <class BlockT, class LoopT> class PopulateLoopsDFS {
- typedef GraphTraits<BlockT *> BlockTraits;
- typedef typename BlockTraits::ChildIteratorType SuccIterTy;
+ using BlockTraits = GraphTraits<BlockT *>;
+ using SuccIterTy = typename BlockTraits::ChildIteratorType;
LoopInfoBase<BlockT, LoopT> *LI;
diff --git a/llvm/include/llvm/Support/JSON.h b/llvm/include/llvm/Support/JSON.h
index a973c56..37baa7b 100644
--- a/llvm/include/llvm/Support/JSON.h
+++ b/llvm/include/llvm/Support/JSON.h
@@ -318,7 +318,7 @@ public:
Value(std::string V) : Type(T_String) {
if (LLVM_UNLIKELY(!isUTF8(V))) {
assert(false && "Invalid UTF-8 in value used as JSON");
- V = fixUTF8(std::move(V));
+ V = fixUTF8(V);
}
create<std::string>(std::move(V));
}
@@ -549,10 +549,10 @@ inline const Value &Array::back() const { return V.back(); }
inline Value *Array::data() { return V.data(); }
inline const Value *Array::data() const { return V.data(); }
-inline typename Array::iterator Array::begin() { return V.begin(); }
-inline typename Array::const_iterator Array::begin() const { return V.begin(); }
-inline typename Array::iterator Array::end() { return V.end(); }
-inline typename Array::const_iterator Array::end() const { return V.end(); }
+inline Array::iterator Array::begin() { return V.begin(); }
+inline Array::const_iterator Array::begin() const { return V.begin(); }
+inline Array::iterator Array::end() { return V.end(); }
+inline Array::const_iterator Array::end() const { return V.end(); }
inline bool Array::empty() const { return V.empty(); }
inline size_t Array::size() const { return V.size(); }
@@ -565,18 +565,18 @@ template <typename... Args> inline void Array::emplace_back(Args &&...A) {
V.emplace_back(std::forward<Args>(A)...);
}
inline void Array::pop_back() { V.pop_back(); }
-inline typename Array::iterator Array::insert(const_iterator P, const Value &E) {
+inline Array::iterator Array::insert(const_iterator P, const Value &E) {
return V.insert(P, E);
}
-inline typename Array::iterator Array::insert(const_iterator P, Value &&E) {
+inline Array::iterator Array::insert(const_iterator P, Value &&E) {
return V.insert(P, std::move(E));
}
template <typename It>
-inline typename Array::iterator Array::insert(const_iterator P, It A, It Z) {
+inline Array::iterator Array::insert(const_iterator P, It A, It Z) {
return V.insert(P, A, Z);
}
template <typename... Args>
-inline typename Array::iterator Array::emplace(const_iterator P, Args &&...A) {
+inline Array::iterator Array::emplace(const_iterator P, Args &&...A) {
return V.emplace(P, std::forward<Args>(A)...);
}
inline bool operator==(const Array &L, const Array &R) { return L.V == R.V; }
@@ -591,7 +591,7 @@ public:
ObjectKey(std::string S) : Owned(new std::string(std::move(S))) {
if (LLVM_UNLIKELY(!isUTF8(*Owned))) {
assert(false && "Invalid UTF-8 in value used as JSON");
- *Owned = fixUTF8(std::move(*Owned));
+ *Owned = fixUTF8(*Owned);
}
Data = *Owned;
}
diff --git a/llvm/include/llvm/Support/MD5.h b/llvm/include/llvm/Support/MD5.h
index 4ba3867..dbcb66d 100644
--- a/llvm/include/llvm/Support/MD5.h
+++ b/llvm/include/llvm/Support/MD5.h
@@ -90,7 +90,7 @@ public:
private:
// Any 32-bit or wider unsigned integer data type will do.
- typedef uint32_t MD5_u32plus;
+ using MD5_u32plus = uint32_t;
// Internal State
struct {
diff --git a/llvm/include/llvm/Support/Mutex.h b/llvm/include/llvm/Support/Mutex.h
index d61e3fd..3ca5c9a 100644
--- a/llvm/include/llvm/Support/Mutex.h
+++ b/llvm/include/llvm/Support/Mutex.h
@@ -63,12 +63,12 @@ namespace llvm
};
/// Mutex - A standard, always enforced mutex.
- typedef SmartMutex<false> Mutex;
+ using Mutex = SmartMutex<false>;
template <bool mt_only>
using SmartScopedLock = std::lock_guard<SmartMutex<mt_only>>;
- typedef SmartScopedLock<false> ScopedLock;
+ using ScopedLock = SmartScopedLock<false>;
}
}
diff --git a/llvm/include/llvm/Support/OnDiskHashTable.h b/llvm/include/llvm/Support/OnDiskHashTable.h
index d7d72cf..54c6b71 100644
--- a/llvm/include/llvm/Support/OnDiskHashTable.h
+++ b/llvm/include/llvm/Support/OnDiskHashTable.h
@@ -69,7 +69,7 @@ template <typename Info> class OnDiskChainedHashTableGenerator {
: Key(Key), Data(Data), Next(nullptr), Hash(InfoObj.ComputeHash(Key)) {}
};
- typedef typename Info::offset_type offset_type;
+ using offset_type = typename Info::offset_type;
offset_type NumBuckets;
offset_type NumEntries;
llvm::SpecificBumpPtrAllocator<Item> BA;
@@ -278,12 +278,12 @@ template <typename Info> class OnDiskChainedHashTable {
Info InfoObj;
public:
- typedef Info InfoType;
- typedef typename Info::internal_key_type internal_key_type;
- typedef typename Info::external_key_type external_key_type;
- typedef typename Info::data_type data_type;
- typedef typename Info::hash_value_type hash_value_type;
- typedef typename Info::offset_type offset_type;
+ using InfoType = Info;
+ using internal_key_type = typename Info::internal_key_type;
+ using external_key_type = typename Info::external_key_type;
+ using data_type = typename Info::data_type;
+ using hash_value_type = typename Info::hash_value_type;
+ using offset_type = typename Info::offset_type;
OnDiskChainedHashTable(offset_type NumBuckets, offset_type NumEntries,
const unsigned char *Buckets,
@@ -435,12 +435,12 @@ class OnDiskIterableChainedHashTable : public OnDiskChainedHashTable<Info> {
const unsigned char *Payload;
public:
- typedef OnDiskChainedHashTable<Info> base_type;
- typedef typename base_type::internal_key_type internal_key_type;
- typedef typename base_type::external_key_type external_key_type;
- typedef typename base_type::data_type data_type;
- typedef typename base_type::hash_value_type hash_value_type;
- typedef typename base_type::offset_type offset_type;
+ using base_type = OnDiskChainedHashTable<Info>;
+ using internal_key_type = typename base_type::internal_key_type;
+ using external_key_type = typename base_type::external_key_type;
+ using data_type = typename base_type::data_type;
+ using hash_value_type = typename base_type::hash_value_type;
+ using offset_type = typename base_type::offset_type;
private:
/// Iterates over all of the keys in the table.
@@ -450,7 +450,7 @@ private:
offset_type NumEntriesLeft;
public:
- typedef external_key_type value_type;
+ using value_type = external_key_type;
iterator_base(const unsigned char *const Ptr, offset_type NumEntries)
: Ptr(Ptr), NumItemsInBucketLeft(0), NumEntriesLeft(NumEntries) {}
@@ -505,7 +505,7 @@ public:
Info *InfoObj;
public:
- typedef external_key_type value_type;
+ using value_type = external_key_type;
key_iterator(const unsigned char *const Ptr, offset_type NumEntries,
Info *InfoObj)
@@ -551,7 +551,7 @@ public:
Info *InfoObj;
public:
- typedef data_type value_type;
+ using value_type = data_type;
data_iterator(const unsigned char *const Ptr, offset_type NumEntries,
Info *InfoObj)
diff --git a/llvm/include/llvm/Support/PointerLikeTypeTraits.h b/llvm/include/llvm/Support/PointerLikeTypeTraits.h
index 320f6b6..a47d684 100644
--- a/llvm/include/llvm/Support/PointerLikeTypeTraits.h
+++ b/llvm/include/llvm/Support/PointerLikeTypeTraits.h
@@ -70,7 +70,7 @@ template <> struct PointerLikeTypeTraits<void *> {
// Provide PointerLikeTypeTraits for const things.
template <typename T> struct PointerLikeTypeTraits<const T> {
- typedef PointerLikeTypeTraits<T> NonConst;
+ using NonConst = PointerLikeTypeTraits<T>;
static inline const void *getAsVoidPointer(const T P) {
return NonConst::getAsVoidPointer(P);
@@ -83,7 +83,7 @@ template <typename T> struct PointerLikeTypeTraits<const T> {
// Provide PointerLikeTypeTraits for const pointers.
template <typename T> struct PointerLikeTypeTraits<const T *> {
- typedef PointerLikeTypeTraits<T *> NonConst;
+ using NonConst = PointerLikeTypeTraits<T *>;
static inline const void *getAsVoidPointer(const T *P) {
return NonConst::getAsVoidPointer(const_cast<T *>(P));
diff --git a/llvm/include/llvm/Support/Program.h b/llvm/include/llvm/Support/Program.h
index 53c2e75..575e416 100644
--- a/llvm/include/llvm/Support/Program.h
+++ b/llvm/include/llvm/Support/Program.h
@@ -39,8 +39,8 @@ const char EnvPathSeparator = ';';
typedef unsigned long procid_t; // Must match the type of DWORD on Windows.
typedef void *process_t; // Must match the type of HANDLE on Windows.
#else
-typedef ::pid_t procid_t;
-typedef procid_t process_t;
+using procid_t = ::pid_t;
+using process_t = procid_t;
#endif
/// This struct encapsulates information about a process.
diff --git a/llvm/include/llvm/Support/RISCVISAUtils.h b/llvm/include/llvm/Support/RISCVISAUtils.h
index 165bb08..05fd32e 100644
--- a/llvm/include/llvm/Support/RISCVISAUtils.h
+++ b/llvm/include/llvm/Support/RISCVISAUtils.h
@@ -40,8 +40,8 @@ struct ExtensionComparator {
/// OrderedExtensionMap is std::map, it's specialized to keep entries
/// in canonical order of extension.
-typedef std::map<std::string, ExtensionVersion, ExtensionComparator>
- OrderedExtensionMap;
+using OrderedExtensionMap =
+ std::map<std::string, ExtensionVersion, ExtensionComparator>;
} // namespace RISCVISAUtils
diff --git a/llvm/include/llvm/Support/RWMutex.h b/llvm/include/llvm/Support/RWMutex.h
index 8d221aa..efc1ca1 100644
--- a/llvm/include/llvm/Support/RWMutex.h
+++ b/llvm/include/llvm/Support/RWMutex.h
@@ -162,7 +162,7 @@ public:
bool try_lock() { return impl.try_lock(); }
};
-typedef SmartRWMutex<false> RWMutex;
+using RWMutex = SmartRWMutex<false>;
/// ScopedReader - RAII acquisition of a reader lock
#if !defined(LLVM_USE_RW_MUTEX_IMPL)
@@ -179,7 +179,7 @@ template <bool mt_only> struct SmartScopedReader {
~SmartScopedReader() { mutex.unlock_shared(); }
};
#endif
-typedef SmartScopedReader<false> ScopedReader;
+using ScopedReader = SmartScopedReader<false>;
/// ScopedWriter - RAII acquisition of a writer lock
#if !defined(LLVM_USE_RW_MUTEX_IMPL)
@@ -196,7 +196,7 @@ template <bool mt_only> struct SmartScopedWriter {
~SmartScopedWriter() { mutex.unlock(); }
};
#endif
-typedef SmartScopedWriter<false> ScopedWriter;
+using ScopedWriter = SmartScopedWriter<false>;
} // end namespace sys
} // end namespace llvm
diff --git a/llvm/include/llvm/Support/Registry.h b/llvm/include/llvm/Support/Registry.h
index c02f15e..acd3b06 100644
--- a/llvm/include/llvm/Support/Registry.h
+++ b/llvm/include/llvm/Support/Registry.h
@@ -43,8 +43,8 @@ namespace llvm {
template <typename T>
class Registry {
public:
- typedef T type;
- typedef SimpleRegistryEntry<T> entry;
+ using type = T;
+ using entry = SimpleRegistryEntry<T>;
class node;
class iterator;
diff --git a/llvm/include/llvm/Support/ScaledNumber.h b/llvm/include/llvm/Support/ScaledNumber.h
index 07baf15..8ca8d457e 100644
--- a/llvm/include/llvm/Support/ScaledNumber.h
+++ b/llvm/include/llvm/Support/ScaledNumber.h
@@ -498,10 +498,10 @@ public:
static_assert(!std::numeric_limits<DigitsT>::is_signed,
"only unsigned floats supported");
- typedef DigitsT DigitsType;
+ using DigitsType = DigitsT;
private:
- typedef std::numeric_limits<DigitsType> DigitsLimits;
+ using DigitsLimits = std::numeric_limits<DigitsType>;
static constexpr int Width = sizeof(DigitsType) * 8;
static_assert(Width <= 64, "invalid integer width for digits");
@@ -782,7 +782,7 @@ uint64_t ScaledNumber<DigitsT>::scale(uint64_t N) const {
template <class DigitsT>
template <class IntT>
IntT ScaledNumber<DigitsT>::toInt() const {
- typedef std::numeric_limits<IntT> Limits;
+ using Limits = std::numeric_limits<IntT>;
if (*this < 1)
return 0;
if (*this >= Limits::max())
diff --git a/llvm/include/llvm/Support/SuffixTree.h b/llvm/include/llvm/Support/SuffixTree.h
index 4c78235..eac66d8 100644
--- a/llvm/include/llvm/Support/SuffixTree.h
+++ b/llvm/include/llvm/Support/SuffixTree.h
@@ -219,7 +219,7 @@ public:
}
};
- typedef RepeatedSubstringIterator iterator;
+ using iterator = RepeatedSubstringIterator;
iterator begin() { return iterator(Root, LeafNodes); }
iterator end() { return iterator(nullptr); }
};
diff --git a/llvm/include/llvm/Support/Threading.h b/llvm/include/llvm/Support/Threading.h
index 8884680..89d90b3 100644
--- a/llvm/include/llvm/Support/Threading.h
+++ b/llvm/include/llvm/Support/Threading.h
@@ -53,7 +53,7 @@ constexpr bool llvm_is_multithreaded() { return LLVM_ENABLE_THREADS; }
#if LLVM_THREADING_USE_STD_CALL_ONCE
- typedef std::once_flag once_flag;
+using once_flag = std::once_flag;
#else
diff --git a/llvm/include/llvm/Support/TrailingObjects.h b/llvm/include/llvm/Support/TrailingObjects.h
index c479765..218c2e3 100644
--- a/llvm/include/llvm/Support/TrailingObjects.h
+++ b/llvm/include/llvm/Support/TrailingObjects.h
@@ -76,7 +76,7 @@ protected:
// number of a different type. e.g.:
// ExtractSecondType<Foo..., int>::type
template <typename Ty1, typename Ty2> struct ExtractSecondType {
- typedef Ty2 type;
+ using type = Ty2;
};
// TrailingObjectsImpl is somewhat complicated, because it is a
@@ -101,8 +101,8 @@ class TrailingObjectsImpl<Align, BaseTy, TopTrailingObj, PrevTy, NextTy,
: public TrailingObjectsImpl<Align, BaseTy, TopTrailingObj, NextTy,
MoreTys...> {
- typedef TrailingObjectsImpl<Align, BaseTy, TopTrailingObj, NextTy, MoreTys...>
- ParentType;
+ using ParentType =
+ TrailingObjectsImpl<Align, BaseTy, TopTrailingObj, NextTy, MoreTys...>;
struct RequiresRealignment {
static const bool value = alignof(PrevTy) < alignof(NextTy);
diff --git a/llvm/include/llvm/Support/UnicodeCharRanges.h b/llvm/include/llvm/Support/UnicodeCharRanges.h
index 7f1a9b3..2b5fc83 100644
--- a/llvm/include/llvm/Support/UnicodeCharRanges.h
+++ b/llvm/include/llvm/Support/UnicodeCharRanges.h
@@ -37,7 +37,7 @@ inline bool operator<(UnicodeCharRange Range, uint32_t Value) {
/// array.
class UnicodeCharSet {
public:
- typedef ArrayRef<UnicodeCharRange> CharRanges;
+ using CharRanges = ArrayRef<UnicodeCharRange>;
/// Constructs a UnicodeCharSet instance from an array of
/// UnicodeCharRanges.
diff --git a/llvm/include/llvm/Support/float128.h b/llvm/include/llvm/Support/float128.h
index e15a98d..ffad124 100644
--- a/llvm/include/llvm/Support/float128.h
+++ b/llvm/include/llvm/Support/float128.h
@@ -14,7 +14,7 @@ namespace llvm {
#if defined(__clang__) && defined(__FLOAT128__) && \
defined(__SIZEOF_INT128__) && !defined(__LONG_DOUBLE_IBM128__)
#define HAS_IEE754_FLOAT128
-typedef __float128 float128;
+using float128 = __float128;
#elif defined(__FLOAT128__) && defined(__SIZEOF_INT128__) && \
!defined(__LONG_DOUBLE_IBM128__) && \
(defined(__GNUC__) || defined(__GNUG__))
diff --git a/llvm/include/llvm/Support/thread.h b/llvm/include/llvm/Support/thread.h
index 16e322b..ecde62d 100644
--- a/llvm/include/llvm/Support/thread.h
+++ b/llvm/include/llvm/Support/thread.h
@@ -127,7 +127,7 @@ LLVM_ABI thread::id llvm_thread_get_current_id_impl();
template <class Function, class... Args>
thread::thread(std::optional<unsigned> StackSizeInBytes, Function &&f,
Args &&...args) {
- typedef std::tuple<std::decay_t<Function>, std::decay_t<Args>...> CalleeTuple;
+ using CalleeTuple = std::tuple<std::decay_t<Function>, std::decay_t<Args>...>;
std::unique_ptr<CalleeTuple> Callee(
new CalleeTuple(std::forward<Function>(f), std::forward<Args>(args)...));
diff --git a/llvm/include/llvm/Transforms/Coroutines/CoroAnnotationElide.h b/llvm/include/llvm/Transforms/Coroutines/CoroAnnotationElide.h
index 352c9e14..2061098 100644
--- a/llvm/include/llvm/Transforms/Coroutines/CoroAnnotationElide.h
+++ b/llvm/include/llvm/Transforms/Coroutines/CoroAnnotationElide.h
@@ -24,7 +24,7 @@
namespace llvm {
struct CoroAnnotationElidePass : PassInfoMixin<CoroAnnotationElidePass> {
- CoroAnnotationElidePass() {}
+ CoroAnnotationElidePass() = default;
PreservedAnalyses run(LazyCallGraph::SCC &C, CGSCCAnalysisManager &AM,
LazyCallGraph &CG, CGSCCUpdateResult &UR);
diff --git a/llvm/include/llvm/Transforms/IPO/FatLTOCleanup.h b/llvm/include/llvm/Transforms/IPO/FatLTOCleanup.h
index 17eab85..6fc1b262 100644
--- a/llvm/include/llvm/Transforms/IPO/FatLTOCleanup.h
+++ b/llvm/include/llvm/Transforms/IPO/FatLTOCleanup.h
@@ -26,7 +26,7 @@ class ModuleSummaryIndex;
class FatLtoCleanup : public PassInfoMixin<FatLtoCleanup> {
public:
- FatLtoCleanup() {}
+ FatLtoCleanup() = default;
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
static bool isRequired() { return true; }
};
diff --git a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Legality.h b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Legality.h
index 96a2348..3d76cda 100644
--- a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Legality.h
+++ b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Legality.h
@@ -167,7 +167,7 @@ protected:
LegalityResult &operator=(const LegalityResult &) = delete;
public:
- virtual ~LegalityResult() {}
+ virtual ~LegalityResult() = default;
LegalityResultID getSubclassID() const { return ID; }
#ifndef NDEBUG
virtual void print(raw_ostream &OS) const {
diff --git a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/SeedCollector.h b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/SeedCollector.h
index b289520..821382b 100644
--- a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/SeedCollector.h
+++ b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/SeedCollector.h
@@ -36,7 +36,7 @@ public:
/// No need to allow copies.
SeedBundle(const SeedBundle &) = delete;
SeedBundle &operator=(const SeedBundle &) = delete;
- virtual ~SeedBundle() {}
+ virtual ~SeedBundle() = default;
using iterator = SmallVector<Instruction *>::iterator;
using const_iterator = SmallVector<Instruction *>::const_iterator;
diff --git a/llvm/lib/Analysis/AliasAnalysis.cpp b/llvm/lib/Analysis/AliasAnalysis.cpp
index f2dc25f..26a5602 100644
--- a/llvm/lib/Analysis/AliasAnalysis.cpp
+++ b/llvm/lib/Analysis/AliasAnalysis.cpp
@@ -75,7 +75,7 @@ AAResults::AAResults(const TargetLibraryInfo &TLI) : TLI(TLI) {}
AAResults::AAResults(AAResults &&Arg)
: TLI(Arg.TLI), AAs(std::move(Arg.AAs)), AADeps(std::move(Arg.AADeps)) {}
-AAResults::~AAResults() {}
+AAResults::~AAResults() = default;
bool AAResults::invalidate(Function &F, const PreservedAnalyses &PA,
FunctionAnalysisManager::Invalidator &Inv) {
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index c9baeda..a31f17b 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -2424,10 +2424,10 @@ ScalarEvolution::getStrengthenedNoWrapFlagsFromBinOp(
// We're trying to construct a SCEV of type `Type' with `Ops' as operands and
// `OldFlags' as can't-wrap behavior. Infer a more aggressive set of
// can't-overflow flags for the operation if possible.
-static SCEV::NoWrapFlags
-StrengthenNoWrapFlags(ScalarEvolution *SE, SCEVTypes Type,
- const ArrayRef<const SCEV *> Ops,
- SCEV::NoWrapFlags Flags) {
+static SCEV::NoWrapFlags StrengthenNoWrapFlags(ScalarEvolution *SE,
+ SCEVTypes Type,
+ ArrayRef<const SCEV *> Ops,
+ SCEV::NoWrapFlags Flags) {
using namespace std::placeholders;
using OBO = OverflowingBinaryOperator;
@@ -2540,7 +2540,7 @@ const SCEV *ScalarEvolution::getAddExpr(SmallVectorImpl<const SCEV *> &Ops,
unsigned Idx = isa<SCEVConstant>(Ops[0]) ? 1 : 0;
// Delay expensive flag strengthening until necessary.
- auto ComputeFlags = [this, OrigFlags](const ArrayRef<const SCEV *> Ops) {
+ auto ComputeFlags = [this, OrigFlags](ArrayRef<const SCEV *> Ops) {
return StrengthenNoWrapFlags(this, scAddExpr, Ops, OrigFlags);
};
@@ -3125,7 +3125,7 @@ const SCEV *ScalarEvolution::getMulExpr(SmallVectorImpl<const SCEV *> &Ops,
return Folded;
// Delay expensive flag strengthening until necessary.
- auto ComputeFlags = [this, OrigFlags](const ArrayRef<const SCEV *> Ops) {
+ auto ComputeFlags = [this, OrigFlags](ArrayRef<const SCEV *> Ops) {
return StrengthenNoWrapFlags(this, scMulExpr, Ops, OrigFlags);
};
@@ -15510,6 +15510,78 @@ static const SCEV *getNextSCEVDivisibleByDivisor(const SCEV *Expr,
return SE.getConstant(*ExprVal + DivisorVal - Rem);
}
+static bool collectDivisibilityInformation(
+ ICmpInst::Predicate Predicate, const SCEV *LHS, const SCEV *RHS,
+ DenseMap<const SCEV *, const SCEV *> &DivInfo,
+ DenseMap<const SCEV *, APInt> &Multiples, ScalarEvolution &SE) {
+ // If we have LHS == 0, check if LHS is computing a property of some unknown
+ // SCEV %v which we can rewrite %v to express explicitly.
+ if (Predicate != CmpInst::ICMP_EQ || !match(RHS, m_scev_Zero()))
+ return false;
+ // If LHS is A % B, i.e. A % B == 0, rewrite A to (A /u B) * B to
+ // explicitly express that.
+ const SCEVUnknown *URemLHS = nullptr;
+ const SCEV *URemRHS = nullptr;
+ if (!match(LHS, m_scev_URem(m_SCEVUnknown(URemLHS), m_SCEV(URemRHS), SE)))
+ return false;
+
+ const SCEV *Multiple =
+ SE.getMulExpr(SE.getUDivExpr(URemLHS, URemRHS), URemRHS);
+ DivInfo[URemLHS] = Multiple;
+ if (auto *C = dyn_cast<SCEVConstant>(URemRHS))
+ Multiples[URemLHS] = C->getAPInt();
+ return true;
+}
+
+// Check if the condition is a divisibility guard (A % B == 0).
+static bool isDivisibilityGuard(const SCEV *LHS, const SCEV *RHS,
+ ScalarEvolution &SE) {
+ const SCEV *X, *Y;
+ return match(LHS, m_scev_URem(m_SCEV(X), m_SCEV(Y), SE)) && RHS->isZero();
+}
+
+// Apply divisibility by \p Divisor on MinMaxExpr with constant values,
+// recursively. This is done by aligning up/down the constant value to the
+// Divisor.
+static const SCEV *applyDivisibilityOnMinMaxExpr(const SCEV *MinMaxExpr,
+ APInt Divisor,
+ ScalarEvolution &SE) {
+ // Return true if \p Expr is a MinMax SCEV expression with a non-negative
+ // constant operand. If so, return in \p SCTy the SCEV type and in \p RHS
+ // the non-constant operand and in \p LHS the constant operand.
+ auto IsMinMaxSCEVWithNonNegativeConstant =
+ [&](const SCEV *Expr, SCEVTypes &SCTy, const SCEV *&LHS,
+ const SCEV *&RHS) {
+ if (auto *MinMax = dyn_cast<SCEVMinMaxExpr>(Expr)) {
+ if (MinMax->getNumOperands() != 2)
+ return false;
+ if (auto *C = dyn_cast<SCEVConstant>(MinMax->getOperand(0))) {
+ if (C->getAPInt().isNegative())
+ return false;
+ SCTy = MinMax->getSCEVType();
+ LHS = MinMax->getOperand(0);
+ RHS = MinMax->getOperand(1);
+ return true;
+ }
+ }
+ return false;
+ };
+
+ const SCEV *MinMaxLHS = nullptr, *MinMaxRHS = nullptr;
+ SCEVTypes SCTy;
+ if (!IsMinMaxSCEVWithNonNegativeConstant(MinMaxExpr, SCTy, MinMaxLHS,
+ MinMaxRHS))
+ return MinMaxExpr;
+ auto IsMin = isa<SCEVSMinExpr>(MinMaxExpr) || isa<SCEVUMinExpr>(MinMaxExpr);
+ assert(SE.isKnownNonNegative(MinMaxLHS) && "Expected non-negative operand!");
+ auto *DivisibleExpr =
+ IsMin ? getPreviousSCEVDivisibleByDivisor(MinMaxLHS, Divisor, SE)
+ : getNextSCEVDivisibleByDivisor(MinMaxLHS, Divisor, SE);
+ SmallVector<const SCEV *> Ops = {
+ applyDivisibilityOnMinMaxExpr(MinMaxRHS, Divisor, SE), DivisibleExpr};
+ return SE.getMinMaxExpr(SCTy, Ops);
+}
+
void ScalarEvolution::LoopGuards::collectFromBlock(
ScalarEvolution &SE, ScalarEvolution::LoopGuards &Guards,
const BasicBlock *Block, const BasicBlock *Pred,
@@ -15520,19 +15592,13 @@ void ScalarEvolution::LoopGuards::collectFromBlock(
SmallVector<const SCEV *> ExprsToRewrite;
auto CollectCondition = [&](ICmpInst::Predicate Predicate, const SCEV *LHS,
const SCEV *RHS,
- DenseMap<const SCEV *, const SCEV *>
- &RewriteMap) {
+ DenseMap<const SCEV *, const SCEV *> &RewriteMap,
+ const LoopGuards &DivGuards) {
// WARNING: It is generally unsound to apply any wrap flags to the proposed
// replacement SCEV which isn't directly implied by the structure of that
// SCEV. In particular, using contextual facts to imply flags is *NOT*
// legal. See the scoping rules for flags in the header to understand why.
- // If LHS is a constant, apply information to the other expression.
- if (isa<SCEVConstant>(LHS)) {
- std::swap(LHS, RHS);
- Predicate = CmpInst::getSwappedPredicate(Predicate);
- }
-
// Check for a condition of the form (-C1 + X < C2). InstCombine will
// create this form when combining two checks of the form (X u< C2 + C1) and
// (X >=u C1).
@@ -15565,67 +15631,6 @@ void ScalarEvolution::LoopGuards::collectFromBlock(
if (MatchRangeCheckIdiom())
return;
- // Return true if \p Expr is a MinMax SCEV expression with a non-negative
- // constant operand. If so, return in \p SCTy the SCEV type and in \p RHS
- // the non-constant operand and in \p LHS the constant operand.
- auto IsMinMaxSCEVWithNonNegativeConstant =
- [&](const SCEV *Expr, SCEVTypes &SCTy, const SCEV *&LHS,
- const SCEV *&RHS) {
- const APInt *C;
- SCTy = Expr->getSCEVType();
- return match(Expr, m_scev_MinMax(m_SCEV(LHS), m_SCEV(RHS))) &&
- match(LHS, m_scev_APInt(C)) && C->isNonNegative();
- };
-
- // Apply divisibilty by \p Divisor on MinMaxExpr with constant values,
- // recursively. This is done by aligning up/down the constant value to the
- // Divisor.
- std::function<const SCEV *(const SCEV *, const SCEV *)>
- ApplyDivisibiltyOnMinMaxExpr = [&](const SCEV *MinMaxExpr,
- const SCEV *Divisor) {
- auto *ConstDivisor = dyn_cast<SCEVConstant>(Divisor);
- if (!ConstDivisor)
- return MinMaxExpr;
- const APInt &DivisorVal = ConstDivisor->getAPInt();
-
- const SCEV *MinMaxLHS = nullptr, *MinMaxRHS = nullptr;
- SCEVTypes SCTy;
- if (!IsMinMaxSCEVWithNonNegativeConstant(MinMaxExpr, SCTy, MinMaxLHS,
- MinMaxRHS))
- return MinMaxExpr;
- auto IsMin =
- isa<SCEVSMinExpr>(MinMaxExpr) || isa<SCEVUMinExpr>(MinMaxExpr);
- assert(SE.isKnownNonNegative(MinMaxLHS) &&
- "Expected non-negative operand!");
- auto *DivisibleExpr =
- IsMin
- ? getPreviousSCEVDivisibleByDivisor(MinMaxLHS, DivisorVal, SE)
- : getNextSCEVDivisibleByDivisor(MinMaxLHS, DivisorVal, SE);
- SmallVector<const SCEV *> Ops = {
- ApplyDivisibiltyOnMinMaxExpr(MinMaxRHS, Divisor), DivisibleExpr};
- return SE.getMinMaxExpr(SCTy, Ops);
- };
-
- // If we have LHS == 0, check if LHS is computing a property of some unknown
- // SCEV %v which we can rewrite %v to express explicitly.
- if (Predicate == CmpInst::ICMP_EQ && match(RHS, m_scev_Zero())) {
- // If LHS is A % B, i.e. A % B == 0, rewrite A to (A /u B) * B to
- // explicitly express that.
- const SCEVUnknown *URemLHS = nullptr;
- const SCEV *URemRHS = nullptr;
- if (match(LHS,
- m_scev_URem(m_SCEVUnknown(URemLHS), m_SCEV(URemRHS), SE))) {
- auto I = RewriteMap.find(URemLHS);
- const SCEV *RewrittenLHS = I != RewriteMap.end() ? I->second : URemLHS;
- RewrittenLHS = ApplyDivisibiltyOnMinMaxExpr(RewrittenLHS, URemRHS);
- const auto *Multiple =
- SE.getMulExpr(SE.getUDivExpr(RewrittenLHS, URemRHS), URemRHS);
- RewriteMap[URemLHS] = Multiple;
- ExprsToRewrite.push_back(URemLHS);
- return;
- }
- }
-
// Do not apply information for constants or if RHS contains an AddRec.
if (isa<SCEVConstant>(LHS) || SE.containsAddRecurrence(RHS))
return;
@@ -15655,7 +15660,9 @@ void ScalarEvolution::LoopGuards::collectFromBlock(
};
const SCEV *RewrittenLHS = GetMaybeRewritten(LHS);
- const APInt &DividesBy = SE.getConstantMultiple(RewrittenLHS);
+ // Apply divisibility information when computing the constant multiple.
+ const APInt &DividesBy =
+ SE.getConstantMultiple(DivGuards.rewrite(RewrittenLHS));
// Collect rewrites for LHS and its transitive operands based on the
// condition.
@@ -15840,8 +15847,11 @@ void ScalarEvolution::LoopGuards::collectFromBlock(
// Now apply the information from the collected conditions to
// Guards.RewriteMap. Conditions are processed in reverse order, so the
- // earliest conditions is processed first. This ensures the SCEVs with the
+ // earliest conditions is processed first, except guards with divisibility
+ // information, which are moved to the back. This ensures the SCEVs with the
// shortest dependency chains are constructed first.
+ SmallVector<std::tuple<CmpInst::Predicate, const SCEV *, const SCEV *>>
+ GuardsToProcess;
for (auto [Term, EnterIfTrue] : reverse(Terms)) {
SmallVector<Value *, 8> Worklist;
SmallPtrSet<Value *, 8> Visited;
@@ -15856,7 +15866,14 @@ void ScalarEvolution::LoopGuards::collectFromBlock(
EnterIfTrue ? Cmp->getPredicate() : Cmp->getInversePredicate();
const auto *LHS = SE.getSCEV(Cmp->getOperand(0));
const auto *RHS = SE.getSCEV(Cmp->getOperand(1));
- CollectCondition(Predicate, LHS, RHS, Guards.RewriteMap);
+ // If LHS is a constant, apply information to the other expression.
+ // TODO: If LHS is not a constant, check if using CompareSCEVComplexity
+ // can improve results.
+ if (isa<SCEVConstant>(LHS)) {
+ std::swap(LHS, RHS);
+ Predicate = CmpInst::getSwappedPredicate(Predicate);
+ }
+ GuardsToProcess.emplace_back(Predicate, LHS, RHS);
continue;
}
@@ -15869,6 +15886,31 @@ void ScalarEvolution::LoopGuards::collectFromBlock(
}
}
+ // Process divisibility guards in reverse order to populate DivGuards early.
+ DenseMap<const SCEV *, APInt> Multiples;
+ LoopGuards DivGuards(SE);
+ for (const auto &[Predicate, LHS, RHS] : GuardsToProcess) {
+ if (!isDivisibilityGuard(LHS, RHS, SE))
+ continue;
+ collectDivisibilityInformation(Predicate, LHS, RHS, DivGuards.RewriteMap,
+ Multiples, SE);
+ }
+
+ for (const auto &[Predicate, LHS, RHS] : GuardsToProcess)
+ CollectCondition(Predicate, LHS, RHS, Guards.RewriteMap, DivGuards);
+
+ // Apply divisibility information last. This ensures it is applied to the
+ // outermost expression after other rewrites for the given value.
+ for (const auto &[K, Divisor] : Multiples) {
+ const SCEV *DivisorSCEV = SE.getConstant(Divisor);
+ Guards.RewriteMap[K] =
+ SE.getMulExpr(SE.getUDivExpr(applyDivisibilityOnMinMaxExpr(
+ Guards.rewrite(K), Divisor, SE),
+ DivisorSCEV),
+ DivisorSCEV);
+ ExprsToRewrite.push_back(K);
+ }
+
// Let the rewriter preserve NUW/NSW flags if the unsigned/signed ranges of
// the replacement expressions are contained in the ranges of the replaced
// expressions.
diff --git a/llvm/lib/Analysis/TargetTransformInfo.cpp b/llvm/lib/Analysis/TargetTransformInfo.cpp
index c47a1c1..0426ac7 100644
--- a/llvm/lib/Analysis/TargetTransformInfo.cpp
+++ b/llvm/lib/Analysis/TargetTransformInfo.cpp
@@ -1353,9 +1353,9 @@ TargetTransformInfo::getInlineCallPenalty(const Function *F,
return TTIImpl->getInlineCallPenalty(F, Call, DefaultCallPenalty);
}
-bool TargetTransformInfo::areTypesABICompatible(
- const Function *Caller, const Function *Callee,
- const ArrayRef<Type *> &Types) const {
+bool TargetTransformInfo::areTypesABICompatible(const Function *Caller,
+ const Function *Callee,
+ ArrayRef<Type *> Types) const {
return TTIImpl->areTypesABICompatible(Caller, Callee, Types);
}
diff --git a/llvm/lib/BinaryFormat/Dwarf.cpp b/llvm/lib/BinaryFormat/Dwarf.cpp
index 55fa2df..a6c7e6a 100644
--- a/llvm/lib/BinaryFormat/Dwarf.cpp
+++ b/llvm/lib/BinaryFormat/Dwarf.cpp
@@ -1076,10 +1076,3 @@ StringRef (*const llvm::dwarf::EnumTraits<LineNumberOps>::StringFn)(unsigned) =
LNStandardString;
StringRef (*const llvm::dwarf::EnumTraits<Index>::StringFn)(unsigned) =
IndexString;
-
-constexpr char llvm::dwarf::EnumTraits<Attribute>::Type[];
-constexpr char llvm::dwarf::EnumTraits<Form>::Type[];
-constexpr char llvm::dwarf::EnumTraits<Index>::Type[];
-constexpr char llvm::dwarf::EnumTraits<Tag>::Type[];
-constexpr char llvm::dwarf::EnumTraits<LineNumberOps>::Type[];
-constexpr char llvm::dwarf::EnumTraits<LocationAtom>::Type[];
diff --git a/llvm/lib/CAS/ActionCaches.cpp b/llvm/lib/CAS/ActionCaches.cpp
index 571c5b3..003c850 100644
--- a/llvm/lib/CAS/ActionCaches.cpp
+++ b/llvm/lib/CAS/ActionCaches.cpp
@@ -13,7 +13,11 @@
#include "BuiltinCAS.h"
#include "llvm/ADT/TrieRawHashMap.h"
#include "llvm/CAS/ActionCache.h"
+#include "llvm/CAS/OnDiskKeyValueDB.h"
+#include "llvm/CAS/UnifiedOnDiskCache.h"
+#include "llvm/Config/llvm-config.h"
#include "llvm/Support/BLAKE3.h"
+#include "llvm/Support/Errc.h"
#define DEBUG_TYPE "cas-action-caches"
@@ -47,12 +51,54 @@ public:
Expected<std::optional<CASID>> getImpl(ArrayRef<uint8_t> ActionKey,
bool CanBeDistributed) const final;
+ Error validate() const final {
+ return createStringError("InMemoryActionCache doesn't support validate()");
+ }
+
private:
using DataT = CacheEntry<sizeof(HashType)>;
using InMemoryCacheT = ThreadSafeTrieRawHashMap<DataT, sizeof(HashType)>;
InMemoryCacheT Cache;
};
+
+/// Builtin basic OnDiskActionCache that uses one underlying OnDiskKeyValueDB.
+class OnDiskActionCache final : public ActionCache {
+public:
+ Error putImpl(ArrayRef<uint8_t> ActionKey, const CASID &Result,
+ bool CanBeDistributed) final;
+ Expected<std::optional<CASID>> getImpl(ArrayRef<uint8_t> ActionKey,
+ bool CanBeDistributed) const final;
+
+ static Expected<std::unique_ptr<OnDiskActionCache>> create(StringRef Path);
+
+ Error validate() const final;
+
+private:
+ static StringRef getHashName() { return "BLAKE3"; }
+
+ OnDiskActionCache(std::unique_ptr<ondisk::OnDiskKeyValueDB> DB);
+
+ std::unique_ptr<ondisk::OnDiskKeyValueDB> DB;
+ using DataT = CacheEntry<sizeof(HashType)>;
+};
+
+/// Builtin unified ActionCache that wraps around UnifiedOnDiskCache to provide
+/// access to its ActionCache.
+class UnifiedOnDiskActionCache final : public ActionCache {
+public:
+ Error putImpl(ArrayRef<uint8_t> ActionKey, const CASID &Result,
+ bool CanBeDistributed) final;
+ Expected<std::optional<CASID>> getImpl(ArrayRef<uint8_t> ActionKey,
+ bool CanBeDistributed) const final;
+
+ UnifiedOnDiskActionCache(std::shared_ptr<ondisk::UnifiedOnDiskCache> UniDB);
+
+ Error validate() const final;
+
+private:
+ std::shared_ptr<ondisk::UnifiedOnDiskCache> UniDB;
+};
} // end namespace
static Error createResultCachePoisonedError(ArrayRef<uint8_t> KeyHash,
@@ -99,3 +145,123 @@ std::unique_ptr<ActionCache> createInMemoryActionCache() {
}
} // namespace llvm::cas
+
+OnDiskActionCache::OnDiskActionCache(
+ std::unique_ptr<ondisk::OnDiskKeyValueDB> DB)
+ : ActionCache(builtin::BuiltinCASContext::getDefaultContext()),
+ DB(std::move(DB)) {}
+
+Expected<std::unique_ptr<OnDiskActionCache>>
+OnDiskActionCache::create(StringRef AbsPath) {
+ std::unique_ptr<ondisk::OnDiskKeyValueDB> DB;
+ if (Error E = ondisk::OnDiskKeyValueDB::open(AbsPath, getHashName(),
+ sizeof(HashType), getHashName(),
+ sizeof(DataT))
+ .moveInto(DB))
+ return std::move(E);
+ return std::unique_ptr<OnDiskActionCache>(
+ new OnDiskActionCache(std::move(DB)));
+}
+
+Expected<std::optional<CASID>>
+OnDiskActionCache::getImpl(ArrayRef<uint8_t> Key,
+ bool /*CanBeDistributed*/) const {
+ std::optional<ArrayRef<char>> Val;
+ if (Error E = DB->get(Key).moveInto(Val))
+ return std::move(E);
+ if (!Val)
+ return std::nullopt;
+ return CASID::create(&getContext(), toStringRef(*Val));
+}
+
+Error OnDiskActionCache::putImpl(ArrayRef<uint8_t> Key, const CASID &Result,
+ bool /*CanBeDistributed*/) {
+ auto ResultHash = Result.getHash();
+ ArrayRef Expected((const char *)ResultHash.data(), ResultHash.size());
+ ArrayRef<char> Observed;
+ if (Error E = DB->put(Key, Expected).moveInto(Observed))
+ return E;
+
+ if (Expected == Observed)
+ return Error::success();
+
+ return createResultCachePoisonedError(
+ Key, getContext(), Result,
+ ArrayRef((const uint8_t *)Observed.data(), Observed.size()));
+}
+
+Error OnDiskActionCache::validate() const {
+ // FIXME: without the matching CAS there is nothing we can check about the
+ // cached values. The hash size is already validated by the DB validator.
+ return DB->validate(nullptr);
+}
+
+UnifiedOnDiskActionCache::UnifiedOnDiskActionCache(
+ std::shared_ptr<ondisk::UnifiedOnDiskCache> UniDB)
+ : ActionCache(builtin::BuiltinCASContext::getDefaultContext()),
+ UniDB(std::move(UniDB)) {}
+
+Expected<std::optional<CASID>>
+UnifiedOnDiskActionCache::getImpl(ArrayRef<uint8_t> Key,
+ bool /*CanBeDistributed*/) const {
+ std::optional<ArrayRef<char>> Val;
+ if (Error E = UniDB->getKeyValueDB().get(Key).moveInto(Val))
+ return std::move(E);
+ if (!Val)
+ return std::nullopt;
+ auto ID = ondisk::UnifiedOnDiskCache::getObjectIDFromValue(*Val);
+ return CASID::create(&getContext(),
+ toStringRef(UniDB->getGraphDB().getDigest(ID)));
+}
+
+Error UnifiedOnDiskActionCache::putImpl(ArrayRef<uint8_t> Key,
+ const CASID &Result,
+ bool /*CanBeDistributed*/) {
+ auto Expected = UniDB->getGraphDB().getReference(Result.getHash());
+ if (LLVM_UNLIKELY(!Expected))
+ return Expected.takeError();
+
+ auto Value = ondisk::UnifiedOnDiskCache::getValueFromObjectID(*Expected);
+ std::optional<ArrayRef<char>> Observed;
+ if (Error E = UniDB->getKeyValueDB().put(Key, Value).moveInto(Observed))
+ return E;
+
+ auto ObservedID = ondisk::UnifiedOnDiskCache::getObjectIDFromValue(*Observed);
+ if (*Expected == ObservedID)
+ return Error::success();
+
+ return createResultCachePoisonedError(
+ Key, getContext(), Result, UniDB->getGraphDB().getDigest(ObservedID));
+}
+
+Error UnifiedOnDiskActionCache::validate() const {
+ auto ValidateRef = [](FileOffset Offset, ArrayRef<char> Value) -> Error {
+ auto ID = ondisk::UnifiedOnDiskCache::getObjectIDFromValue(Value);
+ auto formatError = [&](Twine Msg) {
+ return createStringError(
+ llvm::errc::illegal_byte_sequence,
+ "bad record at 0x" +
+ utohexstr((unsigned)Offset.get(), /*LowerCase=*/true) + ": " +
+ Msg.str());
+ };
+ if (ID.getOpaqueData() == 0)
+ return formatError("zero is not a valid ref");
+ return Error::success();
+ };
+ return UniDB->getKeyValueDB().validate(ValidateRef);
+}
+
+Expected<std::unique_ptr<ActionCache>>
+cas::createOnDiskActionCache(StringRef Path) {
+#if LLVM_ENABLE_ONDISK_CAS
+ return OnDiskActionCache::create(Path);
+#else
+ return createStringError(inconvertibleErrorCode(), "OnDiskCache is disabled");
+#endif
+}
+
+std::unique_ptr<ActionCache>
+cas::builtin::createActionCacheFromUnifiedOnDiskCache(
+ std::shared_ptr<ondisk::UnifiedOnDiskCache> UniDB) {
+ return std::make_unique<UnifiedOnDiskActionCache>(std::move(UniDB));
+}
diff --git a/llvm/lib/CAS/BuiltinCAS.cpp b/llvm/lib/CAS/BuiltinCAS.cpp
index 73646ad..e9bc6d8 100644
--- a/llvm/lib/CAS/BuiltinCAS.cpp
+++ b/llvm/lib/CAS/BuiltinCAS.cpp
@@ -9,6 +9,7 @@
#include "BuiltinCAS.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/CAS/BuiltinObjectHasher.h"
+#include "llvm/CAS/UnifiedOnDiskCache.h"
#include "llvm/Support/Process.h"
using namespace llvm;
@@ -68,7 +69,7 @@ Expected<ObjectRef> BuiltinCAS::store(ArrayRef<ObjectRef> Refs,
Refs, Data);
}
-Error BuiltinCAS::validate(const CASID &ID) {
+Error BuiltinCAS::validateObject(const CASID &ID) {
auto Ref = getReference(ID);
if (!Ref)
return createUnknownObjectError(ID);
@@ -92,3 +93,14 @@ Error BuiltinCAS::validate(const CASID &ID) {
return Error::success();
}
+
+Expected<std::unique_ptr<ondisk::UnifiedOnDiskCache>>
+cas::builtin::createBuiltinUnifiedOnDiskCache(StringRef Path) {
+#if LLVM_ENABLE_ONDISK_CAS
+ return ondisk::UnifiedOnDiskCache::open(Path, /*SizeLimit=*/std::nullopt,
+ BuiltinCASContext::getHashName(),
+ sizeof(HashType));
+#else
+ return createStringError(inconvertibleErrorCode(), "OnDiskCache is disabled");
+#endif
+}
diff --git a/llvm/lib/CAS/BuiltinCAS.h b/llvm/lib/CAS/BuiltinCAS.h
index 3b5374d..4d2de66 100644
--- a/llvm/lib/CAS/BuiltinCAS.h
+++ b/llvm/lib/CAS/BuiltinCAS.h
@@ -1,4 +1,4 @@
-//===- BuiltinCAS.h ---------------------------------------------*- C++ -*-===//
+//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -15,6 +15,9 @@
namespace llvm::cas {
class ActionCache;
+namespace ondisk {
+class UnifiedOnDiskCache;
+} // namespace ondisk
namespace builtin {
/// Common base class for builtin CAS implementations using the same CASContext.
@@ -65,9 +68,27 @@ public:
"corrupt storage");
}
- Error validate(const CASID &ID) final;
+ Error validateObject(const CASID &ID) final;
};
+/// Create a \p UnifiedOnDiskCache instance that uses \p BLAKE3 hashing.
+Expected<std::unique_ptr<ondisk::UnifiedOnDiskCache>>
+createBuiltinUnifiedOnDiskCache(StringRef Path);
+
+/// \param UniDB A \p UnifiedOnDiskCache instance from \p
+/// createBuiltinUnifiedOnDiskCache.
+std::unique_ptr<ObjectStore> createObjectStoreFromUnifiedOnDiskCache(
+ std::shared_ptr<ondisk::UnifiedOnDiskCache> UniDB);
+
+/// \param UniDB A \p UnifiedOnDiskCache instance from \p
+/// createBuiltinUnifiedOnDiskCache.
+std::unique_ptr<ActionCache> createActionCacheFromUnifiedOnDiskCache(
+ std::shared_ptr<ondisk::UnifiedOnDiskCache> UniDB);
+
+// FIXME: Proxy not portable. Maybe also error-prone?
+constexpr StringLiteral DefaultDirProxy = "/^llvm::cas::builtin::default";
+constexpr StringLiteral DefaultDir = "llvm.cas.builtin.default";
+
} // end namespace builtin
} // end namespace llvm::cas
diff --git a/llvm/lib/CAS/BuiltinUnifiedCASDatabases.cpp b/llvm/lib/CAS/BuiltinUnifiedCASDatabases.cpp
new file mode 100644
index 0000000..f3f6fa0
--- /dev/null
+++ b/llvm/lib/CAS/BuiltinUnifiedCASDatabases.cpp
@@ -0,0 +1,38 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/CAS/BuiltinUnifiedCASDatabases.h"
+#include "BuiltinCAS.h"
+#include "llvm/CAS/ActionCache.h"
+#include "llvm/CAS/UnifiedOnDiskCache.h"
+
+using namespace llvm;
+using namespace llvm::cas;
+
+Expected<std::pair<std::unique_ptr<ObjectStore>, std::unique_ptr<ActionCache>>>
+cas::createOnDiskUnifiedCASDatabases(StringRef Path) {
+ std::shared_ptr<ondisk::UnifiedOnDiskCache> UniDB;
+ if (Error E = builtin::createBuiltinUnifiedOnDiskCache(Path).moveInto(UniDB))
+ return std::move(E);
+ auto CAS = builtin::createObjectStoreFromUnifiedOnDiskCache(UniDB);
+ auto AC = builtin::createActionCacheFromUnifiedOnDiskCache(std::move(UniDB));
+ return std::make_pair(std::move(CAS), std::move(AC));
+}
+
+Expected<ValidationResult> cas::validateOnDiskUnifiedCASDatabasesIfNeeded(
+ StringRef Path, bool CheckHash, bool AllowRecovery, bool ForceValidation,
+ std::optional<StringRef> LLVMCasBinary) {
+#if LLVM_ENABLE_ONDISK_CAS
+ return ondisk::UnifiedOnDiskCache::validateIfNeeded(
+ Path, builtin::BuiltinCASContext::getHashName(),
+ sizeof(builtin::HashType), CheckHash, AllowRecovery, ForceValidation,
+ LLVMCasBinary);
+#else
+ return createStringError(inconvertibleErrorCode(), "OnDiskCache is disabled");
+#endif
+}
diff --git a/llvm/lib/CAS/CMakeLists.txt b/llvm/lib/CAS/CMakeLists.txt
index a2f8c49..aad77dc 100644
--- a/llvm/lib/CAS/CMakeLists.txt
+++ b/llvm/lib/CAS/CMakeLists.txt
@@ -2,15 +2,18 @@ add_llvm_component_library(LLVMCAS
ActionCache.cpp
ActionCaches.cpp
BuiltinCAS.cpp
+ BuiltinUnifiedCASDatabases.cpp
DatabaseFile.cpp
InMemoryCAS.cpp
MappedFileRegionArena.cpp
ObjectStore.cpp
+ OnDiskCAS.cpp
OnDiskCommon.cpp
OnDiskDataAllocator.cpp
OnDiskGraphDB.cpp
OnDiskKeyValueDB.cpp
OnDiskTrieRawHashMap.cpp
+ UnifiedOnDiskCache.cpp
ADDITIONAL_HEADER_DIRS
${LLVM_MAIN_INCLUDE_DIR}/llvm/CAS
diff --git a/llvm/lib/CAS/InMemoryCAS.cpp b/llvm/lib/CAS/InMemoryCAS.cpp
index c63ee70d..2d4eedd 100644
--- a/llvm/lib/CAS/InMemoryCAS.cpp
+++ b/llvm/lib/CAS/InMemoryCAS.cpp
@@ -233,6 +233,12 @@ public:
return cast<InMemoryObject>(asInMemoryObject(Node)).getData();
}
+ void print(raw_ostream &OS) const final;
+
+ Error validate(bool CheckHash) const final {
+ return createStringError("InMemoryCAS doesn't support validate()");
+ }
+
InMemoryCAS() = default;
private:
@@ -271,6 +277,8 @@ ArrayRef<const InMemoryObject *> InMemoryObject::getRefs() const {
return cast<InMemoryInlineObject>(this)->getRefsImpl();
}
+void InMemoryCAS::print(raw_ostream &OS) const {}
+
Expected<ObjectRef>
InMemoryCAS::storeFromNullTerminatedRegion(ArrayRef<uint8_t> ComputedHash,
sys::fs::mapped_file_region Map) {
diff --git a/llvm/lib/CAS/ObjectStore.cpp b/llvm/lib/CAS/ObjectStore.cpp
index e0be50b..3110577 100644
--- a/llvm/lib/CAS/ObjectStore.cpp
+++ b/llvm/lib/CAS/ObjectStore.cpp
@@ -1,4 +1,4 @@
-//===- ObjectStore.cpp ------------------------------------------*- C++ -*-===//
+//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -12,7 +12,7 @@
#include "llvm/Support/Errc.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/MemoryBuffer.h"
-#include <optional>
+#include <deque>
using namespace llvm;
using namespace llvm::cas;
@@ -21,6 +21,7 @@ void CASContext::anchor() {}
void ObjectStore::anchor() {}
LLVM_DUMP_METHOD void CASID::dump() const { print(dbgs()); }
+LLVM_DUMP_METHOD void ObjectStore::dump() const { print(dbgs()); }
LLVM_DUMP_METHOD void ObjectRef::dump() const { print(dbgs()); }
LLVM_DUMP_METHOD void ObjectHandle::dump() const { print(dbgs()); }
@@ -141,7 +142,7 @@ Error ObjectStore::validateTree(ObjectRef Root) {
auto [I, Inserted] = ValidatedRefs.insert(Ref);
if (!Inserted)
continue; // already validated.
- if (Error E = validate(getID(Ref)))
+ if (Error E = validateObject(getID(Ref)))
return E;
Expected<ObjectHandle> Obj = load(Ref);
if (!Obj)
@@ -155,6 +156,92 @@ Error ObjectStore::validateTree(ObjectRef Root) {
return Error::success();
}
+Expected<ObjectRef> ObjectStore::importObject(ObjectStore &Upstream,
+ ObjectRef Other) {
+ // Copy the full CAS tree from upstream with depth-first ordering to ensure
+ // all the child nodes are available in downstream CAS before inserting
+ // current object. This uses a similar algorithm as
+ // `OnDiskGraphDB::importFullTree` but doesn't assume the upstream CAS schema
+ // so it can be used to import from any other ObjectStore reguardless of the
+ // CAS schema.
+
+ // There is no work to do if importing from self.
+ if (this == &Upstream)
+ return Other;
+
+ /// Keeps track of the state of visitation for current node and all of its
+ /// parents. Upstream Cursor holds information only from upstream CAS.
+ struct UpstreamCursor {
+ ObjectRef Ref;
+ ObjectHandle Node;
+ size_t RefsCount;
+ std::deque<ObjectRef> Refs;
+ };
+ SmallVector<UpstreamCursor, 16> CursorStack;
+ /// PrimaryNodeStack holds the ObjectRef of the current CAS, with nodes either
+ /// just stored in the CAS or nodes already exists in the current CAS.
+ SmallVector<ObjectRef, 128> PrimaryRefStack;
+ /// A map from upstream ObjectRef to current ObjectRef.
+ llvm::DenseMap<ObjectRef, ObjectRef> CreatedObjects;
+
+ auto enqueueNode = [&](ObjectRef Ref, ObjectHandle Node) {
+ unsigned NumRefs = Upstream.getNumRefs(Node);
+ std::deque<ObjectRef> Refs;
+ for (unsigned I = 0; I < NumRefs; ++I)
+ Refs.push_back(Upstream.readRef(Node, I));
+
+ CursorStack.push_back({Ref, Node, NumRefs, std::move(Refs)});
+ };
+
+ auto UpstreamHandle = Upstream.load(Other);
+ if (!UpstreamHandle)
+ return UpstreamHandle.takeError();
+ enqueueNode(Other, *UpstreamHandle);
+
+ while (!CursorStack.empty()) {
+ UpstreamCursor &Cur = CursorStack.back();
+ if (Cur.Refs.empty()) {
+ // Copy the node data into the primary store.
+ // The bottom of \p PrimaryRefStack contains the ObjectRef for the
+ // current node.
+ assert(PrimaryRefStack.size() >= Cur.RefsCount);
+ auto Refs = ArrayRef(PrimaryRefStack)
+ .slice(PrimaryRefStack.size() - Cur.RefsCount);
+ auto NewNode = store(Refs, Upstream.getData(Cur.Node));
+ if (!NewNode)
+ return NewNode.takeError();
+
+ // Remove the current node and its IDs from the stack.
+ PrimaryRefStack.truncate(PrimaryRefStack.size() - Cur.RefsCount);
+ CursorStack.pop_back();
+
+ PrimaryRefStack.push_back(*NewNode);
+ CreatedObjects.try_emplace(Cur.Ref, *NewNode);
+ continue;
+ }
+
+ // Check if the node exists already.
+ auto CurrentID = Cur.Refs.front();
+ Cur.Refs.pop_front();
+ auto Ref = CreatedObjects.find(CurrentID);
+ if (Ref != CreatedObjects.end()) {
+ // If exists already, just need to enqueue the primary node.
+ PrimaryRefStack.push_back(Ref->second);
+ continue;
+ }
+
+ // Load child.
+ auto PrimaryID = Upstream.load(CurrentID);
+ if (LLVM_UNLIKELY(!PrimaryID))
+ return PrimaryID.takeError();
+
+ enqueueNode(CurrentID, *PrimaryID);
+ }
+
+ assert(PrimaryRefStack.size() == 1);
+ return PrimaryRefStack.front();
+}
+
std::unique_ptr<MemoryBuffer>
ObjectProxy::getMemoryBuffer(StringRef Name,
bool RequiresNullTerminator) const {
diff --git a/llvm/lib/CAS/OnDiskCAS.cpp b/llvm/lib/CAS/OnDiskCAS.cpp
new file mode 100644
index 0000000..7d29f44
--- /dev/null
+++ b/llvm/lib/CAS/OnDiskCAS.cpp
@@ -0,0 +1,211 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "BuiltinCAS.h"
+#include "llvm/CAS/BuiltinCASContext.h"
+#include "llvm/CAS/BuiltinObjectHasher.h"
+#include "llvm/CAS/OnDiskGraphDB.h"
+#include "llvm/CAS/UnifiedOnDiskCache.h"
+#include "llvm/Support/Compiler.h"
+#include "llvm/Support/Error.h"
+
+using namespace llvm;
+using namespace llvm::cas;
+using namespace llvm::cas::builtin;
+
+namespace {
+
+class OnDiskCAS : public BuiltinCAS {
+public:
+ Expected<ObjectRef> storeImpl(ArrayRef<uint8_t> ComputedHash,
+ ArrayRef<ObjectRef> Refs,
+ ArrayRef<char> Data) final;
+
+ Expected<std::optional<ObjectHandle>> loadIfExists(ObjectRef Ref) final;
+
+ CASID getID(ObjectRef Ref) const final;
+
+ std::optional<ObjectRef> getReference(const CASID &ID) const final;
+
+ Expected<bool> isMaterialized(ObjectRef Ref) const final;
+
+ ArrayRef<char> getDataConst(ObjectHandle Node) const final;
+
+ void print(raw_ostream &OS) const final;
+ Error validate(bool CheckHash) const final;
+
+ static Expected<std::unique_ptr<OnDiskCAS>> open(StringRef Path);
+
+ OnDiskCAS(std::shared_ptr<ondisk::UnifiedOnDiskCache> UniDB)
+ : UnifiedDB(std::move(UniDB)), DB(&UnifiedDB->getGraphDB()) {}
+
+private:
+ ObjectHandle convertHandle(ondisk::ObjectHandle Node) const {
+ return makeObjectHandle(Node.getOpaqueData());
+ }
+
+ ondisk::ObjectHandle convertHandle(ObjectHandle Node) const {
+ return ondisk::ObjectHandle(Node.getInternalRef(*this));
+ }
+
+ ObjectRef convertRef(ondisk::ObjectID Ref) const {
+ return makeObjectRef(Ref.getOpaqueData());
+ }
+
+ ondisk::ObjectID convertRef(ObjectRef Ref) const {
+ return ondisk::ObjectID::fromOpaqueData(Ref.getInternalRef(*this));
+ }
+
+ size_t getNumRefs(ObjectHandle Node) const final {
+ auto RefsRange = DB->getObjectRefs(convertHandle(Node));
+ return std::distance(RefsRange.begin(), RefsRange.end());
+ }
+
+ ObjectRef readRef(ObjectHandle Node, size_t I) const final {
+ auto RefsRange = DB->getObjectRefs(convertHandle(Node));
+ return convertRef(RefsRange.begin()[I]);
+ }
+
+ Error forEachRef(ObjectHandle Node,
+ function_ref<Error(ObjectRef)> Callback) const final;
+
+ Error setSizeLimit(std::optional<uint64_t> SizeLimit) final;
+ Expected<std::optional<uint64_t>> getStorageSize() const final;
+ Error pruneStorageData() final;
+
+ OnDiskCAS(std::unique_ptr<ondisk::OnDiskGraphDB> GraphDB)
+ : OwnedDB(std::move(GraphDB)), DB(OwnedDB.get()) {}
+
+ std::unique_ptr<ondisk::OnDiskGraphDB> OwnedDB;
+ std::shared_ptr<ondisk::UnifiedOnDiskCache> UnifiedDB;
+ ondisk::OnDiskGraphDB *DB;
+};
+
+} // end anonymous namespace
+
+void OnDiskCAS::print(raw_ostream &OS) const { DB->print(OS); }
+Error OnDiskCAS::validate(bool CheckHash) const {
+ auto Hasher = [](ArrayRef<ArrayRef<uint8_t>> Refs, ArrayRef<char> Data,
+ SmallVectorImpl<uint8_t> &Result) {
+ auto Hash = BuiltinObjectHasher<llvm::cas::builtin::HasherT>::hashObject(
+ Refs, Data);
+ Result.assign(Hash.begin(), Hash.end());
+ };
+
+ if (auto E = DB->validate(CheckHash, Hasher))
+ return E;
+
+ return Error::success();
+}
+
+CASID OnDiskCAS::getID(ObjectRef Ref) const {
+ ArrayRef<uint8_t> Hash = DB->getDigest(convertRef(Ref));
+ return CASID::create(&getContext(), toStringRef(Hash));
+}
+
+std::optional<ObjectRef> OnDiskCAS::getReference(const CASID &ID) const {
+ std::optional<ondisk::ObjectID> ObjID =
+ DB->getExistingReference(ID.getHash());
+ if (!ObjID)
+ return std::nullopt;
+ return convertRef(*ObjID);
+}
+
+Expected<bool> OnDiskCAS::isMaterialized(ObjectRef ExternalRef) const {
+ return DB->isMaterialized(convertRef(ExternalRef));
+}
+
+ArrayRef<char> OnDiskCAS::getDataConst(ObjectHandle Node) const {
+ return DB->getObjectData(convertHandle(Node));
+}
+
+Expected<std::optional<ObjectHandle>>
+OnDiskCAS::loadIfExists(ObjectRef ExternalRef) {
+ Expected<std::optional<ondisk::ObjectHandle>> ObjHnd =
+ DB->load(convertRef(ExternalRef));
+ if (!ObjHnd)
+ return ObjHnd.takeError();
+ if (!*ObjHnd)
+ return std::nullopt;
+ return convertHandle(**ObjHnd);
+}
+
+Expected<ObjectRef> OnDiskCAS::storeImpl(ArrayRef<uint8_t> ComputedHash,
+ ArrayRef<ObjectRef> Refs,
+ ArrayRef<char> Data) {
+ SmallVector<ondisk::ObjectID, 64> IDs;
+ IDs.reserve(Refs.size());
+ for (ObjectRef Ref : Refs) {
+ IDs.push_back(convertRef(Ref));
+ }
+
+ auto StoredID = DB->getReference(ComputedHash);
+ if (LLVM_UNLIKELY(!StoredID))
+ return StoredID.takeError();
+ if (Error E = DB->store(*StoredID, IDs, Data))
+ return std::move(E);
+ return convertRef(*StoredID);
+}
+
+Error OnDiskCAS::forEachRef(ObjectHandle Node,
+ function_ref<Error(ObjectRef)> Callback) const {
+ auto RefsRange = DB->getObjectRefs(convertHandle(Node));
+ for (ondisk::ObjectID Ref : RefsRange) {
+ if (Error E = Callback(convertRef(Ref)))
+ return E;
+ }
+ return Error::success();
+}
+
+Error OnDiskCAS::setSizeLimit(std::optional<uint64_t> SizeLimit) {
+ UnifiedDB->setSizeLimit(SizeLimit);
+ return Error::success();
+}
+
+Expected<std::optional<uint64_t>> OnDiskCAS::getStorageSize() const {
+ return UnifiedDB->getStorageSize();
+}
+
+Error OnDiskCAS::pruneStorageData() { return UnifiedDB->collectGarbage(); }
+
+Expected<std::unique_ptr<OnDiskCAS>> OnDiskCAS::open(StringRef AbsPath) {
+ Expected<std::unique_ptr<ondisk::OnDiskGraphDB>> DB =
+ ondisk::OnDiskGraphDB::open(AbsPath, BuiltinCASContext::getHashName(),
+ sizeof(HashType));
+ if (!DB)
+ return DB.takeError();
+ return std::unique_ptr<OnDiskCAS>(new OnDiskCAS(std::move(*DB)));
+}
+
+bool cas::isOnDiskCASEnabled() {
+#if LLVM_ENABLE_ONDISK_CAS
+ return true;
+#else
+ return false;
+#endif
+}
+
+Expected<std::unique_ptr<ObjectStore>> cas::createOnDiskCAS(const Twine &Path) {
+#if LLVM_ENABLE_ONDISK_CAS
+ // FIXME: An absolute path isn't really good enough. Should open a directory
+ // and use openat() for files underneath.
+ SmallString<256> AbsPath;
+ Path.toVector(AbsPath);
+ sys::fs::make_absolute(AbsPath);
+
+ return OnDiskCAS::open(AbsPath);
+#else
+ return createStringError(inconvertibleErrorCode(), "OnDiskCAS is disabled");
+#endif /* LLVM_ENABLE_ONDISK_CAS */
+}
+
+std::unique_ptr<ObjectStore>
+cas::builtin::createObjectStoreFromUnifiedOnDiskCache(
+ std::shared_ptr<ondisk::UnifiedOnDiskCache> UniDB) {
+ return std::make_unique<OnDiskCAS>(std::move(UniDB));
+}
diff --git a/llvm/lib/CAS/OnDiskGraphDB.cpp b/llvm/lib/CAS/OnDiskGraphDB.cpp
index 64cbe9d..245b6fb 100644
--- a/llvm/lib/CAS/OnDiskGraphDB.cpp
+++ b/llvm/lib/CAS/OnDiskGraphDB.cpp
@@ -893,6 +893,10 @@ int64_t DataRecordHandle::getDataRelOffset() const {
}
Error OnDiskGraphDB::validate(bool Deep, HashingFuncT Hasher) const {
+ if (UpstreamDB) {
+ if (auto E = UpstreamDB->validate(Deep, Hasher))
+ return E;
+ }
return Index.validate([&](FileOffset Offset,
OnDiskTrieRawHashMap::ConstValueProxy Record)
-> Error {
@@ -1202,11 +1206,8 @@ OnDiskGraphDB::load(ObjectID ExternalRef) {
return I.takeError();
TrieRecord::Data Object = I->Ref.load();
- if (Object.SK == TrieRecord::StorageKind::Unknown) {
- if (!UpstreamDB)
- return std::nullopt;
+ if (Object.SK == TrieRecord::StorageKind::Unknown)
return faultInFromUpstream(ExternalRef);
- }
if (Object.SK == TrieRecord::StorageKind::DataPool)
return ObjectHandle::fromFileOffset(Object.Offset);
@@ -1286,8 +1287,10 @@ OnDiskGraphDB::getObjectPresence(ObjectID ExternalRef,
TrieRecord::Data Object = I->Ref.load();
if (Object.SK != TrieRecord::StorageKind::Unknown)
return ObjectPresence::InPrimaryDB;
+
if (!CheckUpstream || !UpstreamDB)
return ObjectPresence::Missing;
+
std::optional<ObjectID> UpstreamID =
UpstreamDB->getExistingReference(getDigest(*I));
return UpstreamID.has_value() ? ObjectPresence::OnlyInUpstreamDB
@@ -1549,9 +1552,10 @@ unsigned OnDiskGraphDB::getHardStorageLimitUtilization() const {
return std::max(IndexPercent, DataPercent);
}
-Expected<std::unique_ptr<OnDiskGraphDB>> OnDiskGraphDB::open(
- StringRef AbsPath, StringRef HashName, unsigned HashByteSize,
- std::unique_ptr<OnDiskGraphDB> UpstreamDB, FaultInPolicy Policy) {
+Expected<std::unique_ptr<OnDiskGraphDB>>
+OnDiskGraphDB::open(StringRef AbsPath, StringRef HashName,
+ unsigned HashByteSize, OnDiskGraphDB *UpstreamDB,
+ FaultInPolicy Policy) {
if (std::error_code EC = sys::fs::create_directories(AbsPath))
return createFileError(AbsPath, EC);
@@ -1604,18 +1608,15 @@ Expected<std::unique_ptr<OnDiskGraphDB>> OnDiskGraphDB::open(
"unexpected user header in '" + DataPoolPath +
"'");
- return std::unique_ptr<OnDiskGraphDB>(
- new OnDiskGraphDB(AbsPath, std::move(*Index), std::move(*DataPool),
- std::move(UpstreamDB), Policy));
+ return std::unique_ptr<OnDiskGraphDB>(new OnDiskGraphDB(
+ AbsPath, std::move(*Index), std::move(*DataPool), UpstreamDB, Policy));
}
OnDiskGraphDB::OnDiskGraphDB(StringRef RootPath, OnDiskTrieRawHashMap Index,
OnDiskDataAllocator DataPool,
- std::unique_ptr<OnDiskGraphDB> UpstreamDB,
- FaultInPolicy Policy)
+ OnDiskGraphDB *UpstreamDB, FaultInPolicy Policy)
: Index(std::move(Index)), DataPool(std::move(DataPool)),
- RootPath(RootPath.str()), UpstreamDB(std::move(UpstreamDB)),
- FIPolicy(Policy) {
+ RootPath(RootPath.str()), UpstreamDB(UpstreamDB), FIPolicy(Policy) {
/// Lifetime for "big" objects not in DataPool.
///
/// NOTE: Could use ThreadSafeTrieRawHashMap here. For now, doing something
@@ -1638,7 +1639,6 @@ Error OnDiskGraphDB::importFullTree(ObjectID PrimaryID,
// against the process dying during importing and leaving the database with an
// incomplete tree. Note that if the upstream has missing nodes then the tree
// will be copied with missing nodes as well, it won't be considered an error.
-
struct UpstreamCursor {
ObjectHandle Node;
size_t RefsCount;
@@ -1720,7 +1720,6 @@ Error OnDiskGraphDB::importSingleNode(ObjectID PrimaryID,
// Copy the node data into the primary store.
// FIXME: Use hard-link or cloning if the file-system supports it and data is
// stored into a separate file.
-
auto Data = UpstreamDB->getObjectData(UpstreamNode);
auto UpstreamRefs = UpstreamDB->getObjectRefs(UpstreamNode);
SmallVector<ObjectID, 64> Refs;
@@ -1737,7 +1736,8 @@ Error OnDiskGraphDB::importSingleNode(ObjectID PrimaryID,
Expected<std::optional<ObjectHandle>>
OnDiskGraphDB::faultInFromUpstream(ObjectID PrimaryID) {
- assert(UpstreamDB);
+ if (!UpstreamDB)
+ return std::nullopt;
auto UpstreamID = UpstreamDB->getReference(getDigest(PrimaryID));
if (LLVM_UNLIKELY(!UpstreamID))
diff --git a/llvm/lib/CAS/OnDiskKeyValueDB.cpp b/llvm/lib/CAS/OnDiskKeyValueDB.cpp
index 2186071..15656cb 100644
--- a/llvm/lib/CAS/OnDiskKeyValueDB.cpp
+++ b/llvm/lib/CAS/OnDiskKeyValueDB.cpp
@@ -20,6 +20,7 @@
#include "llvm/CAS/OnDiskKeyValueDB.h"
#include "OnDiskCommon.h"
#include "llvm/ADT/StringExtras.h"
+#include "llvm/CAS/UnifiedOnDiskCache.h"
#include "llvm/Support/Alignment.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Errc.h"
@@ -53,15 +54,21 @@ Expected<std::optional<ArrayRef<char>>>
OnDiskKeyValueDB::get(ArrayRef<uint8_t> Key) {
// Check the result cache.
OnDiskTrieRawHashMap::ConstOnDiskPtr ActionP = Cache.find(Key);
- if (!ActionP)
+ if (ActionP) {
+ assert(isAddrAligned(Align(8), ActionP->Data.data()));
+ return ActionP->Data;
+ }
+ if (!UnifiedCache || !UnifiedCache->UpstreamKVDB)
return std::nullopt;
- assert(isAddrAligned(Align(8), ActionP->Data.data()));
- return ActionP->Data;
+
+ // Try to fault in from upstream.
+ return UnifiedCache->faultInFromUpstreamKV(Key);
}
Expected<std::unique_ptr<OnDiskKeyValueDB>>
OnDiskKeyValueDB::open(StringRef Path, StringRef HashName, unsigned KeySize,
- StringRef ValueName, size_t ValueSize) {
+ StringRef ValueName, size_t ValueSize,
+ UnifiedOnDiskCache *Cache) {
if (std::error_code EC = sys::fs::create_directories(Path))
return createFileError(Path, EC);
@@ -87,10 +94,14 @@ OnDiskKeyValueDB::open(StringRef Path, StringRef HashName, unsigned KeySize,
return std::move(E);
return std::unique_ptr<OnDiskKeyValueDB>(
- new OnDiskKeyValueDB(ValueSize, std::move(*ActionCache)));
+ new OnDiskKeyValueDB(ValueSize, std::move(*ActionCache), Cache));
}
Error OnDiskKeyValueDB::validate(CheckValueT CheckValue) const {
+ if (UnifiedCache && UnifiedCache->UpstreamKVDB) {
+ if (auto E = UnifiedCache->UpstreamKVDB->validate(CheckValue))
+ return E;
+ }
return Cache.validate(
[&](FileOffset Offset,
OnDiskTrieRawHashMap::ConstValueProxy Record) -> Error {
diff --git a/llvm/lib/CAS/UnifiedOnDiskCache.cpp b/llvm/lib/CAS/UnifiedOnDiskCache.cpp
new file mode 100644
index 0000000..ae9d818
--- /dev/null
+++ b/llvm/lib/CAS/UnifiedOnDiskCache.cpp
@@ -0,0 +1,613 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+/// \file
+/// Encapsulates \p OnDiskGraphDB and \p OnDiskKeyValueDB instances within one
+/// directory while also restricting storage growth with a scheme of chaining
+/// the two most recent directories (primary & upstream), where the primary
+/// "faults-in" data from the upstream one. When the primary (most recent)
+/// directory exceeds its intended limit a new empty directory becomes the
+/// primary one.
+///
+/// Within the top-level directory (the path that \p UnifiedOnDiskCache::open
+/// receives) there are directories named like this:
+///
+/// 'v<version>.<x>'
+/// 'v<version>.<x+1>'
+/// 'v<version>.<x+2>'
+/// ...
+///
+/// 'version' is the version integer for this \p UnifiedOnDiskCache's scheme and
+/// the part after the dot is an increasing integer. The primary directory is
+/// the one with the highest integer and the upstream one is the directory
+/// before it. For example, if the sub-directories contained are:
+///
+/// 'v1.5', 'v1.6', 'v1.7', 'v1.8'
+///
+/// Then the primary one is 'v1.8', the upstream one is 'v1.7', and the rest are
+/// unused directories that can be safely deleted at any time and by any
+/// process.
+///
+/// Contained within the top-level directory is a file named "lock" which is
+/// used for processes to take shared or exclusive locks for the contents of the
+/// top directory. While a \p UnifiedOnDiskCache is open it keeps a shared lock
+/// for the top-level directory; when it closes, if the primary sub-directory
+/// exceeded its limit, it attempts to get an exclusive lock in order to create
+/// a new empty primary directory; if it can't get the exclusive lock it gives
+/// up and lets the next \p UnifiedOnDiskCache instance that closes to attempt
+/// again.
+///
+/// The downside of this scheme is that while \p UnifiedOnDiskCache is open on a
+/// directory, by any process, the storage size in that directory will keep
+/// growing unrestricted. But the major benefit is that garbage-collection can
+/// be triggered on a directory concurrently, at any time and by any process,
+/// without affecting any active readers/writers in the same process or other
+/// processes.
+///
+/// The \c UnifiedOnDiskCache also provides validation and recovery on top of
+/// the underlying on-disk storage. The low-level storage is designed to remain
+/// coherent across regular process crashes, but may be invalid after power loss
+/// or similar system failures. \c UnifiedOnDiskCache::validateIfNeeded allows
+/// validating the contents once per boot and can recover by marking invalid
+/// data for garbage collection.
+///
+/// The data recovery described above requires exclusive access to the CAS, and
+/// it is an error to attempt recovery if the CAS is open in any process/thread.
+/// In order to maximize backwards compatibility with tools that do not perform
+/// validation before opening the CAS, we do not attempt to get exclusive access
+/// until recovery is actually performed, meaning as long as the data is valid
+/// it will not conflict with concurrent use.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/CAS/UnifiedOnDiskCache.h"
+#include "BuiltinCAS.h"
+#include "OnDiskCommon.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/ScopeExit.h"
+#include "llvm/ADT/SmallString.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/CAS/ActionCache.h"
+#include "llvm/CAS/OnDiskGraphDB.h"
+#include "llvm/CAS/OnDiskKeyValueDB.h"
+#include "llvm/Support/Compiler.h"
+#include "llvm/Support/Errc.h"
+#include "llvm/Support/Error.h"
+#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/FileUtilities.h"
+#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/Path.h"
+#include "llvm/Support/Program.h"
+#include "llvm/Support/raw_ostream.h"
+#include <optional>
+
+#if __has_include(<sys/sysctl.h>)
+#include <sys/sysctl.h>
+#endif
+
+using namespace llvm;
+using namespace llvm::cas;
+using namespace llvm::cas::ondisk;
+
+/// FIXME: When the version of \p DBDirPrefix is bumped up we need to figure out
+/// how to handle the leftover sub-directories of the previous version, within
+/// the \p UnifiedOnDiskCache::collectGarbage function.
+static constexpr StringLiteral DBDirPrefix = "v1.";
+
+static constexpr StringLiteral ValidationFilename = "v1.validation";
+static constexpr StringLiteral CorruptPrefix = "corrupt.";
+
+ObjectID UnifiedOnDiskCache::getObjectIDFromValue(ArrayRef<char> Value) {
+ // little endian encoded.
+ assert(Value.size() == sizeof(uint64_t));
+ return ObjectID::fromOpaqueData(support::endian::read64le(Value.data()));
+}
+
+UnifiedOnDiskCache::ValueBytes
+UnifiedOnDiskCache::getValueFromObjectID(ObjectID ID) {
+ // little endian encoded.
+ UnifiedOnDiskCache::ValueBytes ValBytes;
+ static_assert(ValBytes.size() == sizeof(ID.getOpaqueData()));
+ support::endian::write64le(ValBytes.data(), ID.getOpaqueData());
+ return ValBytes;
+}
+
+Expected<std::optional<ArrayRef<char>>>
+UnifiedOnDiskCache::faultInFromUpstreamKV(ArrayRef<uint8_t> Key) {
+ assert(UpstreamGraphDB);
+ assert(UpstreamKVDB);
+
+ std::optional<ArrayRef<char>> UpstreamValue;
+ if (Error E = UpstreamKVDB->get(Key).moveInto(UpstreamValue))
+ return std::move(E);
+ if (!UpstreamValue)
+ return std::nullopt;
+
+ // The value is the \p ObjectID in the context of the upstream
+ // \p OnDiskGraphDB instance. Translate it to the context of the primary
+ // \p OnDiskGraphDB instance.
+ ObjectID UpstreamID = getObjectIDFromValue(*UpstreamValue);
+ auto PrimaryID =
+ PrimaryGraphDB->getReference(UpstreamGraphDB->getDigest(UpstreamID));
+ if (LLVM_UNLIKELY(!PrimaryID))
+ return PrimaryID.takeError();
+ return PrimaryKVDB->put(Key, getValueFromObjectID(*PrimaryID));
+}
+
+/// \returns all the 'v<version>.<x>' names of sub-directories, sorted with
+/// ascending order of the integer after the dot. Corrupt directories, if
+/// included, will come first.
+static Expected<SmallVector<std::string, 4>>
+getAllDBDirs(StringRef Path, bool IncludeCorrupt = false) {
+ struct DBDir {
+ uint64_t Order;
+ std::string Name;
+ };
+ SmallVector<DBDir> FoundDBDirs;
+
+ std::error_code EC;
+ for (sys::fs::directory_iterator DirI(Path, EC), DirE; !EC && DirI != DirE;
+ DirI.increment(EC)) {
+ if (DirI->type() != sys::fs::file_type::directory_file)
+ continue;
+ StringRef SubDir = sys::path::filename(DirI->path());
+ if (IncludeCorrupt && SubDir.starts_with(CorruptPrefix)) {
+ FoundDBDirs.push_back({0, std::string(SubDir)});
+ continue;
+ }
+ if (!SubDir.starts_with(DBDirPrefix))
+ continue;
+ uint64_t Order;
+ if (SubDir.substr(DBDirPrefix.size()).getAsInteger(10, Order))
+ return createStringError(inconvertibleErrorCode(),
+ "unexpected directory " + DirI->path());
+ FoundDBDirs.push_back({Order, std::string(SubDir)});
+ }
+ if (EC)
+ return createFileError(Path, EC);
+
+ llvm::sort(FoundDBDirs, [](const DBDir &LHS, const DBDir &RHS) -> bool {
+ return LHS.Order <= RHS.Order;
+ });
+
+ SmallVector<std::string, 4> DBDirs;
+ for (DBDir &Dir : FoundDBDirs)
+ DBDirs.push_back(std::move(Dir.Name));
+ return DBDirs;
+}
+
+static Expected<SmallVector<std::string, 4>> getAllGarbageDirs(StringRef Path) {
+ auto DBDirs = getAllDBDirs(Path, /*IncludeCorrupt=*/true);
+ if (!DBDirs)
+ return DBDirs.takeError();
+
+ // FIXME: When the version of \p DBDirPrefix is bumped up we need to figure
+ // out how to handle the leftover sub-directories of the previous version.
+
+ for (unsigned Keep = 2; Keep > 0 && !DBDirs->empty(); --Keep) {
+ StringRef Back(DBDirs->back());
+ if (Back.starts_with(CorruptPrefix))
+ break;
+ DBDirs->pop_back();
+ }
+ return *DBDirs;
+}
+
+/// \returns Given a sub-directory named 'v<version>.<x>', it outputs the
+/// 'v<version>.<x+1>' name.
+static void getNextDBDirName(StringRef DBDir, llvm::raw_ostream &OS) {
+ assert(DBDir.starts_with(DBDirPrefix));
+ uint64_t Count;
+ bool Failed = DBDir.substr(DBDirPrefix.size()).getAsInteger(10, Count);
+ assert(!Failed);
+ (void)Failed;
+ OS << DBDirPrefix << Count + 1;
+}
+
+static Error validateOutOfProcess(StringRef LLVMCasBinary, StringRef RootPath,
+ bool CheckHash) {
+ SmallVector<StringRef> Args{LLVMCasBinary, "-cas", RootPath, "-validate"};
+ if (CheckHash)
+ Args.push_back("-check-hash");
+
+ llvm::SmallString<128> StdErrPath;
+ int StdErrFD = -1;
+ if (std::error_code EC = sys::fs::createTemporaryFile(
+ "llvm-cas-validate-stderr", "txt", StdErrFD, StdErrPath,
+ llvm::sys::fs::OF_Text))
+ return createStringError(EC, "failed to create temporary file");
+ FileRemover OutputRemover(StdErrPath.c_str());
+
+ std::optional<llvm::StringRef> Redirects[] = {
+ {""}, // stdin = /dev/null
+ {""}, // stdout = /dev/null
+ StdErrPath.str(),
+ };
+
+ std::string ErrMsg;
+ int Result =
+ sys::ExecuteAndWait(LLVMCasBinary, Args, /*Env=*/std::nullopt, Redirects,
+ /*SecondsToWait=*/120, /*MemoryLimit=*/0, &ErrMsg);
+
+ if (Result == -1)
+ return createStringError("failed to exec " + join(Args, " ") + ": " +
+ ErrMsg);
+ if (Result != 0) {
+ llvm::SmallString<64> Err("cas contents invalid");
+ if (!ErrMsg.empty()) {
+ Err += ": ";
+ Err += ErrMsg;
+ }
+ auto StdErrBuf = MemoryBuffer::getFile(StdErrPath.c_str());
+ if (StdErrBuf && !(*StdErrBuf)->getBuffer().empty()) {
+ Err += ": ";
+ Err += (*StdErrBuf)->getBuffer();
+ }
+ return createStringError(Err);
+ }
+ return Error::success();
+}
+
+static Error validateInProcess(StringRef RootPath, StringRef HashName,
+ unsigned HashByteSize, bool CheckHash) {
+ std::shared_ptr<UnifiedOnDiskCache> UniDB;
+ if (Error E = UnifiedOnDiskCache::open(RootPath, std::nullopt, HashName,
+ HashByteSize)
+ .moveInto(UniDB))
+ return E;
+ auto CAS = builtin::createObjectStoreFromUnifiedOnDiskCache(UniDB);
+ if (Error E = CAS->validate(CheckHash))
+ return E;
+ auto Cache = builtin::createActionCacheFromUnifiedOnDiskCache(UniDB);
+ if (Error E = Cache->validate())
+ return E;
+ return Error::success();
+}
+
+static Expected<uint64_t> getBootTime() {
+#if __has_include(<sys/sysctl.h>) && defined(KERN_BOOTTIME)
+ struct timeval TV;
+ size_t TVLen = sizeof(TV);
+ int KernBoot[2] = {CTL_KERN, KERN_BOOTTIME};
+ if (sysctl(KernBoot, 2, &TV, &TVLen, nullptr, 0) < 0)
+ return createStringError(llvm::errnoAsErrorCode(),
+ "failed to get boottime");
+ if (TVLen != sizeof(TV))
+ return createStringError("sysctl kern.boottime unexpected format");
+ return TV.tv_sec;
+#elif defined(__linux__)
+ // Use the mtime for /proc, which is recreated during system boot.
+ // We could also read /proc/stat and search for 'btime'.
+ sys::fs::file_status Status;
+ if (std::error_code EC = sys::fs::status("/proc", Status))
+ return createFileError("/proc", EC);
+ return Status.getLastModificationTime().time_since_epoch().count();
+#else
+ llvm::report_fatal_error("getBootTime unimplemented");
+#endif
+}
+
+Expected<ValidationResult> UnifiedOnDiskCache::validateIfNeeded(
+ StringRef RootPath, StringRef HashName, unsigned HashByteSize,
+ bool CheckHash, bool AllowRecovery, bool ForceValidation,
+ std::optional<StringRef> LLVMCasBinaryPath) {
+ if (std::error_code EC = sys::fs::create_directories(RootPath))
+ return createFileError(RootPath, EC);
+
+ SmallString<256> PathBuf(RootPath);
+ sys::path::append(PathBuf, ValidationFilename);
+ int FD = -1;
+ if (std::error_code EC = sys::fs::openFileForReadWrite(
+ PathBuf, FD, sys::fs::CD_OpenAlways, sys::fs::OF_None))
+ return createFileError(PathBuf, EC);
+ assert(FD != -1);
+
+ sys::fs::file_t File = sys::fs::convertFDToNativeFile(FD);
+ auto CloseFile = make_scope_exit([&]() { sys::fs::closeFile(File); });
+
+ if (std::error_code EC = lockFileThreadSafe(FD, sys::fs::LockKind::Exclusive))
+ return createFileError(PathBuf, EC);
+ auto UnlockFD = make_scope_exit([&]() { unlockFileThreadSafe(FD); });
+
+ SmallString<8> Bytes;
+ if (Error E = sys::fs::readNativeFileToEOF(File, Bytes))
+ return createFileError(PathBuf, std::move(E));
+
+ uint64_t ValidationBootTime = 0;
+ if (!Bytes.empty() &&
+ StringRef(Bytes).trim().getAsInteger(10, ValidationBootTime))
+ return createFileError(PathBuf, errc::illegal_byte_sequence,
+ "expected integer");
+
+ static uint64_t BootTime = 0;
+ if (BootTime == 0)
+ if (Error E = getBootTime().moveInto(BootTime))
+ return std::move(E);
+
+ std::string LogValidationError;
+
+ if (ValidationBootTime == BootTime && !ForceValidation)
+ return ValidationResult::Skipped;
+
+ // Validate!
+ bool NeedsRecovery = false;
+ if (Error E =
+ LLVMCasBinaryPath
+ ? validateOutOfProcess(*LLVMCasBinaryPath, RootPath, CheckHash)
+ : validateInProcess(RootPath, HashName, HashByteSize,
+ CheckHash)) {
+ if (AllowRecovery) {
+ consumeError(std::move(E));
+ NeedsRecovery = true;
+ } else {
+ return std::move(E);
+ }
+ }
+
+ if (NeedsRecovery) {
+ sys::path::remove_filename(PathBuf);
+ sys::path::append(PathBuf, "lock");
+
+ int LockFD = -1;
+ if (std::error_code EC = sys::fs::openFileForReadWrite(
+ PathBuf, LockFD, sys::fs::CD_OpenAlways, sys::fs::OF_None))
+ return createFileError(PathBuf, EC);
+ sys::fs::file_t LockFile = sys::fs::convertFDToNativeFile(LockFD);
+ auto CloseLock = make_scope_exit([&]() { sys::fs::closeFile(LockFile); });
+ if (std::error_code EC = tryLockFileThreadSafe(LockFD)) {
+ if (EC == std::errc::no_lock_available)
+ return createFileError(
+ PathBuf, EC,
+ "CAS validation requires exclusive access but CAS was in use");
+ return createFileError(PathBuf, EC);
+ }
+ auto UnlockFD = make_scope_exit([&]() { unlockFileThreadSafe(LockFD); });
+
+ auto DBDirs = getAllDBDirs(RootPath);
+ if (!DBDirs)
+ return DBDirs.takeError();
+
+ for (StringRef DBDir : *DBDirs) {
+ sys::path::remove_filename(PathBuf);
+ sys::path::append(PathBuf, DBDir);
+ std::error_code EC;
+ int Attempt = 0, MaxAttempts = 100;
+ SmallString<128> GCPath;
+ for (; Attempt < MaxAttempts; ++Attempt) {
+ GCPath.assign(RootPath);
+ sys::path::append(GCPath, CorruptPrefix + std::to_string(Attempt) +
+ "." + DBDir);
+ EC = sys::fs::rename(PathBuf, GCPath);
+ // Darwin uses ENOTEMPTY. Linux may return either ENOTEMPTY or EEXIST.
+ if (EC != errc::directory_not_empty && EC != errc::file_exists)
+ break;
+ }
+ if (Attempt == MaxAttempts)
+ return createStringError(
+ EC, "rename " + PathBuf +
+ " failed: too many CAS directories awaiting pruning");
+ if (EC)
+ return createStringError(EC, "rename " + PathBuf + " to " + GCPath +
+ " failed: " + EC.message());
+ }
+ }
+
+ if (ValidationBootTime != BootTime) {
+ // Fix filename in case we have error to report.
+ sys::path::remove_filename(PathBuf);
+ sys::path::append(PathBuf, ValidationFilename);
+ if (std::error_code EC = sys::fs::resize_file(FD, 0))
+ return createFileError(PathBuf, EC);
+ raw_fd_ostream OS(FD, /*shouldClose=*/false);
+ OS.seek(0); // resize does not reset position
+ OS << BootTime << '\n';
+ if (OS.has_error())
+ return createFileError(PathBuf, OS.error());
+ }
+
+ return NeedsRecovery ? ValidationResult::Recovered : ValidationResult::Valid;
+}
+
+Expected<std::unique_ptr<UnifiedOnDiskCache>>
+UnifiedOnDiskCache::open(StringRef RootPath, std::optional<uint64_t> SizeLimit,
+ StringRef HashName, unsigned HashByteSize,
+ OnDiskGraphDB::FaultInPolicy FaultInPolicy) {
+ if (std::error_code EC = sys::fs::create_directories(RootPath))
+ return createFileError(RootPath, EC);
+
+ SmallString<256> PathBuf(RootPath);
+ sys::path::append(PathBuf, "lock");
+ int LockFD = -1;
+ if (std::error_code EC = sys::fs::openFileForReadWrite(
+ PathBuf, LockFD, sys::fs::CD_OpenAlways, sys::fs::OF_None))
+ return createFileError(PathBuf, EC);
+ assert(LockFD != -1);
+ // Locking the directory using shared lock, which will prevent other processes
+ // from creating a new chain (essentially while a \p UnifiedOnDiskCache
+ // instance holds a shared lock the storage for the primary directory will
+ // grow unrestricted).
+ if (std::error_code EC =
+ lockFileThreadSafe(LockFD, sys::fs::LockKind::Shared))
+ return createFileError(PathBuf, EC);
+
+ auto DBDirs = getAllDBDirs(RootPath);
+ if (!DBDirs)
+ return DBDirs.takeError();
+ if (DBDirs->empty())
+ DBDirs->push_back((Twine(DBDirPrefix) + "1").str());
+
+ assert(!DBDirs->empty());
+
+ /// If there is only one directory open databases on it. If there are 2 or
+ /// more directories, get the most recent directories and chain them, with the
+ /// most recent being the primary one. The remaining directories are unused
+ /// data than can be garbage-collected.
+ auto UniDB = std::unique_ptr<UnifiedOnDiskCache>(new UnifiedOnDiskCache());
+ std::unique_ptr<OnDiskGraphDB> UpstreamGraphDB;
+ std::unique_ptr<OnDiskKeyValueDB> UpstreamKVDB;
+ if (DBDirs->size() > 1) {
+ StringRef UpstreamDir = *(DBDirs->end() - 2);
+ PathBuf = RootPath;
+ sys::path::append(PathBuf, UpstreamDir);
+ if (Error E = OnDiskGraphDB::open(PathBuf, HashName, HashByteSize,
+ /*UpstreamDB=*/nullptr, FaultInPolicy)
+ .moveInto(UpstreamGraphDB))
+ return std::move(E);
+ if (Error E = OnDiskKeyValueDB::open(PathBuf, HashName, HashByteSize,
+ /*ValueName=*/"objectid",
+ /*ValueSize=*/sizeof(uint64_t))
+ .moveInto(UpstreamKVDB))
+ return std::move(E);
+ }
+
+ StringRef PrimaryDir = *(DBDirs->end() - 1);
+ PathBuf = RootPath;
+ sys::path::append(PathBuf, PrimaryDir);
+ std::unique_ptr<OnDiskGraphDB> PrimaryGraphDB;
+ if (Error E = OnDiskGraphDB::open(PathBuf, HashName, HashByteSize,
+ UpstreamGraphDB.get(), FaultInPolicy)
+ .moveInto(PrimaryGraphDB))
+ return std::move(E);
+ std::unique_ptr<OnDiskKeyValueDB> PrimaryKVDB;
+ // \p UnifiedOnDiskCache does manual chaining for key-value requests,
+ // including an extra translation step of the value during fault-in.
+ if (Error E =
+ OnDiskKeyValueDB::open(PathBuf, HashName, HashByteSize,
+ /*ValueName=*/"objectid",
+ /*ValueSize=*/sizeof(uint64_t), UniDB.get())
+ .moveInto(PrimaryKVDB))
+ return std::move(E);
+
+ UniDB->RootPath = RootPath;
+ UniDB->SizeLimit = SizeLimit.value_or(0);
+ UniDB->LockFD = LockFD;
+ UniDB->NeedsGarbageCollection = DBDirs->size() > 2;
+ UniDB->PrimaryDBDir = PrimaryDir;
+ UniDB->UpstreamGraphDB = std::move(UpstreamGraphDB);
+ UniDB->PrimaryGraphDB = std::move(PrimaryGraphDB);
+ UniDB->UpstreamKVDB = std::move(UpstreamKVDB);
+ UniDB->PrimaryKVDB = std::move(PrimaryKVDB);
+
+ return std::move(UniDB);
+}
+
+void UnifiedOnDiskCache::setSizeLimit(std::optional<uint64_t> SizeLimit) {
+ this->SizeLimit = SizeLimit.value_or(0);
+}
+
+uint64_t UnifiedOnDiskCache::getStorageSize() const {
+ uint64_t TotalSize = getPrimaryStorageSize();
+ if (UpstreamGraphDB)
+ TotalSize += UpstreamGraphDB->getStorageSize();
+ if (UpstreamKVDB)
+ TotalSize += UpstreamKVDB->getStorageSize();
+ return TotalSize;
+}
+
+uint64_t UnifiedOnDiskCache::getPrimaryStorageSize() const {
+ return PrimaryGraphDB->getStorageSize() + PrimaryKVDB->getStorageSize();
+}
+
+bool UnifiedOnDiskCache::hasExceededSizeLimit() const {
+ uint64_t CurSizeLimit = SizeLimit;
+ if (!CurSizeLimit)
+ return false;
+
+ // If the hard limit is beyond 85%, declare above limit and request clean up.
+ unsigned CurrentPercent =
+ std::max(PrimaryGraphDB->getHardStorageLimitUtilization(),
+ PrimaryKVDB->getHardStorageLimitUtilization());
+ if (CurrentPercent > 85)
+ return true;
+
+ // We allow each of the directories in the chain to reach up to half the
+ // intended size limit. Check whether the primary directory has exceeded half
+ // the limit or not, in order to decide whether we need to start a new chain.
+ //
+ // We could check the size limit against the sum of sizes of both the primary
+ // and upstream directories but then if the upstream is significantly larger
+ // than the intended limit, it would trigger a new chain to be created before
+ // the primary has reached its own limit. Essentially in such situation we
+ // prefer reclaiming the storage later in order to have more consistent cache
+ // hits behavior.
+ return (CurSizeLimit / 2) < getPrimaryStorageSize();
+}
+
+Error UnifiedOnDiskCache::close(bool CheckSizeLimit) {
+ if (LockFD == -1)
+ return Error::success(); // already closed.
+ auto CloseLock = make_scope_exit([&]() {
+ assert(LockFD >= 0);
+ sys::fs::file_t LockFile = sys::fs::convertFDToNativeFile(LockFD);
+ sys::fs::closeFile(LockFile);
+ LockFD = -1;
+ });
+
+ bool ExceededSizeLimit = CheckSizeLimit ? hasExceededSizeLimit() : false;
+ UpstreamKVDB.reset();
+ PrimaryKVDB.reset();
+ UpstreamGraphDB.reset();
+ PrimaryGraphDB.reset();
+ if (std::error_code EC = unlockFileThreadSafe(LockFD))
+ return createFileError(RootPath, EC);
+
+ if (!ExceededSizeLimit)
+ return Error::success();
+
+ // The primary directory exceeded its intended size limit. Try to get an
+ // exclusive lock in order to create a new primary directory for next time
+ // this \p UnifiedOnDiskCache path is opened.
+
+ if (std::error_code EC = tryLockFileThreadSafe(
+ LockFD, std::chrono::milliseconds(0), sys::fs::LockKind::Exclusive)) {
+ if (EC == errc::no_lock_available)
+ return Error::success(); // couldn't get exclusive lock, give up.
+ return createFileError(RootPath, EC);
+ }
+ auto UnlockFile = make_scope_exit([&]() { unlockFileThreadSafe(LockFD); });
+
+ // Managed to get an exclusive lock which means there are no other open
+ // \p UnifiedOnDiskCache instances for the same path, so we can safely start a
+ // new primary directory. To start a new primary directory we just have to
+ // create a new empty directory with the next consecutive index; since this is
+ // an atomic operation we will leave the top-level directory in a consistent
+ // state even if the process dies during this code-path.
+
+ SmallString<256> PathBuf(RootPath);
+ raw_svector_ostream OS(PathBuf);
+ OS << sys::path::get_separator();
+ getNextDBDirName(PrimaryDBDir, OS);
+ if (std::error_code EC = sys::fs::create_directory(PathBuf))
+ return createFileError(PathBuf, EC);
+
+ NeedsGarbageCollection = true;
+ return Error::success();
+}
+
+UnifiedOnDiskCache::UnifiedOnDiskCache() = default;
+
+UnifiedOnDiskCache::~UnifiedOnDiskCache() { consumeError(close()); }
+
+Error UnifiedOnDiskCache::collectGarbage(StringRef Path) {
+ auto DBDirs = getAllGarbageDirs(Path);
+ if (!DBDirs)
+ return DBDirs.takeError();
+
+ SmallString<256> PathBuf(Path);
+ for (StringRef UnusedSubDir : *DBDirs) {
+ sys::path::append(PathBuf, UnusedSubDir);
+ if (std::error_code EC = sys::fs::remove_directories(PathBuf))
+ return createFileError(PathBuf, EC);
+ sys::path::remove_filename(PathBuf);
+ }
+ return Error::success();
+}
+
+Error UnifiedOnDiskCache::collectGarbage() { return collectGarbage(RootPath); }
diff --git a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp
index e5c85d5..1ea30d8 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp
@@ -745,11 +745,6 @@ void AppleAccelTableStaticTypeData::emit(AsmPrinter *Asm) const {
Asm->emitInt32(QualifiedNameHash);
}
-constexpr AppleAccelTableData::Atom AppleAccelTableTypeData::Atoms[];
-constexpr AppleAccelTableData::Atom AppleAccelTableOffsetData::Atoms[];
-constexpr AppleAccelTableData::Atom AppleAccelTableStaticOffsetData::Atoms[];
-constexpr AppleAccelTableData::Atom AppleAccelTableStaticTypeData::Atoms[];
-
#ifndef NDEBUG
void AppleAccelTableWriter::Header::print(raw_ostream &OS) const {
OS << "Magic: " << format("0x%x", Magic) << "\n"
diff --git a/llvm/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp b/llvm/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp
index 171fb83..98cdada 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp
@@ -112,8 +112,7 @@ void DbgValueHistoryMap::Entry::endEntry(EntryIndex Index) {
/// to the first intersecting scope range if one exists.
static std::optional<ArrayRef<InsnRange>::iterator>
intersects(const MachineInstr *StartMI, const MachineInstr *EndMI,
- const ArrayRef<InsnRange> &Ranges,
- const InstructionOrdering &Ordering) {
+ ArrayRef<InsnRange> Ranges, const InstructionOrdering &Ordering) {
for (auto RangesI = Ranges.begin(), RangesE = Ranges.end();
RangesI != RangesE; ++RangesI) {
if (EndMI && Ordering.isBefore(EndMI, RangesI->first))
diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp
index 8ea1326..0309e22 100644
--- a/llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -368,7 +368,7 @@ class CodeGenPrepare {
std::unique_ptr<DominatorTree> DT;
public:
- CodeGenPrepare(){};
+ CodeGenPrepare() = default;
CodeGenPrepare(const TargetMachine *TM) : TM(TM){};
/// If encounter huge function, we need to limit the build time.
bool IsHugeFunc = false;
diff --git a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
index 9ace7d6..ec4d13f 100644
--- a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
@@ -589,8 +589,8 @@ bool CombinerHelper::matchCombineShuffleVector(
return true;
}
-void CombinerHelper::applyCombineShuffleVector(
- MachineInstr &MI, const ArrayRef<Register> Ops) const {
+void CombinerHelper::applyCombineShuffleVector(MachineInstr &MI,
+ ArrayRef<Register> Ops) const {
Register DstReg = MI.getOperand(0).getReg();
Builder.setInsertPt(*MI.getParent(), MI);
Register NewDstReg = MRI.cloneVirtualRegister(DstReg);
diff --git a/llvm/lib/CodeGen/MachineOperand.cpp b/llvm/lib/CodeGen/MachineOperand.cpp
index bb9c76f..8c6d219 100644
--- a/llvm/lib/CodeGen/MachineOperand.cpp
+++ b/llvm/lib/CodeGen/MachineOperand.cpp
@@ -363,8 +363,9 @@ bool MachineOperand::isIdenticalTo(const MachineOperand &Other) const {
case MachineOperand::MO_RegisterMask:
case MachineOperand::MO_RegisterLiveOut: {
// Shallow compare of the two RegMasks
- const uint32_t *RegMask = getRegMask();
- const uint32_t *OtherRegMask = Other.getRegMask();
+ const uint32_t *RegMask = isRegMask() ? getRegMask() : getRegLiveOut();
+ const uint32_t *OtherRegMask =
+ isRegMask() ? Other.getRegMask() : Other.getRegLiveOut();
if (RegMask == OtherRegMask)
return true;
@@ -434,7 +435,8 @@ hash_code llvm::hash_value(const MachineOperand &MO) {
if (const MachineFunction *MF = getMFIfAvailable(MO)) {
const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
unsigned RegMaskSize = MachineOperand::getRegMaskSize(TRI->getNumRegs());
- const uint32_t *RegMask = MO.getRegMask();
+ const uint32_t *RegMask =
+ MO.isRegMask() ? MO.getRegMask() : MO.getRegLiveOut();
std::vector<stable_hash> RegMaskHashes(RegMask, RegMask + RegMaskSize);
return hash_combine(MO.getType(), MO.getTargetFlags(),
stable_hash_combine(RegMaskHashes));
diff --git a/llvm/lib/CodeGen/MachineScheduler.cpp b/llvm/lib/CodeGen/MachineScheduler.cpp
index 3ed1045..f18c051 100644
--- a/llvm/lib/CodeGen/MachineScheduler.cpp
+++ b/llvm/lib/CodeGen/MachineScheduler.cpp
@@ -334,7 +334,7 @@ public:
LiveIntervals &LIS;
};
- MachineSchedulerImpl() {}
+ MachineSchedulerImpl() = default;
// Migration only
void setLegacyPass(MachineFunctionPass *P) { this->P = P; }
void setMFAM(MachineFunctionAnalysisManager *MFAM) { this->MFAM = MFAM; }
@@ -358,7 +358,7 @@ public:
MachineLoopInfo &MLI;
AAResults &AA;
};
- PostMachineSchedulerImpl() {}
+ PostMachineSchedulerImpl() = default;
// Migration only
void setLegacyPass(MachineFunctionPass *P) { this->P = P; }
void setMFAM(MachineFunctionAnalysisManager *MFAM) { this->MFAM = MFAM; }
diff --git a/llvm/lib/CodeGen/MachineStableHash.cpp b/llvm/lib/CodeGen/MachineStableHash.cpp
index 9d56696..6da708d 100644
--- a/llvm/lib/CodeGen/MachineStableHash.cpp
+++ b/llvm/lib/CodeGen/MachineStableHash.cpp
@@ -136,7 +136,8 @@ stable_hash llvm::stableHashValue(const MachineOperand &MO) {
const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
unsigned RegMaskSize =
MachineOperand::getRegMaskSize(TRI->getNumRegs());
- const uint32_t *RegMask = MO.getRegMask();
+ const uint32_t *RegMask =
+ MO.isRegMask() ? MO.getRegMask() : MO.getRegLiveOut();
std::vector<llvm::stable_hash> RegMaskHashes(RegMask,
RegMask + RegMaskSize);
return stable_hash_combine(MO.getType(), MO.getTargetFlags(),
diff --git a/llvm/lib/CodeGen/RegAllocFast.cpp b/llvm/lib/CodeGen/RegAllocFast.cpp
index 697b779..ec6ffd4 100644
--- a/llvm/lib/CodeGen/RegAllocFast.cpp
+++ b/llvm/lib/CodeGen/RegAllocFast.cpp
@@ -206,7 +206,7 @@ private:
bool Error = false; ///< Could not allocate.
explicit LiveReg(Register VirtReg) : VirtReg(VirtReg) {}
- explicit LiveReg() {}
+ explicit LiveReg() = default;
unsigned getSparseSetIndex() const { return VirtReg.virtRegIndex(); }
};
diff --git a/llvm/lib/CodeGen/RegisterCoalescer.cpp b/llvm/lib/CodeGen/RegisterCoalescer.cpp
index e17a214b..38f6deb 100644
--- a/llvm/lib/CodeGen/RegisterCoalescer.cpp
+++ b/llvm/lib/CodeGen/RegisterCoalescer.cpp
@@ -378,7 +378,7 @@ class RegisterCoalescer : private LiveRangeEdit::Delegate {
public:
// For legacy pass only.
- RegisterCoalescer() {}
+ RegisterCoalescer() = default;
RegisterCoalescer &operator=(RegisterCoalescer &&Other) = default;
RegisterCoalescer(LiveIntervals *LIS, SlotIndexes *SI,
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index bdd6bf0..46c4bb8 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -9374,7 +9374,7 @@ static unsigned bigEndianByteAt(unsigned BW, unsigned i) {
// Check if the bytes offsets we are looking at match with either big or
// little endian value loaded. Return true for big endian, false for little
// endian, and std::nullopt if match failed.
-static std::optional<bool> isBigEndian(const ArrayRef<int64_t> ByteOffsets,
+static std::optional<bool> isBigEndian(ArrayRef<int64_t> ByteOffsets,
int64_t FirstOffset) {
// The endian can be decided only when it is 2 bytes at least.
unsigned Width = ByteOffsets.size();
diff --git a/llvm/lib/DWARFLinker/Parallel/DWARFLinkerUnit.h b/llvm/lib/DWARFLinker/Parallel/DWARFLinkerUnit.h
index 84757ae..970abdc 100644
--- a/llvm/lib/DWARFLinker/Parallel/DWARFLinkerUnit.h
+++ b/llvm/lib/DWARFLinker/Parallel/DWARFLinkerUnit.h
@@ -28,7 +28,7 @@ using MacroOffset2UnitMapTy = DenseMap<uint64_t, DwarfUnit *>;
/// Base class for all Dwarf units(Compile unit/Type table unit).
class DwarfUnit : public OutputSections {
public:
- virtual ~DwarfUnit() {}
+ virtual ~DwarfUnit() = default;
DwarfUnit(LinkingGlobalData &GlobalData, unsigned ID,
StringRef ClangModuleName)
: OutputSections(GlobalData), ID(ID), ClangModuleName(ClangModuleName),
diff --git a/llvm/lib/DWARFLinker/Parallel/StringEntryToDwarfStringPoolEntryMap.h b/llvm/lib/DWARFLinker/Parallel/StringEntryToDwarfStringPoolEntryMap.h
index f67536e..8ccb4a5 100644
--- a/llvm/lib/DWARFLinker/Parallel/StringEntryToDwarfStringPoolEntryMap.h
+++ b/llvm/lib/DWARFLinker/Parallel/StringEntryToDwarfStringPoolEntryMap.h
@@ -22,7 +22,7 @@ class StringEntryToDwarfStringPoolEntryMap {
public:
StringEntryToDwarfStringPoolEntryMap(LinkingGlobalData &GlobalData)
: GlobalData(GlobalData) {}
- ~StringEntryToDwarfStringPoolEntryMap() {}
+ ~StringEntryToDwarfStringPoolEntryMap() = default;
/// Create DwarfStringPoolEntry for specified StringEntry if necessary.
/// Initialize DwarfStringPoolEntry with initial values.
diff --git a/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp b/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp
index 7e606c6a..4e7db82 100644
--- a/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp
@@ -27,7 +27,7 @@
namespace llvm {
namespace orc {
-MemoryMapper::~MemoryMapper() {}
+MemoryMapper::~MemoryMapper() = default;
InProcessMemoryMapper::InProcessMemoryMapper(size_t PageSize)
: PageSize(PageSize) {}
diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
index 0e5926f..fff9a81 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -528,7 +528,7 @@ void OpenMPIRBuilder::getKernelArgsVector(TargetKernelArgs &KernelArgs,
Value *Version = Builder.getInt32(OMP_KERNEL_ARG_VERSION);
Value *PointerNum = Builder.getInt32(KernelArgs.NumTargetItems);
auto Int32Ty = Type::getInt32Ty(Builder.getContext());
- constexpr const size_t MaxDim = 3;
+ constexpr size_t MaxDim = 3;
Value *ZeroArray = Constant::getNullValue(ArrayType::get(Int32Ty, MaxDim));
Value *Flags = Builder.getInt64(KernelArgs.HasNoWait);
diff --git a/llvm/lib/IR/ConstantsContext.h b/llvm/lib/IR/ConstantsContext.h
index 51fb40b..e3e8d89 100644
--- a/llvm/lib/IR/ConstantsContext.h
+++ b/llvm/lib/IR/ConstantsContext.h
@@ -535,7 +535,7 @@ struct ConstantPtrAuthKeyType {
unsigned getHash() const { return hash_combine_range(Operands); }
- using TypeClass = typename ConstantInfo<ConstantPtrAuth>::TypeClass;
+ using TypeClass = ConstantInfo<ConstantPtrAuth>::TypeClass;
ConstantPtrAuth *create(TypeClass *Ty) const {
return new ConstantPtrAuth(Operands[0], cast<ConstantInt>(Operands[1]),
diff --git a/llvm/lib/IR/ModuleSummaryIndex.cpp b/llvm/lib/IR/ModuleSummaryIndex.cpp
index 62fd62c..3394754 100644
--- a/llvm/lib/IR/ModuleSummaryIndex.cpp
+++ b/llvm/lib/IR/ModuleSummaryIndex.cpp
@@ -34,8 +34,6 @@ static cl::opt<bool> ImportConstantsWithRefs(
"import-constants-with-refs", cl::init(true), cl::Hidden,
cl::desc("Import constant global variables with references"));
-constexpr uint32_t FunctionSummary::ParamAccess::RangeWidth;
-
FunctionSummary FunctionSummary::ExternalNode =
FunctionSummary::makeDummyFunctionSummary(
SmallVector<FunctionSummary::EdgeTy, 0>());
@@ -88,8 +86,6 @@ std::pair<unsigned, unsigned> FunctionSummary::specialRefCounts() const {
return {RORefCnt, WORefCnt};
}
-constexpr uint64_t ModuleSummaryIndex::BitcodeSummaryVersion;
-
uint64_t ModuleSummaryIndex::getFlags() const {
uint64_t Flags = 0;
// Flags & 0x4 is reserved. DO NOT REUSE.
diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp
index b618222..23be42f 100644
--- a/llvm/lib/LTO/LTO.cpp
+++ b/llvm/lib/LTO/LTO.cpp
@@ -1076,63 +1076,59 @@ Expected<ArrayRef<SymbolResolution>>
LTO::addThinLTO(BitcodeModule BM, ArrayRef<InputFile::Symbol> Syms,
ArrayRef<SymbolResolution> Res) {
llvm::TimeTraceScope timeScope("LTO add thin LTO");
+ const auto BMID = BM.getModuleIdentifier();
ArrayRef<SymbolResolution> ResTmp = Res;
for (const InputFile::Symbol &Sym : Syms) {
assert(!ResTmp.empty());
const SymbolResolution &R = ResTmp.consume_front();
- if (!Sym.getIRName().empty()) {
+ if (!Sym.getIRName().empty() && R.Prevailing) {
auto GUID = GlobalValue::getGUIDAssumingExternalLinkage(
GlobalValue::getGlobalIdentifier(Sym.getIRName(),
GlobalValue::ExternalLinkage, ""));
- if (R.Prevailing)
- ThinLTO.setPrevailingModuleForGUID(GUID, BM.getModuleIdentifier());
+ ThinLTO.setPrevailingModuleForGUID(GUID, BMID);
}
}
- if (Error Err =
- BM.readSummary(ThinLTO.CombinedIndex, BM.getModuleIdentifier(),
- [&](GlobalValue::GUID GUID) {
- return ThinLTO.isPrevailingModuleForGUID(
- GUID, BM.getModuleIdentifier());
- }))
+ if (Error Err = BM.readSummary(
+ ThinLTO.CombinedIndex, BMID, [&](GlobalValue::GUID GUID) {
+ return ThinLTO.isPrevailingModuleForGUID(GUID, BMID);
+ }))
return Err;
- LLVM_DEBUG(dbgs() << "Module " << BM.getModuleIdentifier() << "\n");
+ LLVM_DEBUG(dbgs() << "Module " << BMID << "\n");
for (const InputFile::Symbol &Sym : Syms) {
assert(!Res.empty());
const SymbolResolution &R = Res.consume_front();
- if (!Sym.getIRName().empty()) {
+ if (!Sym.getIRName().empty() &&
+ (R.Prevailing || R.FinalDefinitionInLinkageUnit)) {
auto GUID = GlobalValue::getGUIDAssumingExternalLinkage(
GlobalValue::getGlobalIdentifier(Sym.getIRName(),
GlobalValue::ExternalLinkage, ""));
if (R.Prevailing) {
- assert(
- ThinLTO.isPrevailingModuleForGUID(GUID, BM.getModuleIdentifier()));
+ assert(ThinLTO.isPrevailingModuleForGUID(GUID, BMID));
// For linker redefined symbols (via --wrap or --defsym) we want to
// switch the linkage to `weak` to prevent IPOs from happening.
// Find the summary in the module for this very GV and record the new
// linkage so that we can switch it when we import the GV.
if (R.LinkerRedefined)
- if (auto S = ThinLTO.CombinedIndex.findSummaryInModule(
- GUID, BM.getModuleIdentifier()))
+ if (auto S = ThinLTO.CombinedIndex.findSummaryInModule(GUID, BMID))
S->setLinkage(GlobalValue::WeakAnyLinkage);
}
// If the linker resolved the symbol to a local definition then mark it
// as local in the summary for the module we are adding.
if (R.FinalDefinitionInLinkageUnit) {
- if (auto S = ThinLTO.CombinedIndex.findSummaryInModule(
- GUID, BM.getModuleIdentifier())) {
+ if (auto S = ThinLTO.CombinedIndex.findSummaryInModule(GUID, BMID)) {
S->setDSOLocal(true);
}
}
}
}
- if (!ThinLTO.ModuleMap.insert({BM.getModuleIdentifier(), BM}).second)
+ if (!ThinLTO.ModuleMap.insert({BMID, BM}).second)
return make_error<StringError>(
"Expected at most one ThinLTO module per bitcode file",
inconvertibleErrorCode());
@@ -1143,10 +1139,10 @@ LTO::addThinLTO(BitcodeModule BM, ArrayRef<InputFile::Symbol> Syms,
// This is a fuzzy name matching where only modules with name containing the
// specified switch values are going to be compiled.
for (const std::string &Name : Conf.ThinLTOModulesToCompile) {
- if (BM.getModuleIdentifier().contains(Name)) {
- ThinLTO.ModulesToCompile->insert({BM.getModuleIdentifier(), BM});
- LLVM_DEBUG(dbgs() << "[ThinLTO] Selecting " << BM.getModuleIdentifier()
- << " to compile\n");
+ if (BMID.contains(Name)) {
+ ThinLTO.ModulesToCompile->insert({BMID, BM});
+ LLVM_DEBUG(dbgs() << "[ThinLTO] Selecting " << BMID << " to compile\n");
+ break;
}
}
}
diff --git a/llvm/lib/MC/GOFFObjectWriter.cpp b/llvm/lib/MC/GOFFObjectWriter.cpp
index 71bd397..a3eaaa7 100644
--- a/llvm/lib/MC/GOFFObjectWriter.cpp
+++ b/llvm/lib/MC/GOFFObjectWriter.cpp
@@ -520,7 +520,7 @@ GOFFObjectWriter::GOFFObjectWriter(
std::unique_ptr<MCGOFFObjectTargetWriter> MOTW, raw_pwrite_stream &OS)
: TargetObjectWriter(std::move(MOTW)), OS(OS) {}
-GOFFObjectWriter::~GOFFObjectWriter() {}
+GOFFObjectWriter::~GOFFObjectWriter() = default;
uint64_t GOFFObjectWriter::writeObject() {
uint64_t Size = GOFFWriter(OS, *Asm).writeObject();
diff --git a/llvm/lib/MC/MCDXContainerWriter.cpp b/llvm/lib/MC/MCDXContainerWriter.cpp
index 5eda039..ebed411 100644
--- a/llvm/lib/MC/MCDXContainerWriter.cpp
+++ b/llvm/lib/MC/MCDXContainerWriter.cpp
@@ -16,7 +16,7 @@
using namespace llvm;
-MCDXContainerTargetWriter::~MCDXContainerTargetWriter() {}
+MCDXContainerTargetWriter::~MCDXContainerTargetWriter() = default;
uint64_t DXContainerObjectWriter::writeObject() {
auto &Asm = *this->Asm;
diff --git a/llvm/lib/MC/MCGOFFStreamer.cpp b/llvm/lib/MC/MCGOFFStreamer.cpp
index 8b228db..ad6397b 100644
--- a/llvm/lib/MC/MCGOFFStreamer.cpp
+++ b/llvm/lib/MC/MCGOFFStreamer.cpp
@@ -20,7 +20,7 @@
using namespace llvm;
-MCGOFFStreamer::~MCGOFFStreamer() {}
+MCGOFFStreamer::~MCGOFFStreamer() = default;
GOFFObjectWriter &MCGOFFStreamer::getWriter() {
return static_cast<GOFFObjectWriter &>(getAssembler().getWriter());
diff --git a/llvm/lib/ObjCopy/COFF/COFFWriter.h b/llvm/lib/ObjCopy/COFF/COFFWriter.h
index 66d7f01..3ee0e06 100644
--- a/llvm/lib/ObjCopy/COFF/COFFWriter.h
+++ b/llvm/lib/ObjCopy/COFF/COFFWriter.h
@@ -50,7 +50,7 @@ class COFFWriter {
Expected<uint32_t> virtualAddressToFileAddress(uint32_t RVA);
public:
- virtual ~COFFWriter() {}
+ virtual ~COFFWriter() = default;
Error write();
COFFWriter(Object &Obj, raw_ostream &Out)
diff --git a/llvm/lib/ObjCopy/ELF/ELFObject.h b/llvm/lib/ObjCopy/ELF/ELFObject.h
index 4f6473f..2783ef27 100644
--- a/llvm/lib/ObjCopy/ELF/ELFObject.h
+++ b/llvm/lib/ObjCopy/ELF/ELFObject.h
@@ -134,7 +134,7 @@ private:
using Elf_Sym = typename ELFT::Sym;
public:
- ~ELFSectionWriter() override {}
+ ~ELFSectionWriter() override = default;
Error visit(const SymbolTableSection &Sec) override;
Error visit(const RelocationSection &Sec) override;
Error visit(const GnuDebugLinkSection &Sec) override;
@@ -180,7 +180,7 @@ public:
class BinarySectionWriter : public SectionWriter {
public:
- ~BinarySectionWriter() override {}
+ ~BinarySectionWriter() override = default;
Error visit(const SymbolTableSection &Sec) override;
Error visit(const RelocationSection &Sec) override;
@@ -346,7 +346,7 @@ private:
size_t totalSize() const;
public:
- ~ELFWriter() override {}
+ ~ELFWriter() override = default;
bool WriteSectionHeaders;
// For --only-keep-debug, select an alternative section/segment layout
@@ -367,7 +367,7 @@ private:
uint64_t TotalSize = 0;
public:
- ~BinaryWriter() override {}
+ ~BinaryWriter() override = default;
Error finalize() override;
Error write() override;
BinaryWriter(Object &Obj, raw_ostream &Out, const CommonConfig &Config)
@@ -784,7 +784,7 @@ private:
SymbolTableSection *Symbols = nullptr;
public:
- ~SectionIndexSection() override {}
+ ~SectionIndexSection() override = default;
void addIndex(uint32_t Index) {
assert(Size > 0);
Indexes.push_back(Index);
diff --git a/llvm/lib/ObjCopy/MachO/MachOReader.h b/llvm/lib/ObjCopy/MachO/MachOReader.h
index e315e6fd..940ba4c 100644
--- a/llvm/lib/ObjCopy/MachO/MachOReader.h
+++ b/llvm/lib/ObjCopy/MachO/MachOReader.h
@@ -23,7 +23,7 @@ namespace macho {
// raw binaries and regular MachO object files.
class Reader {
public:
- virtual ~Reader(){};
+ virtual ~Reader() = default;
virtual Expected<std::unique_ptr<Object>> create() const = 0;
};
diff --git a/llvm/lib/ObjCopy/XCOFF/XCOFFWriter.h b/llvm/lib/ObjCopy/XCOFF/XCOFFWriter.h
index 8620548..47639ad 100644
--- a/llvm/lib/ObjCopy/XCOFF/XCOFFWriter.h
+++ b/llvm/lib/ObjCopy/XCOFF/XCOFFWriter.h
@@ -20,7 +20,7 @@ namespace xcoff {
class XCOFFWriter {
public:
- virtual ~XCOFFWriter() {}
+ virtual ~XCOFFWriter() = default;
XCOFFWriter(Object &Obj, raw_ostream &Out) : Obj(Obj), Out(Out) {}
Error write();
diff --git a/llvm/lib/ObjectYAML/GOFFYAML.cpp b/llvm/lib/ObjectYAML/GOFFYAML.cpp
index 60bc1f7..ecd7fb6 100644
--- a/llvm/lib/ObjectYAML/GOFFYAML.cpp
+++ b/llvm/lib/ObjectYAML/GOFFYAML.cpp
@@ -15,7 +15,7 @@
namespace llvm {
namespace GOFFYAML {
-Object::Object() {}
+Object::Object() = default;
} // namespace GOFFYAML
diff --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp
index 7290a86..6b7e980 100644
--- a/llvm/lib/Passes/StandardInstrumentations.cpp
+++ b/llvm/lib/Passes/StandardInstrumentations.cpp
@@ -537,7 +537,7 @@ void IRChangedPrinter::handleAfter(StringRef PassID, std::string &Name,
Out << "*** IR Dump After " << PassID << " on " << Name << " ***\n" << After;
}
-IRChangedTester::~IRChangedTester() {}
+IRChangedTester::~IRChangedTester() = default;
void IRChangedTester::registerCallbacks(PassInstrumentationCallbacks &PIC) {
if (TestChanged != "")
@@ -1566,7 +1566,7 @@ void InLineChangePrinter::registerCallbacks(PassInstrumentationCallbacks &PIC) {
TextChangeReporter<IRDataT<EmptyData>>::registerRequiredCallbacks(PIC);
}
-TimeProfilingPassesHandler::TimeProfilingPassesHandler() {}
+TimeProfilingPassesHandler::TimeProfilingPassesHandler() = default;
void TimeProfilingPassesHandler::registerCallbacks(
PassInstrumentationCallbacks &PIC) {
diff --git a/llvm/lib/SandboxIR/Context.cpp b/llvm/lib/SandboxIR/Context.cpp
index fb6ff62..6f5d072 100644
--- a/llvm/lib/SandboxIR/Context.cpp
+++ b/llvm/lib/SandboxIR/Context.cpp
@@ -637,7 +637,7 @@ Context::Context(LLVMContext &LLVMCtx)
: LLVMCtx(LLVMCtx), IRTracker(*this),
LLVMIRBuilder(LLVMCtx, ConstantFolder()) {}
-Context::~Context() {}
+Context::~Context() = default;
void Context::clear() {
// TODO: Ideally we should clear only function-scope objects, and keep global
diff --git a/llvm/lib/Support/BalancedPartitioning.cpp b/llvm/lib/Support/BalancedPartitioning.cpp
index 1914f4c..d859abd 100644
--- a/llvm/lib/Support/BalancedPartitioning.cpp
+++ b/llvm/lib/Support/BalancedPartitioning.cpp
@@ -231,7 +231,7 @@ unsigned BalancedPartitioning::runIteration(const FunctionNodeRange Nodes,
}
// Compute move gains
- typedef std::pair<float, BPFunctionNode *> GainPair;
+ using GainPair = std::pair<float, BPFunctionNode *>;
std::vector<GainPair> Gains;
for (auto &N : Nodes) {
bool FromLeftToRight = (N.Bucket == LeftBucket);
diff --git a/llvm/lib/Support/BranchProbability.cpp b/llvm/lib/Support/BranchProbability.cpp
index ea42f34..143e58a 100644
--- a/llvm/lib/Support/BranchProbability.cpp
+++ b/llvm/lib/Support/BranchProbability.cpp
@@ -20,8 +20,6 @@
using namespace llvm;
-constexpr uint32_t BranchProbability::D;
-
raw_ostream &BranchProbability::print(raw_ostream &OS) const {
if (isUnknown())
return OS << "?%";
diff --git a/llvm/lib/Support/CommandLine.cpp b/llvm/lib/Support/CommandLine.cpp
index 9491ec0..dab8bee 100644
--- a/llvm/lib/Support/CommandLine.cpp
+++ b/llvm/lib/Support/CommandLine.cpp
@@ -382,7 +382,7 @@ public:
RegisteredSubCommands.erase(sub);
}
- iterator_range<typename SmallPtrSet<SubCommand *, 4>::iterator>
+ iterator_range<SmallPtrSet<SubCommand *, 4>::iterator>
getRegisteredSubcommands() {
return make_range(RegisteredSubCommands.begin(),
RegisteredSubCommands.end());
@@ -2343,10 +2343,10 @@ namespace {
class HelpPrinter {
protected:
const bool ShowHidden;
- typedef SmallVector<std::pair<const char *, Option *>, 128>
- StrOptionPairVector;
- typedef SmallVector<std::pair<const char *, SubCommand *>, 128>
- StrSubCommandPairVector;
+ using StrOptionPairVector =
+ SmallVector<std::pair<const char *, Option *>, 128>;
+ using StrSubCommandPairVector =
+ SmallVector<std::pair<const char *, SubCommand *>, 128>;
// Print the options. Opts is assumed to be alphabetically sorted.
virtual void printOptions(StrOptionPairVector &Opts, size_t MaxArgLen) {
for (const auto &Opt : Opts)
@@ -2830,7 +2830,7 @@ StringMap<Option *> &cl::getRegisteredOptions(SubCommand &Sub) {
return Sub.OptionsMap;
}
-iterator_range<typename SmallPtrSet<SubCommand *, 4>::iterator>
+iterator_range<SmallPtrSet<SubCommand *, 4>::iterator>
cl::getRegisteredSubcommands() {
return GlobalParser->getRegisteredSubcommands();
}
diff --git a/llvm/lib/Support/DAGDeltaAlgorithm.cpp b/llvm/lib/Support/DAGDeltaAlgorithm.cpp
index 98153647..3bfae14 100644
--- a/llvm/lib/Support/DAGDeltaAlgorithm.cpp
+++ b/llvm/lib/Support/DAGDeltaAlgorithm.cpp
@@ -47,16 +47,16 @@ class DAGDeltaAlgorithmImpl {
friend class DeltaActiveSetHelper;
public:
- typedef DAGDeltaAlgorithm::change_ty change_ty;
- typedef DAGDeltaAlgorithm::changeset_ty changeset_ty;
- typedef DAGDeltaAlgorithm::changesetlist_ty changesetlist_ty;
- typedef DAGDeltaAlgorithm::edge_ty edge_ty;
+ using change_ty = DAGDeltaAlgorithm::change_ty;
+ using changeset_ty = DAGDeltaAlgorithm::changeset_ty;
+ using changesetlist_ty = DAGDeltaAlgorithm::changesetlist_ty;
+ using edge_ty = DAGDeltaAlgorithm::edge_ty;
private:
- typedef std::vector<change_ty>::iterator pred_iterator_ty;
- typedef std::vector<change_ty>::iterator succ_iterator_ty;
- typedef std::set<change_ty>::iterator pred_closure_iterator_ty;
- typedef std::set<change_ty>::iterator succ_closure_iterator_ty;
+ using pred_iterator_ty = std::vector<change_ty>::iterator;
+ using succ_iterator_ty = std::vector<change_ty>::iterator;
+ using pred_closure_iterator_ty = std::set<change_ty>::iterator;
+ using succ_closure_iterator_ty = std::set<change_ty>::iterator;
DAGDeltaAlgorithm &DDA;
diff --git a/llvm/lib/Support/DynamicLibrary.cpp b/llvm/lib/Support/DynamicLibrary.cpp
index f1c15c0..61566d3 100644
--- a/llvm/lib/Support/DynamicLibrary.cpp
+++ b/llvm/lib/Support/DynamicLibrary.cpp
@@ -23,7 +23,7 @@ using namespace llvm::sys;
// All methods for HandleSet should be used holding SymbolsMutex.
class DynamicLibrary::HandleSet {
- typedef std::vector<void *> HandleList;
+ using HandleList = std::vector<void *>;
HandleList Handles;
void *Process = &Invalid;
diff --git a/llvm/lib/Support/StringRef.cpp b/llvm/lib/Support/StringRef.cpp
index b6a2f8a..2e8fba8 100644
--- a/llvm/lib/Support/StringRef.cpp
+++ b/llvm/lib/Support/StringRef.cpp
@@ -17,11 +17,6 @@
using namespace llvm;
-// MSVC emits references to this into the translation units which reference it.
-#ifndef _MSC_VER
-constexpr size_t StringRef::npos;
-#endif
-
// strncasecmp() is not available on non-POSIX systems, so define an
// alternative function here.
static int ascii_strncasecmp(StringRef LHS, StringRef RHS) {
diff --git a/llvm/lib/Support/Timer.cpp b/llvm/lib/Support/Timer.cpp
index 9d45096..b08f508 100644
--- a/llvm/lib/Support/Timer.cpp
+++ b/llvm/lib/Support/Timer.cpp
@@ -207,7 +207,7 @@ void TimeRecord::print(const TimeRecord &Total, raw_ostream &OS) const {
namespace {
-typedef StringMap<Timer> Name2TimerMap;
+using Name2TimerMap = StringMap<Timer>;
class Name2PairMap {
StringMap<std::pair<TimerGroup*, Name2TimerMap> > Map;
diff --git a/llvm/lib/Support/UnicodeNameToCodepoint.cpp b/llvm/lib/Support/UnicodeNameToCodepoint.cpp
index 6f8e091..8f0d24e 100644
--- a/llvm/lib/Support/UnicodeNameToCodepoint.cpp
+++ b/llvm/lib/Support/UnicodeNameToCodepoint.cpp
@@ -251,10 +251,10 @@ constexpr const char *const HangulSyllables[][3] = {
// Unicode 15.0
// 3.12 Conjoining Jamo Behavior Common constants
-constexpr const char32_t SBase = 0xAC00;
-constexpr const uint32_t LCount = 19;
-constexpr const uint32_t VCount = 21;
-constexpr const uint32_t TCount = 28;
+constexpr char32_t SBase = 0xAC00;
+constexpr uint32_t LCount = 19;
+constexpr uint32_t VCount = 21;
+constexpr uint32_t TCount = 28;
static std::size_t findSyllable(StringRef Name, bool Strict,
char &PreviousInName, int &Pos, int Column) {
diff --git a/llvm/lib/Target/AArch64/AArch64PrologueEpilogue.cpp b/llvm/lib/Target/AArch64/AArch64PrologueEpilogue.cpp
index 7e03b97..45b7120 100644
--- a/llvm/lib/Target/AArch64/AArch64PrologueEpilogue.cpp
+++ b/llvm/lib/Target/AArch64/AArch64PrologueEpilogue.cpp
@@ -370,6 +370,22 @@ SVEFrameSizes AArch64PrologueEpilogueCommon::getSVEStackFrameSizes() const {
{ZPRCalleeSavesSize, PPRLocalsSize + ZPRLocalsSize}};
}
+SVEStackAllocations AArch64PrologueEpilogueCommon::getSVEStackAllocations(
+ SVEFrameSizes const &SVE) {
+ StackOffset AfterZPRs = SVE.ZPR.LocalsSize;
+ StackOffset BeforePPRs = SVE.ZPR.CalleeSavesSize + SVE.PPR.CalleeSavesSize;
+ StackOffset AfterPPRs = {};
+ if (SVELayout == SVEStackLayout::Split) {
+ BeforePPRs = SVE.PPR.CalleeSavesSize;
+ // If there are no ZPR CSRs, place all local allocations after the ZPRs.
+ if (SVE.ZPR.CalleeSavesSize)
+ AfterPPRs += SVE.PPR.LocalsSize + SVE.ZPR.CalleeSavesSize;
+ else
+ AfterZPRs += SVE.PPR.LocalsSize; // Group allocation of locals.
+ }
+ return {BeforePPRs, AfterPPRs, AfterZPRs};
+}
+
struct SVEPartitions {
struct {
MachineBasicBlock::iterator Begin, End;
@@ -687,16 +703,19 @@ void AArch64PrologueEmitter::emitPrologue() {
// All of the remaining stack allocations are for locals.
determineLocalsStackSize(NumBytes, PrologueSaveSize);
+ auto [PPR, ZPR] = getSVEStackFrameSizes();
+ SVEStackAllocations SVEAllocs = getSVEStackAllocations({PPR, ZPR});
+
MachineBasicBlock::iterator FirstGPRSaveI = PrologueBeginI;
if (SVELayout == SVEStackLayout::CalleeSavesAboveFrameRecord) {
+ assert(!SVEAllocs.AfterPPRs &&
+ "unexpected SVE allocs after PPRs with CalleeSavesAboveFrameRecord");
// If we're doing SVE saves first, we need to immediately allocate space
// for fixed objects, then space for the SVE callee saves.
//
// Windows unwind requires that the scalable size is a multiple of 16;
// that's handled when the callee-saved size is computed.
- auto SaveSize =
- StackOffset::getScalable(AFI->getSVECalleeSavedStackSize()) +
- StackOffset::getFixed(FixedObject);
+ auto SaveSize = SVEAllocs.BeforePPRs + StackOffset::getFixed(FixedObject);
allocateStackSpace(PrologueBeginI, 0, SaveSize, false, StackOffset{},
/*FollowupAllocs=*/true);
NumBytes -= FixedObject;
@@ -764,12 +783,11 @@ void AArch64PrologueEmitter::emitPrologue() {
if (AFL.windowsRequiresStackProbe(MF, NumBytes + RealignmentPadding))
emitWindowsStackProbe(AfterGPRSavesI, DL, NumBytes, RealignmentPadding);
- auto [PPR, ZPR] = getSVEStackFrameSizes();
- StackOffset SVECalleeSavesSize = ZPR.CalleeSavesSize + PPR.CalleeSavesSize;
StackOffset NonSVELocalsSize = StackOffset::getFixed(NumBytes);
+ SVEAllocs.AfterZPRs += NonSVELocalsSize;
+
StackOffset CFAOffset =
StackOffset::getFixed(MFI.getStackSize()) - NonSVELocalsSize;
-
MachineBasicBlock::iterator AfterSVESavesI = AfterGPRSavesI;
// Allocate space for the callee saves and PPR locals (if any).
if (SVELayout != SVEStackLayout::CalleeSavesAboveFrameRecord) {
@@ -780,31 +798,23 @@ void AArch64PrologueEmitter::emitPrologue() {
if (EmitAsyncCFI)
emitCalleeSavedSVELocations(AfterSVESavesI);
- StackOffset AllocateBeforePPRs = SVECalleeSavesSize;
- StackOffset AllocateAfterPPRs = PPR.LocalsSize;
- if (SVELayout == SVEStackLayout::Split) {
- AllocateBeforePPRs = PPR.CalleeSavesSize;
- AllocateAfterPPRs = PPR.LocalsSize + ZPR.CalleeSavesSize;
- }
- allocateStackSpace(PPRRange.Begin, 0, AllocateBeforePPRs,
+ allocateStackSpace(PPRRange.Begin, 0, SVEAllocs.BeforePPRs,
EmitAsyncCFI && !HasFP, CFAOffset,
- MFI.hasVarSizedObjects() || AllocateAfterPPRs ||
- ZPR.LocalsSize || NonSVELocalsSize);
- CFAOffset += AllocateBeforePPRs;
+ MFI.hasVarSizedObjects() || SVEAllocs.AfterPPRs ||
+ SVEAllocs.AfterZPRs);
+ CFAOffset += SVEAllocs.BeforePPRs;
assert(PPRRange.End == ZPRRange.Begin &&
"Expected ZPR callee saves after PPR locals");
- allocateStackSpace(PPRRange.End, RealignmentPadding, AllocateAfterPPRs,
+ allocateStackSpace(PPRRange.End, RealignmentPadding, SVEAllocs.AfterPPRs,
EmitAsyncCFI && !HasFP, CFAOffset,
- MFI.hasVarSizedObjects() || ZPR.LocalsSize ||
- NonSVELocalsSize);
- CFAOffset += AllocateAfterPPRs;
+ MFI.hasVarSizedObjects() || SVEAllocs.AfterZPRs);
+ CFAOffset += SVEAllocs.AfterPPRs;
} else {
assert(SVELayout == SVEStackLayout::CalleeSavesAboveFrameRecord);
- // Note: With CalleeSavesAboveFrameRecord, the SVE CS have already been
- // allocated (and separate PPR locals are not supported, all SVE locals,
- // both PPR and ZPR, are within the ZPR locals area).
- assert(!PPR.LocalsSize && "Unexpected PPR locals!");
- CFAOffset += SVECalleeSavesSize;
+ // Note: With CalleeSavesAboveFrameRecord, the SVE CS (BeforePPRs) have
+ // already been allocated. PPR locals (included in AfterPPRs) are not
+ // supported (note: this is asserted above).
+ CFAOffset += SVEAllocs.BeforePPRs;
}
// Allocate space for the rest of the frame including ZPR locals. Align the
@@ -815,9 +825,9 @@ void AArch64PrologueEmitter::emitPrologue() {
// FIXME: in the case of dynamic re-alignment, NumBytes doesn't have the
// correct value here, as NumBytes also includes padding bytes, which
// shouldn't be counted here.
- allocateStackSpace(
- AfterSVESavesI, RealignmentPadding, ZPR.LocalsSize + NonSVELocalsSize,
- EmitAsyncCFI && !HasFP, CFAOffset, MFI.hasVarSizedObjects());
+ allocateStackSpace(AfterSVESavesI, RealignmentPadding, SVEAllocs.AfterZPRs,
+ EmitAsyncCFI && !HasFP, CFAOffset,
+ MFI.hasVarSizedObjects());
}
// If we need a base pointer, set it up here. It's whatever the value of the
@@ -1472,27 +1482,26 @@ void AArch64EpilogueEmitter::emitEpilogue() {
assert(NumBytes >= 0 && "Negative stack allocation size!?");
StackOffset SVECalleeSavesSize = ZPR.CalleeSavesSize + PPR.CalleeSavesSize;
- StackOffset SVEStackSize =
- SVECalleeSavesSize + PPR.LocalsSize + ZPR.LocalsSize;
+ SVEStackAllocations SVEAllocs = getSVEStackAllocations({PPR, ZPR});
MachineBasicBlock::iterator RestoreBegin = ZPRRange.Begin;
- MachineBasicBlock::iterator RestoreEnd = PPRRange.End;
// Deallocate the SVE area.
if (SVELayout == SVEStackLayout::CalleeSavesAboveFrameRecord) {
- StackOffset SVELocalsSize = ZPR.LocalsSize + PPR.LocalsSize;
+ assert(!SVEAllocs.AfterPPRs &&
+ "unexpected SVE allocs after PPRs with CalleeSavesAboveFrameRecord");
// If the callee-save area is before FP, restoring the FP implicitly
- // deallocates non-callee-save SVE allocations. Otherwise, deallocate them
+ // deallocates non-callee-save SVE allocations. Otherwise, deallocate them
// explicitly.
if (!AFI->isStackRealigned() && !MFI.hasVarSizedObjects()) {
emitFrameOffset(MBB, FirstGPRRestoreI, DL, AArch64::SP, AArch64::SP,
- SVELocalsSize, TII, MachineInstr::FrameDestroy, false,
- NeedsWinCFI, &HasWinCFI);
+ SVEAllocs.AfterZPRs, TII, MachineInstr::FrameDestroy,
+ false, NeedsWinCFI, &HasWinCFI);
}
// Deallocate callee-save SVE registers.
- emitFrameOffset(MBB, RestoreEnd, DL, AArch64::SP, AArch64::SP,
- SVECalleeSavesSize, TII, MachineInstr::FrameDestroy, false,
- NeedsWinCFI, &HasWinCFI);
+ emitFrameOffset(MBB, PPRRange.End, DL, AArch64::SP, AArch64::SP,
+ SVEAllocs.BeforePPRs, TII, MachineInstr::FrameDestroy,
+ false, NeedsWinCFI, &HasWinCFI);
} else if (AFI->hasSVEStackSize()) {
// If we have stack realignment or variable-sized objects we must use the FP
// to restore SVE callee saves (as there is an unknown amount of
@@ -1524,46 +1533,33 @@ void AArch64EpilogueEmitter::emitEpilogue() {
emitFrameOffset(MBB, RestoreBegin, DL, AArch64::SP, CalleeSaveBase,
-SVECalleeSavesSize, TII, MachineInstr::FrameDestroy);
} else if (BaseForSVEDealloc == AArch64::SP) {
- auto CFAOffset =
- SVEStackSize + StackOffset::getFixed(NumBytes + PrologueSaveSize);
-
- if (SVECalleeSavesSize) {
- // Deallocate the non-SVE locals first before we can deallocate (and
- // restore callee saves) from the SVE area.
- auto NonSVELocals = StackOffset::getFixed(NumBytes);
- emitFrameOffset(MBB, ZPRRange.Begin, DL, AArch64::SP, AArch64::SP,
- NonSVELocals, TII, MachineInstr::FrameDestroy, false,
- NeedsWinCFI, &HasWinCFI, EmitCFI && !HasFP, CFAOffset);
- CFAOffset -= NonSVELocals;
- NumBytes = 0;
- }
-
- if (ZPR.LocalsSize) {
- emitFrameOffset(MBB, ZPRRange.Begin, DL, AArch64::SP, AArch64::SP,
- ZPR.LocalsSize, TII, MachineInstr::FrameDestroy, false,
- NeedsWinCFI, &HasWinCFI, EmitCFI && !HasFP, CFAOffset);
- CFAOffset -= ZPR.LocalsSize;
+ auto NonSVELocals = StackOffset::getFixed(NumBytes);
+ auto CFAOffset = NonSVELocals + StackOffset::getFixed(PrologueSaveSize) +
+ SVEAllocs.totalSize();
+
+ if (SVECalleeSavesSize || SVELayout == SVEStackLayout::Split) {
+ // Deallocate non-SVE locals now. This is needed to reach the SVE callee
+ // saves, but may also allow combining stack hazard bumps for split SVE.
+ SVEAllocs.AfterZPRs += NonSVELocals;
+ NumBytes -= NonSVELocals.getFixed();
}
-
- StackOffset SVECalleeSavesToDealloc = SVECalleeSavesSize;
- if (SVELayout == SVEStackLayout::Split &&
- (PPR.LocalsSize || ZPR.CalleeSavesSize)) {
- assert(PPRRange.Begin == ZPRRange.End &&
- "Expected PPR restores after ZPR");
- emitFrameOffset(MBB, PPRRange.Begin, DL, AArch64::SP, AArch64::SP,
- PPR.LocalsSize + ZPR.CalleeSavesSize, TII,
- MachineInstr::FrameDestroy, false, NeedsWinCFI,
- &HasWinCFI, EmitCFI && !HasFP, CFAOffset);
- CFAOffset -= PPR.LocalsSize + ZPR.CalleeSavesSize;
- SVECalleeSavesToDealloc -= ZPR.CalleeSavesSize;
- }
-
- // If split SVE is on, this dealloc PPRs, otherwise, deallocs ZPRs + PPRs:
- if (SVECalleeSavesToDealloc)
- emitFrameOffset(MBB, PPRRange.End, DL, AArch64::SP, AArch64::SP,
- SVECalleeSavesToDealloc, TII,
- MachineInstr::FrameDestroy, false, NeedsWinCFI,
- &HasWinCFI, EmitCFI && !HasFP, CFAOffset);
+ // To deallocate the SVE stack adjust by the allocations in reverse.
+ emitFrameOffset(MBB, ZPRRange.Begin, DL, AArch64::SP, AArch64::SP,
+ SVEAllocs.AfterZPRs, TII, MachineInstr::FrameDestroy,
+ false, NeedsWinCFI, &HasWinCFI, EmitCFI && !HasFP,
+ CFAOffset);
+ CFAOffset -= SVEAllocs.AfterZPRs;
+ assert(PPRRange.Begin == ZPRRange.End &&
+ "Expected PPR restores after ZPR");
+ emitFrameOffset(MBB, PPRRange.Begin, DL, AArch64::SP, AArch64::SP,
+ SVEAllocs.AfterPPRs, TII, MachineInstr::FrameDestroy,
+ false, NeedsWinCFI, &HasWinCFI, EmitCFI && !HasFP,
+ CFAOffset);
+ CFAOffset -= SVEAllocs.AfterPPRs;
+ emitFrameOffset(MBB, PPRRange.End, DL, AArch64::SP, AArch64::SP,
+ SVEAllocs.BeforePPRs, TII, MachineInstr::FrameDestroy,
+ false, NeedsWinCFI, &HasWinCFI, EmitCFI && !HasFP,
+ CFAOffset);
}
if (EmitCFI)
diff --git a/llvm/lib/Target/AArch64/AArch64PrologueEpilogue.h b/llvm/lib/Target/AArch64/AArch64PrologueEpilogue.h
index bccadda..6e0e283 100644
--- a/llvm/lib/Target/AArch64/AArch64PrologueEpilogue.h
+++ b/llvm/lib/Target/AArch64/AArch64PrologueEpilogue.h
@@ -33,6 +33,11 @@ struct SVEFrameSizes {
} PPR, ZPR;
};
+struct SVEStackAllocations {
+ StackOffset BeforePPRs, AfterPPRs, AfterZPRs;
+ StackOffset totalSize() const { return BeforePPRs + AfterPPRs + AfterZPRs; }
+};
+
class AArch64PrologueEpilogueCommon {
public:
AArch64PrologueEpilogueCommon(MachineFunction &MF, MachineBasicBlock &MBB,
@@ -66,6 +71,7 @@ protected:
bool shouldCombineCSRLocalStackBump(uint64_t StackBumpBytes) const;
SVEFrameSizes getSVEStackFrameSizes() const;
+ SVEStackAllocations getSVEStackAllocations(SVEFrameSizes const &);
MachineFunction &MF;
MachineBasicBlock &MBB;
diff --git a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
index 47c1ac4..5b5565a 100644
--- a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
@@ -308,9 +308,9 @@ bool AArch64TTIImpl::areInlineCompatible(const Function *Caller,
return (EffectiveCallerBits & EffectiveCalleeBits) == EffectiveCalleeBits;
}
-bool AArch64TTIImpl::areTypesABICompatible(
- const Function *Caller, const Function *Callee,
- const ArrayRef<Type *> &Types) const {
+bool AArch64TTIImpl::areTypesABICompatible(const Function *Caller,
+ const Function *Callee,
+ ArrayRef<Type *> Types) const {
if (!BaseT::areTypesABICompatible(Caller, Callee, Types))
return false;
@@ -2227,7 +2227,7 @@ static std::optional<Instruction *> instCombineSVEPTest(InstCombiner &IC,
return std::nullopt;
}
-template <Intrinsic::ID MulOpc, typename Intrinsic::ID FuseOpc>
+template <Intrinsic::ID MulOpc, Intrinsic::ID FuseOpc>
static std::optional<Instruction *>
instCombineSVEVectorFuseMulAddSub(InstCombiner &IC, IntrinsicInst &II,
bool MergeIntoAddendOp) {
@@ -6657,10 +6657,15 @@ bool AArch64TTIImpl::isProfitableToSinkOperands(
Ops.push_back(&Ext->getOperandUse(0));
Ops.push_back(&Op);
- if (isa<SExtInst>(Ext))
+ if (isa<SExtInst>(Ext)) {
NumSExts++;
- else
+ } else {
NumZExts++;
+ // A zext(a) is also a sext(zext(a)), if we take more than 2 steps.
+ if (Ext->getOperand(0)->getType()->getScalarSizeInBits() * 2 <
+ I->getType()->getScalarSizeInBits())
+ NumSExts++;
+ }
continue;
}
diff --git a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.h b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.h
index fe2e849..b39546a 100644
--- a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.h
+++ b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.h
@@ -84,7 +84,7 @@ public:
const Function *Callee) const override;
bool areTypesABICompatible(const Function *Caller, const Function *Callee,
- const ArrayRef<Type *> &Types) const override;
+ ArrayRef<Type *> Types) const override;
unsigned getInlineCallPenalty(const Function *F, const CallBase &Call,
unsigned DefaultCallPenalty) const override;
diff --git a/llvm/lib/Target/AMDGPU/AMDGPU.h b/llvm/lib/Target/AMDGPU/AMDGPU.h
index cd8b249..67042b7 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPU.h
+++ b/llvm/lib/Target/AMDGPU/AMDGPU.h
@@ -69,7 +69,7 @@ FunctionPass *createAMDGPUPreloadKernArgPrologLegacyPass();
ModulePass *createAMDGPUPreloadKernelArgumentsLegacyPass(const TargetMachine *);
struct AMDGPUSimplifyLibCallsPass : PassInfoMixin<AMDGPUSimplifyLibCallsPass> {
- AMDGPUSimplifyLibCallsPass() {}
+ AMDGPUSimplifyLibCallsPass() = default;
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
};
@@ -371,13 +371,13 @@ public:
class AMDGPUAnnotateUniformValuesPass
: public PassInfoMixin<AMDGPUAnnotateUniformValuesPass> {
public:
- AMDGPUAnnotateUniformValuesPass() {}
+ AMDGPUAnnotateUniformValuesPass() = default;
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
};
class SIModeRegisterPass : public PassInfoMixin<SIModeRegisterPass> {
public:
- SIModeRegisterPass() {}
+ SIModeRegisterPass() = default;
PreservedAnalyses run(MachineFunction &F, MachineFunctionAnalysisManager &AM);
};
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUArgumentUsageInfo.h b/llvm/lib/Target/AMDGPU/AMDGPUArgumentUsageInfo.h
index 1064e57..dad94b8 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUArgumentUsageInfo.h
+++ b/llvm/lib/Target/AMDGPU/AMDGPUArgumentUsageInfo.h
@@ -96,7 +96,7 @@ inline raw_ostream &operator<<(raw_ostream &OS, const ArgDescriptor &Arg) {
}
struct KernArgPreloadDescriptor : public ArgDescriptor {
- KernArgPreloadDescriptor() {}
+ KernArgPreloadDescriptor() = default;
SmallVector<MCRegister> Regs;
};
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp b/llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp
index 9907c88f..8669978 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp
@@ -1555,7 +1555,7 @@ private:
AMDGPU::ClusterDimsAttr Attr;
- static constexpr const char AttrName[] = "amdgpu-cluster-dims";
+ static constexpr char AttrName[] = "amdgpu-cluster-dims";
};
AAAMDGPUClusterDims &
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUPerfHintAnalysis.h b/llvm/lib/Target/AMDGPU/AMDGPUPerfHintAnalysis.h
index cf2ab825..a3be0f5 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUPerfHintAnalysis.h
+++ b/llvm/lib/Target/AMDGPU/AMDGPUPerfHintAnalysis.h
@@ -48,7 +48,7 @@ private:
FuncInfoMap FIM;
public:
- AMDGPUPerfHintAnalysis() {}
+ AMDGPUPerfHintAnalysis() = default;
// OldPM
bool runOnSCC(const GCNTargetMachine &TM, CallGraphSCC &SCC);
diff --git a/llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.cpp b/llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.cpp
index 103cdec..1e5885a2 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.cpp
@@ -202,7 +202,7 @@ bool PredicateMapping::match(const MachineInstr &MI,
return true;
}
-SetOfRulesForOpcode::SetOfRulesForOpcode() {}
+SetOfRulesForOpcode::SetOfRulesForOpcode() = default;
SetOfRulesForOpcode::SetOfRulesForOpcode(FastRulesTypes FastTypes)
: FastTypes(FastTypes) {}
@@ -913,6 +913,8 @@ RegBankLegalizeRules::RegBankLegalizeRules(const GCNSubtarget &_ST,
addRulesForGOpcs({G_ABS}, Standard).Uni(S16, {{Sgpr32Trunc}, {Sgpr32SExt}});
+ addRulesForGOpcs({G_FENCE}).Any({{{}}, {{}, {}}});
+
addRulesForGOpcs({G_READSTEADYCOUNTER, G_READCYCLECOUNTER}, Standard)
.Uni(S64, {{Sgpr64}, {}});
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUUnifyDivergentExitNodes.cpp b/llvm/lib/Target/AMDGPU/AMDGPUUnifyDivergentExitNodes.cpp
index 733c5d5..ddf9a24 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUUnifyDivergentExitNodes.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUUnifyDivergentExitNodes.cpp
@@ -225,8 +225,8 @@ bool AMDGPUUnifyDivergentExitNodesImpl::run(Function &F, DominatorTree *DT,
ConstantInt *BoolTrue = ConstantInt::getTrue(F.getContext());
if (DummyReturnBB == nullptr) {
- DummyReturnBB = BasicBlock::Create(F.getContext(),
- "DummyReturnBlock", &F);
+ DummyReturnBB =
+ BasicBlock::Create(F.getContext(), "DummyReturnBlock", &F);
Type *RetTy = F.getReturnType();
Value *RetVal = RetTy->isVoidTy() ? nullptr : PoisonValue::get(RetTy);
ReturnInst::Create(F.getContext(), RetVal, DummyReturnBB);
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUWaitSGPRHazards.cpp b/llvm/lib/Target/AMDGPU/AMDGPUWaitSGPRHazards.cpp
index 61c5dcd..ded2f5a 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUWaitSGPRHazards.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUWaitSGPRHazards.cpp
@@ -54,7 +54,7 @@ public:
bool CullSGPRHazardsAtMemWait;
unsigned CullSGPRHazardsMemWaitThreshold;
- AMDGPUWaitSGPRHazards() {}
+ AMDGPUWaitSGPRHazards() = default;
// Return the numeric ID 0-127 for a given SGPR.
static std::optional<unsigned> sgprNumber(Register Reg,
diff --git a/llvm/lib/Target/AMDGPU/GCNSchedStrategy.h b/llvm/lib/Target/AMDGPU/GCNSchedStrategy.h
index 975781f..f357981 100644
--- a/llvm/lib/Target/AMDGPU/GCNSchedStrategy.h
+++ b/llvm/lib/Target/AMDGPU/GCNSchedStrategy.h
@@ -183,7 +183,7 @@ class ScheduleMetrics {
unsigned BubbleCycles;
public:
- ScheduleMetrics() {}
+ ScheduleMetrics() = default;
ScheduleMetrics(unsigned L, unsigned BC)
: ScheduleLength(L), BubbleCycles(BC) {}
unsigned getLength() const { return ScheduleLength; }
@@ -217,7 +217,7 @@ class RegionPressureMap {
bool IsLiveOut;
public:
- RegionPressureMap() {}
+ RegionPressureMap() = default;
RegionPressureMap(GCNScheduleDAGMILive *GCNDAG, bool LiveOut)
: DAG(GCNDAG), IsLiveOut(LiveOut) {}
// Build the Instr->LiveReg and RegionIdx->Instr maps
diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
index d9f76c9..45f5919 100644
--- a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
+++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
@@ -6153,7 +6153,7 @@ bool SIInstrInfo::isLegalRegOperand(const MachineInstr &MI, unsigned OpIdx,
// information.
if (AMDGPU::isPackedFP32Inst(MI.getOpcode()) && AMDGPU::isGFX12Plus(ST) &&
MO.isReg() && RI.isSGPRReg(MRI, MO.getReg())) {
- constexpr const AMDGPU::OpName OpNames[] = {
+ constexpr AMDGPU::OpName OpNames[] = {
AMDGPU::OpName::src0, AMDGPU::OpName::src1, AMDGPU::OpName::src2};
for (auto [I, OpName] : enumerate(OpNames)) {
@@ -6215,8 +6215,8 @@ bool SIInstrInfo::isLegalVSrcOperand(const MachineRegisterInfo &MRI,
bool SIInstrInfo::isLegalGFX12PlusPackedMathFP32Operand(
const MachineRegisterInfo &MRI, const MachineInstr &MI, unsigned SrcN,
const MachineOperand *MO) const {
- constexpr const unsigned NumOps = 3;
- constexpr const AMDGPU::OpName OpNames[NumOps * 2] = {
+ constexpr unsigned NumOps = 3;
+ constexpr AMDGPU::OpName OpNames[NumOps * 2] = {
AMDGPU::OpName::src0, AMDGPU::OpName::src1,
AMDGPU::OpName::src2, AMDGPU::OpName::src0_modifiers,
AMDGPU::OpName::src1_modifiers, AMDGPU::OpName::src2_modifiers};
diff --git a/llvm/lib/Target/Hexagon/HexagonDepIICHVX.td b/llvm/lib/Target/Hexagon/HexagonDepIICHVX.td
index f4e36fa7..e661c94 100644
--- a/llvm/lib/Target/Hexagon/HexagonDepIICHVX.td
+++ b/llvm/lib/Target/Hexagon/HexagonDepIICHVX.td
@@ -26,6 +26,7 @@ def tc_20a4bbec : InstrItinClass;
def tc_227864f7 : InstrItinClass;
def tc_257f6f7c : InstrItinClass;
def tc_26a377fe : InstrItinClass;
+def tc_2a698a03 : InstrItinClass;
def tc_2b4c548e : InstrItinClass;
def tc_2c745bb8 : InstrItinClass;
def tc_2d4051cd : InstrItinClass;
@@ -52,6 +53,7 @@ def tc_561aaa58 : InstrItinClass;
def tc_56c4f9fe : InstrItinClass;
def tc_56e64202 : InstrItinClass;
def tc_58d21193 : InstrItinClass;
+def tc_57a4709c : InstrItinClass;
def tc_5bf8afbb : InstrItinClass;
def tc_5cdf8c84 : InstrItinClass;
def tc_61bf7c03 : InstrItinClass;
@@ -220,6 +222,11 @@ class DepHVXItinV55 {
InstrStage<1, [CVI_ALL_NOMEM]>], [9, 3, 5, 2],
[HVX_FWD, Hex_FWD, HVX_FWD, Hex_FWD]>,
+ InstrItinData <tc_2a698a03, /*SLOT0123,VSorVP*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_SHIFT, CVI_XLANE]>], [9, 5],
+ [HVX_FWD, HVX_FWD]>,
+
InstrItinData <tc_2b4c548e, /*SLOT23,VX_DV*/
[InstrStage<1, [SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_MPY01]>], [9, 5, 5, 2],
@@ -356,6 +363,11 @@ class DepHVXItinV55 {
InstrStage<1, [CVI_MPY01, CVI_XLSHF]>], [7, 1, 2, 7, 7],
[HVX_FWD, Hex_FWD, Hex_FWD, HVX_FWD, HVX_FWD]>,
+ InstrItinData <tc_57a4709c, /*SLOT0123,VA*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_MPY0, CVI_MPY1, CVI_SHIFT, CVI_XLANE]>], [9, 7, 7, 2],
+ [HVX_FWD, HVX_FWD, HVX_FWD, Hex_FWD]>,
+
InstrItinData <tc_5bf8afbb, /*SLOT0123,VP*/
[InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_XLANE]>], [9, 2],
@@ -812,6 +824,11 @@ class DepHVXItinV60 {
InstrStage<1, [CVI_ALL_NOMEM]>], [9, 3, 5, 2],
[HVX_FWD, Hex_FWD, HVX_FWD, Hex_FWD]>,
+ InstrItinData <tc_2a698a03, /*SLOT0123,VSorVP*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_SHIFT, CVI_XLANE]>], [9, 5],
+ [HVX_FWD, HVX_FWD]>,
+
InstrItinData <tc_2b4c548e, /*SLOT23,VX_DV*/
[InstrStage<1, [SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_MPY01]>], [9, 5, 5, 2],
@@ -948,6 +965,11 @@ class DepHVXItinV60 {
InstrStage<1, [CVI_MPY01, CVI_XLSHF]>], [7, 1, 2, 7, 7],
[HVX_FWD, Hex_FWD, Hex_FWD, HVX_FWD, HVX_FWD]>,
+ InstrItinData <tc_57a4709c, /*SLOT0123,VA*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_MPY0, CVI_MPY1, CVI_SHIFT, CVI_XLANE]>], [9, 7, 7, 2],
+ [HVX_FWD, HVX_FWD, HVX_FWD, Hex_FWD]>,
+
InstrItinData <tc_5bf8afbb, /*SLOT0123,VP*/
[InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_XLANE]>], [9, 2],
@@ -1404,6 +1426,11 @@ class DepHVXItinV62 {
InstrStage<1, [CVI_ALL_NOMEM]>], [9, 3, 5, 2],
[HVX_FWD, Hex_FWD, HVX_FWD, Hex_FWD]>,
+ InstrItinData <tc_2a698a03, /*SLOT0123,VSorVP*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_SHIFT, CVI_XLANE]>], [9, 5],
+ [HVX_FWD, HVX_FWD]>,
+
InstrItinData <tc_2b4c548e, /*SLOT23,VX_DV*/
[InstrStage<1, [SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_MPY01]>], [9, 5, 5, 2],
@@ -1540,6 +1567,11 @@ class DepHVXItinV62 {
InstrStage<1, [CVI_MPY01, CVI_XLSHF]>], [7, 1, 2, 7, 7],
[HVX_FWD, Hex_FWD, Hex_FWD, HVX_FWD, HVX_FWD]>,
+ InstrItinData <tc_57a4709c, /*SLOT0123,VA*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_MPY0, CVI_MPY1, CVI_SHIFT, CVI_XLANE]>], [9, 7, 7, 2],
+ [HVX_FWD, HVX_FWD, HVX_FWD, Hex_FWD]>,
+
InstrItinData <tc_5bf8afbb, /*SLOT0123,VP*/
[InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_XLANE]>], [9, 2],
@@ -1996,6 +2028,11 @@ class DepHVXItinV65 {
InstrStage<1, [CVI_ALL_NOMEM]>], [9, 3, 5, 2],
[HVX_FWD, Hex_FWD, HVX_FWD, Hex_FWD]>,
+ InstrItinData <tc_2a698a03, /*SLOT0123,VSorVP*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_SHIFT, CVI_XLANE]>], [9, 5],
+ [HVX_FWD, HVX_FWD]>,
+
InstrItinData <tc_2b4c548e, /*SLOT23,VX_DV*/
[InstrStage<1, [SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_MPY01]>], [9, 5, 5, 2],
@@ -2132,6 +2169,11 @@ class DepHVXItinV65 {
InstrStage<1, [CVI_MPY01, CVI_XLSHF]>], [7, 1, 2, 7, 7],
[HVX_FWD, Hex_FWD, Hex_FWD, HVX_FWD, HVX_FWD]>,
+ InstrItinData <tc_57a4709c, /*SLOT0123,VA*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_MPY0, CVI_MPY1, CVI_SHIFT, CVI_XLANE]>], [9, 7, 7, 2],
+ [HVX_FWD, HVX_FWD, HVX_FWD, Hex_FWD]>,
+
InstrItinData <tc_5bf8afbb, /*SLOT0123,VP*/
[InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_XLANE]>], [9, 2],
@@ -2588,6 +2630,11 @@ class DepHVXItinV66 {
InstrStage<1, [CVI_ALL_NOMEM]>], [9, 3, 5, 2],
[HVX_FWD, Hex_FWD, HVX_FWD, Hex_FWD]>,
+ InstrItinData <tc_2a698a03, /*SLOT0123,VSorVP*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_SHIFT, CVI_XLANE]>], [9, 5],
+ [HVX_FWD, HVX_FWD]>,
+
InstrItinData <tc_2b4c548e, /*SLOT23,VX_DV*/
[InstrStage<1, [SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_MPY01]>], [9, 5, 5, 2],
@@ -2724,6 +2771,11 @@ class DepHVXItinV66 {
InstrStage<1, [CVI_MPY01, CVI_XLSHF]>], [7, 1, 2, 7, 7],
[HVX_FWD, Hex_FWD, Hex_FWD, HVX_FWD, HVX_FWD]>,
+ InstrItinData <tc_57a4709c, /*SLOT0123,VA*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_MPY0, CVI_MPY1, CVI_SHIFT, CVI_XLANE]>], [9, 7, 7, 2],
+ [HVX_FWD, HVX_FWD, HVX_FWD, Hex_FWD]>,
+
InstrItinData <tc_5bf8afbb, /*SLOT0123,VP*/
[InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_XLANE]>], [9, 2],
@@ -3180,6 +3232,11 @@ class DepHVXItinV67 {
InstrStage<1, [CVI_ALL_NOMEM]>], [9, 3, 5, 2],
[HVX_FWD, Hex_FWD, HVX_FWD, Hex_FWD]>,
+ InstrItinData <tc_2a698a03, /*SLOT0123,VSorVP*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_SHIFT, CVI_XLANE]>], [9, 5],
+ [HVX_FWD, HVX_FWD]>,
+
InstrItinData <tc_2b4c548e, /*SLOT23,VX_DV*/
[InstrStage<1, [SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_MPY01]>], [9, 5, 5, 2],
@@ -3316,6 +3373,11 @@ class DepHVXItinV67 {
InstrStage<1, [CVI_MPY01, CVI_XLSHF]>], [7, 1, 2, 7, 7],
[HVX_FWD, Hex_FWD, Hex_FWD, HVX_FWD, HVX_FWD]>,
+ InstrItinData <tc_57a4709c, /*SLOT0123,VA*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_MPY0, CVI_MPY1, CVI_SHIFT, CVI_XLANE]>], [9, 7, 7, 2],
+ [HVX_FWD, HVX_FWD, HVX_FWD, Hex_FWD]>,
+
InstrItinData <tc_5bf8afbb, /*SLOT0123,VP*/
[InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_XLANE]>], [9, 2],
@@ -3772,6 +3834,11 @@ class DepHVXItinV68 {
InstrStage<1, [CVI_ALL_NOMEM]>], [9, 3, 5, 2],
[HVX_FWD, Hex_FWD, HVX_FWD, Hex_FWD]>,
+ InstrItinData <tc_2a698a03, /*SLOT0123,VSorVP*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_SHIFT, CVI_XLANE]>], [9, 5],
+ [HVX_FWD, HVX_FWD]>,
+
InstrItinData <tc_2b4c548e, /*SLOT23,VX_DV*/
[InstrStage<1, [SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_MPY01]>], [9, 5, 5, 2],
@@ -3908,6 +3975,11 @@ class DepHVXItinV68 {
InstrStage<1, [CVI_MPY01, CVI_XLSHF]>], [7, 1, 2, 7, 7],
[HVX_FWD, Hex_FWD, Hex_FWD, HVX_FWD, HVX_FWD]>,
+ InstrItinData <tc_57a4709c, /*SLOT0123,VA*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_MPY0, CVI_MPY1, CVI_SHIFT, CVI_XLANE]>], [9, 7, 7, 2],
+ [HVX_FWD, HVX_FWD, HVX_FWD, Hex_FWD]>,
+
InstrItinData <tc_5bf8afbb, /*SLOT0123,VP*/
[InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_XLANE]>], [9, 2],
@@ -4364,6 +4436,11 @@ class DepHVXItinV69 {
InstrStage<1, [CVI_ALL_NOMEM]>], [9, 3, 5, 2],
[HVX_FWD, Hex_FWD, HVX_FWD, Hex_FWD]>,
+ InstrItinData <tc_2a698a03, /*SLOT0123,VSorVP*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_SHIFT, CVI_XLANE]>], [9, 5],
+ [HVX_FWD, HVX_FWD]>,
+
InstrItinData <tc_2b4c548e, /*SLOT23,VX_DV*/
[InstrStage<1, [SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_MPY01]>], [9, 5, 5, 2],
@@ -4500,6 +4577,11 @@ class DepHVXItinV69 {
InstrStage<1, [CVI_MPY01, CVI_XLSHF]>], [7, 1, 2, 7, 7],
[HVX_FWD, Hex_FWD, Hex_FWD, HVX_FWD, HVX_FWD]>,
+ InstrItinData <tc_57a4709c, /*SLOT0123,VA*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_MPY0, CVI_MPY1, CVI_SHIFT, CVI_XLANE]>], [9, 7, 7, 2],
+ [HVX_FWD, HVX_FWD, HVX_FWD, Hex_FWD]>,
+
InstrItinData <tc_5bf8afbb, /*SLOT0123,VP*/
[InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_XLANE]>], [9, 2],
@@ -4956,6 +5038,11 @@ class DepHVXItinV71 {
InstrStage<1, [CVI_ALL_NOMEM]>], [9, 3, 5, 2],
[HVX_FWD, Hex_FWD, HVX_FWD, Hex_FWD]>,
+ InstrItinData <tc_2a698a03, /*SLOT0123,VSorVP*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_SHIFT, CVI_XLANE]>], [9, 5],
+ [HVX_FWD, HVX_FWD]>,
+
InstrItinData <tc_2b4c548e, /*SLOT23,VX_DV*/
[InstrStage<1, [SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_MPY01]>], [9, 5, 5, 2],
@@ -5092,6 +5179,11 @@ class DepHVXItinV71 {
InstrStage<1, [CVI_MPY01, CVI_XLSHF]>], [7, 1, 2, 7, 7],
[HVX_FWD, Hex_FWD, Hex_FWD, HVX_FWD, HVX_FWD]>,
+ InstrItinData <tc_57a4709c, /*SLOT0123,VA*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_MPY0, CVI_MPY1, CVI_SHIFT, CVI_XLANE]>], [9, 7, 7, 2],
+ [HVX_FWD, HVX_FWD, HVX_FWD, Hex_FWD]>,
+
InstrItinData <tc_5bf8afbb, /*SLOT0123,VP*/
[InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_XLANE]>], [9, 2],
@@ -5548,6 +5640,11 @@ class DepHVXItinV73 {
InstrStage<1, [CVI_ALL_NOMEM]>], [9, 3, 5, 2],
[HVX_FWD, Hex_FWD, HVX_FWD, Hex_FWD]>,
+ InstrItinData <tc_2a698a03, /*SLOT0123,VSorVP*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_SHIFT, CVI_XLANE]>], [9, 5],
+ [HVX_FWD, HVX_FWD]>,
+
InstrItinData <tc_2b4c548e, /*SLOT23,VX_DV*/
[InstrStage<1, [SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_MPY01]>], [9, 5, 5, 2],
@@ -5684,6 +5781,11 @@ class DepHVXItinV73 {
InstrStage<1, [CVI_MPY01, CVI_XLSHF]>], [7, 1, 2, 7, 7],
[HVX_FWD, Hex_FWD, Hex_FWD, HVX_FWD, HVX_FWD]>,
+ InstrItinData <tc_57a4709c, /*SLOT0123,VA*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_MPY0, CVI_MPY1, CVI_SHIFT, CVI_XLANE]>], [9, 7, 7, 2],
+ [HVX_FWD, HVX_FWD, HVX_FWD, Hex_FWD]>,
+
InstrItinData <tc_5bf8afbb, /*SLOT0123,VP*/
[InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_XLANE]>], [9, 2],
@@ -6140,6 +6242,11 @@ class DepHVXItinV75 {
InstrStage<1, [CVI_ALL_NOMEM]>], [9, 3, 5, 2],
[HVX_FWD, Hex_FWD, HVX_FWD, Hex_FWD]>,
+ InstrItinData <tc_2a698a03, /*SLOT0123,VSorVP*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_SHIFT, CVI_XLANE]>], [9, 5],
+ [HVX_FWD, HVX_FWD]>,
+
InstrItinData <tc_2b4c548e, /*SLOT23,VX_DV*/
[InstrStage<1, [SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_MPY01]>], [9, 5, 5, 2],
@@ -6276,6 +6383,11 @@ class DepHVXItinV75 {
InstrStage<1, [CVI_MPY01, CVI_XLSHF]>], [7, 1, 2, 7, 7],
[HVX_FWD, Hex_FWD, Hex_FWD, HVX_FWD, HVX_FWD]>,
+ InstrItinData <tc_57a4709c, /*SLOT0123,VA*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_MPY0, CVI_MPY1, CVI_SHIFT, CVI_XLANE]>], [9, 7, 7, 2],
+ [HVX_FWD, HVX_FWD, HVX_FWD, Hex_FWD]>,
+
InstrItinData <tc_5bf8afbb, /*SLOT0123,VP*/
[InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_XLANE]>], [9, 2],
@@ -6732,6 +6844,11 @@ class DepHVXItinV79 {
InstrStage<1, [CVI_ALL_NOMEM]>], [9, 3, 5, 2],
[HVX_FWD, Hex_FWD, HVX_FWD, Hex_FWD]>,
+ InstrItinData <tc_2a698a03, /*SLOT0123,VSorVP*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_SHIFT, CVI_XLANE]>], [9, 5],
+ [HVX_FWD, HVX_FWD]>,
+
InstrItinData <tc_2b4c548e, /*SLOT23,VX_DV*/
[InstrStage<1, [SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_MPY01]>], [9, 5, 5, 2],
@@ -6868,6 +6985,11 @@ class DepHVXItinV79 {
InstrStage<1, [CVI_MPY01, CVI_XLSHF]>], [7, 1, 2, 7, 7],
[HVX_FWD, Hex_FWD, Hex_FWD, HVX_FWD, HVX_FWD]>,
+ InstrItinData <tc_57a4709c, /*SLOT0123,VA*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_MPY0, CVI_MPY1, CVI_SHIFT, CVI_XLANE]>], [9, 7, 7, 2],
+ [HVX_FWD, HVX_FWD, HVX_FWD, Hex_FWD]>,
+
InstrItinData <tc_5bf8afbb, /*SLOT0123,VP*/
[InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_XLANE]>], [9, 2],
@@ -7324,6 +7446,11 @@ class DepHVXItinV81 {
InstrStage<1, [CVI_ALL_NOMEM]>], [9, 3, 5, 2],
[HVX_FWD, Hex_FWD, HVX_FWD, Hex_FWD]>,
+ InstrItinData <tc_2a698a03, /*SLOT0123,VSorVP*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_SHIFT, CVI_XLANE]>], [9, 5],
+ [HVX_FWD, HVX_FWD]>,
+
InstrItinData <tc_2b4c548e, /*SLOT23,VX_DV*/
[InstrStage<1, [SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_MPY01]>], [9, 5, 5, 2],
@@ -7460,6 +7587,11 @@ class DepHVXItinV81 {
InstrStage<1, [CVI_MPY01, CVI_XLSHF]>], [7, 1, 2, 7, 7],
[HVX_FWD, Hex_FWD, Hex_FWD, HVX_FWD, HVX_FWD]>,
+ InstrItinData <tc_57a4709c, /*SLOT0123,VA*/
+ [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
+ InstrStage<1, [CVI_MPY0, CVI_MPY1, CVI_SHIFT, CVI_XLANE]>], [9, 7, 7, 2],
+ [HVX_FWD, HVX_FWD, HVX_FWD, Hex_FWD]>,
+
InstrItinData <tc_5bf8afbb, /*SLOT0123,VP*/
[InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3], 0>,
InstrStage<1, [CVI_XLANE]>], [9, 2],
diff --git a/llvm/lib/Target/Hexagon/HexagonDepInstrInfo.td b/llvm/lib/Target/Hexagon/HexagonDepInstrInfo.td
index f8f1c2a..b188134 100644
--- a/llvm/lib/Target/Hexagon/HexagonDepInstrInfo.td
+++ b/llvm/lib/Target/Hexagon/HexagonDepInstrInfo.td
@@ -29939,6 +29939,58 @@ let opNewValue = 0;
let isCVI = 1;
let DecoderNamespace = "EXT_mmvec";
}
+def V6_vabs_qf16_hf : HInst<
+(outs HvxVR:$Vd32),
+(ins HvxVR:$Vu32),
+"$Vd32.qf16 = vabs($Vu32.hf)",
+tc_2a698a03, TypeCVI_VS>, Enc_e7581c, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-5} = 0b110;
+let Inst{13-13} = 0b1;
+let Inst{31-16} = 0b0001111000001110;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
+def V6_vabs_qf16_qf16 : HInst<
+(outs HvxVR:$Vd32),
+(ins HvxVR:$Vu32),
+"$Vd32.qf16 = vabs($Vu32.qf16)",
+tc_2a698a03, TypeCVI_VS>, Enc_e7581c, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-5} = 0b111;
+let Inst{13-13} = 0b1;
+let Inst{31-16} = 0b0001111000001110;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
+def V6_vabs_qf32_qf32 : HInst<
+(outs HvxVR:$Vd32),
+(ins HvxVR:$Vu32),
+"$Vd32.qf32 = vabs($Vu32.qf32)",
+tc_2a698a03, TypeCVI_VS>, Enc_e7581c, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-5} = 0b101;
+let Inst{13-13} = 0b1;
+let Inst{31-16} = 0b0001111000001110;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
+def V6_vabs_qf32_sf : HInst<
+(outs HvxVR:$Vd32),
+(ins HvxVR:$Vu32),
+"$Vd32.qf32 = vabs($Vu32.sf)",
+tc_2a698a03, TypeCVI_VS>, Enc_e7581c, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-5} = 0b100;
+let Inst{13-13} = 0b1;
+let Inst{31-16} = 0b0001111000001110;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
def V6_vabs_sf : HInst<
(outs HvxVR:$Vd32),
(ins HvxVR:$Vu32),
@@ -31302,6 +31354,21 @@ let isPseudo = 1;
let isCodeGenOnly = 1;
let DecoderNamespace = "EXT_mmvec";
}
+def V6_valign4 : HInst<
+(outs HvxVR:$Vd32),
+(ins HvxVR:$Vu32, HvxVR:$Vv32, IntRegsLow8:$Rt8),
+"$Vd32 = valign4($Vu32,$Vv32,$Rt8)",
+tc_57a4709c, TypeCVI_VA>, Enc_a30110, Requires<[UseHVXV81]> {
+let Inst{7-5} = 0b101;
+let Inst{13-13} = 0b0;
+let Inst{31-24} = 0b00011000;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let isHVXALU = 1;
+let isHVXALU2SRC = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
def V6_valignb : HInst<
(outs HvxVR:$Vd32),
(ins HvxVR:$Vu32, HvxVR:$Vv32, IntRegsLow8:$Rt8),
@@ -32583,6 +32650,32 @@ let isCVI = 1;
let hasHvxTmp = 1;
let DecoderNamespace = "EXT_mmvec";
}
+def V6_vconv_bf_qf32 : HInst<
+(outs HvxVR:$Vd32),
+(ins HvxWR:$Vuu32),
+"$Vd32.bf = $Vuu32.qf32",
+tc_2a698a03, TypeCVI_VS>, Enc_a33d04, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-5} = 0b111;
+let Inst{13-13} = 0b1;
+let Inst{31-16} = 0b0001111000000110;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
+def V6_vconv_f8_qf16 : HInst<
+(outs HvxVR:$Vd32),
+(ins HvxVR:$Vu32),
+"$Vd32.f8 = $Vu32.qf16",
+tc_2a698a03, TypeCVI_VS>, Enc_e7581c, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-5} = 0b111;
+let Inst{13-13} = 0b1;
+let Inst{31-16} = 0b0001111000001100;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
def V6_vconv_h_hf : HInst<
(outs HvxVR:$Vd32),
(ins HvxVR:$Vu32),
@@ -32596,6 +32689,19 @@ let opNewValue = 0;
let isCVI = 1;
let DecoderNamespace = "EXT_mmvec";
}
+def V6_vconv_h_hf_rnd : HInst<
+(outs HvxVR:$Vd32),
+(ins HvxVR:$Vu32),
+"$Vd32.h = $Vu32.hf:rnd",
+tc_2a698a03, TypeCVI_VS>, Enc_e7581c, Requires<[UseHVXV81]> {
+let Inst{7-5} = 0b110;
+let Inst{13-13} = 0b1;
+let Inst{31-16} = 0b0001111000000110;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
def V6_vconv_hf_h : HInst<
(outs HvxVR:$Vd32),
(ins HvxVR:$Vu32),
@@ -32635,6 +32741,71 @@ let opNewValue = 0;
let isCVI = 1;
let DecoderNamespace = "EXT_mmvec";
}
+def V6_vconv_qf16_f8 : HInst<
+(outs HvxWR:$Vdd32),
+(ins HvxVR:$Vu32),
+"$Vdd32.qf16 = $Vu32.f8",
+tc_04da405a, TypeCVI_VP_VS>, Enc_dd766a, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-5} = 0b101;
+let Inst{13-13} = 0b1;
+let Inst{31-16} = 0b0001111000001100;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
+def V6_vconv_qf16_hf : HInst<
+(outs HvxVR:$Vd32),
+(ins HvxVR:$Vu32),
+"$Vd32.qf16 = $Vu32.hf",
+tc_2a698a03, TypeCVI_VS>, Enc_e7581c, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-5} = 0b100;
+let Inst{13-13} = 0b1;
+let Inst{31-16} = 0b0001111000001100;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
+def V6_vconv_qf16_qf16 : HInst<
+(outs HvxVR:$Vd32),
+(ins HvxVR:$Vu32),
+"$Vd32.qf16 = $Vu32.qf16",
+tc_2a698a03, TypeCVI_VS>, Enc_e7581c, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-5} = 0b110;
+let Inst{13-13} = 0b1;
+let Inst{31-16} = 0b0001111000001100;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
+def V6_vconv_qf32_qf32 : HInst<
+(outs HvxVR:$Vd32),
+(ins HvxVR:$Vu32),
+"$Vd32.qf32 = $Vu32.qf32",
+tc_2a698a03, TypeCVI_VS>, Enc_e7581c, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-5} = 0b111;
+let Inst{13-13} = 0b1;
+let Inst{31-16} = 0b0001111000001101;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
+def V6_vconv_qf32_sf : HInst<
+(outs HvxVR:$Vd32),
+(ins HvxVR:$Vu32),
+"$Vd32.qf32 = $Vu32.sf",
+tc_2a698a03, TypeCVI_VS>, Enc_e7581c, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-5} = 0b110;
+let Inst{13-13} = 0b1;
+let Inst{31-16} = 0b0001111000001101;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
def V6_vconv_sf_qf32 : HInst<
(outs HvxVR:$Vd32),
(ins HvxVR:$Vu32),
@@ -33720,6 +33891,122 @@ let isHVXALU2SRC = 1;
let DecoderNamespace = "EXT_mmvec";
let Constraints = "$Qx4 = $Qx4in";
}
+def V6_veqhf : HInst<
+(outs HvxQR:$Qd4),
+(ins HvxVR:$Vu32, HvxVR:$Vv32),
+"$Qd4 = vcmp.eq($Vu32.hf,$Vv32.hf)",
+tc_56c4f9fe, TypeCVI_VA>, Enc_95441f, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-2} = 0b000111;
+let Inst{13-13} = 0b0;
+let Inst{31-21} = 0b00011111100;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let isHVXALU = 1;
+let isHVXALU2SRC = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
+def V6_veqhf_and : HInst<
+(outs HvxQR:$Qx4),
+(ins HvxQR:$Qx4in, HvxVR:$Vu32, HvxVR:$Vv32),
+"$Qx4 &= vcmp.eq($Vu32.hf,$Vv32.hf)",
+tc_257f6f7c, TypeCVI_VA>, Enc_eaa9f8, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-2} = 0b000111;
+let Inst{13-13} = 0b1;
+let Inst{31-21} = 0b00011100100;
+let isCVI = 1;
+let isHVXALU = 1;
+let isHVXALU2SRC = 1;
+let DecoderNamespace = "EXT_mmvec";
+let Constraints = "$Qx4 = $Qx4in";
+}
+def V6_veqhf_or : HInst<
+(outs HvxQR:$Qx4),
+(ins HvxQR:$Qx4in, HvxVR:$Vu32, HvxVR:$Vv32),
+"$Qx4 |= vcmp.eq($Vu32.hf,$Vv32.hf)",
+tc_257f6f7c, TypeCVI_VA>, Enc_eaa9f8, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-2} = 0b010111;
+let Inst{13-13} = 0b1;
+let Inst{31-21} = 0b00011100100;
+let isAccumulator = 1;
+let isCVI = 1;
+let isHVXALU = 1;
+let isHVXALU2SRC = 1;
+let DecoderNamespace = "EXT_mmvec";
+let Constraints = "$Qx4 = $Qx4in";
+}
+def V6_veqhf_xor : HInst<
+(outs HvxQR:$Qx4),
+(ins HvxQR:$Qx4in, HvxVR:$Vu32, HvxVR:$Vv32),
+"$Qx4 ^= vcmp.eq($Vu32.hf,$Vv32.hf)",
+tc_257f6f7c, TypeCVI_VA>, Enc_eaa9f8, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-2} = 0b100111;
+let Inst{13-13} = 0b1;
+let Inst{31-21} = 0b00011100100;
+let isCVI = 1;
+let isHVXALU = 1;
+let isHVXALU2SRC = 1;
+let DecoderNamespace = "EXT_mmvec";
+let Constraints = "$Qx4 = $Qx4in";
+}
+def V6_veqsf : HInst<
+(outs HvxQR:$Qd4),
+(ins HvxVR:$Vu32, HvxVR:$Vv32),
+"$Qd4 = vcmp.eq($Vu32.sf,$Vv32.sf)",
+tc_56c4f9fe, TypeCVI_VA>, Enc_95441f, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-2} = 0b000011;
+let Inst{13-13} = 0b0;
+let Inst{31-21} = 0b00011111100;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let isHVXALU = 1;
+let isHVXALU2SRC = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
+def V6_veqsf_and : HInst<
+(outs HvxQR:$Qx4),
+(ins HvxQR:$Qx4in, HvxVR:$Vu32, HvxVR:$Vv32),
+"$Qx4 &= vcmp.eq($Vu32.sf,$Vv32.sf)",
+tc_257f6f7c, TypeCVI_VA>, Enc_eaa9f8, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-2} = 0b000011;
+let Inst{13-13} = 0b1;
+let Inst{31-21} = 0b00011100100;
+let isCVI = 1;
+let isHVXALU = 1;
+let isHVXALU2SRC = 1;
+let DecoderNamespace = "EXT_mmvec";
+let Constraints = "$Qx4 = $Qx4in";
+}
+def V6_veqsf_or : HInst<
+(outs HvxQR:$Qx4),
+(ins HvxQR:$Qx4in, HvxVR:$Vu32, HvxVR:$Vv32),
+"$Qx4 |= vcmp.eq($Vu32.sf,$Vv32.sf)",
+tc_257f6f7c, TypeCVI_VA>, Enc_eaa9f8, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-2} = 0b010011;
+let Inst{13-13} = 0b1;
+let Inst{31-21} = 0b00011100100;
+let isAccumulator = 1;
+let isCVI = 1;
+let isHVXALU = 1;
+let isHVXALU2SRC = 1;
+let DecoderNamespace = "EXT_mmvec";
+let Constraints = "$Qx4 = $Qx4in";
+}
+def V6_veqsf_xor : HInst<
+(outs HvxQR:$Qx4),
+(ins HvxQR:$Qx4in, HvxVR:$Vu32, HvxVR:$Vv32),
+"$Qx4 ^= vcmp.eq($Vu32.sf,$Vv32.sf)",
+tc_257f6f7c, TypeCVI_VA>, Enc_eaa9f8, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-2} = 0b100011;
+let Inst{13-13} = 0b1;
+let Inst{31-21} = 0b00011100100;
+let isCVI = 1;
+let isHVXALU = 1;
+let isHVXALU2SRC = 1;
+let DecoderNamespace = "EXT_mmvec";
+let Constraints = "$Qx4 = $Qx4in";
+}
def V6_veqw : HInst<
(outs HvxQR:$Qd4),
(ins HvxVR:$Vu32, HvxVR:$Vv32),
@@ -34538,6 +34825,58 @@ let Inst{31-24} = 0b00011110;
let isCVI = 1;
let DecoderNamespace = "EXT_mmvec";
}
+def V6_vilog2_hf : HInst<
+(outs HvxVR:$Vd32),
+(ins HvxVR:$Vu32),
+"$Vd32.w = vilog2($Vu32.hf)",
+tc_2a698a03, TypeCVI_VS>, Enc_e7581c, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-5} = 0b011;
+let Inst{13-13} = 0b1;
+let Inst{31-16} = 0b0001111000001100;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
+def V6_vilog2_qf16 : HInst<
+(outs HvxVR:$Vd32),
+(ins HvxVR:$Vu32),
+"$Vd32.w = vilog2($Vu32.qf16)",
+tc_2a698a03, TypeCVI_VS>, Enc_e7581c, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-5} = 0b001;
+let Inst{13-13} = 0b1;
+let Inst{31-16} = 0b0001111000001100;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
+def V6_vilog2_qf32 : HInst<
+(outs HvxVR:$Vd32),
+(ins HvxVR:$Vu32),
+"$Vd32.w = vilog2($Vu32.qf32)",
+tc_2a698a03, TypeCVI_VS>, Enc_e7581c, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-5} = 0b000;
+let Inst{13-13} = 0b1;
+let Inst{31-16} = 0b0001111000001100;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
+def V6_vilog2_sf : HInst<
+(outs HvxVR:$Vd32),
+(ins HvxVR:$Vu32),
+"$Vd32.w = vilog2($Vu32.sf)",
+tc_2a698a03, TypeCVI_VS>, Enc_e7581c, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-5} = 0b010;
+let Inst{13-13} = 0b1;
+let Inst{31-16} = 0b0001111000001100;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
def V6_vinsertwr : HInst<
(outs HvxVR:$Vx32),
(ins HvxVR:$Vx32in, IntRegs:$Rt32),
@@ -37170,6 +37509,58 @@ let isCVI = 1;
let isHVXALU = 1;
let DecoderNamespace = "EXT_mmvec";
}
+def V6_vneg_qf16_hf : HInst<
+(outs HvxVR:$Vd32),
+(ins HvxVR:$Vu32),
+"$Vd32.qf16 = vneg($Vu32.hf)",
+tc_2a698a03, TypeCVI_VS>, Enc_e7581c, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-5} = 0b010;
+let Inst{13-13} = 0b1;
+let Inst{31-16} = 0b0001111000001110;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
+def V6_vneg_qf16_qf16 : HInst<
+(outs HvxVR:$Vd32),
+(ins HvxVR:$Vu32),
+"$Vd32.qf16 = vneg($Vu32.qf16)",
+tc_2a698a03, TypeCVI_VS>, Enc_e7581c, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-5} = 0b011;
+let Inst{13-13} = 0b1;
+let Inst{31-16} = 0b0001111000001110;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
+def V6_vneg_qf32_qf32 : HInst<
+(outs HvxVR:$Vd32),
+(ins HvxVR:$Vu32),
+"$Vd32.qf32 = vneg($Vu32.qf32)",
+tc_2a698a03, TypeCVI_VS>, Enc_e7581c, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-5} = 0b001;
+let Inst{13-13} = 0b1;
+let Inst{31-16} = 0b0001111000001110;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
+def V6_vneg_qf32_sf : HInst<
+(outs HvxVR:$Vd32),
+(ins HvxVR:$Vu32),
+"$Vd32.qf32 = vneg($Vu32.sf)",
+tc_2a698a03, TypeCVI_VS>, Enc_e7581c, Requires<[UseHVXV81,UseHVXQFloat]> {
+let Inst{7-5} = 0b000;
+let Inst{13-13} = 0b1;
+let Inst{31-16} = 0b0001111000001110;
+let hasNewValue = 1;
+let opNewValue = 0;
+let isCVI = 1;
+let DecoderNamespace = "EXT_mmvec";
+}
def V6_vnormamth : HInst<
(outs HvxVR:$Vd32),
(ins HvxVR:$Vu32),
diff --git a/llvm/lib/Target/Hexagon/HexagonDepMapAsm2Intrin.td b/llvm/lib/Target/Hexagon/HexagonDepMapAsm2Intrin.td
index 23f4b3a..c11483b 100644
--- a/llvm/lib/Target/Hexagon/HexagonDepMapAsm2Intrin.td
+++ b/llvm/lib/Target/Hexagon/HexagonDepMapAsm2Intrin.td
@@ -3830,6 +3830,122 @@ def: Pat<(int_hexagon_V6_vsub_hf_f8_128B HvxVR:$src1, HvxVR:$src2),
// V81 HVX Instructions.
+def: Pat<(int_hexagon_V6_vabs_qf16_hf HvxVR:$src1),
+ (V6_vabs_qf16_hf HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vabs_qf16_hf_128B HvxVR:$src1),
+ (V6_vabs_qf16_hf HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vabs_qf16_qf16 HvxVR:$src1),
+ (V6_vabs_qf16_qf16 HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vabs_qf16_qf16_128B HvxVR:$src1),
+ (V6_vabs_qf16_qf16 HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vabs_qf32_qf32 HvxVR:$src1),
+ (V6_vabs_qf32_qf32 HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vabs_qf32_qf32_128B HvxVR:$src1),
+ (V6_vabs_qf32_qf32 HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vabs_qf32_sf HvxVR:$src1),
+ (V6_vabs_qf32_sf HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vabs_qf32_sf_128B HvxVR:$src1),
+ (V6_vabs_qf32_sf HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_valign4 HvxVR:$src1, HvxVR:$src2, IntRegsLow8:$src3),
+ (V6_valign4 HvxVR:$src1, HvxVR:$src2, IntRegsLow8:$src3)>, Requires<[UseHVXV81, UseHVX64B]>;
+def: Pat<(int_hexagon_V6_valign4_128B HvxVR:$src1, HvxVR:$src2, IntRegsLow8:$src3),
+ (V6_valign4 HvxVR:$src1, HvxVR:$src2, IntRegsLow8:$src3)>, Requires<[UseHVXV81, UseHVX128B]>;
+def: Pat<(int_hexagon_V6_vconv_bf_qf32 HvxWR:$src1),
+ (V6_vconv_bf_qf32 HvxWR:$src1)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vconv_bf_qf32_128B HvxWR:$src1),
+ (V6_vconv_bf_qf32 HvxWR:$src1)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vconv_f8_qf16 HvxVR:$src1),
+ (V6_vconv_f8_qf16 HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vconv_f8_qf16_128B HvxVR:$src1),
+ (V6_vconv_f8_qf16 HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vconv_h_hf_rnd HvxVR:$src1),
+ (V6_vconv_h_hf_rnd HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX64B]>;
+def: Pat<(int_hexagon_V6_vconv_h_hf_rnd_128B HvxVR:$src1),
+ (V6_vconv_h_hf_rnd HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX128B]>;
+def: Pat<(int_hexagon_V6_vconv_qf16_f8 HvxVR:$src1),
+ (V6_vconv_qf16_f8 HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vconv_qf16_f8_128B HvxVR:$src1),
+ (V6_vconv_qf16_f8 HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vconv_qf16_hf HvxVR:$src1),
+ (V6_vconv_qf16_hf HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vconv_qf16_hf_128B HvxVR:$src1),
+ (V6_vconv_qf16_hf HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vconv_qf16_qf16 HvxVR:$src1),
+ (V6_vconv_qf16_qf16 HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vconv_qf16_qf16_128B HvxVR:$src1),
+ (V6_vconv_qf16_qf16 HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vconv_qf32_qf32 HvxVR:$src1),
+ (V6_vconv_qf32_qf32 HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vconv_qf32_qf32_128B HvxVR:$src1),
+ (V6_vconv_qf32_qf32 HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vconv_qf32_sf HvxVR:$src1),
+ (V6_vconv_qf32_sf HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vconv_qf32_sf_128B HvxVR:$src1),
+ (V6_vconv_qf32_sf HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_veqhf HvxVR:$src1, HvxVR:$src2),
+ (V6_veqhf HvxVR:$src1, HvxVR:$src2)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_veqhf_128B HvxVR:$src1, HvxVR:$src2),
+ (V6_veqhf HvxVR:$src1, HvxVR:$src2)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_veqhf_and HvxQR:$src1, HvxVR:$src2, HvxVR:$src3),
+ (V6_veqhf_and HvxQR:$src1, HvxVR:$src2, HvxVR:$src3)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_veqhf_and_128B HvxQR:$src1, HvxVR:$src2, HvxVR:$src3),
+ (V6_veqhf_and HvxQR:$src1, HvxVR:$src2, HvxVR:$src3)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_veqhf_or HvxQR:$src1, HvxVR:$src2, HvxVR:$src3),
+ (V6_veqhf_or HvxQR:$src1, HvxVR:$src2, HvxVR:$src3)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_veqhf_or_128B HvxQR:$src1, HvxVR:$src2, HvxVR:$src3),
+ (V6_veqhf_or HvxQR:$src1, HvxVR:$src2, HvxVR:$src3)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_veqhf_xor HvxQR:$src1, HvxVR:$src2, HvxVR:$src3),
+ (V6_veqhf_xor HvxQR:$src1, HvxVR:$src2, HvxVR:$src3)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_veqhf_xor_128B HvxQR:$src1, HvxVR:$src2, HvxVR:$src3),
+ (V6_veqhf_xor HvxQR:$src1, HvxVR:$src2, HvxVR:$src3)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_veqsf HvxVR:$src1, HvxVR:$src2),
+ (V6_veqsf HvxVR:$src1, HvxVR:$src2)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_veqsf_128B HvxVR:$src1, HvxVR:$src2),
+ (V6_veqsf HvxVR:$src1, HvxVR:$src2)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_veqsf_and HvxQR:$src1, HvxVR:$src2, HvxVR:$src3),
+ (V6_veqsf_and HvxQR:$src1, HvxVR:$src2, HvxVR:$src3)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_veqsf_and_128B HvxQR:$src1, HvxVR:$src2, HvxVR:$src3),
+ (V6_veqsf_and HvxQR:$src1, HvxVR:$src2, HvxVR:$src3)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_veqsf_or HvxQR:$src1, HvxVR:$src2, HvxVR:$src3),
+ (V6_veqsf_or HvxQR:$src1, HvxVR:$src2, HvxVR:$src3)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_veqsf_or_128B HvxQR:$src1, HvxVR:$src2, HvxVR:$src3),
+ (V6_veqsf_or HvxQR:$src1, HvxVR:$src2, HvxVR:$src3)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_veqsf_xor HvxQR:$src1, HvxVR:$src2, HvxVR:$src3),
+ (V6_veqsf_xor HvxQR:$src1, HvxVR:$src2, HvxVR:$src3)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_veqsf_xor_128B HvxQR:$src1, HvxVR:$src2, HvxVR:$src3),
+ (V6_veqsf_xor HvxQR:$src1, HvxVR:$src2, HvxVR:$src3)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vilog2_hf HvxVR:$src1),
+ (V6_vilog2_hf HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vilog2_hf_128B HvxVR:$src1),
+ (V6_vilog2_hf HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vilog2_qf16 HvxVR:$src1),
+ (V6_vilog2_qf16 HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vilog2_qf16_128B HvxVR:$src1),
+ (V6_vilog2_qf16 HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vilog2_qf32 HvxVR:$src1),
+ (V6_vilog2_qf32 HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vilog2_qf32_128B HvxVR:$src1),
+ (V6_vilog2_qf32 HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vilog2_sf HvxVR:$src1),
+ (V6_vilog2_sf HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vilog2_sf_128B HvxVR:$src1),
+ (V6_vilog2_sf HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vneg_qf16_hf HvxVR:$src1),
+ (V6_vneg_qf16_hf HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vneg_qf16_hf_128B HvxVR:$src1),
+ (V6_vneg_qf16_hf HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vneg_qf16_qf16 HvxVR:$src1),
+ (V6_vneg_qf16_qf16 HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vneg_qf16_qf16_128B HvxVR:$src1),
+ (V6_vneg_qf16_qf16 HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vneg_qf32_qf32 HvxVR:$src1),
+ (V6_vneg_qf32_qf32 HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vneg_qf32_qf32_128B HvxVR:$src1),
+ (V6_vneg_qf32_qf32 HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vneg_qf32_sf HvxVR:$src1),
+ (V6_vneg_qf32_sf HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
+def: Pat<(int_hexagon_V6_vneg_qf32_sf_128B HvxVR:$src1),
+ (V6_vneg_qf32_sf HvxVR:$src1)>, Requires<[UseHVXV81, UseHVX128B, UseHVXQFloat]>;
def: Pat<(int_hexagon_V6_vsub_hf_mix HvxVR:$src1, HvxVR:$src2),
(V6_vsub_hf_mix HvxVR:$src1, HvxVR:$src2)>, Requires<[UseHVXV81, UseHVX64B, UseHVXQFloat]>;
def: Pat<(int_hexagon_V6_vsub_hf_mix_128B HvxVR:$src1, HvxVR:$src2),
diff --git a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp
index 7ee280d..eadf020 100644
--- a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp
+++ b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp
@@ -1815,7 +1815,7 @@ struct WeightedLeaf {
int Weight;
int InsertionOrder;
- WeightedLeaf() {}
+ WeightedLeaf() = default;
WeightedLeaf(SDValue Value, int Weight, int InsertionOrder) :
Value(Value), Weight(Weight), InsertionOrder(InsertionOrder) {
diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
index 904aabed..fe700e1 100644
--- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
+++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
@@ -375,6 +375,8 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
setOperationAction(ISD::FFLOOR, VT, Legal);
setOperationAction(ISD::FTRUNC, VT, Legal);
setOperationAction(ISD::FROUNDEVEN, VT, Legal);
+ setOperationAction(ISD::FMINNUM, VT, Legal);
+ setOperationAction(ISD::FMAXNUM, VT, Legal);
}
setOperationAction(ISD::CTPOP, GRLenVT, Legal);
setOperationAction(ISD::FCEIL, {MVT::f32, MVT::f64}, Legal);
@@ -461,6 +463,8 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
setOperationAction(ISD::FFLOOR, VT, Legal);
setOperationAction(ISD::FTRUNC, VT, Legal);
setOperationAction(ISD::FROUNDEVEN, VT, Legal);
+ setOperationAction(ISD::FMINNUM, VT, Legal);
+ setOperationAction(ISD::FMAXNUM, VT, Legal);
}
}
diff --git a/llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td b/llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td
index 610ba05..b502b056 100644
--- a/llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td
+++ b/llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td
@@ -1558,6 +1558,10 @@ defm : PatXrXrF<fmul, "XVFMUL">;
// XVFDIV_{S/D}
defm : PatXrXrF<fdiv, "XVFDIV">;
+// XVFMAX_{S/D}, XVFMIN_{S/D}
+defm : PatXrXrF<fmaxnum, "XVFMAX">;
+defm : PatXrXrF<fminnum, "XVFMIN">;
+
// XVFMADD_{S/D}
def : Pat<(fma v8f32:$xj, v8f32:$xk, v8f32:$xa),
(XVFMADD_S v8f32:$xj, v8f32:$xk, v8f32:$xa)>;
diff --git a/llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td b/llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td
index 6470842..6b74a4b 100644
--- a/llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td
+++ b/llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td
@@ -1760,6 +1760,10 @@ defm : PatVrVrF<fmul, "VFMUL">;
// VFDIV_{S/D}
defm : PatVrVrF<fdiv, "VFDIV">;
+// VFMAX_{S/D}, VFMIN_{S/D}
+defm : PatVrVrF<fmaxnum, "VFMAX">;
+defm : PatVrVrF<fminnum, "VFMIN">;
+
// VFMADD_{S/D}
def : Pat<(fma v4f32:$vj, v4f32:$vk, v4f32:$va),
(VFMADD_S v4f32:$vj, v4f32:$vk, v4f32:$va)>;
diff --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp
index 7d54565..6d69af5 100644
--- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp
+++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp
@@ -39,7 +39,7 @@ LoongArchELFObjectWriter::LoongArchELFObjectWriter(uint8_t OSABI, bool Is64Bit)
: MCELFObjectTargetWriter(Is64Bit, OSABI, ELF::EM_LOONGARCH,
/*HasRelocationAddend=*/true) {}
-LoongArchELFObjectWriter::~LoongArchELFObjectWriter() {}
+LoongArchELFObjectWriter::~LoongArchELFObjectWriter() = default;
unsigned LoongArchELFObjectWriter::getRelocType(const MCFixup &Fixup,
const MCValue &Target,
diff --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp
index f0e2bc4..08fa51d 100644
--- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp
+++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp
@@ -38,7 +38,7 @@ public:
LoongArchMCCodeEmitter(MCContext &ctx, MCInstrInfo const &MCII)
: Ctx(ctx), MCII(MCII) {}
- ~LoongArchMCCodeEmitter() override {}
+ ~LoongArchMCCodeEmitter() override = default;
void encodeInstruction(const MCInst &MI, SmallVectorImpl<char> &CB,
SmallVectorImpl<MCFixup> &Fixups,
diff --git a/llvm/lib/Target/NVPTX/NVPTXAliasAnalysis.h b/llvm/lib/Target/NVPTX/NVPTXAliasAnalysis.h
index caef8fe7..b832b82 100644
--- a/llvm/lib/Target/NVPTX/NVPTXAliasAnalysis.h
+++ b/llvm/lib/Target/NVPTX/NVPTXAliasAnalysis.h
@@ -20,7 +20,7 @@ class MemoryLocation;
class NVPTXAAResult : public AAResultBase {
public:
- NVPTXAAResult() {}
+ NVPTXAAResult() = default;
NVPTXAAResult(NVPTXAAResult &&Arg) : AAResultBase(std::move(Arg)) {}
/// Handle invalidation events from the new pass manager.
diff --git a/llvm/lib/Target/PowerPC/PPCInstrFuture.td b/llvm/lib/Target/PowerPC/PPCInstrFuture.td
index da3efdc..0c2e44e 100644
--- a/llvm/lib/Target/PowerPC/PPCInstrFuture.td
+++ b/llvm/lib/Target/PowerPC/PPCInstrFuture.td
@@ -360,6 +360,10 @@ let Predicates = [HasVSX, IsISAFuture] in {
def LXVPRLL : XForm_XTp5_RAB5<31, 621, (outs vsrprc:$XTp),
(ins (memr $RA):$addr, g8rc:$RB),
"lxvprll $XTp, $addr, $RB", IIC_LdStLFD, []>;
+ def LXVPB32X
+ : XForm_XTp5_RAB5<31, 877, (outs vsrprc:$XTp),
+ (ins (memr $RA):$addr, g8rc:$RB),
+ "lxvpb32x $XTp, $addr, $RB", IIC_LdStLFD, []>;
}
let mayStore = 1 in {
@@ -376,6 +380,10 @@ let Predicates = [HasVSX, IsISAFuture] in {
: XForm_XTp5_RAB5<31, 749, (outs),
(ins vsrprc:$XTp, (memr $RA):$addr, g8rc:$RB),
"stxvprll $XTp, $addr, $RB", IIC_LdStLFD, []>;
+ def STXVPB32X
+ : XForm_XTp5_RAB5<31, 1005, (outs),
+ (ins vsrprc:$XTp, (memr $RA):$addr, g8rc:$RB),
+ "stxvpb32x $XTp, $addr, $RB", IIC_LdStLFD, []>;
}
def VUPKHSNTOB : VXForm_VRTB5<387, 0, (outs vrrc:$VRT), (ins vrrc:$VRB),
diff --git a/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp b/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp
index 2fba090..b04e887 100644
--- a/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp
+++ b/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp
@@ -912,7 +912,7 @@ bool PPCTTIImpl::areInlineCompatible(const Function *Caller,
bool PPCTTIImpl::areTypesABICompatible(const Function *Caller,
const Function *Callee,
- const ArrayRef<Type *> &Types) const {
+ ArrayRef<Type *> Types) const {
// We need to ensure that argument promotion does not
// attempt to promote pointers to MMA types (__vector_pair
diff --git a/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.h b/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.h
index 475472a..8d7f255 100644
--- a/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.h
+++ b/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.h
@@ -147,7 +147,7 @@ public:
bool areInlineCompatible(const Function *Caller,
const Function *Callee) const override;
bool areTypesABICompatible(const Function *Caller, const Function *Callee,
- const ArrayRef<Type *> &Types) const override;
+ ArrayRef<Type *> Types) const override;
bool supportsTailCallFor(const CallBase *CB) const override;
private:
diff --git a/llvm/lib/Target/RISCV/RISCVInsertWriteVXRM.cpp b/llvm/lib/Target/RISCV/RISCVInsertWriteVXRM.cpp
index a1c8e23..c58a5c0 100644
--- a/llvm/lib/Target/RISCV/RISCVInsertWriteVXRM.cpp
+++ b/llvm/lib/Target/RISCV/RISCVInsertWriteVXRM.cpp
@@ -48,7 +48,7 @@ class VXRMInfo {
} State = Uninitialized;
public:
- VXRMInfo() {}
+ VXRMInfo() = default;
static VXRMInfo getUnknown() {
VXRMInfo Info;
diff --git a/llvm/lib/Target/SPIRV/MCTargetDesc/SPIRVTargetStreamer.cpp b/llvm/lib/Target/SPIRV/MCTargetDesc/SPIRVTargetStreamer.cpp
index 0a318e0..ed6d355 100644
--- a/llvm/lib/Target/SPIRV/MCTargetDesc/SPIRVTargetStreamer.cpp
+++ b/llvm/lib/Target/SPIRV/MCTargetDesc/SPIRVTargetStreamer.cpp
@@ -15,4 +15,4 @@
using namespace llvm;
SPIRVTargetStreamer::SPIRVTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {}
-SPIRVTargetStreamer::~SPIRVTargetStreamer() {}
+SPIRVTargetStreamer::~SPIRVTargetStreamer() = default;
diff --git a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
index 9e11c3a..dd57b74 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
@@ -149,23 +149,23 @@ static FunctionType *getOriginalFunctionType(const Function &F) {
return isa<MDString>(N->getOperand(0)) &&
cast<MDString>(N->getOperand(0))->getString() == F.getName();
});
- // TODO: probably one function can have numerous type mutations,
- // so we should support this.
if (ThisFuncMDIt != NamedMD->op_end()) {
auto *ThisFuncMD = *ThisFuncMDIt;
- MDNode *MD = dyn_cast<MDNode>(ThisFuncMD->getOperand(1));
- assert(MD && "MDNode operand is expected");
- ConstantInt *Const = getConstInt(MD, 0);
- if (Const) {
- auto *CMeta = dyn_cast<ConstantAsMetadata>(MD->getOperand(1));
- assert(CMeta && "ConstantAsMetadata operand is expected");
- assert(Const->getSExtValue() >= -1);
- // Currently -1 indicates return value, greater values mean
- // argument numbers.
- if (Const->getSExtValue() == -1)
- RetTy = CMeta->getType();
- else
- ArgTypes[Const->getSExtValue()] = CMeta->getType();
+ for (unsigned I = 1; I != ThisFuncMD->getNumOperands(); ++I) {
+ MDNode *MD = dyn_cast<MDNode>(ThisFuncMD->getOperand(I));
+ assert(MD && "MDNode operand is expected");
+ ConstantInt *Const = getConstInt(MD, 0);
+ if (Const) {
+ auto *CMeta = dyn_cast<ConstantAsMetadata>(MD->getOperand(1));
+ assert(CMeta && "ConstantAsMetadata operand is expected");
+ assert(Const->getSExtValue() >= -1);
+ // Currently -1 indicates return value, greater values mean
+ // argument numbers.
+ if (Const->getSExtValue() == -1)
+ RetTy = CMeta->getType();
+ else
+ ArgTypes[Const->getSExtValue()] = CMeta->getType();
+ }
}
}
diff --git a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.h b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.h
index 2d19f6de..44b6c66 100644
--- a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.h
+++ b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.h
@@ -81,7 +81,7 @@ private:
void initAvailableCapabilitiesForVulkan(const SPIRVSubtarget &ST);
public:
- RequirementHandler() {}
+ RequirementHandler() = default;
void clear() {
MinimalCaps.clear();
AllCaps.clear();
diff --git a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp
index 7dd0b95..5ba0356 100644
--- a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp
@@ -69,7 +69,7 @@ static Reloc::Model getEffectiveRelocModel(std::optional<Reloc::Model> RM) {
}
// Pin SPIRVTargetObjectFile's vtables to this file.
-SPIRVTargetObjectFile::~SPIRVTargetObjectFile() {}
+SPIRVTargetObjectFile::~SPIRVTargetObjectFile() = default;
SPIRVTargetMachine::SPIRVTargetMachine(const Target &T, const Triple &TT,
StringRef CPU, StringRef FS,
diff --git a/llvm/lib/Target/SystemZ/SystemZTargetObjectFile.h b/llvm/lib/Target/SystemZ/SystemZTargetObjectFile.h
index 9d0adbb..87ec256 100644
--- a/llvm/lib/Target/SystemZ/SystemZTargetObjectFile.h
+++ b/llvm/lib/Target/SystemZ/SystemZTargetObjectFile.h
@@ -16,7 +16,7 @@ namespace llvm {
/// This implementation is used for SystemZ ELF targets.
class SystemZELFTargetObjectFile : public TargetLoweringObjectFileELF {
public:
- SystemZELFTargetObjectFile() {}
+ SystemZELFTargetObjectFile() = default;
/// Describe a TLS variable address within debug info.
const MCExpr *getDebugThreadLocalSymbol(const MCSymbol *Sym) const override;
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.h b/llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.h
index 7845cdf..1bfc61f 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.h
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.h
@@ -76,7 +76,7 @@ public:
BlockSet.insert(MBB);
}
ArrayRef<MachineBasicBlock *> getBlocks() const { return Blocks; }
- using block_iterator = typename ArrayRef<MachineBasicBlock *>::const_iterator;
+ using block_iterator = ArrayRef<MachineBasicBlock *>::const_iterator;
block_iterator block_begin() const { return getBlocks().begin(); }
block_iterator block_end() const { return getBlocks().end(); }
inline iterator_range<block_iterator> blocks() const {
@@ -96,7 +96,7 @@ public:
void addSubException(std::unique_ptr<WebAssemblyException> E) {
SubExceptions.push_back(std::move(E));
}
- using iterator = typename decltype(SubExceptions)::const_iterator;
+ using iterator = decltype(SubExceptions)::const_iterator;
iterator begin() const { return SubExceptions.begin(); }
iterator end() const { return SubExceptions.end(); }
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblySortRegion.h b/llvm/lib/Target/WebAssembly/WebAssemblySortRegion.h
index e92bf17..96b8a4e 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblySortRegion.h
+++ b/llvm/lib/Target/WebAssembly/WebAssemblySortRegion.h
@@ -35,7 +35,7 @@ public:
virtual MachineBasicBlock *getHeader() const = 0;
virtual bool contains(const MachineBasicBlock *MBB) const = 0;
virtual unsigned getNumBlocks() const = 0;
- using block_iterator = typename ArrayRef<MachineBasicBlock *>::const_iterator;
+ using block_iterator = ArrayRef<MachineBasicBlock *>::const_iterator;
virtual iterator_range<block_iterator> blocks() const = 0;
virtual bool isLoop() const = 0;
};
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 133406b..2970cf4 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -53347,6 +53347,80 @@ static SDValue combineMaskedStore(SDNode *N, SelectionDAG &DAG,
return SDValue();
}
+// Look for a RMW operation that only touches one bit of a larger than legal
+// type and fold it to a BTC/BTR/BTS pattern acting on a single i32 sub value.
+static SDValue narrowBitOpRMW(StoreSDNode *St, const SDLoc &DL,
+ SelectionDAG &DAG,
+ const X86Subtarget &Subtarget) {
+ using namespace SDPatternMatch;
+
+ // Only handle normal stores and its chain was a matching normal load.
+ auto *Ld = dyn_cast<LoadSDNode>(St->getChain());
+ if (!ISD::isNormalStore(St) || !St->isSimple() || !Ld ||
+ !ISD::isNormalLoad(Ld) || !Ld->isSimple() ||
+ Ld->getBasePtr() != St->getBasePtr() ||
+ Ld->getOffset() != St->getOffset())
+ return SDValue();
+
+ SDValue LoadVal(Ld, 0);
+ SDValue StoredVal = St->getValue();
+ EVT VT = StoredVal.getValueType();
+
+ // Only narrow larger than legal scalar integers.
+ if (!VT.isScalarInteger() ||
+ VT.getSizeInBits() <= (Subtarget.is64Bit() ? 64 : 32))
+ return SDValue();
+
+ // BTR: X & ~(1 << ShAmt)
+ // BTS: X | (1 << ShAmt)
+ // BTC: X ^ (1 << ShAmt)
+ SDValue ShAmt;
+ if (!StoredVal.hasOneUse() ||
+ !(sd_match(StoredVal, m_And(m_Specific(LoadVal),
+ m_Not(m_Shl(m_One(), m_Value(ShAmt))))) ||
+ sd_match(StoredVal,
+ m_Or(m_Specific(LoadVal), m_Shl(m_One(), m_Value(ShAmt)))) ||
+ sd_match(StoredVal,
+ m_Xor(m_Specific(LoadVal), m_Shl(m_One(), m_Value(ShAmt))))))
+ return SDValue();
+
+ // Ensure the shift amount is in bounds.
+ KnownBits KnownAmt = DAG.computeKnownBits(ShAmt);
+ if (KnownAmt.getMaxValue().uge(VT.getSizeInBits()))
+ return SDValue();
+
+ // Split the shift into an alignment shift that moves the active i32 block to
+ // the bottom bits for truncation and a modulo shift that can act on the i32.
+ EVT AmtVT = ShAmt.getValueType();
+ SDValue AlignAmt = DAG.getNode(ISD::AND, DL, AmtVT, ShAmt,
+ DAG.getSignedConstant(-32LL, DL, AmtVT));
+ SDValue ModuloAmt =
+ DAG.getNode(ISD::AND, DL, AmtVT, ShAmt, DAG.getConstant(31, DL, AmtVT));
+
+ // Compute the byte offset for the i32 block that is changed by the RMW.
+ // combineTruncate will adjust the load for us in a similar way.
+ EVT PtrVT = St->getBasePtr().getValueType();
+ SDValue PtrBitOfs = DAG.getZExtOrTrunc(AlignAmt, DL, PtrVT);
+ SDValue PtrByteOfs = DAG.getNode(ISD::SRL, DL, PtrVT, PtrBitOfs,
+ DAG.getShiftAmountConstant(3, PtrVT, DL));
+ SDValue NewPtr = DAG.getMemBasePlusOffset(St->getBasePtr(), PtrByteOfs, DL,
+ SDNodeFlags::NoUnsignedWrap);
+
+ // Reconstruct the BTC/BTR/BTS pattern for the i32 block and store.
+ SDValue X = DAG.getNode(ISD::SRL, DL, VT, LoadVal, AlignAmt);
+ X = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, X);
+
+ SDValue Mask =
+ DAG.getNode(ISD::SHL, DL, MVT::i32, DAG.getConstant(1, DL, MVT::i32),
+ DAG.getZExtOrTrunc(ModuloAmt, DL, MVT::i8));
+ if (StoredVal.getOpcode() == ISD::AND)
+ Mask = DAG.getNOT(DL, Mask, MVT::i32);
+
+ SDValue Res = DAG.getNode(StoredVal.getOpcode(), DL, MVT::i32, X, Mask);
+ return DAG.getStore(St->getChain(), DL, Res, NewPtr, St->getPointerInfo(),
+ Align(), St->getMemOperand()->getFlags());
+}
+
static SDValue combineStore(SDNode *N, SelectionDAG &DAG,
TargetLowering::DAGCombinerInfo &DCI,
const X86Subtarget &Subtarget) {
@@ -53573,6 +53647,9 @@ static SDValue combineStore(SDNode *N, SelectionDAG &DAG,
}
}
+ if (SDValue R = narrowBitOpRMW(St, dl, DAG, Subtarget))
+ return R;
+
// Convert store(cmov(load(p), x, CC), p) to cstore(x, p, CC)
// store(cmov(x, load(p), CC), p) to cstore(x, p, InvertCC)
if ((VT == MVT::i16 || VT == MVT::i32 || VT == MVT::i64) &&
@@ -54505,8 +54582,9 @@ static SDValue combineTruncate(SDNode *N, SelectionDAG &DAG,
// truncation, see if we can convert the shift into a pointer offset instead.
// Limit this to normal (non-ext) scalar integer loads.
if (SrcVT.isScalarInteger() && Src.getOpcode() == ISD::SRL &&
- Src.hasOneUse() && Src.getOperand(0).hasOneUse() &&
- ISD::isNormalLoad(Src.getOperand(0).getNode())) {
+ Src.hasOneUse() && ISD::isNormalLoad(Src.getOperand(0).getNode()) &&
+ (Src.getOperand(0).hasOneUse() ||
+ !DAG.getTargetLoweringInfo().isOperationLegal(ISD::LOAD, SrcVT))) {
auto *Ld = cast<LoadSDNode>(Src.getOperand(0));
if (Ld->isSimple() && VT.isByteSized() &&
isPowerOf2_64(VT.getSizeInBits())) {
@@ -54529,8 +54607,7 @@ static SDValue combineTruncate(SDNode *N, SelectionDAG &DAG,
SDValue NewLoad =
DAG.getLoad(VT, DL, Ld->getChain(), NewPtr, Ld->getPointerInfo(),
Align(), Ld->getMemOperand()->getFlags());
- DAG.ReplaceAllUsesOfValueWith(Src.getOperand(0).getValue(1),
- NewLoad.getValue(1));
+ DAG.makeEquivalentMemoryOrdering(Ld, NewLoad);
return NewLoad;
}
}
@@ -56306,6 +56383,7 @@ static SDValue combineAVX512SetCCToKMOV(EVT VT, SDValue Op0, ISD::CondCode CC,
static SDValue combineSetCC(SDNode *N, SelectionDAG &DAG,
TargetLowering::DAGCombinerInfo &DCI,
const X86Subtarget &Subtarget) {
+ using namespace SDPatternMatch;
const ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get();
const SDValue LHS = N->getOperand(0);
const SDValue RHS = N->getOperand(1);
@@ -56364,6 +56442,37 @@ static SDValue combineSetCC(SDNode *N, SelectionDAG &DAG,
if (SDValue AndN = MatchAndCmpEq(RHS, LHS))
return DAG.getSetCC(DL, VT, AndN, DAG.getConstant(0, DL, OpVT), CC);
+ // If we're performing a bit test on a larger than legal type, attempt
+ // to (aligned) shift down the value to the bottom 32-bits and then
+ // perform the bittest on the i32 value.
+ // ICMP_ZERO(AND(X,SHL(1,IDX)))
+ // --> ICMP_ZERO(AND(TRUNC(SRL(X,AND(IDX,-32))),SHL(1,AND(IDX,31))))
+ if (isNullConstant(RHS) &&
+ OpVT.getScalarSizeInBits() > (Subtarget.is64Bit() ? 64 : 32)) {
+ SDValue X, ShAmt;
+ if (sd_match(LHS, m_OneUse(m_And(m_Value(X),
+ m_Shl(m_One(), m_Value(ShAmt)))))) {
+ // Only attempt this if the shift amount is known to be in bounds.
+ KnownBits KnownAmt = DAG.computeKnownBits(ShAmt);
+ if (KnownAmt.getMaxValue().ult(OpVT.getScalarSizeInBits())) {
+ EVT AmtVT = ShAmt.getValueType();
+ SDValue AlignAmt =
+ DAG.getNode(ISD::AND, DL, AmtVT, ShAmt,
+ DAG.getSignedConstant(-32LL, DL, AmtVT));
+ SDValue ModuloAmt = DAG.getNode(ISD::AND, DL, AmtVT, ShAmt,
+ DAG.getConstant(31, DL, AmtVT));
+ SDValue Mask = DAG.getNode(
+ ISD::SHL, DL, MVT::i32, DAG.getConstant(1, DL, MVT::i32),
+ DAG.getZExtOrTrunc(ModuloAmt, DL, MVT::i8));
+ X = DAG.getNode(ISD::SRL, DL, OpVT, X, AlignAmt);
+ X = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, X);
+ X = DAG.getNode(ISD::AND, DL, MVT::i32, X, Mask);
+ return DAG.getSetCC(DL, VT, X, DAG.getConstant(0, DL, MVT::i32),
+ CC);
+ }
+ }
+ }
+
// cmpeq(trunc(x),C) --> cmpeq(x,C)
// cmpne(trunc(x),C) --> cmpne(x,C)
// iff x upper bits are zero.
diff --git a/llvm/lib/Target/X86/X86LoadValueInjectionLoadHardening.cpp b/llvm/lib/Target/X86/X86LoadValueInjectionLoadHardening.cpp
index 090060e..3b96e70 100644
--- a/llvm/lib/Target/X86/X86LoadValueInjectionLoadHardening.cpp
+++ b/llvm/lib/Target/X86/X86LoadValueInjectionLoadHardening.cpp
@@ -115,9 +115,9 @@ struct MachineGadgetGraph : ImmutableGraph<MachineInstr *, int> {
static constexpr MachineInstr *const ArgNodeSentinel = nullptr;
using GraphT = ImmutableGraph<MachineInstr *, int>;
- using Node = typename GraphT::Node;
- using Edge = typename GraphT::Edge;
- using size_type = typename GraphT::size_type;
+ using Node = GraphT::Node;
+ using Edge = GraphT::Edge;
+ using size_type = GraphT::size_type;
MachineGadgetGraph(std::unique_ptr<Node[]> Nodes,
std::unique_ptr<Edge[]> Edges, size_type NodesSize,
size_type EdgesSize, int NumFences = 0, int NumGadgets = 0)
@@ -191,10 +191,10 @@ template <>
struct DOTGraphTraits<MachineGadgetGraph *> : DefaultDOTGraphTraits {
using GraphType = MachineGadgetGraph;
using Traits = llvm::GraphTraits<GraphType *>;
- using NodeRef = typename Traits::NodeRef;
- using EdgeRef = typename Traits::EdgeRef;
- using ChildIteratorType = typename Traits::ChildIteratorType;
- using ChildEdgeIteratorType = typename Traits::ChildEdgeIteratorType;
+ using NodeRef = Traits::NodeRef;
+ using EdgeRef = Traits::EdgeRef;
+ using ChildIteratorType = Traits::ChildIteratorType;
+ using ChildEdgeIteratorType = Traits::ChildEdgeIteratorType;
DOTGraphTraits(bool IsSimple = false) : DefaultDOTGraphTraits(IsSimple) {}
@@ -227,9 +227,6 @@ struct DOTGraphTraits<MachineGadgetGraph *> : DefaultDOTGraphTraits {
} // end namespace llvm
-constexpr MachineInstr *MachineGadgetGraph::ArgNodeSentinel;
-constexpr int MachineGadgetGraph::GadgetEdgeSentinel;
-
char X86LoadValueInjectionLoadHardeningPass::ID = 0;
void X86LoadValueInjectionLoadHardeningPass::getAnalysisUsage(
@@ -335,7 +332,7 @@ X86LoadValueInjectionLoadHardeningPass::getGadgetGraph(
L.computePhiInfo();
GraphBuilder Builder;
- using GraphIter = typename GraphBuilder::BuilderNodeRef;
+ using GraphIter = GraphBuilder::BuilderNodeRef;
DenseMap<MachineInstr *, GraphIter> NodeMap;
int FenceCount = 0, GadgetCount = 0;
auto MaybeAddNode = [&NodeMap, &Builder](MachineInstr *MI) {
diff --git a/llvm/lib/Target/X86/X86TargetTransformInfo.cpp b/llvm/lib/Target/X86/X86TargetTransformInfo.cpp
index 3d8d0a23..0b1430e 100644
--- a/llvm/lib/Target/X86/X86TargetTransformInfo.cpp
+++ b/llvm/lib/Target/X86/X86TargetTransformInfo.cpp
@@ -6562,7 +6562,7 @@ bool X86TTIImpl::areInlineCompatible(const Function *Caller,
bool X86TTIImpl::areTypesABICompatible(const Function *Caller,
const Function *Callee,
- const ArrayRef<Type *> &Types) const {
+ ArrayRef<Type *> Types) const {
if (!BaseT::areTypesABICompatible(Caller, Callee, Types))
return false;
diff --git a/llvm/lib/Target/X86/X86TargetTransformInfo.h b/llvm/lib/Target/X86/X86TargetTransformInfo.h
index 133b366..de5e1c2 100644
--- a/llvm/lib/Target/X86/X86TargetTransformInfo.h
+++ b/llvm/lib/Target/X86/X86TargetTransformInfo.h
@@ -296,7 +296,7 @@ public:
bool areInlineCompatible(const Function *Caller,
const Function *Callee) const override;
bool areTypesABICompatible(const Function *Caller, const Function *Callee,
- const ArrayRef<Type *> &Type) const override;
+ ArrayRef<Type *> Type) const override;
uint64_t getMaxMemIntrinsicInlineSizeThreshold() const override {
return ST->getMaxInlineSizeThreshold();
diff --git a/llvm/lib/TextAPI/BinaryReader/DylibReader.cpp b/llvm/lib/TextAPI/BinaryReader/DylibReader.cpp
index cda07e8..f55bc9c 100644
--- a/llvm/lib/TextAPI/BinaryReader/DylibReader.cpp
+++ b/llvm/lib/TextAPI/BinaryReader/DylibReader.cpp
@@ -32,7 +32,7 @@ using namespace llvm::MachO;
using namespace llvm::MachO::DylibReader;
using TripleVec = std::vector<Triple>;
-static typename TripleVec::iterator emplace(TripleVec &Container, Triple &&T) {
+static TripleVec::iterator emplace(TripleVec &Container, Triple &&T) {
auto I = partition_point(Container, [=](const Triple &CT) {
return std::forward_as_tuple(CT.getArch(), CT.getOS(),
CT.getEnvironment()) <
diff --git a/llvm/lib/TextAPI/RecordVisitor.cpp b/llvm/lib/TextAPI/RecordVisitor.cpp
index d333b33..24971a7 100644
--- a/llvm/lib/TextAPI/RecordVisitor.cpp
+++ b/llvm/lib/TextAPI/RecordVisitor.cpp
@@ -15,7 +15,7 @@
using namespace llvm;
using namespace llvm::MachO;
-RecordVisitor::~RecordVisitor() {}
+RecordVisitor::~RecordVisitor() = default;
void RecordVisitor::visitObjCInterface(const ObjCInterfaceRecord &) {}
void RecordVisitor::visitObjCCategory(const ObjCCategoryRecord &) {}
diff --git a/llvm/lib/Transforms/Coroutines/CoroCloner.h b/llvm/lib/Transforms/Coroutines/CoroCloner.h
index e05fe28..1e549f1 100644
--- a/llvm/lib/Transforms/Coroutines/CoroCloner.h
+++ b/llvm/lib/Transforms/Coroutines/CoroCloner.h
@@ -77,7 +77,7 @@ public:
: OrigF(OrigF), Suffix(Suffix), Shape(Shape), FKind(FKind),
Builder(OrigF.getContext()), TTI(TTI) {}
- virtual ~BaseCloner() {}
+ virtual ~BaseCloner() = default;
/// Create a clone for a continuation lowering.
static Function *createClone(Function &OrigF, const Twine &Suffix,
diff --git a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
index 5048561..5ed47ae 100644
--- a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
+++ b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
@@ -3619,7 +3619,7 @@ struct AAIntraFnReachabilityFunction final
return true;
RQITy StackRQI(A, From, To, ExclusionSet, false);
- typename RQITy::Reachable Result;
+ RQITy::Reachable Result;
if (!NonConstThis->checkQueryCache(A, StackRQI, Result))
return NonConstThis->isReachableImpl(A, StackRQI,
/*IsTemporaryRQI=*/true);
@@ -10701,7 +10701,7 @@ struct AAInterFnReachabilityFunction
auto *NonConstThis = const_cast<AAInterFnReachabilityFunction *>(this);
RQITy StackRQI(A, From, To, ExclusionSet, false);
- typename RQITy::Reachable Result;
+ RQITy::Reachable Result;
if (!NonConstThis->checkQueryCache(A, StackRQI, Result))
return NonConstThis->isReachableImpl(A, StackRQI,
/*IsTemporaryRQI=*/true);
diff --git a/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp b/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp
index 894d83f..d35ae47 100644
--- a/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp
+++ b/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp
@@ -1034,11 +1034,11 @@ private:
} // namespace
template <>
-struct llvm::DenseMapInfo<typename CallsiteContextGraph<
+struct llvm::DenseMapInfo<CallsiteContextGraph<
ModuleCallsiteContextGraph, Function, Instruction *>::CallInfo>
: public DenseMapInfo<std::pair<Instruction *, unsigned>> {};
template <>
-struct llvm::DenseMapInfo<typename CallsiteContextGraph<
+struct llvm::DenseMapInfo<CallsiteContextGraph<
IndexCallsiteContextGraph, FunctionSummary, IndexCall>::CallInfo>
: public DenseMapInfo<std::pair<IndexCall, unsigned>> {};
template <>
diff --git a/llvm/lib/Transforms/IPO/OpenMPOpt.cpp b/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
index d7eb745..2a87a0f 100644
--- a/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
+++ b/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
@@ -208,7 +208,7 @@ namespace KernelInfo {
// };
#define KERNEL_ENVIRONMENT_IDX(MEMBER, IDX) \
- constexpr const unsigned MEMBER##Idx = IDX;
+ constexpr unsigned MEMBER##Idx = IDX;
KERNEL_ENVIRONMENT_IDX(Configuration, 0)
KERNEL_ENVIRONMENT_IDX(Ident, 1)
@@ -216,7 +216,7 @@ KERNEL_ENVIRONMENT_IDX(Ident, 1)
#undef KERNEL_ENVIRONMENT_IDX
#define KERNEL_ENVIRONMENT_CONFIGURATION_IDX(MEMBER, IDX) \
- constexpr const unsigned MEMBER##Idx = IDX;
+ constexpr unsigned MEMBER##Idx = IDX;
KERNEL_ENVIRONMENT_CONFIGURATION_IDX(UseGenericStateMachine, 0)
KERNEL_ENVIRONMENT_CONFIGURATION_IDX(MayUseNestedParallelism, 1)
@@ -258,7 +258,7 @@ KERNEL_ENVIRONMENT_CONFIGURATION_GETTER(MaxTeams)
GlobalVariable *
getKernelEnvironementGVFromKernelInitCB(CallBase *KernelInitCB) {
- constexpr const int InitKernelEnvironmentArgNo = 0;
+ constexpr int InitKernelEnvironmentArgNo = 0;
return cast<GlobalVariable>(
KernelInitCB->getArgOperand(InitKernelEnvironmentArgNo)
->stripPointerCasts());
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
index 3ddf182..cbaff29 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -3997,6 +3997,27 @@ static Value *foldOrUnsignedUMulOverflowICmp(BinaryOperator &I,
return nullptr;
}
+/// Fold select(X >s 0, 0, -X) | smax(X, 0) --> abs(X)
+/// select(X <s 0, -X, 0) | smax(X, 0) --> abs(X)
+static Value *FoldOrOfSelectSmaxToAbs(BinaryOperator &I,
+ InstCombiner::BuilderTy &Builder) {
+ Value *X;
+ Value *Sel;
+ if (match(&I,
+ m_c_Or(m_Value(Sel), m_OneUse(m_SMax(m_Value(X), m_ZeroInt()))))) {
+ auto NegX = m_Neg(m_Specific(X));
+ if (match(Sel, m_Select(m_SpecificICmp(ICmpInst::ICMP_SGT, m_Specific(X),
+ m_ZeroInt()),
+ m_ZeroInt(), NegX)) ||
+ match(Sel, m_Select(m_SpecificICmp(ICmpInst::ICMP_SLT, m_Specific(X),
+ m_ZeroInt()),
+ NegX, m_ZeroInt())))
+ return Builder.CreateBinaryIntrinsic(Intrinsic::abs, X,
+ Builder.getFalse());
+ }
+ return nullptr;
+}
+
// FIXME: We use commutative matchers (m_c_*) for some, but not all, matches
// here. We should standardize that construct where it is needed or choose some
// other way to ensure that commutated variants of patterns are not missed.
@@ -4545,6 +4566,9 @@ Instruction *InstCombinerImpl::visitOr(BinaryOperator &I) {
if (Value *V = SimplifyAddWithRemainder(I))
return replaceInstUsesWith(I, V);
+ if (Value *Res = FoldOrOfSelectSmaxToAbs(I, Builder))
+ return replaceInstUsesWith(I, Res);
+
return nullptr;
}
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index f5130da..9572f9d 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -3599,6 +3599,21 @@ Instruction *InstCombinerImpl::foldSelectOfBools(SelectInst &SI) {
m_Not(m_Specific(SelCond->getTrueValue())));
if (MayNeedFreeze)
C = Builder.CreateFreeze(C);
+ if (!ProfcheckDisableMetadataFixes) {
+ Value *C2 = nullptr, *A2 = nullptr, *B2 = nullptr;
+ if (match(CondVal, m_LogicalAnd(m_Specific(C), m_Value(A2))) &&
+ SelCond) {
+ return SelectInst::Create(C, A, B, "", nullptr, SelCond);
+ } else if (match(FalseVal,
+ m_LogicalAnd(m_Not(m_Value(C2)), m_Value(B2))) &&
+ SelFVal) {
+ SelectInst *NewSI = SelectInst::Create(C, A, B, "", nullptr, SelFVal);
+ NewSI->swapProfMetadata();
+ return NewSI;
+ } else {
+ return createSelectInstWithUnknownProfile(C, A, B);
+ }
+ }
return SelectInst::Create(C, A, B);
}
@@ -3615,6 +3630,20 @@ Instruction *InstCombinerImpl::foldSelectOfBools(SelectInst &SI) {
m_Not(m_Specific(SelFVal->getTrueValue())));
if (MayNeedFreeze)
C = Builder.CreateFreeze(C);
+ if (!ProfcheckDisableMetadataFixes) {
+ Value *C2 = nullptr, *A2 = nullptr, *B2 = nullptr;
+ if (match(CondVal, m_LogicalAnd(m_Not(m_Value(C2)), m_Value(A2))) &&
+ SelCond) {
+ SelectInst *NewSI = SelectInst::Create(C, B, A, "", nullptr, SelCond);
+ NewSI->swapProfMetadata();
+ return NewSI;
+ } else if (match(FalseVal, m_LogicalAnd(m_Specific(C), m_Value(B2))) &&
+ SelFVal) {
+ return SelectInst::Create(C, B, A, "", nullptr, SelFVal);
+ } else {
+ return createSelectInstWithUnknownProfile(C, B, A);
+ }
+ }
return SelectInst::Create(C, B, A);
}
}
diff --git a/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp
index 80e77e09..a2fad02 100644
--- a/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp
@@ -161,7 +161,7 @@ template <char NsanTypeId>
class ShadowTypeConfigImpl : public ShadowTypeConfig {
public:
char getNsanTypeId() const override { return NsanTypeId; }
- static constexpr const char kNsanTypeId = NsanTypeId;
+ static constexpr char kNsanTypeId = NsanTypeId;
};
// `double` (`d`) shadow type.
diff --git a/llvm/lib/Transforms/Scalar/DropUnnecessaryAssumes.cpp b/llvm/lib/Transforms/Scalar/DropUnnecessaryAssumes.cpp
index 89980d5..a577f51 100644
--- a/llvm/lib/Transforms/Scalar/DropUnnecessaryAssumes.cpp
+++ b/llvm/lib/Transforms/Scalar/DropUnnecessaryAssumes.cpp
@@ -122,7 +122,8 @@ DropUnnecessaryAssumesPass::run(Function &F, FunctionAnalysisManager &FAM) {
Value *Cond = Assume->getArgOperand(0);
// Don't drop type tests, which have special semantics.
- if (match(Cond, m_Intrinsic<Intrinsic::type_test>()))
+ if (match(Cond, m_Intrinsic<Intrinsic::type_test>()) ||
+ match(Cond, m_Intrinsic<Intrinsic::public_type_test>()))
continue;
SmallVector<Value *> Affected;
diff --git a/llvm/lib/Transforms/Scalar/GVNSink.cpp b/llvm/lib/Transforms/Scalar/GVNSink.cpp
index a06f832..d564e32 100644
--- a/llvm/lib/Transforms/Scalar/GVNSink.cpp
+++ b/llvm/lib/Transforms/Scalar/GVNSink.cpp
@@ -514,7 +514,7 @@ public:
class GVNSink {
public:
- GVNSink() {}
+ GVNSink() = default;
bool run(Function &F) {
LLVM_DEBUG(dbgs() << "GVNSink: running on function @" << F.getName()
diff --git a/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp b/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
index 3487e81..7e70ba2 100644
--- a/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
+++ b/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp
@@ -245,11 +245,14 @@ raw_ostream &operator<<(raw_ostream &OS, ShapeInfo SI) {
} // namespace
-static bool isUniformShape(Value *V) {
+static bool isShapePreserving(Value *V) {
Instruction *I = dyn_cast<Instruction>(V);
if (!I)
return true;
+ if (isa<SelectInst>(I))
+ return true;
+
if (I->isBinaryOp())
return true;
@@ -300,6 +303,16 @@ static bool isUniformShape(Value *V) {
}
}
+/// Return an iterator over the operands of \p I that should share shape
+/// information with \p I.
+static iterator_range<Use *> getShapedOperandsForInst(Instruction *I) {
+ assert(isShapePreserving(I) &&
+ "Can't retrieve shaped operands for an instruction that does not "
+ "preserve shape information");
+ auto Ops = I->operands();
+ return isa<SelectInst>(I) ? drop_begin(Ops) : Ops;
+}
+
/// Return the ShapeInfo for the result of \p I, it it can be determined.
static std::optional<ShapeInfo>
computeShapeInfoForInst(Instruction *I,
@@ -329,9 +342,8 @@ computeShapeInfoForInst(Instruction *I,
return OpShape->second;
}
- if (isUniformShape(I) || isa<SelectInst>(I)) {
- auto Ops = I->operands();
- auto ShapedOps = isa<SelectInst>(I) ? drop_begin(Ops) : Ops;
+ if (isShapePreserving(I)) {
+ auto ShapedOps = getShapedOperandsForInst(I);
// Find the first operand that has a known shape and use that.
for (auto &Op : ShapedOps) {
auto OpShape = ShapeMap.find(Op.get());
@@ -710,10 +722,9 @@ public:
case Intrinsic::matrix_column_major_store:
return true;
default:
- return isUniformShape(II);
+ break;
}
- return isUniformShape(V) || isa<StoreInst>(V) || isa<LoadInst>(V) ||
- isa<SelectInst>(V);
+ return isShapePreserving(V) || isa<StoreInst>(V) || isa<LoadInst>(V);
}
/// Propagate the shape information of instructions to their users.
@@ -800,9 +811,8 @@ public:
} else if (isa<StoreInst>(V)) {
// Nothing to do. We forward-propagated to this so we would just
// backward propagate to an instruction with an already known shape.
- } else if (isUniformShape(V) || isa<SelectInst>(V)) {
- auto Ops = cast<Instruction>(V)->operands();
- auto ShapedOps = isa<SelectInst>(V) ? drop_begin(Ops) : Ops;
+ } else if (isShapePreserving(V)) {
+ auto ShapedOps = getShapedOperandsForInst(cast<Instruction>(V));
// Propagate to all operands.
ShapeInfo Shape = ShapeMap[V];
for (Use &U : ShapedOps) {
diff --git a/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp b/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp
index 0f3978f..5f6f66a 100644
--- a/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp
+++ b/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp
@@ -143,8 +143,8 @@ struct SubGraphTraits {
class WrappedSuccIterator
: public iterator_adaptor_base<
WrappedSuccIterator, BaseSuccIterator,
- typename std::iterator_traits<BaseSuccIterator>::iterator_category,
- NodeRef, std::ptrdiff_t, NodeRef *, NodeRef> {
+ std::iterator_traits<BaseSuccIterator>::iterator_category, NodeRef,
+ std::ptrdiff_t, NodeRef *, NodeRef> {
SmallDenseSet<RegionNode *> *Nodes;
public:
diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp
index 8be471b..6e60b94 100644
--- a/llvm/lib/Transforms/Utils/LoopUtils.cpp
+++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp
@@ -992,9 +992,12 @@ BranchProbability llvm::getBranchProbability(BranchInst *B,
uint64_t Weight0, Weight1;
if (!extractBranchWeights(*B, Weight0, Weight1))
return BranchProbability::getUnknown();
+ uint64_t Denominator = Weight0 + Weight1;
+ if (Denominator == 0)
+ return BranchProbability::getUnknown();
if (!ForFirstTarget)
std::swap(Weight0, Weight1);
- return BranchProbability::getBranchProbability(Weight0, Weight0 + Weight1);
+ return BranchProbability::getBranchProbability(Weight0, Denominator);
}
bool llvm::setBranchProbability(BranchInst *B, BranchProbability P,
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index 34b405c..bf3f52c 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -20975,6 +20975,27 @@ BoUpSLP::BlockScheduling::tryScheduleBundle(ArrayRef<Value *> VL, BoUpSLP *SLP,
if (isa<PHINode>(S.getMainOp()) ||
isVectorLikeInstWithConstOps(S.getMainOp()))
return nullptr;
+ // If the parent node is non-schedulable and the current node is copyable, and
+ // any of parent instructions are used outside several basic blocks or in
+ // bin-op node - cancel scheduling, it may cause wrong def-use deps in
+ // analysis, leading to a crash.
+ // Non-scheduled nodes may not have related ScheduleData model, which may lead
+ // to a skipped dep analysis.
+ if (S.areInstructionsWithCopyableElements() && EI && EI.UserTE->hasState() &&
+ EI.UserTE->doesNotNeedToSchedule() &&
+ EI.UserTE->getOpcode() != Instruction::PHI &&
+ any_of(EI.UserTE->Scalars, [](Value *V) {
+ auto *I = dyn_cast<Instruction>(V);
+ if (!I || I->hasOneUser())
+ return false;
+ for (User *U : I->users()) {
+ auto *UI = cast<Instruction>(U);
+ if (isa<BinaryOperator>(UI))
+ return true;
+ }
+ return false;
+ }))
+ return std::nullopt;
bool HasCopyables = S.areInstructionsWithCopyableElements();
if (((!HasCopyables && doesNotNeedToSchedule(VL)) ||
all_of(VL, [&](Value *V) { return S.isNonSchedulable(V); }))) {
diff --git a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/DependencyGraph.cpp b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/DependencyGraph.cpp
index 9c869dd..d354933 100644
--- a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/DependencyGraph.cpp
+++ b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/DependencyGraph.cpp
@@ -92,7 +92,7 @@ void MemDGNode::print(raw_ostream &OS, bool PrintDeps) const {
DGNode::print(OS, false);
if (PrintDeps) {
// Print memory preds.
- static constexpr const unsigned Indent = 4;
+ static constexpr unsigned Indent = 4;
for (auto *Pred : MemPreds)
OS.indent(Indent) << "<-" << *Pred->getInstruction() << "\n";
}
diff --git a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/BottomUpVec.cpp b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/BottomUpVec.cpp
index 86dbd21..5534da9 100644
--- a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/BottomUpVec.cpp
+++ b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/BottomUpVec.cpp
@@ -25,14 +25,14 @@ static cl::opt<bool>
"emit new instructions (*very* expensive)."));
#endif // NDEBUG
-static constexpr const unsigned long StopAtDisabled =
+static constexpr unsigned long StopAtDisabled =
std::numeric_limits<unsigned long>::max();
static cl::opt<unsigned long>
StopAt("sbvec-stop-at", cl::init(StopAtDisabled), cl::Hidden,
cl::desc("Vectorize if the invocation count is < than this. 0 "
"disables vectorization."));
-static constexpr const unsigned long StopBundleDisabled =
+static constexpr unsigned long StopBundleDisabled =
std::numeric_limits<unsigned long>::max();
static cl::opt<unsigned long>
StopBundle("sbvec-stop-bndl", cl::init(StopBundleDisabled), cl::Hidden,
diff --git a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizer.cpp
index ed2f80b..2de6921 100644
--- a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizer.cpp
@@ -43,7 +43,7 @@ cl::opt<std::string> AllowFiles(
"sbvec-allow-files", cl::init(".*"), cl::Hidden,
cl::desc("Run the vectorizer only on file paths that match any in the "
"list of comma-separated regex's."));
-static constexpr const char AllowFilesDelim = ',';
+static constexpr char AllowFilesDelim = ',';
SandboxVectorizerPass::SandboxVectorizerPass() : FPM("fpm") {
if (UserDefinedPassPipeline == DefaultPipelineMagicStr) {
diff --git a/llvm/lib/Transforms/Vectorize/VPlan.h b/llvm/lib/Transforms/Vectorize/VPlan.h
index 9081ad7..cfe1f1e 100644
--- a/llvm/lib/Transforms/Vectorize/VPlan.h
+++ b/llvm/lib/Transforms/Vectorize/VPlan.h
@@ -939,7 +939,7 @@ class VPIRMetadata {
SmallVector<std::pair<unsigned, MDNode *>> Metadata;
public:
- VPIRMetadata() {}
+ VPIRMetadata() = default;
/// Adds metatadata that can be preserved from the original instruction
/// \p I.
@@ -950,12 +950,9 @@ public:
VPIRMetadata(Instruction &I, LoopVersioning *LVer);
/// Copy constructor for cloning.
- VPIRMetadata(const VPIRMetadata &Other) : Metadata(Other.Metadata) {}
+ VPIRMetadata(const VPIRMetadata &Other) = default;
- VPIRMetadata &operator=(const VPIRMetadata &Other) {
- Metadata = Other.Metadata;
- return *this;
- }
+ VPIRMetadata &operator=(const VPIRMetadata &Other) = default;
/// Add all metadata to \p I.
void applyMetadata(Instruction &I) const;
@@ -1113,9 +1110,8 @@ public:
VP_CLASSOF_IMPL(VPDef::VPInstructionSC)
VPInstruction *clone() override {
- SmallVector<VPValue *, 2> Operands(operands());
- auto *New =
- new VPInstruction(Opcode, Operands, *this, *this, getDebugLoc(), Name);
+ auto *New = new VPInstruction(Opcode, operands(), *this, *this,
+ getDebugLoc(), Name);
if (getUnderlyingValue())
New->setUnderlyingValue(getUnderlyingInstr());
return New;
@@ -1229,10 +1225,9 @@ public:
}
VPInstruction *clone() override {
- SmallVector<VPValue *, 2> Operands(operands());
auto *New =
- new VPInstructionWithType(getOpcode(), Operands, getResultType(), *this,
- getDebugLoc(), getName());
+ new VPInstructionWithType(getOpcode(), operands(), getResultType(),
+ *this, getDebugLoc(), getName());
New->setUnderlyingValue(getUnderlyingValue());
return New;
}
@@ -3214,6 +3209,9 @@ protected:
: VPRecipeBase(SC, Operands, DL), VPIRMetadata(Metadata), Ingredient(I),
Alignment(Alignment), Consecutive(Consecutive), Reverse(Reverse) {
assert((Consecutive || !Reverse) && "Reverse implies consecutive");
+ assert(isa<VPVectorEndPointerRecipe>(getAddr()) ||
+ !Reverse &&
+ "Reversed acccess without VPVectorEndPointerRecipe address?");
}
public:
@@ -3985,7 +3983,7 @@ class VPIRBasicBlock : public VPBasicBlock {
IRBB(IRBB) {}
public:
- ~VPIRBasicBlock() override {}
+ ~VPIRBasicBlock() override = default;
static inline bool classof(const VPBlockBase *V) {
return V->getVPBlockID() == VPBlockBase::VPIRBasicBlockSC;
@@ -4037,7 +4035,7 @@ class LLVM_ABI_FOR_TEST VPRegionBlock : public VPBlockBase {
IsReplicator(IsReplicator) {}
public:
- ~VPRegionBlock() override {}
+ ~VPRegionBlock() override = default;
/// Method to support type inquiry through isa, cast, and dyn_cast.
static inline bool classof(const VPBlockBase *V) {
diff --git a/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h b/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
index b5b98c6..b57c448 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
+++ b/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
@@ -313,7 +313,8 @@ private:
// Check for recipes that do not have opcodes.
if constexpr (std::is_same_v<RecipeTy, VPScalarIVStepsRecipe> ||
std::is_same_v<RecipeTy, VPCanonicalIVPHIRecipe> ||
- std::is_same_v<RecipeTy, VPDerivedIVRecipe>)
+ std::is_same_v<RecipeTy, VPDerivedIVRecipe> ||
+ std::is_same_v<RecipeTy, VPVectorEndPointerRecipe>)
return DefR;
else
return DefR && DefR->getOpcode() == Opcode;
@@ -686,6 +687,64 @@ m_DerivedIV(const Op0_t &Op0, const Op1_t &Op1, const Op2_t &Op2) {
return VPDerivedIV_match<Op0_t, Op1_t, Op2_t>({Op0, Op1, Op2});
}
+template <typename Addr_t, typename Mask_t> struct Load_match {
+ Addr_t Addr;
+ Mask_t Mask;
+
+ Load_match(Addr_t Addr, Mask_t Mask) : Addr(Addr), Mask(Mask) {}
+
+ template <typename OpTy> bool match(const OpTy *V) const {
+ auto *Load = dyn_cast<VPWidenLoadRecipe>(V);
+ if (!Load || !Addr.match(Load->getAddr()) || !Load->isMasked() ||
+ !Mask.match(Load->getMask()))
+ return false;
+ return true;
+ }
+};
+
+/// Match a (possibly reversed) masked load.
+template <typename Addr_t, typename Mask_t>
+inline Load_match<Addr_t, Mask_t> m_MaskedLoad(const Addr_t &Addr,
+ const Mask_t &Mask) {
+ return Load_match<Addr_t, Mask_t>(Addr, Mask);
+}
+
+template <typename Addr_t, typename Val_t, typename Mask_t> struct Store_match {
+ Addr_t Addr;
+ Val_t Val;
+ Mask_t Mask;
+
+ Store_match(Addr_t Addr, Val_t Val, Mask_t Mask)
+ : Addr(Addr), Val(Val), Mask(Mask) {}
+
+ template <typename OpTy> bool match(const OpTy *V) const {
+ auto *Store = dyn_cast<VPWidenStoreRecipe>(V);
+ if (!Store || !Addr.match(Store->getAddr()) ||
+ !Val.match(Store->getStoredValue()) || !Store->isMasked() ||
+ !Mask.match(Store->getMask()))
+ return false;
+ return true;
+ }
+};
+
+/// Match a (possibly reversed) masked store.
+template <typename Addr_t, typename Val_t, typename Mask_t>
+inline Store_match<Addr_t, Val_t, Mask_t>
+m_MaskedStore(const Addr_t &Addr, const Val_t &Val, const Mask_t &Mask) {
+ return Store_match<Addr_t, Val_t, Mask_t>(Addr, Val, Mask);
+}
+
+template <typename Op0_t, typename Op1_t>
+using VectorEndPointerRecipe_match =
+ Recipe_match<std::tuple<Op0_t, Op1_t>, 0,
+ /*Commutative*/ false, VPVectorEndPointerRecipe>;
+
+template <typename Op0_t, typename Op1_t>
+VectorEndPointerRecipe_match<Op0_t, Op1_t> m_VecEndPtr(const Op0_t &Op0,
+ const Op1_t &Op1) {
+ return VectorEndPointerRecipe_match<Op0_t, Op1_t>(Op0, Op1);
+}
+
/// Match a call argument at a given argument index.
template <typename Opnd_t> struct Argument_match {
/// Call argument index to match.
diff --git a/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp b/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
index 1a02117..1ee405a 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
@@ -162,8 +162,12 @@ bool VPRecipeBase::mayHaveSideEffects() const {
case VPPredInstPHISC:
case VPVectorEndPointerSC:
return false;
- case VPInstructionSC:
- return mayWriteToMemory();
+ case VPInstructionSC: {
+ auto *VPI = cast<VPInstruction>(this);
+ return mayWriteToMemory() ||
+ VPI->getOpcode() == VPInstruction::BranchOnCount ||
+ VPI->getOpcode() == VPInstruction::BranchOnCond;
+ }
case VPWidenCallSC: {
Function *Fn = cast<VPWidenCallRecipe>(this)->getCalledScalarFunction();
return mayWriteToMemory() || !Fn->doesNotThrow() || !Fn->willReturn();
@@ -1241,6 +1245,8 @@ bool VPInstruction::opcodeMayReadOrWriteFromMemory() const {
case Instruction::Select:
case Instruction::PHI:
case VPInstruction::AnyOf:
+ case VPInstruction::BranchOnCond:
+ case VPInstruction::BranchOnCount:
case VPInstruction::Broadcast:
case VPInstruction::BuildStructVector:
case VPInstruction::BuildVector:
diff --git a/llvm/lib/Transforms/Vectorize/VPlanSLP.h b/llvm/lib/Transforms/Vectorize/VPlanSLP.h
index 77ff36c..44972c68 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanSLP.h
+++ b/llvm/lib/Transforms/Vectorize/VPlanSLP.h
@@ -89,8 +89,7 @@ class VPlanSlp {
/// Width of the widest combined bundle in bits.
unsigned WidestBundleBits = 0;
- using MultiNodeOpTy =
- typename std::pair<VPInstruction *, SmallVector<VPValue *, 4>>;
+ using MultiNodeOpTy = std::pair<VPInstruction *, SmallVector<VPValue *, 4>>;
// Input operand bundles for the current multi node. Each multi node operand
// bundle contains values not matching the multi node's opcode. They will
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index f50bf29..9d9bb14 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -151,7 +151,27 @@ static bool cannotHoistOrSinkRecipe(const VPRecipeBase &R) {
static bool sinkScalarOperands(VPlan &Plan) {
auto Iter = vp_depth_first_deep(Plan.getEntry());
+ bool ScalarVFOnly = Plan.hasScalarVFOnly();
bool Changed = false;
+
+ auto IsValidSinkCandidate = [ScalarVFOnly](VPBasicBlock *SinkTo,
+ VPSingleDefRecipe *Candidate) {
+ // We only know how to duplicate VPReplicateRecipes and
+ // VPScalarIVStepsRecipes for now.
+ if (!isa<VPReplicateRecipe, VPScalarIVStepsRecipe>(Candidate))
+ return false;
+
+ if (Candidate->getParent() == SinkTo || Candidate->mayHaveSideEffects() ||
+ Candidate->mayReadOrWriteMemory())
+ return false;
+
+ if (auto *RepR = dyn_cast<VPReplicateRecipe>(Candidate))
+ if (!ScalarVFOnly && RepR->isSingleScalar())
+ return false;
+
+ return true;
+ };
+
// First, collect the operands of all recipes in replicate blocks as seeds for
// sinking.
SetVector<std::pair<VPBasicBlock *, VPSingleDefRecipe *>> WorkList;
@@ -159,51 +179,37 @@ static bool sinkScalarOperands(VPlan &Plan) {
VPBasicBlock *EntryVPBB = VPR->getEntryBasicBlock();
if (!VPR->isReplicator() || EntryVPBB->getSuccessors().size() != 2)
continue;
- VPBasicBlock *VPBB = dyn_cast<VPBasicBlock>(EntryVPBB->getSuccessors()[0]);
- if (!VPBB || VPBB->getSingleSuccessor() != VPR->getExitingBasicBlock())
+ VPBasicBlock *VPBB = cast<VPBasicBlock>(EntryVPBB->getSuccessors().front());
+ if (VPBB->getSingleSuccessor() != VPR->getExitingBasicBlock())
continue;
for (auto &Recipe : *VPBB) {
- for (VPValue *Op : Recipe.operands())
+ for (VPValue *Op : Recipe.operands()) {
if (auto *Def =
dyn_cast_or_null<VPSingleDefRecipe>(Op->getDefiningRecipe()))
- WorkList.insert({VPBB, Def});
+ if (IsValidSinkCandidate(VPBB, Def))
+ WorkList.insert({VPBB, Def});
+ }
}
}
- bool ScalarVFOnly = Plan.hasScalarVFOnly();
// Try to sink each replicate or scalar IV steps recipe in the worklist.
for (unsigned I = 0; I != WorkList.size(); ++I) {
VPBasicBlock *SinkTo;
VPSingleDefRecipe *SinkCandidate;
std::tie(SinkTo, SinkCandidate) = WorkList[I];
- if (SinkCandidate->getParent() == SinkTo ||
- SinkCandidate->mayHaveSideEffects() ||
- SinkCandidate->mayReadOrWriteMemory())
- continue;
- if (auto *RepR = dyn_cast<VPReplicateRecipe>(SinkCandidate)) {
- if (!ScalarVFOnly && RepR->isSingleScalar())
- continue;
- } else if (!isa<VPScalarIVStepsRecipe>(SinkCandidate))
- continue;
- bool NeedsDuplicating = false;
// All recipe users of the sink candidate must be in the same block SinkTo
- // or all users outside of SinkTo must be uniform-after-vectorization (
- // i.e., only first lane is used) . In the latter case, we need to duplicate
- // SinkCandidate.
- auto CanSinkWithUser = [SinkTo, &NeedsDuplicating,
- SinkCandidate](VPUser *U) {
- auto *UI = cast<VPRecipeBase>(U);
- if (UI->getParent() == SinkTo)
- return true;
- NeedsDuplicating = UI->onlyFirstLaneUsed(SinkCandidate);
- // We only know how to duplicate VPReplicateRecipes and
- // VPScalarIVStepsRecipes for now.
- return NeedsDuplicating &&
- isa<VPReplicateRecipe, VPScalarIVStepsRecipe>(SinkCandidate);
- };
- if (!all_of(SinkCandidate->users(), CanSinkWithUser))
+ // or all users outside of SinkTo must have only their first lane used. In
+ // the latter case, we need to duplicate SinkCandidate.
+ auto UsersOutsideSinkTo =
+ make_filter_range(SinkCandidate->users(), [SinkTo](VPUser *U) {
+ return cast<VPRecipeBase>(U)->getParent() != SinkTo;
+ });
+ if (any_of(UsersOutsideSinkTo, [SinkCandidate](VPUser *U) {
+ return !U->onlyFirstLaneUsed(SinkCandidate);
+ }))
continue;
+ bool NeedsDuplicating = !UsersOutsideSinkTo.empty();
if (NeedsDuplicating) {
if (ScalarVFOnly)
@@ -230,7 +236,8 @@ static bool sinkScalarOperands(VPlan &Plan) {
for (VPValue *Op : SinkCandidate->operands())
if (auto *Def =
dyn_cast_or_null<VPSingleDefRecipe>(Op->getDefiningRecipe()))
- WorkList.insert({SinkTo, Def});
+ if (IsValidSinkCandidate(SinkTo, Def))
+ WorkList.insert({SinkTo, Def});
Changed = true;
}
return Changed;
@@ -1056,13 +1063,9 @@ static VPValue *tryToFoldLiveIns(VPSingleDefRecipe &R,
return nullptr;
}
-/// Try to simplify recipe \p R.
-static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
- VPlan *Plan = R.getParent()->getPlan();
-
- auto *Def = dyn_cast<VPSingleDefRecipe>(&R);
- if (!Def)
- return;
+/// Try to simplify VPSingleDefRecipe \p Def.
+static void simplifyRecipe(VPSingleDefRecipe *Def, VPTypeAnalysis &TypeInfo) {
+ VPlan *Plan = Def->getParent()->getPlan();
// Simplification of live-in IR values for SingleDef recipes using
// InstSimplifyFolder.
@@ -1072,7 +1075,7 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
return Def->replaceAllUsesWith(V);
// Fold PredPHI LiveIn -> LiveIn.
- if (auto *PredPHI = dyn_cast<VPPredInstPHIRecipe>(&R)) {
+ if (auto *PredPHI = dyn_cast<VPPredInstPHIRecipe>(Def)) {
VPValue *Op = PredPHI->getOperand(0);
if (Op->isLiveIn())
PredPHI->replaceAllUsesWith(Op);
@@ -1091,12 +1094,12 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
return;
if (ATy->getScalarSizeInBits() < TruncTy->getScalarSizeInBits()) {
- unsigned ExtOpcode = match(R.getOperand(0), m_SExt(m_VPValue()))
+ unsigned ExtOpcode = match(Def->getOperand(0), m_SExt(m_VPValue()))
? Instruction::SExt
: Instruction::ZExt;
auto *Ext = Builder.createWidenCast(Instruction::CastOps(ExtOpcode), A,
TruncTy);
- if (auto *UnderlyingExt = R.getOperand(0)->getUnderlyingValue()) {
+ if (auto *UnderlyingExt = Def->getOperand(0)->getUnderlyingValue()) {
// UnderlyingExt has distinct return type, used to retain legacy cost.
Ext->setUnderlyingValue(UnderlyingExt);
}
@@ -1159,7 +1162,7 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
Builder.createLogicalAnd(X, Builder.createOr(Y, Z)));
// x && !x -> 0
- if (match(&R, m_LogicalAnd(m_VPValue(X), m_Not(m_Deferred(X)))))
+ if (match(Def, m_LogicalAnd(m_VPValue(X), m_Not(m_Deferred(X)))))
return Def->replaceAllUsesWith(Plan->getFalse());
if (match(Def, m_Select(m_VPValue(), m_VPValue(X), m_Deferred(X))))
@@ -1187,8 +1190,8 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
return Def->replaceAllUsesWith(A);
if (match(Def, m_c_Mul(m_VPValue(A), m_ZeroInt())))
- return Def->replaceAllUsesWith(R.getOperand(0) == A ? R.getOperand(1)
- : R.getOperand(0));
+ return Def->replaceAllUsesWith(
+ Def->getOperand(0) == A ? Def->getOperand(1) : Def->getOperand(0));
if (match(Def, m_Not(m_VPValue(A)))) {
if (match(A, m_Not(m_VPValue(A))))
@@ -1217,8 +1220,8 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
}
// If Cmp doesn't have a debug location, use the one from the negation,
// to preserve the location.
- if (!Cmp->getDebugLoc() && R.getDebugLoc())
- Cmp->setDebugLoc(R.getDebugLoc());
+ if (!Cmp->getDebugLoc() && Def->getDebugLoc())
+ Cmp->setDebugLoc(Def->getDebugLoc());
}
}
}
@@ -1244,7 +1247,7 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
if (match(Def, m_Intrinsic<Intrinsic::vp_merge>(m_True(), m_VPValue(A),
m_VPValue(X), m_VPValue())) &&
match(A, m_c_BinaryOr(m_Specific(X), m_VPValue(Y))) &&
- TypeInfo.inferScalarType(R.getVPSingleValue())->isIntegerTy(1)) {
+ TypeInfo.inferScalarType(Def)->isIntegerTy(1)) {
Def->setOperand(1, Def->getOperand(0));
Def->setOperand(0, Y);
return;
@@ -1252,36 +1255,36 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
if (auto *Phi = dyn_cast<VPFirstOrderRecurrencePHIRecipe>(Def)) {
if (Phi->getOperand(0) == Phi->getOperand(1))
- Def->replaceAllUsesWith(Phi->getOperand(0));
+ Phi->replaceAllUsesWith(Phi->getOperand(0));
return;
}
// Look through ExtractLastElement (BuildVector ....).
- if (match(&R, m_CombineOr(m_ExtractLastElement(m_BuildVector()),
- m_ExtractLastLanePerPart(m_BuildVector())))) {
- auto *BuildVector = cast<VPInstruction>(R.getOperand(0));
+ if (match(Def, m_CombineOr(m_ExtractLastElement(m_BuildVector()),
+ m_ExtractLastLanePerPart(m_BuildVector())))) {
+ auto *BuildVector = cast<VPInstruction>(Def->getOperand(0));
Def->replaceAllUsesWith(
BuildVector->getOperand(BuildVector->getNumOperands() - 1));
return;
}
// Look through ExtractPenultimateElement (BuildVector ....).
- if (match(&R, m_VPInstruction<VPInstruction::ExtractPenultimateElement>(
- m_BuildVector()))) {
- auto *BuildVector = cast<VPInstruction>(R.getOperand(0));
+ if (match(Def, m_VPInstruction<VPInstruction::ExtractPenultimateElement>(
+ m_BuildVector()))) {
+ auto *BuildVector = cast<VPInstruction>(Def->getOperand(0));
Def->replaceAllUsesWith(
BuildVector->getOperand(BuildVector->getNumOperands() - 2));
return;
}
uint64_t Idx;
- if (match(&R, m_ExtractElement(m_BuildVector(), m_ConstantInt(Idx)))) {
- auto *BuildVector = cast<VPInstruction>(R.getOperand(0));
+ if (match(Def, m_ExtractElement(m_BuildVector(), m_ConstantInt(Idx)))) {
+ auto *BuildVector = cast<VPInstruction>(Def->getOperand(0));
Def->replaceAllUsesWith(BuildVector->getOperand(Idx));
return;
}
- if (match(Def, m_BuildVector()) && all_equal(R.operands())) {
+ if (match(Def, m_BuildVector()) && all_equal(Def->operands())) {
Def->replaceAllUsesWith(
Builder.createNaryOp(VPInstruction::Broadcast, Def->getOperand(0)));
return;
@@ -1303,7 +1306,7 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
isa<VPPhi>(X)) {
auto *Phi = cast<VPPhi>(X);
if (Phi->getOperand(1) != Def && match(Phi->getOperand(0), m_ZeroInt()) &&
- Phi->getNumUsers() == 1 && (*Phi->user_begin() == &R)) {
+ Phi->getNumUsers() == 1 && (*Phi->user_begin() == Def)) {
Phi->setOperand(0, Y);
Def->replaceAllUsesWith(Phi);
return;
@@ -1311,7 +1314,7 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
}
// VPVectorPointer for part 0 can be replaced by their start pointer.
- if (auto *VecPtr = dyn_cast<VPVectorPointerRecipe>(&R)) {
+ if (auto *VecPtr = dyn_cast<VPVectorPointerRecipe>(Def)) {
if (VecPtr->isFirstPart()) {
VecPtr->replaceAllUsesWith(VecPtr->getOperand(0));
return;
@@ -1366,9 +1369,9 @@ void VPlanTransforms::simplifyRecipes(VPlan &Plan) {
Plan.getEntry());
VPTypeAnalysis TypeInfo(Plan);
for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(RPOT)) {
- for (VPRecipeBase &R : make_early_inc_range(*VPBB)) {
- simplifyRecipe(R, TypeInfo);
- }
+ for (VPRecipeBase &R : make_early_inc_range(*VPBB))
+ if (auto *Def = dyn_cast<VPSingleDefRecipe>(&R))
+ simplifyRecipe(Def, TypeInfo);
}
}
@@ -2521,90 +2524,102 @@ void VPlanTransforms::addActiveLaneMask(
HeaderMask->eraseFromParent();
}
+template <typename Op0_t, typename Op1_t> struct RemoveMask_match {
+ Op0_t In;
+ Op1_t &Out;
+
+ RemoveMask_match(const Op0_t &In, Op1_t &Out) : In(In), Out(Out) {}
+
+ template <typename OpTy> bool match(OpTy *V) const {
+ if (m_Specific(In).match(V)) {
+ Out = nullptr;
+ return true;
+ }
+ if (m_LogicalAnd(m_Specific(In), m_VPValue(Out)).match(V))
+ return true;
+ return false;
+ }
+};
+
+/// Match a specific mask \p In, or a combination of it (logical-and In, Out).
+/// Returns the remaining part \p Out if so, or nullptr otherwise.
+template <typename Op0_t, typename Op1_t>
+static inline RemoveMask_match<Op0_t, Op1_t> m_RemoveMask(const Op0_t &In,
+ Op1_t &Out) {
+ return RemoveMask_match<Op0_t, Op1_t>(In, Out);
+}
+
/// Try to optimize a \p CurRecipe masked by \p HeaderMask to a corresponding
/// EVL-based recipe without the header mask. Returns nullptr if no EVL-based
/// recipe could be created.
/// \p HeaderMask Header Mask.
/// \p CurRecipe Recipe to be transform.
/// \p TypeInfo VPlan-based type analysis.
-/// \p AllOneMask The vector mask parameter of vector-predication intrinsics.
/// \p EVL The explicit vector length parameter of vector-predication
/// intrinsics.
static VPRecipeBase *optimizeMaskToEVL(VPValue *HeaderMask,
VPRecipeBase &CurRecipe,
- VPTypeAnalysis &TypeInfo,
- VPValue &AllOneMask, VPValue &EVL) {
- // FIXME: Don't transform recipes to EVL recipes if they're not masked by the
- // header mask.
- auto GetNewMask = [&](VPValue *OrigMask) -> VPValue * {
- assert(OrigMask && "Unmasked recipe when folding tail");
- // HeaderMask will be handled using EVL.
- VPValue *Mask;
- if (match(OrigMask, m_LogicalAnd(m_Specific(HeaderMask), m_VPValue(Mask))))
- return Mask;
- return HeaderMask == OrigMask ? nullptr : OrigMask;
- };
+ VPTypeAnalysis &TypeInfo, VPValue &EVL) {
+ VPlan *Plan = CurRecipe.getParent()->getPlan();
+ VPValue *Addr, *Mask, *EndPtr;
/// Adjust any end pointers so that they point to the end of EVL lanes not VF.
- auto GetNewAddr = [&CurRecipe, &EVL](VPValue *Addr) -> VPValue * {
- auto *EndPtr = dyn_cast<VPVectorEndPointerRecipe>(Addr);
- if (!EndPtr)
- return Addr;
- assert(EndPtr->getOperand(1) == &EndPtr->getParent()->getPlan()->getVF() &&
- "VPVectorEndPointerRecipe with non-VF VF operand?");
- assert(
- all_of(EndPtr->users(),
- [](VPUser *U) {
- return cast<VPWidenMemoryRecipe>(U)->isReverse();
- }) &&
- "VPVectorEndPointRecipe not used by reversed widened memory recipe?");
- VPVectorEndPointerRecipe *EVLAddr = EndPtr->clone();
- EVLAddr->insertBefore(&CurRecipe);
- EVLAddr->setOperand(1, &EVL);
- return EVLAddr;
+ auto AdjustEndPtr = [&CurRecipe, &EVL](VPValue *EndPtr) {
+ auto *EVLEndPtr = cast<VPVectorEndPointerRecipe>(EndPtr)->clone();
+ EVLEndPtr->insertBefore(&CurRecipe);
+ EVLEndPtr->setOperand(1, &EVL);
+ return EVLEndPtr;
};
- return TypeSwitch<VPRecipeBase *, VPRecipeBase *>(&CurRecipe)
- .Case<VPWidenLoadRecipe>([&](VPWidenLoadRecipe *L) {
- VPValue *NewMask = GetNewMask(L->getMask());
- VPValue *NewAddr = GetNewAddr(L->getAddr());
- return new VPWidenLoadEVLRecipe(*L, NewAddr, EVL, NewMask);
- })
- .Case<VPWidenStoreRecipe>([&](VPWidenStoreRecipe *S) {
- VPValue *NewMask = GetNewMask(S->getMask());
- VPValue *NewAddr = GetNewAddr(S->getAddr());
- return new VPWidenStoreEVLRecipe(*S, NewAddr, EVL, NewMask);
- })
- .Case<VPInterleaveRecipe>([&](VPInterleaveRecipe *IR) {
- VPValue *NewMask = GetNewMask(IR->getMask());
- return new VPInterleaveEVLRecipe(*IR, EVL, NewMask);
- })
- .Case<VPReductionRecipe>([&](VPReductionRecipe *Red) {
- VPValue *NewMask = GetNewMask(Red->getCondOp());
- return new VPReductionEVLRecipe(*Red, EVL, NewMask);
- })
- .Case<VPInstruction>([&](VPInstruction *VPI) -> VPRecipeBase * {
- VPValue *LHS, *RHS;
- // Transform select with a header mask condition
- // select(header_mask, LHS, RHS)
- // into vector predication merge.
- // vp.merge(all-true, LHS, RHS, EVL)
- if (!match(VPI, m_Select(m_Specific(HeaderMask), m_VPValue(LHS),
- m_VPValue(RHS))))
- return nullptr;
- // Use all true as the condition because this transformation is
- // limited to selects whose condition is a header mask.
- return new VPWidenIntrinsicRecipe(
- Intrinsic::vp_merge, {&AllOneMask, LHS, RHS, &EVL},
- TypeInfo.inferScalarType(LHS), VPI->getDebugLoc());
- })
- .Default([&](VPRecipeBase *R) { return nullptr; });
+ if (match(&CurRecipe,
+ m_MaskedLoad(m_VPValue(Addr), m_RemoveMask(HeaderMask, Mask))) &&
+ !cast<VPWidenLoadRecipe>(CurRecipe).isReverse())
+ return new VPWidenLoadEVLRecipe(cast<VPWidenLoadRecipe>(CurRecipe), Addr,
+ EVL, Mask);
+
+ if (match(&CurRecipe,
+ m_MaskedLoad(m_VPValue(EndPtr), m_RemoveMask(HeaderMask, Mask))) &&
+ match(EndPtr, m_VecEndPtr(m_VPValue(Addr), m_Specific(&Plan->getVF()))) &&
+ cast<VPWidenLoadRecipe>(CurRecipe).isReverse())
+ return new VPWidenLoadEVLRecipe(cast<VPWidenLoadRecipe>(CurRecipe),
+ AdjustEndPtr(EndPtr), EVL, Mask);
+
+ if (match(&CurRecipe, m_MaskedStore(m_VPValue(Addr), m_VPValue(),
+ m_RemoveMask(HeaderMask, Mask))) &&
+ !cast<VPWidenStoreRecipe>(CurRecipe).isReverse())
+ return new VPWidenStoreEVLRecipe(cast<VPWidenStoreRecipe>(CurRecipe), Addr,
+ EVL, Mask);
+
+ if (match(&CurRecipe, m_MaskedStore(m_VPValue(EndPtr), m_VPValue(),
+ m_RemoveMask(HeaderMask, Mask))) &&
+ match(EndPtr, m_VecEndPtr(m_VPValue(Addr), m_Specific(&Plan->getVF()))) &&
+ cast<VPWidenStoreRecipe>(CurRecipe).isReverse())
+ return new VPWidenStoreEVLRecipe(cast<VPWidenStoreRecipe>(CurRecipe),
+ AdjustEndPtr(EndPtr), EVL, Mask);
+
+ if (auto *Rdx = dyn_cast<VPReductionRecipe>(&CurRecipe))
+ if (Rdx->isConditional() &&
+ match(Rdx->getCondOp(), m_RemoveMask(HeaderMask, Mask)))
+ return new VPReductionEVLRecipe(*Rdx, EVL, Mask);
+
+ if (auto *Interleave = dyn_cast<VPInterleaveRecipe>(&CurRecipe))
+ if (Interleave->getMask() &&
+ match(Interleave->getMask(), m_RemoveMask(HeaderMask, Mask)))
+ return new VPInterleaveEVLRecipe(*Interleave, EVL, Mask);
+
+ VPValue *LHS, *RHS;
+ if (match(&CurRecipe,
+ m_Select(m_Specific(HeaderMask), m_VPValue(LHS), m_VPValue(RHS))))
+ return new VPWidenIntrinsicRecipe(
+ Intrinsic::vp_merge, {Plan->getTrue(), LHS, RHS, &EVL},
+ TypeInfo.inferScalarType(LHS), CurRecipe.getDebugLoc());
+
+ return nullptr;
}
/// Replace recipes with their EVL variants.
static void transformRecipestoEVLRecipes(VPlan &Plan, VPValue &EVL) {
VPTypeAnalysis TypeInfo(Plan);
- VPValue *AllOneMask = Plan.getTrue();
VPRegionBlock *LoopRegion = Plan.getVectorLoopRegion();
VPBasicBlock *Header = LoopRegion->getEntryBasicBlock();
@@ -2664,7 +2679,7 @@ static void transformRecipestoEVLRecipes(VPlan &Plan, VPValue &EVL) {
ConstantInt::getSigned(Type::getInt32Ty(Plan.getContext()), -1));
VPWidenIntrinsicRecipe *VPSplice = new VPWidenIntrinsicRecipe(
Intrinsic::experimental_vp_splice,
- {V1, V2, Imm, AllOneMask, PrevEVL, &EVL},
+ {V1, V2, Imm, Plan.getTrue(), PrevEVL, &EVL},
TypeInfo.inferScalarType(R.getVPSingleValue()), R.getDebugLoc());
VPSplice->insertBefore(&R);
R.getVPSingleValue()->replaceAllUsesWith(VPSplice);
@@ -2698,7 +2713,7 @@ static void transformRecipestoEVLRecipes(VPlan &Plan, VPValue &EVL) {
for (VPUser *U : collectUsersRecursively(EVLMask)) {
auto *CurRecipe = cast<VPRecipeBase>(U);
VPRecipeBase *EVLRecipe =
- optimizeMaskToEVL(EVLMask, *CurRecipe, TypeInfo, *AllOneMask, EVL);
+ optimizeMaskToEVL(EVLMask, *CurRecipe, TypeInfo, EVL);
if (!EVLRecipe)
continue;
@@ -4174,7 +4189,7 @@ void VPlanTransforms::narrowInterleaveGroups(VPlan &Plan, ElementCount VF,
unsigned VFMinVal = VF.getKnownMinValue();
SmallVector<VPInterleaveRecipe *> StoreGroups;
for (auto &R : *VectorLoop->getEntryBasicBlock()) {
- if (isa<VPCanonicalIVPHIRecipe>(&R) || match(&R, m_BranchOnCount()))
+ if (isa<VPCanonicalIVPHIRecipe>(&R))
continue;
if (isa<VPDerivedIVRecipe, VPScalarIVStepsRecipe>(&R) &&
diff --git a/llvm/lib/Transforms/Vectorize/VPlanUtils.cpp b/llvm/lib/Transforms/Vectorize/VPlanUtils.cpp
index 8c23e78..c6380d3 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanUtils.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanUtils.cpp
@@ -32,22 +32,17 @@ bool vputils::onlyScalarValuesUsed(const VPValue *Def) {
}
VPValue *vputils::getOrCreateVPValueForSCEVExpr(VPlan &Plan, const SCEV *Expr) {
- VPValue *Expanded = nullptr;
if (auto *E = dyn_cast<SCEVConstant>(Expr))
- Expanded = Plan.getOrAddLiveIn(E->getValue());
- else {
- auto *U = dyn_cast<SCEVUnknown>(Expr);
- // Skip SCEV expansion if Expr is a SCEVUnknown wrapping a non-instruction
- // value. Otherwise the value may be defined in a loop and using it directly
- // will break LCSSA form. The SCEV expansion takes care of preserving LCSSA
- // form.
- if (U && !isa<Instruction>(U->getValue())) {
- Expanded = Plan.getOrAddLiveIn(U->getValue());
- } else {
- Expanded = new VPExpandSCEVRecipe(Expr);
- Plan.getEntry()->appendRecipe(Expanded->getDefiningRecipe());
- }
- }
+ return Plan.getOrAddLiveIn(E->getValue());
+ // Skip SCEV expansion if Expr is a SCEVUnknown wrapping a non-instruction
+ // value. Otherwise the value may be defined in a loop and using it directly
+ // will break LCSSA form. The SCEV expansion takes care of preserving LCSSA
+ // form.
+ auto *U = dyn_cast<SCEVUnknown>(Expr);
+ if (U && !isa<Instruction>(U->getValue()))
+ return Plan.getOrAddLiveIn(U->getValue());
+ auto *Expanded = new VPExpandSCEVRecipe(Expr);
+ Plan.getEntry()->appendRecipe(Expanded);
return Expanded;
}
diff --git a/llvm/test/Analysis/CostModel/AArch64/masked_ldst_vls.ll b/llvm/test/Analysis/CostModel/AArch64/masked_ldst_vls.ll
index fa53a18..1920fc9 100644
--- a/llvm/test/Analysis/CostModel/AArch64/masked_ldst_vls.ll
+++ b/llvm/test/Analysis/CostModel/AArch64/masked_ldst_vls.ll
@@ -1,17 +1,6 @@
; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=256 | FileCheck %s -D#VBITS=256
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=384 | FileCheck %s -D#VBITS=256
; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=512 | FileCheck %s -D#VBITS=512
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=640 | FileCheck %s -D#VBITS=512
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=768 | FileCheck %s -D#VBITS=512
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=896 | FileCheck %s -D#VBITS=512
; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1024 | FileCheck %s -D#VBITS=1024
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1152 | FileCheck %s -D#VBITS=1024
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1280 | FileCheck %s -D#VBITS=1024
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1408 | FileCheck %s -D#VBITS=1024
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1536 | FileCheck %s -D#VBITS=1024
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1664 | FileCheck %s -D#VBITS=1024
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1792 | FileCheck %s -D#VBITS=1024
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1920 | FileCheck %s -D#VBITS=1024
; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=2048 | FileCheck %s -D#VBITS=2048
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
diff --git a/llvm/test/Analysis/CostModel/AArch64/sve-fixed-length.ll b/llvm/test/Analysis/CostModel/AArch64/sve-fixed-length.ll
index df40a96..e128987 100644
--- a/llvm/test/Analysis/CostModel/AArch64/sve-fixed-length.ll
+++ b/llvm/test/Analysis/CostModel/AArch64/sve-fixed-length.ll
@@ -1,19 +1,8 @@
; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output | FileCheck %s -D#VBITS=128
; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=128 | FileCheck %s -D#VBITS=128
; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=256 | FileCheck %s -D#VBITS=256
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=384 | FileCheck %s -D#VBITS=256
; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=512 | FileCheck %s -D#VBITS=512
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=640 | FileCheck %s -D#VBITS=512
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=768 | FileCheck %s -D#VBITS=512
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=896 | FileCheck %s -D#VBITS=512
; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1024 | FileCheck %s -D#VBITS=1024
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1152 | FileCheck %s -D#VBITS=1024
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1280 | FileCheck %s -D#VBITS=1024
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1408 | FileCheck %s -D#VBITS=1024
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1536 | FileCheck %s -D#VBITS=1024
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1664 | FileCheck %s -D#VBITS=1024
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1792 | FileCheck %s -D#VBITS=1024
-; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1920 | FileCheck %s -D#VBITS=1024
; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=2048 | FileCheck %s -D#VBITS=2048
; VBITS represents the useful bit size of a vector register from the code
diff --git a/llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll b/llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll
index b54f262..4894932 100644
--- a/llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll
+++ b/llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll
@@ -755,199 +755,117 @@ define i64 @red_mla_dup_ext_u8_s8_s64(ptr noalias noundef readonly captures(none
; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1
; CHECK-SD-NEXT: cbz w2, .LBB6_3
; CHECK-SD-NEXT: // %bb.1: // %iter.check
-; CHECK-SD-NEXT: str x25, [sp, #-64]! // 8-byte Folded Spill
-; CHECK-SD-NEXT: stp x24, x23, [sp, #16] // 16-byte Folded Spill
-; CHECK-SD-NEXT: stp x22, x21, [sp, #32] // 16-byte Folded Spill
-; CHECK-SD-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill
-; CHECK-SD-NEXT: .cfi_def_cfa_offset 64
-; CHECK-SD-NEXT: .cfi_offset w19, -8
-; CHECK-SD-NEXT: .cfi_offset w20, -16
-; CHECK-SD-NEXT: .cfi_offset w21, -24
-; CHECK-SD-NEXT: .cfi_offset w22, -32
-; CHECK-SD-NEXT: .cfi_offset w23, -40
-; CHECK-SD-NEXT: .cfi_offset w24, -48
-; CHECK-SD-NEXT: .cfi_offset w25, -64
-; CHECK-SD-NEXT: sxtb x9, w1
; CHECK-SD-NEXT: cmp w2, #3
-; CHECK-SD-NEXT: mov w10, w2
+; CHECK-SD-NEXT: mov w9, w2
; CHECK-SD-NEXT: b.hi .LBB6_4
; CHECK-SD-NEXT: // %bb.2:
-; CHECK-SD-NEXT: mov x11, xzr
+; CHECK-SD-NEXT: mov x10, xzr
; CHECK-SD-NEXT: mov x8, xzr
; CHECK-SD-NEXT: b .LBB6_13
; CHECK-SD-NEXT: .LBB6_3:
-; CHECK-SD-NEXT: mov x0, xzr
+; CHECK-SD-NEXT: mov x8, xzr
+; CHECK-SD-NEXT: mov x0, x8
; CHECK-SD-NEXT: ret
; CHECK-SD-NEXT: .LBB6_4: // %vector.main.loop.iter.check
-; CHECK-SD-NEXT: dup v0.2d, x9
; CHECK-SD-NEXT: cmp w2, #16
; CHECK-SD-NEXT: b.hs .LBB6_6
; CHECK-SD-NEXT: // %bb.5:
-; CHECK-SD-NEXT: mov x11, xzr
+; CHECK-SD-NEXT: mov x10, xzr
; CHECK-SD-NEXT: mov x8, xzr
; CHECK-SD-NEXT: b .LBB6_10
; CHECK-SD-NEXT: .LBB6_6: // %vector.ph
+; CHECK-SD-NEXT: mov w8, w1
+; CHECK-SD-NEXT: movi v0.2d, #0000000000000000
; CHECK-SD-NEXT: movi v1.2d, #0000000000000000
-; CHECK-SD-NEXT: mov x8, v0.d[1]
-; CHECK-SD-NEXT: and x12, x10, #0xc
+; CHECK-SD-NEXT: sxtb x8, w8
+; CHECK-SD-NEXT: movi v3.2d, #0000000000000000
; CHECK-SD-NEXT: movi v2.2d, #0000000000000000
+; CHECK-SD-NEXT: movi v6.2d, #0000000000000000
; CHECK-SD-NEXT: movi v4.2d, #0000000000000000
-; CHECK-SD-NEXT: and x11, x10, #0xfffffff0
-; CHECK-SD-NEXT: movi v3.2d, #0000000000000000
+; CHECK-SD-NEXT: and x11, x9, #0xc
; CHECK-SD-NEXT: movi v7.2d, #0000000000000000
-; CHECK-SD-NEXT: mov x15, x0
; CHECK-SD-NEXT: movi v5.2d, #0000000000000000
-; CHECK-SD-NEXT: movi v16.2d, #0000000000000000
-; CHECK-SD-NEXT: and x16, x10, #0xfffffff0
-; CHECK-SD-NEXT: movi v6.2d, #0000000000000000
-; CHECK-SD-NEXT: fmov x13, d0
-; CHECK-SD-NEXT: fmov x14, d0
+; CHECK-SD-NEXT: and x10, x9, #0xfffffff0
+; CHECK-SD-NEXT: dup v16.4s, w8
+; CHECK-SD-NEXT: mov x8, x0
+; CHECK-SD-NEXT: and x12, x9, #0xfffffff0
; CHECK-SD-NEXT: .LBB6_7: // %vector.body
; CHECK-SD-NEXT: // =>This Inner Loop Header: Depth=1
-; CHECK-SD-NEXT: ldr q17, [x15], #16
-; CHECK-SD-NEXT: subs x16, x16, #16
+; CHECK-SD-NEXT: ldr q17, [x8], #16
+; CHECK-SD-NEXT: subs x12, x12, #16
; CHECK-SD-NEXT: ushll v18.8h, v17.8b, #0
-; CHECK-SD-NEXT: ushll2 v19.8h, v17.16b, #0
-; CHECK-SD-NEXT: ushll v17.4s, v18.4h, #0
-; CHECK-SD-NEXT: ushll2 v20.4s, v19.8h, #0
-; CHECK-SD-NEXT: ushll2 v18.4s, v18.8h, #0
-; CHECK-SD-NEXT: ushll v19.4s, v19.4h, #0
-; CHECK-SD-NEXT: ushll v21.2d, v17.2s, #0
-; CHECK-SD-NEXT: ushll2 v22.2d, v20.4s, #0
-; CHECK-SD-NEXT: ushll2 v17.2d, v17.4s, #0
-; CHECK-SD-NEXT: ushll v23.2d, v18.2s, #0
-; CHECK-SD-NEXT: ushll v20.2d, v20.2s, #0
-; CHECK-SD-NEXT: ushll2 v18.2d, v18.4s, #0
-; CHECK-SD-NEXT: fmov x17, d21
-; CHECK-SD-NEXT: mov x2, v21.d[1]
-; CHECK-SD-NEXT: ushll v21.2d, v19.2s, #0
-; CHECK-SD-NEXT: ushll2 v19.2d, v19.4s, #0
-; CHECK-SD-NEXT: fmov x18, d22
-; CHECK-SD-NEXT: fmov x1, d17
-; CHECK-SD-NEXT: fmov x3, d23
-; CHECK-SD-NEXT: fmov x21, d20
-; CHECK-SD-NEXT: fmov x22, d18
-; CHECK-SD-NEXT: fmov x19, d21
-; CHECK-SD-NEXT: mul x17, x13, x17
-; CHECK-SD-NEXT: mov x4, v22.d[1]
-; CHECK-SD-NEXT: fmov x24, d19
-; CHECK-SD-NEXT: mov x5, v23.d[1]
-; CHECK-SD-NEXT: mov x6, v21.d[1]
-; CHECK-SD-NEXT: mov x7, v20.d[1]
-; CHECK-SD-NEXT: mov x20, v18.d[1]
-; CHECK-SD-NEXT: mov x23, v19.d[1]
-; CHECK-SD-NEXT: mov x25, v17.d[1]
-; CHECK-SD-NEXT: mul x18, x14, x18
-; CHECK-SD-NEXT: mul x1, x13, x1
-; CHECK-SD-NEXT: fmov d17, x17
-; CHECK-SD-NEXT: mul x3, x13, x3
-; CHECK-SD-NEXT: fmov d18, x18
-; CHECK-SD-NEXT: mul x19, x13, x19
-; CHECK-SD-NEXT: fmov d19, x1
-; CHECK-SD-NEXT: mul x21, x13, x21
-; CHECK-SD-NEXT: fmov d20, x3
-; CHECK-SD-NEXT: mul x22, x13, x22
-; CHECK-SD-NEXT: fmov d21, x19
-; CHECK-SD-NEXT: mul x24, x13, x24
-; CHECK-SD-NEXT: fmov d24, x21
-; CHECK-SD-NEXT: mul x2, x8, x2
-; CHECK-SD-NEXT: fmov d22, x22
-; CHECK-SD-NEXT: mul x4, x8, x4
-; CHECK-SD-NEXT: fmov d23, x24
-; CHECK-SD-NEXT: mul x5, x8, x5
-; CHECK-SD-NEXT: mov v17.d[1], x2
-; CHECK-SD-NEXT: mul x6, x8, x6
-; CHECK-SD-NEXT: mov v18.d[1], x4
-; CHECK-SD-NEXT: mul x7, x8, x7
-; CHECK-SD-NEXT: mov v20.d[1], x5
-; CHECK-SD-NEXT: add v1.2d, v17.2d, v1.2d
-; CHECK-SD-NEXT: mul x20, x8, x20
-; CHECK-SD-NEXT: mov v21.d[1], x6
-; CHECK-SD-NEXT: add v6.2d, v18.2d, v6.2d
-; CHECK-SD-NEXT: mul x23, x8, x23
-; CHECK-SD-NEXT: mov v24.d[1], x7
-; CHECK-SD-NEXT: add v4.2d, v20.2d, v4.2d
-; CHECK-SD-NEXT: mul x17, x8, x25
-; CHECK-SD-NEXT: mov v22.d[1], x20
-; CHECK-SD-NEXT: add v7.2d, v21.2d, v7.2d
-; CHECK-SD-NEXT: mov v23.d[1], x23
-; CHECK-SD-NEXT: add v16.2d, v24.2d, v16.2d
-; CHECK-SD-NEXT: mov v19.d[1], x17
-; CHECK-SD-NEXT: add v3.2d, v22.2d, v3.2d
-; CHECK-SD-NEXT: add v5.2d, v23.2d, v5.2d
-; CHECK-SD-NEXT: add v2.2d, v19.2d, v2.2d
+; CHECK-SD-NEXT: ushll2 v17.8h, v17.16b, #0
+; CHECK-SD-NEXT: ushll2 v19.4s, v18.8h, #0
+; CHECK-SD-NEXT: ushll v20.4s, v17.4h, #0
+; CHECK-SD-NEXT: ushll v18.4s, v18.4h, #0
+; CHECK-SD-NEXT: ushll2 v17.4s, v17.8h, #0
+; CHECK-SD-NEXT: smlal2 v2.2d, v16.4s, v19.4s
+; CHECK-SD-NEXT: smlal2 v4.2d, v16.4s, v20.4s
+; CHECK-SD-NEXT: smlal v6.2d, v16.2s, v20.2s
+; CHECK-SD-NEXT: smlal v3.2d, v16.2s, v19.2s
+; CHECK-SD-NEXT: smlal2 v1.2d, v16.4s, v18.4s
+; CHECK-SD-NEXT: smlal v7.2d, v16.2s, v17.2s
+; CHECK-SD-NEXT: smlal v0.2d, v16.2s, v18.2s
+; CHECK-SD-NEXT: smlal2 v5.2d, v16.4s, v17.4s
; CHECK-SD-NEXT: b.ne .LBB6_7
; CHECK-SD-NEXT: // %bb.8: // %middle.block
-; CHECK-SD-NEXT: add v1.2d, v1.2d, v7.2d
-; CHECK-SD-NEXT: add v4.2d, v4.2d, v16.2d
-; CHECK-SD-NEXT: cmp x11, x10
-; CHECK-SD-NEXT: add v2.2d, v2.2d, v5.2d
-; CHECK-SD-NEXT: add v3.2d, v3.2d, v6.2d
+; CHECK-SD-NEXT: add v0.2d, v0.2d, v6.2d
+; CHECK-SD-NEXT: add v3.2d, v3.2d, v7.2d
+; CHECK-SD-NEXT: cmp x10, x9
; CHECK-SD-NEXT: add v1.2d, v1.2d, v4.2d
-; CHECK-SD-NEXT: add v2.2d, v2.2d, v3.2d
+; CHECK-SD-NEXT: add v2.2d, v2.2d, v5.2d
+; CHECK-SD-NEXT: add v0.2d, v0.2d, v3.2d
; CHECK-SD-NEXT: add v1.2d, v1.2d, v2.2d
-; CHECK-SD-NEXT: addp d1, v1.2d
-; CHECK-SD-NEXT: fmov x8, d1
+; CHECK-SD-NEXT: add v0.2d, v0.2d, v1.2d
+; CHECK-SD-NEXT: addp d0, v0.2d
+; CHECK-SD-NEXT: fmov x8, d0
; CHECK-SD-NEXT: b.eq .LBB6_15
; CHECK-SD-NEXT: // %bb.9: // %vec.epilog.iter.check
-; CHECK-SD-NEXT: cbz x12, .LBB6_13
+; CHECK-SD-NEXT: cbz x11, .LBB6_13
; CHECK-SD-NEXT: .LBB6_10: // %vec.epilog.ph
+; CHECK-SD-NEXT: movi v0.2d, #0000000000000000
+; CHECK-SD-NEXT: mov w11, w1
; CHECK-SD-NEXT: movi v1.2d, #0000000000000000
-; CHECK-SD-NEXT: movi v2.2d, #0000000000000000
-; CHECK-SD-NEXT: mov x13, x11
+; CHECK-SD-NEXT: sxtb x11, w11
; CHECK-SD-NEXT: movi v3.2d, #0x000000000000ff
-; CHECK-SD-NEXT: fmov x14, d0
-; CHECK-SD-NEXT: and x11, x10, #0xfffffffc
-; CHECK-SD-NEXT: fmov x15, d0
-; CHECK-SD-NEXT: sub x12, x13, x11
-; CHECK-SD-NEXT: add x13, x0, x13
-; CHECK-SD-NEXT: mov v1.d[0], x8
-; CHECK-SD-NEXT: mov x8, v0.d[1]
+; CHECK-SD-NEXT: dup v2.2s, w11
+; CHECK-SD-NEXT: mov x11, x10
+; CHECK-SD-NEXT: and x10, x9, #0xfffffffc
+; CHECK-SD-NEXT: mov v0.d[0], x8
+; CHECK-SD-NEXT: sub x8, x11, x10
+; CHECK-SD-NEXT: add x11, x0, x11
; CHECK-SD-NEXT: .LBB6_11: // %vec.epilog.vector.body
; CHECK-SD-NEXT: // =>This Inner Loop Header: Depth=1
-; CHECK-SD-NEXT: ldr s0, [x13], #4
-; CHECK-SD-NEXT: adds x12, x12, #4
-; CHECK-SD-NEXT: ushll v0.8h, v0.8b, #0
-; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #0
-; CHECK-SD-NEXT: ushll v4.2d, v0.2s, #0
-; CHECK-SD-NEXT: ushll2 v0.2d, v0.4s, #0
+; CHECK-SD-NEXT: ldr s4, [x11], #4
+; CHECK-SD-NEXT: adds x8, x8, #4
+; CHECK-SD-NEXT: ushll v4.8h, v4.8b, #0
+; CHECK-SD-NEXT: ushll v4.4s, v4.4h, #0
+; CHECK-SD-NEXT: ushll v5.2d, v4.2s, #0
+; CHECK-SD-NEXT: ushll2 v4.2d, v4.4s, #0
+; CHECK-SD-NEXT: and v5.16b, v5.16b, v3.16b
; CHECK-SD-NEXT: and v4.16b, v4.16b, v3.16b
-; CHECK-SD-NEXT: and v0.16b, v0.16b, v3.16b
-; CHECK-SD-NEXT: fmov x16, d4
-; CHECK-SD-NEXT: fmov x18, d0
-; CHECK-SD-NEXT: mov x17, v4.d[1]
-; CHECK-SD-NEXT: mov x1, v0.d[1]
-; CHECK-SD-NEXT: mul x16, x14, x16
-; CHECK-SD-NEXT: mul x18, x15, x18
-; CHECK-SD-NEXT: mul x17, x8, x17
-; CHECK-SD-NEXT: fmov d0, x16
-; CHECK-SD-NEXT: mul x1, x8, x1
-; CHECK-SD-NEXT: fmov d4, x18
-; CHECK-SD-NEXT: mov v0.d[1], x17
-; CHECK-SD-NEXT: mov v4.d[1], x1
-; CHECK-SD-NEXT: add v1.2d, v0.2d, v1.2d
-; CHECK-SD-NEXT: add v2.2d, v4.2d, v2.2d
+; CHECK-SD-NEXT: xtn v5.2s, v5.2d
+; CHECK-SD-NEXT: xtn v4.2s, v4.2d
+; CHECK-SD-NEXT: smlal v1.2d, v2.2s, v4.2s
+; CHECK-SD-NEXT: smlal v0.2d, v2.2s, v5.2s
; CHECK-SD-NEXT: b.ne .LBB6_11
; CHECK-SD-NEXT: // %bb.12: // %vec.epilog.middle.block
-; CHECK-SD-NEXT: add v0.2d, v1.2d, v2.2d
-; CHECK-SD-NEXT: cmp x11, x10
+; CHECK-SD-NEXT: add v0.2d, v0.2d, v1.2d
+; CHECK-SD-NEXT: cmp x10, x9
; CHECK-SD-NEXT: addp d0, v0.2d
; CHECK-SD-NEXT: fmov x8, d0
; CHECK-SD-NEXT: b.eq .LBB6_15
; CHECK-SD-NEXT: .LBB6_13: // %for.body.preheader
-; CHECK-SD-NEXT: sub x10, x10, x11
-; CHECK-SD-NEXT: add x11, x0, x11
+; CHECK-SD-NEXT: sxtb x11, w1
+; CHECK-SD-NEXT: sub x9, x9, x10
+; CHECK-SD-NEXT: add x10, x0, x10
; CHECK-SD-NEXT: .LBB6_14: // %for.body
; CHECK-SD-NEXT: // =>This Inner Loop Header: Depth=1
-; CHECK-SD-NEXT: ldrb w12, [x11], #1
-; CHECK-SD-NEXT: subs x10, x10, #1
-; CHECK-SD-NEXT: smaddl x8, w12, w9, x8
+; CHECK-SD-NEXT: ldrb w12, [x10], #1
+; CHECK-SD-NEXT: subs x9, x9, #1
+; CHECK-SD-NEXT: smaddl x8, w12, w11, x8
; CHECK-SD-NEXT: b.ne .LBB6_14
-; CHECK-SD-NEXT: .LBB6_15:
-; CHECK-SD-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload
-; CHECK-SD-NEXT: ldp x22, x21, [sp, #32] // 16-byte Folded Reload
-; CHECK-SD-NEXT: ldp x24, x23, [sp, #16] // 16-byte Folded Reload
-; CHECK-SD-NEXT: ldr x25, [sp], #64 // 8-byte Folded Reload
+; CHECK-SD-NEXT: .LBB6_15: // %for.cond.cleanup
; CHECK-SD-NEXT: mov x0, x8
; CHECK-SD-NEXT: ret
;
@@ -957,63 +875,64 @@ define i64 @red_mla_dup_ext_u8_s8_s64(ptr noalias noundef readonly captures(none
; CHECK-GI-NEXT: cbz w2, .LBB6_7
; CHECK-GI-NEXT: // %bb.1: // %iter.check
; CHECK-GI-NEXT: movi d0, #0000000000000000
-; CHECK-GI-NEXT: sxtb x9, w1
-; CHECK-GI-NEXT: mov x11, xzr
+; CHECK-GI-NEXT: mov x10, xzr
; CHECK-GI-NEXT: cmp w2, #4
-; CHECK-GI-NEXT: mov w10, w2
+; CHECK-GI-NEXT: mov w9, w2
; CHECK-GI-NEXT: b.lo .LBB6_12
; CHECK-GI-NEXT: // %bb.2: // %vector.main.loop.iter.check
; CHECK-GI-NEXT: movi d0, #0000000000000000
-; CHECK-GI-NEXT: dup v1.2d, x9
-; CHECK-GI-NEXT: mov x11, xzr
+; CHECK-GI-NEXT: mov x10, xzr
; CHECK-GI-NEXT: cmp w2, #16
; CHECK-GI-NEXT: b.lo .LBB6_9
; CHECK-GI-NEXT: // %bb.3: // %vector.ph
+; CHECK-GI-NEXT: mov w8, w1
; CHECK-GI-NEXT: movi v0.2d, #0000000000000000
-; CHECK-GI-NEXT: xtn v2.2s, v1.2d
-; CHECK-GI-NEXT: and x8, x10, #0xc
+; CHECK-GI-NEXT: movi v1.2d, #0000000000000000
+; CHECK-GI-NEXT: sxtb x8, w8
+; CHECK-GI-NEXT: movi v2.2d, #0000000000000000
; CHECK-GI-NEXT: movi v3.2d, #0000000000000000
; CHECK-GI-NEXT: movi v4.2d, #0000000000000000
-; CHECK-GI-NEXT: and x11, x10, #0xfffffff0
-; CHECK-GI-NEXT: movi v5.2d, #0000000000000000
; CHECK-GI-NEXT: movi v6.2d, #0000000000000000
-; CHECK-GI-NEXT: mov x12, x0
+; CHECK-GI-NEXT: and x10, x9, #0xfffffff0
+; CHECK-GI-NEXT: dup v5.2d, x8
; CHECK-GI-NEXT: movi v7.2d, #0000000000000000
-; CHECK-GI-NEXT: movi v16.2d, #0000000000000000
-; CHECK-GI-NEXT: and x13, x10, #0xfffffff0
-; CHECK-GI-NEXT: movi v17.2d, #0000000000000000
+; CHECK-GI-NEXT: and x8, x9, #0xc
+; CHECK-GI-NEXT: mov x11, x0
+; CHECK-GI-NEXT: and x12, x9, #0xfffffff0
+; CHECK-GI-NEXT: xtn v16.2s, v5.2d
+; CHECK-GI-NEXT: movi v5.2d, #0000000000000000
; CHECK-GI-NEXT: .LBB6_4: // %vector.body
; CHECK-GI-NEXT: // =>This Inner Loop Header: Depth=1
-; CHECK-GI-NEXT: ldr q18, [x12], #16
-; CHECK-GI-NEXT: subs x13, x13, #16
-; CHECK-GI-NEXT: ushll v19.8h, v18.8b, #0
-; CHECK-GI-NEXT: ushll2 v18.8h, v18.16b, #0
-; CHECK-GI-NEXT: ushll v20.4s, v19.4h, #0
-; CHECK-GI-NEXT: ushll2 v19.4s, v19.8h, #0
-; CHECK-GI-NEXT: ushll v21.4s, v18.4h, #0
+; CHECK-GI-NEXT: ldr q17, [x11], #16
+; CHECK-GI-NEXT: subs x12, x12, #16
+; CHECK-GI-NEXT: ushll v18.8h, v17.8b, #0
+; CHECK-GI-NEXT: ushll2 v17.8h, v17.16b, #0
+; CHECK-GI-NEXT: ushll v19.4s, v18.4h, #0
; CHECK-GI-NEXT: ushll2 v18.4s, v18.8h, #0
-; CHECK-GI-NEXT: mov d22, v20.d[1]
-; CHECK-GI-NEXT: mov d23, v19.d[1]
-; CHECK-GI-NEXT: mov d24, v21.d[1]
-; CHECK-GI-NEXT: mov d25, v18.d[1]
-; CHECK-GI-NEXT: smlal v0.2d, v2.2s, v20.2s
-; CHECK-GI-NEXT: smlal v4.2d, v2.2s, v19.2s
-; CHECK-GI-NEXT: smlal v6.2d, v2.2s, v21.2s
-; CHECK-GI-NEXT: smlal v16.2d, v2.2s, v18.2s
-; CHECK-GI-NEXT: smlal v3.2d, v2.2s, v22.2s
-; CHECK-GI-NEXT: smlal v5.2d, v2.2s, v23.2s
-; CHECK-GI-NEXT: smlal v7.2d, v2.2s, v24.2s
-; CHECK-GI-NEXT: smlal v17.2d, v2.2s, v25.2s
+; CHECK-GI-NEXT: ushll v20.4s, v17.4h, #0
+; CHECK-GI-NEXT: ushll2 v17.4s, v17.8h, #0
+; CHECK-GI-NEXT: mov d21, v19.d[1]
+; CHECK-GI-NEXT: mov d22, v18.d[1]
+; CHECK-GI-NEXT: mov d23, v20.d[1]
+; CHECK-GI-NEXT: mov d24, v17.d[1]
+; CHECK-GI-NEXT: smlal v0.2d, v16.2s, v19.2s
+; CHECK-GI-NEXT: smlal v2.2d, v16.2s, v18.2s
+; CHECK-GI-NEXT: smlal v4.2d, v16.2s, v20.2s
+; CHECK-GI-NEXT: smlal v6.2d, v16.2s, v17.2s
+; CHECK-GI-NEXT: smlal v1.2d, v16.2s, v21.2s
+; CHECK-GI-NEXT: smlal v3.2d, v16.2s, v22.2s
+; CHECK-GI-NEXT: smlal v5.2d, v16.2s, v23.2s
+; CHECK-GI-NEXT: smlal v7.2d, v16.2s, v24.2s
; CHECK-GI-NEXT: b.ne .LBB6_4
; CHECK-GI-NEXT: // %bb.5: // %middle.block
-; CHECK-GI-NEXT: add v0.2d, v0.2d, v3.2d
+; CHECK-GI-NEXT: add v0.2d, v0.2d, v1.2d
+; CHECK-GI-NEXT: add v1.2d, v2.2d, v3.2d
+; CHECK-GI-NEXT: cmp x10, x9
; CHECK-GI-NEXT: add v2.2d, v4.2d, v5.2d
-; CHECK-GI-NEXT: cmp x11, x10
; CHECK-GI-NEXT: add v3.2d, v6.2d, v7.2d
-; CHECK-GI-NEXT: add v4.2d, v16.2d, v17.2d
-; CHECK-GI-NEXT: add v0.2d, v0.2d, v2.2d
-; CHECK-GI-NEXT: add v2.2d, v3.2d, v4.2d
-; CHECK-GI-NEXT: add v0.2d, v0.2d, v2.2d
+; CHECK-GI-NEXT: add v0.2d, v0.2d, v1.2d
+; CHECK-GI-NEXT: add v1.2d, v2.2d, v3.2d
+; CHECK-GI-NEXT: add v0.2d, v0.2d, v1.2d
; CHECK-GI-NEXT: addp d0, v0.2d
; CHECK-GI-NEXT: b.ne .LBB6_8
; CHECK-GI-NEXT: // %bb.6:
@@ -1027,50 +946,54 @@ define i64 @red_mla_dup_ext_u8_s8_s64(ptr noalias noundef readonly captures(none
; CHECK-GI-NEXT: .LBB6_8: // %vec.epilog.iter.check
; CHECK-GI-NEXT: cbz x8, .LBB6_12
; CHECK-GI-NEXT: .LBB6_9: // %vec.epilog.ph
+; CHECK-GI-NEXT: mov w8, w1
; CHECK-GI-NEXT: mov v0.d[1], xzr
-; CHECK-GI-NEXT: movi v2.2d, #0000000000000000
-; CHECK-GI-NEXT: mov x12, x11
-; CHECK-GI-NEXT: xtn v1.2s, v1.2d
-; CHECK-GI-NEXT: and x11, x10, #0xfffffffc
-; CHECK-GI-NEXT: sub x8, x12, x11
-; CHECK-GI-NEXT: add x12, x0, x12
+; CHECK-GI-NEXT: movi v1.2d, #0000000000000000
+; CHECK-GI-NEXT: sxtb x8, w8
+; CHECK-GI-NEXT: mov x11, x10
+; CHECK-GI-NEXT: and x10, x9, #0xfffffffc
+; CHECK-GI-NEXT: dup v2.2d, x8
+; CHECK-GI-NEXT: sub x8, x11, x10
+; CHECK-GI-NEXT: add x11, x0, x11
+; CHECK-GI-NEXT: xtn v2.2s, v2.2d
; CHECK-GI-NEXT: .LBB6_10: // %vec.epilog.vector.body
; CHECK-GI-NEXT: // =>This Inner Loop Header: Depth=1
-; CHECK-GI-NEXT: ldr w13, [x12], #4
+; CHECK-GI-NEXT: ldr w12, [x11], #4
; CHECK-GI-NEXT: adds x8, x8, #4
-; CHECK-GI-NEXT: fmov s3, w13
-; CHECK-GI-NEXT: uxtb w13, w13
+; CHECK-GI-NEXT: fmov s3, w12
+; CHECK-GI-NEXT: uxtb w12, w12
; CHECK-GI-NEXT: mov b4, v3.b[2]
; CHECK-GI-NEXT: mov b5, v3.b[1]
; CHECK-GI-NEXT: mov b6, v3.b[3]
-; CHECK-GI-NEXT: fmov s3, w13
-; CHECK-GI-NEXT: fmov w14, s4
-; CHECK-GI-NEXT: fmov w15, s5
-; CHECK-GI-NEXT: fmov w16, s6
+; CHECK-GI-NEXT: fmov s3, w12
+; CHECK-GI-NEXT: fmov w13, s4
+; CHECK-GI-NEXT: fmov w14, s5
+; CHECK-GI-NEXT: fmov w15, s6
+; CHECK-GI-NEXT: uxtb w13, w13
; CHECK-GI-NEXT: uxtb w14, w14
; CHECK-GI-NEXT: uxtb w15, w15
-; CHECK-GI-NEXT: uxtb w16, w16
-; CHECK-GI-NEXT: fmov s4, w14
-; CHECK-GI-NEXT: mov v3.s[1], w15
-; CHECK-GI-NEXT: mov v4.s[1], w16
-; CHECK-GI-NEXT: smlal v0.2d, v1.2s, v3.2s
-; CHECK-GI-NEXT: smlal v2.2d, v1.2s, v4.2s
+; CHECK-GI-NEXT: fmov s4, w13
+; CHECK-GI-NEXT: mov v3.s[1], w14
+; CHECK-GI-NEXT: mov v4.s[1], w15
+; CHECK-GI-NEXT: smlal v0.2d, v2.2s, v3.2s
+; CHECK-GI-NEXT: smlal v1.2d, v2.2s, v4.2s
; CHECK-GI-NEXT: b.ne .LBB6_10
; CHECK-GI-NEXT: // %bb.11: // %vec.epilog.middle.block
-; CHECK-GI-NEXT: add v0.2d, v0.2d, v2.2d
-; CHECK-GI-NEXT: cmp x11, x10
+; CHECK-GI-NEXT: add v0.2d, v0.2d, v1.2d
+; CHECK-GI-NEXT: cmp x10, x9
; CHECK-GI-NEXT: addp d0, v0.2d
; CHECK-GI-NEXT: fmov x8, d0
; CHECK-GI-NEXT: b.eq .LBB6_14
; CHECK-GI-NEXT: .LBB6_12: // %for.body.preheader
-; CHECK-GI-NEXT: sub x10, x10, x11
-; CHECK-GI-NEXT: add x11, x0, x11
+; CHECK-GI-NEXT: sxtb x11, w1
+; CHECK-GI-NEXT: sub x9, x9, x10
+; CHECK-GI-NEXT: add x10, x0, x10
; CHECK-GI-NEXT: .LBB6_13: // %for.body
; CHECK-GI-NEXT: // =>This Inner Loop Header: Depth=1
-; CHECK-GI-NEXT: ldrb w8, [x11], #1
+; CHECK-GI-NEXT: ldrb w8, [x10], #1
; CHECK-GI-NEXT: fmov x12, d0
-; CHECK-GI-NEXT: subs x10, x10, #1
-; CHECK-GI-NEXT: madd x8, x8, x9, x12
+; CHECK-GI-NEXT: subs x9, x9, #1
+; CHECK-GI-NEXT: madd x8, x8, x11, x12
; CHECK-GI-NEXT: fmov d0, x8
; CHECK-GI-NEXT: b.ne .LBB6_13
; CHECK-GI-NEXT: .LBB6_14: // %for.cond.cleanup
diff --git a/llvm/test/CodeGen/AArch64/framelayout-split-sve.mir b/llvm/test/CodeGen/AArch64/framelayout-split-sve.mir
index 35eafe8..f535e0f 100644
--- a/llvm/test/CodeGen/AArch64/framelayout-split-sve.mir
+++ b/llvm/test/CodeGen/AArch64/framelayout-split-sve.mir
@@ -68,13 +68,9 @@
# CHECK: early-clobber $sp = frame-setup STRXpre killed $fp, $sp, -16 :: (store (s64) into %stack.4)
# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
-# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 1024, 0
-# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 1040
-# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1, implicit $vg
-# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0x90, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22
-# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 1040, 0
-# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22
-# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -2, implicit $vg
+# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 2064, 0
+# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 2080
+# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3, implicit $vg
# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22
#
# CHECK-NEXT: $x8 = ADDXri $sp, 1040, 0
@@ -83,14 +79,10 @@
# CHECK-NEXT: $x8 = ADDXri $sp, 2064, 0
# CHECK-NEXT: STR_PXI $p0, killed $x8, 18 :: (store (<vscale x 1 x s16>) into %stack.1)
#
-# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 2, implicit $vg
-# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22
-# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1024, 0
-# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22
-# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 1, implicit $vg
-# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 1056
-# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1040, 0
-# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 16
+# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 2064, 0
+# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22
+# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3, implicit $vg
+# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16
# CHECK-NEXT: early-clobber $sp, $fp = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.4)
# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
@@ -100,38 +92,26 @@
# ASM: str x29, [sp, #-16]!
# ASM-NEXT: .cfi_def_cfa_offset 16
# ASM-NEXT: .cfi_offset w29, -16
-# ASM-NEXT: sub sp, sp, #1024
-# ASM-NEXT: .cfi_def_cfa_offset 1040
-# ASM-NEXT: addvl sp, sp, #-1
-# ASM-NEXT: .cfi_escape 0x0f, 0x09, 0x8f, 0x90, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 1040 + 8 * VG
-# ASM-NEXT: sub sp, sp, #1040
-# ASM-NEXT: .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 2080 + 8 * VG
-# ASM-NEXT: addvl sp, sp, #-2
+# ASM-NEXT: sub sp, sp, #2064
+# ASM-NEXT: .cfi_def_cfa_offset 2080
+# ASM-NEXT: addvl sp, sp, #-3
# ASM-NEXT: .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22 // sp + 2080 + 24 * VG
#
-# ASM: addvl sp, sp, #2
-# ASM-NEXT: .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 2080 + 8 * VG
-# ASM-NEXT: add sp, sp, #1024
-# ASM-NEXT: .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 1056 + 8 * VG
-# ASM-NEXT: addvl sp, sp, #1
-# ASM-NEXT: .cfi_def_cfa wsp, 1056
-# ASM-NEXT: add sp, sp, #1040
-# ASM-NEXT: .cfi_def_cfa_offset 16
+# ASM: add sp, sp, #2064
+# ASM-NEXT: .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22 // sp + 16 + 24 * VG
+# ASM-NEXT: addvl sp, sp, #3
+# ASM-NEXT: .cfi_def_cfa wsp, 16
# ASM-NEXT: ldr x29, [sp], #16
# ASM-NEXT: .cfi_def_cfa_offset 0
# ASM-NEXT: .cfi_restore w29
# UNWINDINFO: DW_CFA_def_cfa_offset: +16
# UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16
-# UNWINDINFO: DW_CFA_def_cfa_offset: +1040
-# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +1040, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus
-# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +2080, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus
+# UNWINDINFO: DW_CFA_def_cfa_offset: +2080
# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +2080, DW_OP_bregx 0x2e +0, DW_OP_lit24, DW_OP_mul, DW_OP_plus
#
-# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +2080, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus
-# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +1056, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus
-# UNWINDINFO: DW_CFA_def_cfa: reg31 +1056
-# UNWINDINFO: DW_CFA_def_cfa_offset: +16
+# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_lit24, DW_OP_mul, DW_OP_plus
+# UNWINDINFO: DW_CFA_def_cfa: reg31 +16
# UNWINDINFO: DW_CFA_def_cfa_offset: +0
# UNWINDINFO-NEXT: DW_CFA_restore: reg29
@@ -270,13 +250,9 @@ body: |
# CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $fp, $sp, -16 :: (store (s64) into %stack.5)
# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
-# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 1024, 0
-# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 1040
-# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1, implicit $vg
-# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0x90, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22
-# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 1040, 0
-# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22
-# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -2, implicit $vg
+# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 2064, 0
+# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 2080
+# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3, implicit $vg
# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22
#
# CHECK-NEXT: $[[TMP:x[0-9]+]] = ADDXri $sp, 1040, 0
@@ -286,14 +262,10 @@ body: |
# CHECK-NEXT: $[[TMP:x[0-9]+]] = ADDXri $sp, 2064, 0
# CHECK-NEXT: STR_PXI $p0, killed $[[TMP]], 23
#
-# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 2, implicit $vg
-# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22
-# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1024, 0
-# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22
-# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 1, implicit $vg
-# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 1056
-# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1040, 0
-# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 16
+# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 2064, 0
+# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22
+# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3, implicit $vg
+# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16
# CHECK-NEXT: early-clobber $sp, $fp = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.5)
# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
@@ -303,38 +275,27 @@ body: |
# ASM: str x29, [sp, #-16]!
# ASM-NEXT: .cfi_def_cfa_offset 16
# ASM-NEXT: .cfi_offset w29, -16
-# ASM-NEXT: sub sp, sp, #1024
-# ASM-NEXT: .cfi_def_cfa_offset 1040
-# ASM-NEXT: addvl sp, sp, #-1
-# ASM-NEXT: .cfi_escape 0x0f, 0x09, 0x8f, 0x90, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 1040 + 8 * VG
-# ASM-NEXT: sub sp, sp, #1040
-# ASM-NEXT: .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 2080 + 8 * VG
-# ASM-NEXT: addvl sp, sp, #-2
+# ASM-NEXT: sub sp, sp, #2064
+# ASM-NEXT: .cfi_def_cfa_offset 2080
+# ASM-NEXT: addvl sp, sp, #-3
# ASM-NEXT: .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22 // sp + 2080 + 24 * VG
#
-# ASM: addvl sp, sp, #2
-# ASM-NEXT: .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 2080 + 8 * VG
-# ASM-NEXT: add sp, sp, #1024
-# ASM-NEXT: .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 1056 + 8 * VG
-# ASM-NEXT: addvl sp, sp, #1
-# ASM-NEXT: .cfi_def_cfa wsp, 1056
-# ASM-NEXT: add sp, sp, #1040
-# ASM-NEXT: .cfi_def_cfa_offset 16
+# ASM: add sp, sp, #2064
+# ASM-NEXT: .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22 // sp + 16 + 24 * VG
+# ASM-NEXT: addvl sp, sp, #3
+# ASM-NEXT: .cfi_def_cfa wsp, 16
# ASM-NEXT: ldr x29, [sp], #16
# ASM-NEXT: .cfi_def_cfa_offset 0
# ASM-NEXT: .cfi_restore w29
+# ASM-NEXT: ret
# UNWINDINFO: DW_CFA_def_cfa_offset: +16
# UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16
-# UNWINDINFO: DW_CFA_def_cfa_offset: +1040
-# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +1040, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus
-# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +2080, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus
+# UNWINDINFO: DW_CFA_def_cfa_offset: +2080
# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +2080, DW_OP_bregx 0x2e +0, DW_OP_lit24, DW_OP_mul, DW_OP_plus
#
-# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +2080, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus
-# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +1056, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus
-# UNWINDINFO: DW_CFA_def_cfa: reg31 +1056
-# UNWINDINFO: DW_CFA_def_cfa_offset: +16
+# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_lit24, DW_OP_mul, DW_OP_plus
+# UNWINDINFO: DW_CFA_def_cfa: reg31 +16
# UNWINDINFO: DW_CFA_def_cfa_offset: +0
# UNWINDINFO-NEXT: DW_CFA_restore: reg29
@@ -385,10 +346,8 @@ body: |
# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa $w29, 16
# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w30, -8
# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
-# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 1024, 0
-# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1, implicit $vg
-# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 1040, 0
-# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -2, implicit $vg
+# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 2064, 0
+# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3, implicit $vg
#
# CHECK-NEXT: $[[TMP:x[0-9]+]] = SUBXri $fp, 1024, 0
# CHECK-NEXT: STR_ZXI $z0, killed $[[TMP]], -2
@@ -396,10 +355,8 @@ body: |
# CHECK-NEXT: STR_ZXI $z1, killed $[[TMP]], -3
# CHECK-NEXT: STR_PXI $p0, $fp, -1
#
-# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 2, implicit $vg
-# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1024, 0
-# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 1, implicit $vg
-# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1040, 0
+# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 2064, 0
+# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3, implicit $vg
# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16
# CHECK-NEXT: early-clobber $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2 :: (load (s64) from %stack.6), (load (s64) from %stack.5)
# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
@@ -414,15 +371,11 @@ body: |
# ASM-NEXT: .cfi_def_cfa w29, 16
# ASM-NEXT: .cfi_offset w30, -8
# ASM-NEXT: .cfi_offset w29, -16
-# ASM-NEXT: sub sp, sp, #1024
-# ASM-NEXT: addvl sp, sp, #-1
-# ASM-NEXT: sub sp, sp, #1040
-# ASM-NEXT: addvl sp, sp, #-2
+# ASM-NEXT: sub sp, sp, #2064
+# ASM-NEXT: addvl sp, sp, #-3
#
-# ASM: addvl sp, sp, #2
-# ASM-NEXT: add sp, sp, #1024
-# ASM-NEXT: addvl sp, sp, #1
-# ASM-NEXT: add sp, sp, #1040
+# ASM: add sp, sp, #2064
+# ASM-NEXT: addvl sp, sp, #3
# ASM-NEXT: .cfi_def_cfa wsp, 16
# ASM-NEXT: ldp x29, x30, [sp], #16
# ASM-NEXT: .cfi_def_cfa_offset 0
diff --git a/llvm/test/CodeGen/AArch64/split-sve-stack-frame-layout.ll b/llvm/test/CodeGen/AArch64/split-sve-stack-frame-layout.ll
index 690a39d..c13dd33 100644
--- a/llvm/test/CodeGen/AArch64/split-sve-stack-frame-layout.ll
+++ b/llvm/test/CodeGen/AArch64/split-sve-stack-frame-layout.ll
@@ -19,20 +19,16 @@ define void @zpr_and_ppr_local(<vscale x 16 x i1> %pred, <vscale x 16 x i8> %vec
; CHECK-LABEL: zpr_and_ppr_local:
; CHECK: // %bb.0:
; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-NEXT: sub sp, sp, #1024
-; CHECK-NEXT: addvl sp, sp, #-1
-; CHECK-NEXT: sub sp, sp, #1024
-; CHECK-NEXT: addvl sp, sp, #-1
+; CHECK-NEXT: sub sp, sp, #2048
+; CHECK-NEXT: addvl sp, sp, #-2
; CHECK-NEXT: .cfi_escape 0x0f, 0x09, 0x8f, 0x90, 0x10, 0x92, 0x2e, 0x00, 0x40, 0x1e, 0x22 // sp + 2064 + 16 * VG
; CHECK-NEXT: .cfi_offset w29, -16
; CHECK-NEXT: add x8, sp, #2048
; CHECK-NEXT: str p0, [x8, #15, mul vl]
; CHECK-NEXT: add x8, sp, #1024
; CHECK-NEXT: str z0, [x8]
-; CHECK-NEXT: addvl sp, sp, #1
-; CHECK-NEXT: add sp, sp, #1024
-; CHECK-NEXT: addvl sp, sp, #1
-; CHECK-NEXT: add sp, sp, #1024
+; CHECK-NEXT: add sp, sp, #2048
+; CHECK-NEXT: addvl sp, sp, #2
; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
; CHECK-NEXT: ret
%ppr_local = alloca <vscale x 16 x i1>
@@ -62,20 +58,16 @@ define void @zpr_and_ppr_local_fp(<vscale x 16 x i1> %pred, <vscale x 16 x i8> %
; CHECK: // %bb.0:
; CHECK-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
; CHECK-NEXT: mov x29, sp
-; CHECK-NEXT: sub sp, sp, #1024
-; CHECK-NEXT: addvl sp, sp, #-1
-; CHECK-NEXT: sub sp, sp, #1024
-; CHECK-NEXT: addvl sp, sp, #-1
+; CHECK-NEXT: sub sp, sp, #2048
+; CHECK-NEXT: addvl sp, sp, #-2
; CHECK-NEXT: .cfi_def_cfa w29, 16
; CHECK-NEXT: .cfi_offset w30, -8
; CHECK-NEXT: .cfi_offset w29, -16
; CHECK-NEXT: sub x8, x29, #1024
; CHECK-NEXT: str p0, [x29, #-1, mul vl]
; CHECK-NEXT: str z0, [x8, #-2, mul vl]
-; CHECK-NEXT: addvl sp, sp, #1
-; CHECK-NEXT: add sp, sp, #1024
-; CHECK-NEXT: addvl sp, sp, #1
-; CHECK-NEXT: add sp, sp, #1024
+; CHECK-NEXT: add sp, sp, #2048
+; CHECK-NEXT: addvl sp, sp, #2
; CHECK-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload
; CHECK-NEXT: ret
%ppr_local = alloca <vscale x 16 x i1>
@@ -103,17 +95,15 @@ define void @fpr_and_ppr_local(<vscale x 16 x i1> %pred, double %double) "aarch6
; CHECK-LABEL: fpr_and_ppr_local:
; CHECK: // %bb.0:
; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-NEXT: sub sp, sp, #1024
+; CHECK-NEXT: sub sp, sp, #2064
; CHECK-NEXT: addvl sp, sp, #-1
-; CHECK-NEXT: sub sp, sp, #1040
; CHECK-NEXT: .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 2080 + 8 * VG
; CHECK-NEXT: .cfi_offset w29, -16
; CHECK-NEXT: add x8, sp, #2064
; CHECK-NEXT: str p0, [x8, #7, mul vl]
; CHECK-NEXT: str d0, [sp, #1032]
-; CHECK-NEXT: add sp, sp, #1024
+; CHECK-NEXT: add sp, sp, #2064
; CHECK-NEXT: addvl sp, sp, #1
-; CHECK-NEXT: add sp, sp, #1040
; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
; CHECK-NEXT: ret
%ppr_local = alloca <vscale x 16 x i1>
@@ -144,17 +134,15 @@ define void @fpr_and_ppr_local_fp(<vscale x 16 x i1> %pred, double %double) "aar
; CHECK: // %bb.0:
; CHECK-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
; CHECK-NEXT: mov x29, sp
-; CHECK-NEXT: sub sp, sp, #1024
+; CHECK-NEXT: sub sp, sp, #2064
; CHECK-NEXT: addvl sp, sp, #-1
-; CHECK-NEXT: sub sp, sp, #1040
; CHECK-NEXT: .cfi_def_cfa w29, 16
; CHECK-NEXT: .cfi_offset w30, -8
; CHECK-NEXT: .cfi_offset w29, -16
; CHECK-NEXT: str p0, [x29, #-1, mul vl]
; CHECK-NEXT: str d0, [sp, #1032]
-; CHECK-NEXT: add sp, sp, #1024
+; CHECK-NEXT: add sp, sp, #2064
; CHECK-NEXT: addvl sp, sp, #1
-; CHECK-NEXT: add sp, sp, #1040
; CHECK-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload
; CHECK-NEXT: ret
%ppr_local = alloca <vscale x 16 x i1>
@@ -793,11 +781,8 @@ define void @zpr_and_ppr_local_stack_probing(<vscale x 16 x i1> %pred, <vscale x
; CHECK-LABEL: zpr_and_ppr_local_stack_probing:
; CHECK: // %bb.0:
; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
-; CHECK-NEXT: sub sp, sp, #1024
-; CHECK-NEXT: addvl sp, sp, #-1
-; CHECK-NEXT: str xzr, [sp]
-; CHECK-NEXT: sub sp, sp, #1824
-; CHECK-NEXT: addvl sp, sp, #-1
+; CHECK-NEXT: sub sp, sp, #2848
+; CHECK-NEXT: addvl sp, sp, #-2
; CHECK-NEXT: str xzr, [sp]
; CHECK-NEXT: .cfi_escape 0x0f, 0x09, 0x8f, 0xb0, 0x16, 0x92, 0x2e, 0x00, 0x40, 0x1e, 0x22 // sp + 2864 + 16 * VG
; CHECK-NEXT: .cfi_offset w29, -16
@@ -806,10 +791,8 @@ define void @zpr_and_ppr_local_stack_probing(<vscale x 16 x i1> %pred, <vscale x
; CHECK-NEXT: add x8, sp, #1824
; CHECK-NEXT: str z0, [x8]
; CHECK-NEXT: str x0, [sp]
-; CHECK-NEXT: addvl sp, sp, #1
-; CHECK-NEXT: add sp, sp, #1024
-; CHECK-NEXT: addvl sp, sp, #1
-; CHECK-NEXT: add sp, sp, #1824
+; CHECK-NEXT: add sp, sp, #2848
+; CHECK-NEXT: addvl sp, sp, #2
; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
; CHECK-NEXT: ret
"probe-stack"="inline-asm" "stack-probe-size"="4096" "frame-pointer"="none" "aarch64_pstate_sm_compatible"
diff --git a/llvm/test/CodeGen/AArch64/sve-fixed-length-loads-stores.ll b/llvm/test/CodeGen/AArch64/sve-fixed-length-loads-stores.ll
index becddae..b2ed8de 100644
--- a/llvm/test/CodeGen/AArch64/sve-fixed-length-loads-stores.ll
+++ b/llvm/test/CodeGen/AArch64/sve-fixed-length-loads-stores.ll
@@ -1,19 +1,8 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -aarch64-sve-vector-bits-min=128 < %s | not grep ptrue
; RUN: llc -aarch64-sve-vector-bits-min=256 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_256
-; RUN: llc -aarch64-sve-vector-bits-min=384 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_256
; RUN: llc -aarch64-sve-vector-bits-min=512 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_512
-; RUN: llc -aarch64-sve-vector-bits-min=640 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_512
-; RUN: llc -aarch64-sve-vector-bits-min=768 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_512
-; RUN: llc -aarch64-sve-vector-bits-min=896 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_512
; RUN: llc -aarch64-sve-vector-bits-min=1024 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024
-; RUN: llc -aarch64-sve-vector-bits-min=1152 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024
-; RUN: llc -aarch64-sve-vector-bits-min=1280 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024
-; RUN: llc -aarch64-sve-vector-bits-min=1408 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024
-; RUN: llc -aarch64-sve-vector-bits-min=1536 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024
-; RUN: llc -aarch64-sve-vector-bits-min=1664 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024
-; RUN: llc -aarch64-sve-vector-bits-min=1792 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024
-; RUN: llc -aarch64-sve-vector-bits-min=1920 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024
; RUN: llc -aarch64-sve-vector-bits-min=2048 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_2048
target triple = "aarch64-unknown-linux-gnu"
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/memory-legalizer-atomic-fence.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/memory-legalizer-atomic-fence.ll
index e86f747..37b5422 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/memory-legalizer-atomic-fence.ll
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/memory-legalizer-atomic-fence.ll
@@ -1,11 +1,11 @@
; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 4
-; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd- -mcpu=gfx600 < %s | FileCheck -check-prefix=GFX6 %s
-; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd- -mcpu=gfx803 < %s | FileCheck -check-prefix=GFX8 %s
-; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx803 < %s | FileCheck -check-prefix=GFX8 %s
-; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 < %s | FileCheck -check-prefix=GFX10WGP %s
-; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -mattr=+cumode < %s | FileCheck -check-prefix=GFX10CU %s
-; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 < %s | FileCheck -check-prefix=GFX11WGP %s
-; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+cumode < %s | FileCheck -check-prefix=GFX11CU %s
+; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd- -mcpu=gfx600 < %s | FileCheck -check-prefix=GFX6 %s
+; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd- -mcpu=gfx803 < %s | FileCheck -check-prefix=GFX8 %s
+; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx803 < %s | FileCheck -check-prefix=GFX8 %s
+; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 < %s | FileCheck -check-prefix=GFX10WGP %s
+; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -mattr=+cumode < %s | FileCheck -check-prefix=GFX10CU %s
+; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 < %s | FileCheck -check-prefix=GFX11WGP %s
+; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+cumode < %s | FileCheck -check-prefix=GFX11CU %s
; Note: we use MIR test checks + stop after legalizer to prevent
; tests from being optimized out.
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/mmra.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/mmra.ll
index 44b12a9..61a6137 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/mmra.ll
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/mmra.ll
@@ -1,5 +1,5 @@
; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 2
-; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx900 -stop-after=finalize-isel < %s | FileCheck %s
+; RUN: llc -global-isel -new-reg-bank-select -mtriple=amdgcn -mcpu=gfx900 -stop-after=finalize-isel < %s | FileCheck %s
declare void @readsMem(ptr) #0
declare void @writesMem(ptr) #1
diff --git a/llvm/test/CodeGen/LoongArch/lasx/fp-max-min.ll b/llvm/test/CodeGen/LoongArch/lasx/fp-max-min.ll
index 48ec98c..8e08e1e 100644
--- a/llvm/test/CodeGen/LoongArch/lasx/fp-max-min.ll
+++ b/llvm/test/CodeGen/LoongArch/lasx/fp-max-min.ll
@@ -5,40 +5,10 @@
define void @minnum_v8f32(ptr %res, ptr %x, ptr %y) nounwind {
; CHECK-LABEL: minnum_v8f32:
; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: xvld $xr0, $a2, 0
-; CHECK-NEXT: xvld $xr1, $a1, 0
-; CHECK-NEXT: xvpickve.w $xr2, $xr0, 5
-; CHECK-NEXT: xvpickve.w $xr3, $xr1, 5
-; CHECK-NEXT: fmin.s $fa2, $fa3, $fa2
-; CHECK-NEXT: xvpickve.w $xr3, $xr0, 4
-; CHECK-NEXT: xvpickve.w $xr4, $xr1, 4
-; CHECK-NEXT: fmin.s $fa3, $fa4, $fa3
-; CHECK-NEXT: vextrins.w $vr3, $vr2, 16
-; CHECK-NEXT: xvpickve.w $xr2, $xr0, 6
-; CHECK-NEXT: xvpickve.w $xr4, $xr1, 6
-; CHECK-NEXT: fmin.s $fa2, $fa4, $fa2
-; CHECK-NEXT: vextrins.w $vr3, $vr2, 32
-; CHECK-NEXT: xvpickve.w $xr2, $xr0, 7
-; CHECK-NEXT: xvpickve.w $xr4, $xr1, 7
-; CHECK-NEXT: fmin.s $fa2, $fa4, $fa2
-; CHECK-NEXT: vextrins.w $vr3, $vr2, 48
-; CHECK-NEXT: xvpickve.w $xr2, $xr0, 1
-; CHECK-NEXT: xvpickve.w $xr4, $xr1, 1
-; CHECK-NEXT: fmin.s $fa2, $fa4, $fa2
-; CHECK-NEXT: xvpickve.w $xr4, $xr0, 0
-; CHECK-NEXT: xvpickve.w $xr5, $xr1, 0
-; CHECK-NEXT: fmin.s $fa4, $fa5, $fa4
-; CHECK-NEXT: vextrins.w $vr4, $vr2, 16
-; CHECK-NEXT: xvpickve.w $xr2, $xr0, 2
-; CHECK-NEXT: xvpickve.w $xr5, $xr1, 2
-; CHECK-NEXT: fmin.s $fa2, $fa5, $fa2
-; CHECK-NEXT: vextrins.w $vr4, $vr2, 32
-; CHECK-NEXT: xvpickve.w $xr0, $xr0, 3
-; CHECK-NEXT: xvpickve.w $xr1, $xr1, 3
-; CHECK-NEXT: fmin.s $fa0, $fa1, $fa0
-; CHECK-NEXT: vextrins.w $vr4, $vr0, 48
-; CHECK-NEXT: xvpermi.q $xr4, $xr3, 2
-; CHECK-NEXT: xvst $xr4, $a0, 0
+; CHECK-NEXT: xvld $xr0, $a1, 0
+; CHECK-NEXT: xvld $xr1, $a2, 0
+; CHECK-NEXT: xvfmin.s $xr0, $xr0, $xr1
+; CHECK-NEXT: xvst $xr0, $a0, 0
; CHECK-NEXT: ret
entry:
%v0 = load <8 x float>, ptr %x
@@ -51,23 +21,9 @@ entry:
define void @minnum_v4f64(ptr %res, ptr %x, ptr %y) nounwind {
; CHECK-LABEL: minnum_v4f64:
; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: xvld $xr0, $a2, 0
-; CHECK-NEXT: xvld $xr1, $a1, 0
-; CHECK-NEXT: xvpickve.d $xr2, $xr0, 3
-; CHECK-NEXT: xvpickve.d $xr3, $xr1, 3
-; CHECK-NEXT: fmin.d $fa2, $fa3, $fa2
-; CHECK-NEXT: xvpickve.d $xr3, $xr0, 2
-; CHECK-NEXT: xvpickve.d $xr4, $xr1, 2
-; CHECK-NEXT: fmin.d $fa3, $fa4, $fa3
-; CHECK-NEXT: vextrins.d $vr3, $vr2, 16
-; CHECK-NEXT: xvpickve.d $xr2, $xr0, 1
-; CHECK-NEXT: xvpickve.d $xr4, $xr1, 1
-; CHECK-NEXT: fmin.d $fa2, $fa4, $fa2
-; CHECK-NEXT: xvpickve.d $xr0, $xr0, 0
-; CHECK-NEXT: xvpickve.d $xr1, $xr1, 0
-; CHECK-NEXT: fmin.d $fa0, $fa1, $fa0
-; CHECK-NEXT: vextrins.d $vr0, $vr2, 16
-; CHECK-NEXT: xvpermi.q $xr0, $xr3, 2
+; CHECK-NEXT: xvld $xr0, $a1, 0
+; CHECK-NEXT: xvld $xr1, $a2, 0
+; CHECK-NEXT: xvfmin.d $xr0, $xr0, $xr1
; CHECK-NEXT: xvst $xr0, $a0, 0
; CHECK-NEXT: ret
entry:
@@ -81,40 +37,10 @@ entry:
define void @maxnum_v8f32(ptr %res, ptr %x, ptr %y) nounwind {
; CHECK-LABEL: maxnum_v8f32:
; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: xvld $xr0, $a2, 0
-; CHECK-NEXT: xvld $xr1, $a1, 0
-; CHECK-NEXT: xvpickve.w $xr2, $xr0, 5
-; CHECK-NEXT: xvpickve.w $xr3, $xr1, 5
-; CHECK-NEXT: fmax.s $fa2, $fa3, $fa2
-; CHECK-NEXT: xvpickve.w $xr3, $xr0, 4
-; CHECK-NEXT: xvpickve.w $xr4, $xr1, 4
-; CHECK-NEXT: fmax.s $fa3, $fa4, $fa3
-; CHECK-NEXT: vextrins.w $vr3, $vr2, 16
-; CHECK-NEXT: xvpickve.w $xr2, $xr0, 6
-; CHECK-NEXT: xvpickve.w $xr4, $xr1, 6
-; CHECK-NEXT: fmax.s $fa2, $fa4, $fa2
-; CHECK-NEXT: vextrins.w $vr3, $vr2, 32
-; CHECK-NEXT: xvpickve.w $xr2, $xr0, 7
-; CHECK-NEXT: xvpickve.w $xr4, $xr1, 7
-; CHECK-NEXT: fmax.s $fa2, $fa4, $fa2
-; CHECK-NEXT: vextrins.w $vr3, $vr2, 48
-; CHECK-NEXT: xvpickve.w $xr2, $xr0, 1
-; CHECK-NEXT: xvpickve.w $xr4, $xr1, 1
-; CHECK-NEXT: fmax.s $fa2, $fa4, $fa2
-; CHECK-NEXT: xvpickve.w $xr4, $xr0, 0
-; CHECK-NEXT: xvpickve.w $xr5, $xr1, 0
-; CHECK-NEXT: fmax.s $fa4, $fa5, $fa4
-; CHECK-NEXT: vextrins.w $vr4, $vr2, 16
-; CHECK-NEXT: xvpickve.w $xr2, $xr0, 2
-; CHECK-NEXT: xvpickve.w $xr5, $xr1, 2
-; CHECK-NEXT: fmax.s $fa2, $fa5, $fa2
-; CHECK-NEXT: vextrins.w $vr4, $vr2, 32
-; CHECK-NEXT: xvpickve.w $xr0, $xr0, 3
-; CHECK-NEXT: xvpickve.w $xr1, $xr1, 3
-; CHECK-NEXT: fmax.s $fa0, $fa1, $fa0
-; CHECK-NEXT: vextrins.w $vr4, $vr0, 48
-; CHECK-NEXT: xvpermi.q $xr4, $xr3, 2
-; CHECK-NEXT: xvst $xr4, $a0, 0
+; CHECK-NEXT: xvld $xr0, $a1, 0
+; CHECK-NEXT: xvld $xr1, $a2, 0
+; CHECK-NEXT: xvfmax.s $xr0, $xr0, $xr1
+; CHECK-NEXT: xvst $xr0, $a0, 0
; CHECK-NEXT: ret
entry:
%v0 = load <8 x float>, ptr %x
@@ -127,23 +53,9 @@ entry:
define void @maxnum_v4f64(ptr %res, ptr %x, ptr %y) nounwind {
; CHECK-LABEL: maxnum_v4f64:
; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: xvld $xr0, $a2, 0
-; CHECK-NEXT: xvld $xr1, $a1, 0
-; CHECK-NEXT: xvpickve.d $xr2, $xr0, 3
-; CHECK-NEXT: xvpickve.d $xr3, $xr1, 3
-; CHECK-NEXT: fmax.d $fa2, $fa3, $fa2
-; CHECK-NEXT: xvpickve.d $xr3, $xr0, 2
-; CHECK-NEXT: xvpickve.d $xr4, $xr1, 2
-; CHECK-NEXT: fmax.d $fa3, $fa4, $fa3
-; CHECK-NEXT: vextrins.d $vr3, $vr2, 16
-; CHECK-NEXT: xvpickve.d $xr2, $xr0, 1
-; CHECK-NEXT: xvpickve.d $xr4, $xr1, 1
-; CHECK-NEXT: fmax.d $fa2, $fa4, $fa2
-; CHECK-NEXT: xvpickve.d $xr0, $xr0, 0
-; CHECK-NEXT: xvpickve.d $xr1, $xr1, 0
-; CHECK-NEXT: fmax.d $fa0, $fa1, $fa0
-; CHECK-NEXT: vextrins.d $vr0, $vr2, 16
-; CHECK-NEXT: xvpermi.q $xr0, $xr3, 2
+; CHECK-NEXT: xvld $xr0, $a1, 0
+; CHECK-NEXT: xvld $xr1, $a2, 0
+; CHECK-NEXT: xvfmax.d $xr0, $xr0, $xr1
; CHECK-NEXT: xvst $xr0, $a0, 0
; CHECK-NEXT: ret
entry:
diff --git a/llvm/test/CodeGen/LoongArch/lsx/fp-max-min.ll b/llvm/test/CodeGen/LoongArch/lsx/fp-max-min.ll
index 27ecb75..c173092 100644
--- a/llvm/test/CodeGen/LoongArch/lsx/fp-max-min.ll
+++ b/llvm/test/CodeGen/LoongArch/lsx/fp-max-min.ll
@@ -5,24 +5,10 @@
define void @minnum_v4f32(ptr %res, ptr %x, ptr %y) nounwind {
; CHECK-LABEL: minnum_v4f32:
; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: vld $vr0, $a2, 0
-; CHECK-NEXT: vld $vr1, $a1, 0
-; CHECK-NEXT: vreplvei.w $vr2, $vr0, 1
-; CHECK-NEXT: vreplvei.w $vr3, $vr1, 1
-; CHECK-NEXT: fmin.s $fa2, $fa3, $fa2
-; CHECK-NEXT: vreplvei.w $vr3, $vr0, 0
-; CHECK-NEXT: vreplvei.w $vr4, $vr1, 0
-; CHECK-NEXT: fmin.s $fa3, $fa4, $fa3
-; CHECK-NEXT: vextrins.w $vr3, $vr2, 16
-; CHECK-NEXT: vreplvei.w $vr2, $vr0, 2
-; CHECK-NEXT: vreplvei.w $vr4, $vr1, 2
-; CHECK-NEXT: fmin.s $fa2, $fa4, $fa2
-; CHECK-NEXT: vextrins.w $vr3, $vr2, 32
-; CHECK-NEXT: vreplvei.w $vr0, $vr0, 3
-; CHECK-NEXT: vreplvei.w $vr1, $vr1, 3
-; CHECK-NEXT: fmin.s $fa0, $fa1, $fa0
-; CHECK-NEXT: vextrins.w $vr3, $vr0, 48
-; CHECK-NEXT: vst $vr3, $a0, 0
+; CHECK-NEXT: vld $vr0, $a1, 0
+; CHECK-NEXT: vld $vr1, $a2, 0
+; CHECK-NEXT: vfmin.s $vr0, $vr0, $vr1
+; CHECK-NEXT: vst $vr0, $a0, 0
; CHECK-NEXT: ret
entry:
%v0 = load <4 x float>, ptr %x
@@ -35,15 +21,9 @@ entry:
define void @minnum_v2f64(ptr %res, ptr %x, ptr %y) nounwind {
; CHECK-LABEL: minnum_v2f64:
; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: vld $vr0, $a2, 0
-; CHECK-NEXT: vld $vr1, $a1, 0
-; CHECK-NEXT: vreplvei.d $vr2, $vr0, 1
-; CHECK-NEXT: vreplvei.d $vr3, $vr1, 1
-; CHECK-NEXT: fmin.d $fa2, $fa3, $fa2
-; CHECK-NEXT: vreplvei.d $vr0, $vr0, 0
-; CHECK-NEXT: vreplvei.d $vr1, $vr1, 0
-; CHECK-NEXT: fmin.d $fa0, $fa1, $fa0
-; CHECK-NEXT: vextrins.d $vr0, $vr2, 16
+; CHECK-NEXT: vld $vr0, $a1, 0
+; CHECK-NEXT: vld $vr1, $a2, 0
+; CHECK-NEXT: vfmin.d $vr0, $vr0, $vr1
; CHECK-NEXT: vst $vr0, $a0, 0
; CHECK-NEXT: ret
entry:
@@ -57,24 +37,10 @@ entry:
define void @maxnum_v4f32(ptr %res, ptr %x, ptr %y) nounwind {
; CHECK-LABEL: maxnum_v4f32:
; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: vld $vr0, $a2, 0
-; CHECK-NEXT: vld $vr1, $a1, 0
-; CHECK-NEXT: vreplvei.w $vr2, $vr0, 1
-; CHECK-NEXT: vreplvei.w $vr3, $vr1, 1
-; CHECK-NEXT: fmax.s $fa2, $fa3, $fa2
-; CHECK-NEXT: vreplvei.w $vr3, $vr0, 0
-; CHECK-NEXT: vreplvei.w $vr4, $vr1, 0
-; CHECK-NEXT: fmax.s $fa3, $fa4, $fa3
-; CHECK-NEXT: vextrins.w $vr3, $vr2, 16
-; CHECK-NEXT: vreplvei.w $vr2, $vr0, 2
-; CHECK-NEXT: vreplvei.w $vr4, $vr1, 2
-; CHECK-NEXT: fmax.s $fa2, $fa4, $fa2
-; CHECK-NEXT: vextrins.w $vr3, $vr2, 32
-; CHECK-NEXT: vreplvei.w $vr0, $vr0, 3
-; CHECK-NEXT: vreplvei.w $vr1, $vr1, 3
-; CHECK-NEXT: fmax.s $fa0, $fa1, $fa0
-; CHECK-NEXT: vextrins.w $vr3, $vr0, 48
-; CHECK-NEXT: vst $vr3, $a0, 0
+; CHECK-NEXT: vld $vr0, $a1, 0
+; CHECK-NEXT: vld $vr1, $a2, 0
+; CHECK-NEXT: vfmax.s $vr0, $vr0, $vr1
+; CHECK-NEXT: vst $vr0, $a0, 0
; CHECK-NEXT: ret
entry:
%v0 = load <4 x float>, ptr %x
@@ -87,15 +53,9 @@ entry:
define void @maxnum_v2f64(ptr %res, ptr %x, ptr %y) nounwind {
; CHECK-LABEL: maxnum_v2f64:
; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: vld $vr0, $a2, 0
-; CHECK-NEXT: vld $vr1, $a1, 0
-; CHECK-NEXT: vreplvei.d $vr2, $vr0, 1
-; CHECK-NEXT: vreplvei.d $vr3, $vr1, 1
-; CHECK-NEXT: fmax.d $fa2, $fa3, $fa2
-; CHECK-NEXT: vreplvei.d $vr0, $vr0, 0
-; CHECK-NEXT: vreplvei.d $vr1, $vr1, 0
-; CHECK-NEXT: fmax.d $fa0, $fa1, $fa0
-; CHECK-NEXT: vextrins.d $vr0, $vr2, 16
+; CHECK-NEXT: vld $vr0, $a1, 0
+; CHECK-NEXT: vld $vr1, $a2, 0
+; CHECK-NEXT: vfmax.d $vr0, $vr0, $vr1
; CHECK-NEXT: vst $vr0, $a0, 0
; CHECK-NEXT: ret
entry:
diff --git a/llvm/test/CodeGen/SPIRV/pointers/composite-fun-fix-ptr-arg.ll b/llvm/test/CodeGen/SPIRV/pointers/composite-fun-fix-ptr-arg.ll
index 73c46b1..c9b2968 100644
--- a/llvm/test/CodeGen/SPIRV/pointers/composite-fun-fix-ptr-arg.ll
+++ b/llvm/test/CodeGen/SPIRV/pointers/composite-fun-fix-ptr-arg.ll
@@ -10,6 +10,7 @@
; CHECK-DAG: %[[#Int8:]] = OpTypeInt 8 0
; CHECK-DAG: %[[#Half:]] = OpTypeFloat 16
+; CHECK-DAG: %[[#Float:]] = OpTypeFloat 32
; CHECK-DAG: %[[#Struct:]] = OpTypeStruct %[[#Half]]
; CHECK-DAG: %[[#Void:]] = OpTypeVoid
; CHECK-DAG: %[[#PtrInt8:]] = OpTypePointer CrossWorkgroup %[[#Int8:]]
@@ -17,12 +18,20 @@
; CHECK-DAG: %[[#Int64:]] = OpTypeInt 64 0
; CHECK-DAG: %[[#PtrInt64:]] = OpTypePointer CrossWorkgroup %[[#Int64]]
; CHECK-DAG: %[[#BarType:]] = OpTypeFunction %[[#Void]] %[[#PtrInt64]] %[[#Struct]]
+; CHECK-DAG: %[[#BazType:]] = OpTypeFunction %[[#Void]] %[[#PtrInt8]] %[[#Struct]] %[[#Int8]] %[[#Struct]] %[[#Float]] %[[#Struct]]
; CHECK: OpFunction %[[#Void]] None %[[#FooType]]
; CHECK: OpFunctionParameter %[[#PtrInt8]]
; CHECK: OpFunctionParameter %[[#Struct]]
; CHECK: OpFunction %[[#Void]] None %[[#BarType]]
; CHECK: OpFunctionParameter %[[#PtrInt64]]
; CHECK: OpFunctionParameter %[[#Struct]]
+; CHECK: OpFunction %[[#Void]] None %[[#BazType]]
+; CHECK: OpFunctionParameter %[[#PtrInt8]]
+; CHECK: OpFunctionParameter %[[#Struct]]
+; CHECK: OpFunctionParameter %[[#Int8]]
+; CHECK: OpFunctionParameter %[[#Struct]]
+; CHECK: OpFunctionParameter %[[#Float]]
+; CHECK: OpFunctionParameter %[[#Struct]]
%t_half = type { half }
@@ -38,4 +47,9 @@ entry:
ret void
}
+define spir_kernel void @baz(ptr addrspace(1) %a, %t_half %b, i8 %c, %t_half %d, float %e, %t_half %f) {
+entry:
+ ret void
+}
+
declare spir_func %t_half @_Z29__spirv_SpecConstantComposite(half)
diff --git a/llvm/test/CodeGen/X86/bittest-big-integer.ll b/llvm/test/CodeGen/X86/bittest-big-integer.ll
index 8007d9d..c311ab8 100644
--- a/llvm/test/CodeGen/X86/bittest-big-integer.ll
+++ b/llvm/test/CodeGen/X86/bittest-big-integer.ll
@@ -203,24 +203,14 @@ define i1 @init_eq_i32(ptr %word, i32 %position, i1 zeroext %value) nounwind {
define i1 @test_ne_i64(ptr %word, i32 %position) nounwind {
; X86-LABEL: test_ne_i64:
; X86: # %bb.0:
-; X86-NEXT: pushl %esi
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
-; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: movl $1, %edx
-; X86-NEXT: xorl %esi, %esi
-; X86-NEXT: shldl %cl, %edx, %esi
-; X86-NEXT: shll %cl, %edx
-; X86-NEXT: testb $32, %cl
-; X86-NEXT: je .LBB5_2
-; X86-NEXT: # %bb.1:
-; X86-NEXT: movl %edx, %esi
-; X86-NEXT: xorl %edx, %edx
-; X86-NEXT: .LBB5_2:
-; X86-NEXT: andl 4(%eax), %esi
-; X86-NEXT: andl (%eax), %edx
-; X86-NEXT: orl %esi, %edx
-; X86-NEXT: setne %al
-; X86-NEXT: popl %esi
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: andl $32, %edx
+; X86-NEXT: shrl $3, %edx
+; X86-NEXT: movl (%eax,%edx), %eax
+; X86-NEXT: btl %ecx, %eax
+; X86-NEXT: setb %al
; X86-NEXT: retl
;
; X64-LABEL: test_ne_i64:
@@ -242,38 +232,20 @@ define i1 @test_ne_i64(ptr %word, i32 %position) nounwind {
define i1 @complement_ne_i64(ptr %word, i32 %position) nounwind {
; X86-LABEL: complement_ne_i64:
; X86: # %bb.0:
-; X86-NEXT: pushl %ebp
-; X86-NEXT: pushl %ebx
; X86-NEXT: pushl %edi
; X86-NEXT: pushl %esi
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
-; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: movl $1, %eax
-; X86-NEXT: xorl %esi, %esi
-; X86-NEXT: shldl %cl, %eax, %esi
-; X86-NEXT: shll %cl, %eax
-; X86-NEXT: testb $32, %cl
-; X86-NEXT: je .LBB6_2
-; X86-NEXT: # %bb.1:
-; X86-NEXT: movl %eax, %esi
-; X86-NEXT: xorl %eax, %eax
-; X86-NEXT: .LBB6_2:
-; X86-NEXT: movl (%edx), %ecx
-; X86-NEXT: movl 4(%edx), %edi
-; X86-NEXT: movl %edi, %ebx
-; X86-NEXT: andl %esi, %ebx
-; X86-NEXT: movl %ecx, %ebp
-; X86-NEXT: andl %eax, %ebp
-; X86-NEXT: xorl %esi, %edi
-; X86-NEXT: xorl %eax, %ecx
-; X86-NEXT: orl %ebx, %ebp
-; X86-NEXT: setne %al
-; X86-NEXT: movl %ecx, (%edx)
-; X86-NEXT: movl %edi, 4(%edx)
+; X86-NEXT: movl %edx, %esi
+; X86-NEXT: andl $32, %esi
+; X86-NEXT: shrl $3, %esi
+; X86-NEXT: movl (%ecx,%esi), %edi
+; X86-NEXT: btl %edx, %edi
+; X86-NEXT: setb %al
+; X86-NEXT: btcl %edx, %edi
+; X86-NEXT: movl %edi, (%ecx,%esi)
; X86-NEXT: popl %esi
; X86-NEXT: popl %edi
-; X86-NEXT: popl %ebx
-; X86-NEXT: popl %ebp
; X86-NEXT: retl
;
; X64-LABEL: complement_ne_i64:
@@ -300,40 +272,20 @@ define i1 @complement_ne_i64(ptr %word, i32 %position) nounwind {
define i1 @reset_eq_i64(ptr %word, i32 %position) nounwind {
; X86-LABEL: reset_eq_i64:
; X86: # %bb.0:
-; X86-NEXT: pushl %ebp
-; X86-NEXT: pushl %ebx
; X86-NEXT: pushl %edi
; X86-NEXT: pushl %esi
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
-; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: movl $1, %esi
-; X86-NEXT: xorl %edi, %edi
-; X86-NEXT: shldl %cl, %esi, %edi
-; X86-NEXT: shll %cl, %esi
-; X86-NEXT: testb $32, %cl
-; X86-NEXT: je .LBB7_2
-; X86-NEXT: # %bb.1:
-; X86-NEXT: movl %esi, %edi
-; X86-NEXT: xorl %esi, %esi
-; X86-NEXT: .LBB7_2:
-; X86-NEXT: movl (%edx), %eax
-; X86-NEXT: movl 4(%edx), %ecx
-; X86-NEXT: movl %ecx, %ebx
-; X86-NEXT: andl %edi, %ebx
-; X86-NEXT: notl %edi
-; X86-NEXT: movl %eax, %ebp
-; X86-NEXT: andl %esi, %ebp
-; X86-NEXT: notl %esi
-; X86-NEXT: andl %ecx, %edi
-; X86-NEXT: andl %eax, %esi
-; X86-NEXT: orl %ebx, %ebp
-; X86-NEXT: sete %al
-; X86-NEXT: movl %esi, (%edx)
-; X86-NEXT: movl %edi, 4(%edx)
+; X86-NEXT: movl %edx, %esi
+; X86-NEXT: andl $32, %esi
+; X86-NEXT: shrl $3, %esi
+; X86-NEXT: movl (%ecx,%esi), %edi
+; X86-NEXT: btl %edx, %edi
+; X86-NEXT: setae %al
+; X86-NEXT: btrl %edx, %edi
+; X86-NEXT: movl %edi, (%ecx,%esi)
; X86-NEXT: popl %esi
; X86-NEXT: popl %edi
-; X86-NEXT: popl %ebx
-; X86-NEXT: popl %ebp
; X86-NEXT: retl
;
; X64-LABEL: reset_eq_i64:
@@ -361,38 +313,20 @@ define i1 @reset_eq_i64(ptr %word, i32 %position) nounwind {
define i1 @set_ne_i64(ptr %word, i32 %position) nounwind {
; X86-LABEL: set_ne_i64:
; X86: # %bb.0:
-; X86-NEXT: pushl %ebp
-; X86-NEXT: pushl %ebx
; X86-NEXT: pushl %edi
; X86-NEXT: pushl %esi
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
-; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: movl $1, %eax
-; X86-NEXT: xorl %esi, %esi
-; X86-NEXT: shldl %cl, %eax, %esi
-; X86-NEXT: shll %cl, %eax
-; X86-NEXT: testb $32, %cl
-; X86-NEXT: je .LBB8_2
-; X86-NEXT: # %bb.1:
-; X86-NEXT: movl %eax, %esi
-; X86-NEXT: xorl %eax, %eax
-; X86-NEXT: .LBB8_2:
-; X86-NEXT: movl (%edx), %ecx
-; X86-NEXT: movl 4(%edx), %edi
-; X86-NEXT: movl %edi, %ebx
-; X86-NEXT: andl %esi, %ebx
-; X86-NEXT: movl %ecx, %ebp
-; X86-NEXT: andl %eax, %ebp
-; X86-NEXT: orl %esi, %edi
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: orl %ebx, %ebp
-; X86-NEXT: setne %al
-; X86-NEXT: movl %ecx, (%edx)
-; X86-NEXT: movl %edi, 4(%edx)
+; X86-NEXT: movl %edx, %esi
+; X86-NEXT: andl $32, %esi
+; X86-NEXT: shrl $3, %esi
+; X86-NEXT: movl (%ecx,%esi), %edi
+; X86-NEXT: btl %edx, %edi
+; X86-NEXT: setb %al
+; X86-NEXT: btsl %edx, %edi
+; X86-NEXT: movl %edi, (%ecx,%esi)
; X86-NEXT: popl %esi
; X86-NEXT: popl %edi
-; X86-NEXT: popl %ebx
-; X86-NEXT: popl %ebp
; X86-NEXT: retl
;
; X64-LABEL: set_ne_i64:
@@ -419,52 +353,47 @@ define i1 @set_ne_i64(ptr %word, i32 %position) nounwind {
define i1 @init_eq_i64(ptr %word, i32 %position, i1 zeroext %value) nounwind {
; X86-LABEL: init_eq_i64:
; X86: # %bb.0:
-; X86-NEXT: pushl %ebp
; X86-NEXT: pushl %ebx
; X86-NEXT: pushl %edi
; X86-NEXT: pushl %esi
-; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: movl $1, %eax
-; X86-NEXT: xorl %edx, %edx
-; X86-NEXT: shldl %cl, %eax, %edx
-; X86-NEXT: shll %cl, %eax
-; X86-NEXT: movzbl {{[0-9]+}}(%esp), %esi
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movl $1, %edx
+; X86-NEXT: xorl %esi, %esi
+; X86-NEXT: shldl %cl, %edx, %esi
+; X86-NEXT: shll %cl, %edx
+; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
; X86-NEXT: xorl %edi, %edi
-; X86-NEXT: shldl %cl, %esi, %edi
-; X86-NEXT: shll %cl, %esi
+; X86-NEXT: shldl %cl, %eax, %edi
+; X86-NEXT: shll %cl, %eax
; X86-NEXT: testb $32, %cl
; X86-NEXT: je .LBB9_2
; X86-NEXT: # %bb.1:
-; X86-NEXT: movl %eax, %edx
-; X86-NEXT: movl $0, %eax
+; X86-NEXT: movl %edx, %esi
+; X86-NEXT: movl $0, %edx
; X86-NEXT: .LBB9_2:
-; X86-NEXT: movl %edx, %ebx
-; X86-NEXT: notl %ebx
-; X86-NEXT: movl %eax, %ebp
-; X86-NEXT: notl %ebp
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
+; X86-NEXT: notl %esi
+; X86-NEXT: notl %edx
; X86-NEXT: je .LBB9_4
; X86-NEXT: # %bb.3:
-; X86-NEXT: movl %esi, %edi
-; X86-NEXT: xorl %esi, %esi
+; X86-NEXT: movl %eax, %edi
+; X86-NEXT: xorl %eax, %eax
; X86-NEXT: .LBB9_4:
-; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: movl 4(%ecx), %ecx
-; X86-NEXT: andl %ecx, %edx
-; X86-NEXT: andl %ecx, %ebx
-; X86-NEXT: orl %edi, %ebx
-; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
-; X86-NEXT: movl (%edi), %ecx
-; X86-NEXT: andl %ecx, %eax
-; X86-NEXT: andl %ecx, %ebp
-; X86-NEXT: orl %esi, %ebp
-; X86-NEXT: orl %edx, %eax
-; X86-NEXT: movl %ebp, (%edi)
-; X86-NEXT: movl %ebx, 4(%edi)
-; X86-NEXT: sete %al
+; X86-NEXT: andl 4(%ebx), %esi
+; X86-NEXT: orl %edi, %esi
+; X86-NEXT: andl (%ebx), %edx
+; X86-NEXT: orl %eax, %edx
+; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: andl $32, %eax
+; X86-NEXT: shrl $3, %eax
+; X86-NEXT: movl (%ebx,%eax), %eax
+; X86-NEXT: btl %ecx, %eax
+; X86-NEXT: setae %al
+; X86-NEXT: movl %edx, (%ebx)
+; X86-NEXT: movl %esi, 4(%ebx)
; X86-NEXT: popl %esi
; X86-NEXT: popl %edi
; X86-NEXT: popl %ebx
-; X86-NEXT: popl %ebp
; X86-NEXT: retl
;
; SSE-LABEL: init_eq_i64:
@@ -516,101 +445,25 @@ define i1 @init_eq_i64(ptr %word, i32 %position, i1 zeroext %value) nounwind {
define i1 @test_ne_i128(ptr %word, i32 %position) nounwind {
; X86-LABEL: test_ne_i128:
; X86: # %bb.0:
-; X86-NEXT: pushl %ebp
-; X86-NEXT: movl %esp, %ebp
-; X86-NEXT: pushl %ebx
-; X86-NEXT: pushl %edi
-; X86-NEXT: pushl %esi
-; X86-NEXT: andl $-16, %esp
-; X86-NEXT: subl $48, %esp
-; X86-NEXT: movzbl 12(%ebp), %ecx
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $1, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, (%esp)
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: shrb $3, %al
-; X86-NEXT: andb $12, %al
-; X86-NEXT: negb %al
-; X86-NEXT: movsbl %al, %esi
-; X86-NEXT: movl 24(%esp,%esi), %edi
-; X86-NEXT: movl 28(%esp,%esi), %eax
-; X86-NEXT: shldl %cl, %edi, %eax
-; X86-NEXT: movl 16(%esp,%esi), %edx
-; X86-NEXT: movl 20(%esp,%esi), %esi
-; X86-NEXT: shldl %cl, %esi, %edi
-; X86-NEXT: shldl %cl, %edx, %esi
-; X86-NEXT: movl 8(%ebp), %ebx
-; X86-NEXT: shll %cl, %edx
-; X86-NEXT: andl 8(%ebx), %edi
-; X86-NEXT: andl (%ebx), %edx
-; X86-NEXT: orl %edi, %edx
-; X86-NEXT: andl 12(%ebx), %eax
-; X86-NEXT: andl 4(%ebx), %esi
-; X86-NEXT: orl %eax, %esi
-; X86-NEXT: orl %edx, %esi
-; X86-NEXT: setne %al
-; X86-NEXT: leal -12(%ebp), %esp
-; X86-NEXT: popl %esi
-; X86-NEXT: popl %edi
-; X86-NEXT: popl %ebx
-; X86-NEXT: popl %ebp
+; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: andl $96, %edx
+; X86-NEXT: shrl $3, %edx
+; X86-NEXT: movl (%eax,%edx), %eax
+; X86-NEXT: btl %ecx, %eax
+; X86-NEXT: setb %al
; X86-NEXT: retl
;
-; SSE-LABEL: test_ne_i128:
-; SSE: # %bb.0:
-; SSE-NEXT: movl %esi, %ecx
-; SSE-NEXT: movl $1, %eax
-; SSE-NEXT: xorl %edx, %edx
-; SSE-NEXT: shldq %cl, %rax, %rdx
-; SSE-NEXT: xorl %esi, %esi
-; SSE-NEXT: shlq %cl, %rax
-; SSE-NEXT: testb $64, %cl
-; SSE-NEXT: cmovneq %rax, %rdx
-; SSE-NEXT: cmovneq %rsi, %rax
-; SSE-NEXT: andq 8(%rdi), %rdx
-; SSE-NEXT: andq (%rdi), %rax
-; SSE-NEXT: orq %rdx, %rax
-; SSE-NEXT: setne %al
-; SSE-NEXT: retq
-;
-; AVX2-LABEL: test_ne_i128:
-; AVX2: # %bb.0:
-; AVX2-NEXT: movl %esi, %ecx
-; AVX2-NEXT: xorl %eax, %eax
-; AVX2-NEXT: movl $1, %edx
-; AVX2-NEXT: xorl %esi, %esi
-; AVX2-NEXT: shldq %cl, %rdx, %rsi
-; AVX2-NEXT: shlxq %rcx, %rdx, %rdx
-; AVX2-NEXT: testb $64, %cl
-; AVX2-NEXT: cmovneq %rdx, %rsi
-; AVX2-NEXT: cmovneq %rax, %rdx
-; AVX2-NEXT: andq 8(%rdi), %rsi
-; AVX2-NEXT: andq (%rdi), %rdx
-; AVX2-NEXT: orq %rsi, %rdx
-; AVX2-NEXT: setne %al
-; AVX2-NEXT: retq
-;
-; AVX512-LABEL: test_ne_i128:
-; AVX512: # %bb.0:
-; AVX512-NEXT: movl %esi, %ecx
-; AVX512-NEXT: movl $1, %eax
-; AVX512-NEXT: xorl %edx, %edx
-; AVX512-NEXT: shldq %cl, %rax, %rdx
-; AVX512-NEXT: xorl %esi, %esi
-; AVX512-NEXT: shlxq %rcx, %rax, %rax
-; AVX512-NEXT: testb $64, %cl
-; AVX512-NEXT: cmovneq %rax, %rdx
-; AVX512-NEXT: cmovneq %rsi, %rax
-; AVX512-NEXT: andq 8(%rdi), %rdx
-; AVX512-NEXT: andq (%rdi), %rax
-; AVX512-NEXT: orq %rdx, %rax
-; AVX512-NEXT: setne %al
-; AVX512-NEXT: retq
+; X64-LABEL: test_ne_i128:
+; X64: # %bb.0:
+; X64-NEXT: movl %esi, %eax
+; X64-NEXT: andl $96, %eax
+; X64-NEXT: shrl $3, %eax
+; X64-NEXT: movl (%rdi,%rax), %eax
+; X64-NEXT: btl %esi, %eax
+; X64-NEXT: setb %al
+; X64-NEXT: retq
%rem = and i32 %position, 127
%ofs = zext nneg i32 %rem to i128
%bit = shl nuw i128 1, %ofs
@@ -623,124 +476,33 @@ define i1 @test_ne_i128(ptr %word, i32 %position) nounwind {
define i1 @complement_ne_i128(ptr %word, i32 %position) nounwind {
; X86-LABEL: complement_ne_i128:
; X86: # %bb.0:
-; X86-NEXT: pushl %ebp
-; X86-NEXT: movl %esp, %ebp
-; X86-NEXT: pushl %ebx
; X86-NEXT: pushl %edi
; X86-NEXT: pushl %esi
-; X86-NEXT: andl $-16, %esp
-; X86-NEXT: subl $80, %esp
-; X86-NEXT: movzbl 12(%ebp), %ecx
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $1, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: shrb $3, %al
-; X86-NEXT: andb $12, %al
-; X86-NEXT: negb %al
-; X86-NEXT: movsbl %al, %eax
-; X86-NEXT: movl 56(%esp,%eax), %esi
-; X86-NEXT: movl 60(%esp,%eax), %edx
-; X86-NEXT: shldl %cl, %esi, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 48(%esp,%eax), %edi
-; X86-NEXT: movl 52(%esp,%eax), %ebx
-; X86-NEXT: shldl %cl, %ebx, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edi, %ebx
-; X86-NEXT: movl 8(%ebp), %eax
-; X86-NEXT: shll %cl, %edi
-; X86-NEXT: movl %eax, %ecx
-; X86-NEXT: movl 8(%eax), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %esi, %eax
-; X86-NEXT: movl (%ecx), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl %ecx, %esi
-; X86-NEXT: movl %edx, %ecx
-; X86-NEXT: andl %edi, %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl 12(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl 4(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ebx, %eax
-; X86-NEXT: orl %edx, %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: xorl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: xorl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: xorl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
-; X86-NEXT: xorl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
-; X86-NEXT: orl %ecx, %eax
-; X86-NEXT: movl 8(%ebp), %eax
-; X86-NEXT: movl %edx, 8(%eax)
-; X86-NEXT: movl %esi, 12(%eax)
-; X86-NEXT: movl %edi, (%eax)
-; X86-NEXT: movl %ebx, 4(%eax)
-; X86-NEXT: setne %al
-; X86-NEXT: leal -12(%ebp), %esp
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
+; X86-NEXT: movl %edx, %esi
+; X86-NEXT: andl $96, %esi
+; X86-NEXT: shrl $3, %esi
+; X86-NEXT: movl (%ecx,%esi), %edi
+; X86-NEXT: btl %edx, %edi
+; X86-NEXT: setb %al
+; X86-NEXT: btcl %edx, %edi
+; X86-NEXT: movl %edi, (%ecx,%esi)
; X86-NEXT: popl %esi
; X86-NEXT: popl %edi
-; X86-NEXT: popl %ebx
-; X86-NEXT: popl %ebp
; X86-NEXT: retl
;
-; SSE-LABEL: complement_ne_i128:
-; SSE: # %bb.0:
-; SSE-NEXT: movl %esi, %ecx
-; SSE-NEXT: movl $1, %edx
-; SSE-NEXT: xorl %esi, %esi
-; SSE-NEXT: shldq %cl, %rdx, %rsi
-; SSE-NEXT: shlq %cl, %rdx
-; SSE-NEXT: xorl %eax, %eax
-; SSE-NEXT: testb $64, %cl
-; SSE-NEXT: cmovneq %rdx, %rsi
-; SSE-NEXT: cmovneq %rax, %rdx
-; SSE-NEXT: movq (%rdi), %rax
-; SSE-NEXT: movq 8(%rdi), %rcx
-; SSE-NEXT: movq %rcx, %r8
-; SSE-NEXT: andq %rsi, %r8
-; SSE-NEXT: movq %rax, %r9
-; SSE-NEXT: andq %rdx, %r9
-; SSE-NEXT: xorq %rcx, %rsi
-; SSE-NEXT: xorq %rax, %rdx
-; SSE-NEXT: orq %r8, %r9
-; SSE-NEXT: setne %al
-; SSE-NEXT: movq %rdx, (%rdi)
-; SSE-NEXT: movq %rsi, 8(%rdi)
-; SSE-NEXT: retq
-;
-; AVX-LABEL: complement_ne_i128:
-; AVX: # %bb.0:
-; AVX-NEXT: movl %esi, %ecx
-; AVX-NEXT: xorl %eax, %eax
-; AVX-NEXT: movl $1, %edx
-; AVX-NEXT: xorl %esi, %esi
-; AVX-NEXT: shldq %cl, %rdx, %rsi
-; AVX-NEXT: shlxq %rcx, %rdx, %rdx
-; AVX-NEXT: testb $64, %cl
-; AVX-NEXT: cmovneq %rdx, %rsi
-; AVX-NEXT: cmovneq %rax, %rdx
-; AVX-NEXT: movq (%rdi), %rax
-; AVX-NEXT: movq 8(%rdi), %rcx
-; AVX-NEXT: movq %rcx, %r8
-; AVX-NEXT: andq %rsi, %r8
-; AVX-NEXT: movq %rax, %r9
-; AVX-NEXT: andq %rdx, %r9
-; AVX-NEXT: xorq %rcx, %rsi
-; AVX-NEXT: xorq %rax, %rdx
-; AVX-NEXT: orq %r8, %r9
-; AVX-NEXT: setne %al
-; AVX-NEXT: movq %rdx, (%rdi)
-; AVX-NEXT: movq %rsi, 8(%rdi)
-; AVX-NEXT: retq
+; X64-LABEL: complement_ne_i128:
+; X64: # %bb.0:
+; X64-NEXT: movl %esi, %ecx
+; X64-NEXT: andl $96, %ecx
+; X64-NEXT: shrl $3, %ecx
+; X64-NEXT: movl (%rdi,%rcx), %edx
+; X64-NEXT: btl %esi, %edx
+; X64-NEXT: setb %al
+; X64-NEXT: btcl %esi, %edx
+; X64-NEXT: movl %edx, (%rdi,%rcx)
+; X64-NEXT: retq
%rem = and i32 %position, 127
%ofs = zext nneg i32 %rem to i128
%bit = shl nuw i128 1, %ofs
@@ -755,124 +517,33 @@ define i1 @complement_ne_i128(ptr %word, i32 %position) nounwind {
define i1 @reset_eq_i128(ptr %word, i32 %position) nounwind {
; X86-LABEL: reset_eq_i128:
; X86: # %bb.0:
-; X86-NEXT: pushl %ebp
-; X86-NEXT: movl %esp, %ebp
-; X86-NEXT: pushl %ebx
; X86-NEXT: pushl %edi
; X86-NEXT: pushl %esi
-; X86-NEXT: andl $-16, %esp
-; X86-NEXT: subl $80, %esp
-; X86-NEXT: movzbl 12(%ebp), %ecx
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $1, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: shrb $3, %al
-; X86-NEXT: andb $12, %al
-; X86-NEXT: negb %al
-; X86-NEXT: movsbl %al, %eax
-; X86-NEXT: movl 56(%esp,%eax), %edx
-; X86-NEXT: movl 60(%esp,%eax), %esi
-; X86-NEXT: shldl %cl, %edx, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 48(%esp,%eax), %esi
-; X86-NEXT: movl 52(%esp,%eax), %edi
-; X86-NEXT: shldl %cl, %edi, %edx
-; X86-NEXT: shldl %cl, %esi, %edi
-; X86-NEXT: movl 8(%ebp), %ebx
-; X86-NEXT: shll %cl, %esi
-; X86-NEXT: movl 8(%ebx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %edx, %eax
-; X86-NEXT: movl (%ebx), %ecx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %esi, %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 12(%ebx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: movl %edi, %ecx
-; X86-NEXT: movl 4(%ebx), %ebx
-; X86-NEXT: andl %ebx, %edi
-; X86-NEXT: orl %eax, %edi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: notl %eax
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: notl %ecx
-; X86-NEXT: andl %ebx, %ecx
-; X86-NEXT: notl %esi
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
-; X86-NEXT: movl 8(%ebp), %edi
-; X86-NEXT: movl %edx, 8(%edi)
-; X86-NEXT: movl %eax, 12(%edi)
-; X86-NEXT: movl %esi, (%edi)
-; X86-NEXT: movl %ecx, 4(%edi)
-; X86-NEXT: sete %al
-; X86-NEXT: leal -12(%ebp), %esp
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
+; X86-NEXT: movl %edx, %esi
+; X86-NEXT: andl $96, %esi
+; X86-NEXT: shrl $3, %esi
+; X86-NEXT: movl (%ecx,%esi), %edi
+; X86-NEXT: btl %edx, %edi
+; X86-NEXT: setae %al
+; X86-NEXT: btrl %edx, %edi
+; X86-NEXT: movl %edi, (%ecx,%esi)
; X86-NEXT: popl %esi
; X86-NEXT: popl %edi
-; X86-NEXT: popl %ebx
-; X86-NEXT: popl %ebp
; X86-NEXT: retl
;
-; SSE-LABEL: reset_eq_i128:
-; SSE: # %bb.0:
-; SSE-NEXT: movl %esi, %ecx
-; SSE-NEXT: movl $1, %edx
-; SSE-NEXT: xorl %esi, %esi
-; SSE-NEXT: shldq %cl, %rdx, %rsi
-; SSE-NEXT: xorl %eax, %eax
-; SSE-NEXT: shlq %cl, %rdx
-; SSE-NEXT: testb $64, %cl
-; SSE-NEXT: cmovneq %rdx, %rsi
-; SSE-NEXT: cmovneq %rax, %rdx
-; SSE-NEXT: movq (%rdi), %rax
-; SSE-NEXT: movq 8(%rdi), %rcx
-; SSE-NEXT: movq %rcx, %r8
-; SSE-NEXT: andq %rsi, %r8
-; SSE-NEXT: notq %rsi
-; SSE-NEXT: movq %rax, %r9
-; SSE-NEXT: andq %rdx, %r9
-; SSE-NEXT: notq %rdx
-; SSE-NEXT: andq %rcx, %rsi
-; SSE-NEXT: andq %rax, %rdx
-; SSE-NEXT: orq %r8, %r9
-; SSE-NEXT: sete %al
-; SSE-NEXT: movq %rdx, (%rdi)
-; SSE-NEXT: movq %rsi, 8(%rdi)
-; SSE-NEXT: retq
-;
-; AVX-LABEL: reset_eq_i128:
-; AVX: # %bb.0:
-; AVX-NEXT: movl %esi, %ecx
-; AVX-NEXT: xorl %eax, %eax
-; AVX-NEXT: movl $1, %edx
-; AVX-NEXT: xorl %esi, %esi
-; AVX-NEXT: shldq %cl, %rdx, %rsi
-; AVX-NEXT: shlxq %rcx, %rdx, %rdx
-; AVX-NEXT: testb $64, %cl
-; AVX-NEXT: cmovneq %rdx, %rsi
-; AVX-NEXT: cmovneq %rax, %rdx
-; AVX-NEXT: movq (%rdi), %rax
-; AVX-NEXT: movq 8(%rdi), %rcx
-; AVX-NEXT: andnq %rcx, %rsi, %r8
-; AVX-NEXT: andq %rsi, %rcx
-; AVX-NEXT: andnq %rax, %rdx, %rsi
-; AVX-NEXT: andq %rdx, %rax
-; AVX-NEXT: orq %rcx, %rax
-; AVX-NEXT: sete %al
-; AVX-NEXT: movq %rsi, (%rdi)
-; AVX-NEXT: movq %r8, 8(%rdi)
-; AVX-NEXT: retq
+; X64-LABEL: reset_eq_i128:
+; X64: # %bb.0:
+; X64-NEXT: movl %esi, %ecx
+; X64-NEXT: andl $96, %ecx
+; X64-NEXT: shrl $3, %ecx
+; X64-NEXT: movl (%rdi,%rcx), %edx
+; X64-NEXT: btl %esi, %edx
+; X64-NEXT: setae %al
+; X64-NEXT: btrl %esi, %edx
+; X64-NEXT: movl %edx, (%rdi,%rcx)
+; X64-NEXT: retq
%rem = and i32 %position, 127
%ofs = zext nneg i32 %rem to i128
%bit = shl nuw i128 1, %ofs
@@ -888,124 +559,33 @@ define i1 @reset_eq_i128(ptr %word, i32 %position) nounwind {
define i1 @set_ne_i128(ptr %word, i32 %position) nounwind {
; X86-LABEL: set_ne_i128:
; X86: # %bb.0:
-; X86-NEXT: pushl %ebp
-; X86-NEXT: movl %esp, %ebp
-; X86-NEXT: pushl %ebx
; X86-NEXT: pushl %edi
; X86-NEXT: pushl %esi
-; X86-NEXT: andl $-16, %esp
-; X86-NEXT: subl $80, %esp
-; X86-NEXT: movzbl 12(%ebp), %ecx
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $1, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: shrb $3, %al
-; X86-NEXT: andb $12, %al
-; X86-NEXT: negb %al
-; X86-NEXT: movsbl %al, %eax
-; X86-NEXT: movl 56(%esp,%eax), %esi
-; X86-NEXT: movl 60(%esp,%eax), %edx
-; X86-NEXT: shldl %cl, %esi, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 48(%esp,%eax), %edi
-; X86-NEXT: movl 52(%esp,%eax), %ebx
-; X86-NEXT: shldl %cl, %ebx, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edi, %ebx
-; X86-NEXT: movl 8(%ebp), %eax
-; X86-NEXT: shll %cl, %edi
-; X86-NEXT: movl %eax, %ecx
-; X86-NEXT: movl 8(%eax), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %esi, %eax
-; X86-NEXT: movl (%ecx), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl %ecx, %esi
-; X86-NEXT: movl %edx, %ecx
-; X86-NEXT: andl %edi, %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl 12(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl 4(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ebx, %eax
-; X86-NEXT: orl %edx, %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
-; X86-NEXT: orl %ecx, %eax
-; X86-NEXT: movl 8(%ebp), %eax
-; X86-NEXT: movl %edx, 8(%eax)
-; X86-NEXT: movl %esi, 12(%eax)
-; X86-NEXT: movl %edi, (%eax)
-; X86-NEXT: movl %ebx, 4(%eax)
-; X86-NEXT: setne %al
-; X86-NEXT: leal -12(%ebp), %esp
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
+; X86-NEXT: movl %edx, %esi
+; X86-NEXT: andl $96, %esi
+; X86-NEXT: shrl $3, %esi
+; X86-NEXT: movl (%ecx,%esi), %edi
+; X86-NEXT: btl %edx, %edi
+; X86-NEXT: setb %al
+; X86-NEXT: btsl %edx, %edi
+; X86-NEXT: movl %edi, (%ecx,%esi)
; X86-NEXT: popl %esi
; X86-NEXT: popl %edi
-; X86-NEXT: popl %ebx
-; X86-NEXT: popl %ebp
; X86-NEXT: retl
;
-; SSE-LABEL: set_ne_i128:
-; SSE: # %bb.0:
-; SSE-NEXT: movl %esi, %ecx
-; SSE-NEXT: movl $1, %edx
-; SSE-NEXT: xorl %esi, %esi
-; SSE-NEXT: shldq %cl, %rdx, %rsi
-; SSE-NEXT: shlq %cl, %rdx
-; SSE-NEXT: xorl %eax, %eax
-; SSE-NEXT: testb $64, %cl
-; SSE-NEXT: cmovneq %rdx, %rsi
-; SSE-NEXT: cmovneq %rax, %rdx
-; SSE-NEXT: movq (%rdi), %rax
-; SSE-NEXT: movq 8(%rdi), %rcx
-; SSE-NEXT: movq %rcx, %r8
-; SSE-NEXT: andq %rsi, %r8
-; SSE-NEXT: movq %rax, %r9
-; SSE-NEXT: andq %rdx, %r9
-; SSE-NEXT: orq %rcx, %rsi
-; SSE-NEXT: orq %rax, %rdx
-; SSE-NEXT: orq %r8, %r9
-; SSE-NEXT: setne %al
-; SSE-NEXT: movq %rdx, (%rdi)
-; SSE-NEXT: movq %rsi, 8(%rdi)
-; SSE-NEXT: retq
-;
-; AVX-LABEL: set_ne_i128:
-; AVX: # %bb.0:
-; AVX-NEXT: movl %esi, %ecx
-; AVX-NEXT: xorl %eax, %eax
-; AVX-NEXT: movl $1, %edx
-; AVX-NEXT: xorl %esi, %esi
-; AVX-NEXT: shldq %cl, %rdx, %rsi
-; AVX-NEXT: shlxq %rcx, %rdx, %rdx
-; AVX-NEXT: testb $64, %cl
-; AVX-NEXT: cmovneq %rdx, %rsi
-; AVX-NEXT: cmovneq %rax, %rdx
-; AVX-NEXT: movq (%rdi), %rax
-; AVX-NEXT: movq 8(%rdi), %rcx
-; AVX-NEXT: movq %rcx, %r8
-; AVX-NEXT: andq %rsi, %r8
-; AVX-NEXT: movq %rax, %r9
-; AVX-NEXT: andq %rdx, %r9
-; AVX-NEXT: orq %rcx, %rsi
-; AVX-NEXT: orq %rax, %rdx
-; AVX-NEXT: orq %r8, %r9
-; AVX-NEXT: setne %al
-; AVX-NEXT: movq %rdx, (%rdi)
-; AVX-NEXT: movq %rsi, 8(%rdi)
-; AVX-NEXT: retq
+; X64-LABEL: set_ne_i128:
+; X64: # %bb.0:
+; X64-NEXT: movl %esi, %ecx
+; X64-NEXT: andl $96, %ecx
+; X64-NEXT: shrl $3, %ecx
+; X64-NEXT: movl (%rdi,%rcx), %edx
+; X64-NEXT: btl %esi, %edx
+; X64-NEXT: setb %al
+; X64-NEXT: btsl %esi, %edx
+; X64-NEXT: movl %edx, (%rdi,%rcx)
+; X64-NEXT: retq
%rem = and i32 %position, 127
%ofs = zext nneg i32 %rem to i128
%bit = shl nuw i128 1, %ofs
@@ -1026,9 +606,9 @@ define i1 @init_eq_i128(ptr %word, i32 %position, i1 zeroext %value) nounwind {
; X86-NEXT: pushl %edi
; X86-NEXT: pushl %esi
; X86-NEXT: andl $-16, %esp
-; X86-NEXT: subl $128, %esp
-; X86-NEXT: movzbl 12(%ebp), %ecx
-; X86-NEXT: movzbl 16(%ebp), %eax
+; X86-NEXT: subl $96, %esp
+; X86-NEXT: movl 12(%ebp), %ecx
+; X86-NEXT: movzbl 16(%ebp), %ebx
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
@@ -1037,25 +617,30 @@ define i1 @init_eq_i128(ptr %word, i32 %position, i1 zeroext %value) nounwind {
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %ecx, %edx
-; X86-NEXT: shrb $3, %dl
-; X86-NEXT: andb $12, %dl
-; X86-NEXT: negb %dl
-; X86-NEXT: movsbl %dl, %esi
-; X86-NEXT: movl 64(%esp,%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 68(%esp,%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 72(%esp,%esi), %ebx
+; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: shrb $3, %al
+; X86-NEXT: andb $12, %al
+; X86-NEXT: negb %al
+; X86-NEXT: movsbl %al, %eax
+; X86-NEXT: movl 64(%esp,%eax), %edx
+; X86-NEXT: movl 68(%esp,%eax), %esi
; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movzbl %al, %eax
-; X86-NEXT: movl 76(%esp,%esi), %edi
+; X86-NEXT: movl %eax, %esi
+; X86-NEXT: movl %eax, (%esp) # 4-byte Spill
+; X86-NEXT: movzbl %bl, %eax
+; X86-NEXT: movl 72(%esp,%esi), %ebx
+; X86-NEXT: movl 76(%esp,%esi), %esi
; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %ebx, %eax
+; X86-NEXT: movl %ebx, %edi
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; X86-NEXT: shldl %cl, %eax, %edi
+; X86-NEXT: shldl %cl, %ebx, %esi
+; X86-NEXT: movl %edx, %ebx
+; X86-NEXT: shll %cl, %ebx
+; X86-NEXT: # kill: def $cl killed $cl killed $ecx
; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: shldl %cl, %ebx, %edi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: shll %cl, %edx
+; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: notl %edi
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
@@ -1063,72 +648,59 @@ define i1 @init_eq_i128(ptr %word, i32 %position, i1 zeroext %value) nounwind {
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl 8(%ebp), %esi
+; X86-NEXT: movl (%esp), %ecx # 4-byte Reload
+; X86-NEXT: movl 36(%esp,%ecx), %eax
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 8(%esi), %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ebx, %eax
+; X86-NEXT: movl 40(%esp,%ecx), %edx
; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl (%esi), %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ebx, %edx
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; X86-NEXT: movl 12(%ebp), %ecx
+; X86-NEXT: # kill: def $cl killed $cl killed $ecx
+; X86-NEXT: shldl %cl, %eax, %edx
+; X86-NEXT: movl 8(%ebp), %eax
+; X86-NEXT: andl 8(%eax), %edi
+; X86-NEXT: orl %edx, %edi
+; X86-NEXT: notl %esi
+; X86-NEXT: movl (%esp), %eax # 4-byte Reload
+; X86-NEXT: movl 44(%esp,%eax), %eax
+; X86-NEXT: movl 12(%ebp), %ecx
+; X86-NEXT: # kill: def $cl killed $cl killed $ecx
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %edi, %esi
; X86-NEXT: movl 8(%ebp), %ecx
-; X86-NEXT: movl 12(%ecx), %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ebx, %edi
-; X86-NEXT: movl %eax, %ebx
-; X86-NEXT: movl %eax, %edx
-; X86-NEXT: movl 4(%ecx), %ecx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ecx, %ebx
-; X86-NEXT: orl %edi, %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: notl %ecx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl 100(%esp,%ecx), %edi
-; X86-NEXT: movl 104(%esp,%ecx), %ecx
-; X86-NEXT: movl %ecx, %ebx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: movzbl 12(%ebp), %ecx
-; X86-NEXT: shldl %cl, %edi, %ebx
-; X86-NEXT: orl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: notl %esi
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
-; X86-NEXT: movl 108(%esp,%ebx), %ebx
-; X86-NEXT: shldl %cl, %eax, %ebx
-; X86-NEXT: orl %ebx, %esi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: notl %eax
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
-; X86-NEXT: movl 96(%esp,%ebx), %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shll %cl, %ebx
-; X86-NEXT: orl %ebx, %eax
+; X86-NEXT: andl 12(%ecx), %esi
+; X86-NEXT: orl %eax, %esi
+; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: notl %ebx
+; X86-NEXT: movl (%esp), %eax # 4-byte Reload
+; X86-NEXT: movl 32(%esp,%eax), %edx
+; X86-NEXT: movl %edx, (%esp) # 4-byte Spill
+; X86-NEXT: movl 12(%ebp), %ecx
+; X86-NEXT: shll %cl, %edx
+; X86-NEXT: movl 8(%ebp), %eax
+; X86-NEXT: andl (%eax), %ebx
+; X86-NEXT: orl %edx, %ebx
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
-; X86-NEXT: shldl %cl, %ebx, %edi
-; X86-NEXT: orl %edi, %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; X86-NEXT: # kill: def $cl killed $cl killed $ecx
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; X86-NEXT: movl (%esp), %esi # 4-byte Reload
+; X86-NEXT: shldl %cl, %esi, %eax
; X86-NEXT: movl 8(%ebp), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; X86-NEXT: andl 4(%ecx), %edx
+; X86-NEXT: orl %eax, %edx
+; X86-NEXT: movl 12(%ebp), %esi
+; X86-NEXT: movl %esi, %eax
+; X86-NEXT: andl $96, %eax
+; X86-NEXT: shrl $3, %eax
+; X86-NEXT: movl (%ecx,%eax), %eax
+; X86-NEXT: btl %esi, %eax
+; X86-NEXT: movl %ecx, %eax
; X86-NEXT: movl %edi, 8(%ecx)
-; X86-NEXT: movl %esi, 12(%ecx)
-; X86-NEXT: movl %eax, (%ecx)
-; X86-NEXT: movl %edx, 4(%ecx)
-; X86-NEXT: sete %al
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; X86-NEXT: movl %ecx, 12(%eax)
+; X86-NEXT: movl %ebx, (%eax)
+; X86-NEXT: movl %edx, 4(%eax)
+; X86-NEXT: setae %al
; X86-NEXT: leal -12(%ebp), %esp
; X86-NEXT: popl %esi
; X86-NEXT: popl %edi
@@ -1151,22 +723,20 @@ define i1 @init_eq_i128(ptr %word, i32 %position, i1 zeroext %value) nounwind {
; SSE-NEXT: testb $64, %cl
; SSE-NEXT: cmovneq %rsi, %r8
; SSE-NEXT: cmovneq %r9, %rsi
+; SSE-NEXT: notq %r8
; SSE-NEXT: cmovneq %rax, %rdx
; SSE-NEXT: cmovneq %r9, %rax
-; SSE-NEXT: movq (%rdi), %rcx
-; SSE-NEXT: movq 8(%rdi), %r9
-; SSE-NEXT: movq %r9, %r10
-; SSE-NEXT: andq %r8, %r10
-; SSE-NEXT: notq %r8
-; SSE-NEXT: movq %rcx, %r11
-; SSE-NEXT: andq %rsi, %r11
; SSE-NEXT: notq %rsi
-; SSE-NEXT: andq %r9, %r8
+; SSE-NEXT: andq 8(%rdi), %r8
; SSE-NEXT: orq %rdx, %r8
-; SSE-NEXT: andq %rcx, %rsi
+; SSE-NEXT: andq (%rdi), %rsi
; SSE-NEXT: orq %rax, %rsi
-; SSE-NEXT: orq %r10, %r11
-; SSE-NEXT: sete %al
+; SSE-NEXT: movl %ecx, %eax
+; SSE-NEXT: andl $96, %eax
+; SSE-NEXT: shrl $3, %eax
+; SSE-NEXT: movl (%rdi,%rax), %eax
+; SSE-NEXT: btl %ecx, %eax
+; SSE-NEXT: setae %al
; SSE-NEXT: movq %rsi, (%rdi)
; SSE-NEXT: movq %r8, 8(%rdi)
; SSE-NEXT: retq
@@ -1174,63 +744,63 @@ define i1 @init_eq_i128(ptr %word, i32 %position, i1 zeroext %value) nounwind {
; AVX2-LABEL: init_eq_i128:
; AVX2: # %bb.0:
; AVX2-NEXT: movl %esi, %ecx
-; AVX2-NEXT: movl $1, %esi
-; AVX2-NEXT: xorl %eax, %eax
-; AVX2-NEXT: shldq %cl, %rsi, %rax
-; AVX2-NEXT: xorl %r8d, %r8d
+; AVX2-NEXT: movl $1, %eax
+; AVX2-NEXT: xorl %esi, %esi
+; AVX2-NEXT: shldq %cl, %rax, %rsi
; AVX2-NEXT: movl %edx, %edx
+; AVX2-NEXT: xorl %r8d, %r8d
+; AVX2-NEXT: shldq %cl, %rdx, %r8
; AVX2-NEXT: xorl %r9d, %r9d
-; AVX2-NEXT: shldq %cl, %rdx, %r9
-; AVX2-NEXT: shlxq %rcx, %rsi, %rsi
+; AVX2-NEXT: shlxq %rcx, %rax, %rax
; AVX2-NEXT: testb $64, %cl
-; AVX2-NEXT: cmovneq %rsi, %rax
-; AVX2-NEXT: cmovneq %r8, %rsi
-; AVX2-NEXT: shlxq %rcx, %rdx, %rcx
-; AVX2-NEXT: cmovneq %rcx, %r9
-; AVX2-NEXT: cmovneq %r8, %rcx
-; AVX2-NEXT: movq (%rdi), %rdx
-; AVX2-NEXT: movq 8(%rdi), %r8
-; AVX2-NEXT: andnq %r8, %rax, %r10
-; AVX2-NEXT: andq %rax, %r8
-; AVX2-NEXT: andnq %rdx, %rsi, %r11
-; AVX2-NEXT: andq %rsi, %rdx
-; AVX2-NEXT: orq %r9, %r10
-; AVX2-NEXT: orq %rcx, %r11
-; AVX2-NEXT: orq %r8, %rdx
-; AVX2-NEXT: sete %al
-; AVX2-NEXT: movq %r11, (%rdi)
-; AVX2-NEXT: movq %r10, 8(%rdi)
+; AVX2-NEXT: cmovneq %rax, %rsi
+; AVX2-NEXT: cmovneq %r9, %rax
+; AVX2-NEXT: shlxq %rcx, %rdx, %rdx
+; AVX2-NEXT: cmovneq %rdx, %r8
+; AVX2-NEXT: cmovneq %r9, %rdx
+; AVX2-NEXT: andnq 8(%rdi), %rsi, %rsi
+; AVX2-NEXT: orq %r8, %rsi
+; AVX2-NEXT: andnq (%rdi), %rax, %r8
+; AVX2-NEXT: orq %rdx, %r8
+; AVX2-NEXT: movl %ecx, %eax
+; AVX2-NEXT: andl $96, %eax
+; AVX2-NEXT: shrl $3, %eax
+; AVX2-NEXT: movl (%rdi,%rax), %eax
+; AVX2-NEXT: btl %ecx, %eax
+; AVX2-NEXT: setae %al
+; AVX2-NEXT: movq %r8, (%rdi)
+; AVX2-NEXT: movq %rsi, 8(%rdi)
; AVX2-NEXT: retq
;
; AVX512-LABEL: init_eq_i128:
; AVX512: # %bb.0:
; AVX512-NEXT: movl %esi, %ecx
-; AVX512-NEXT: xorl %eax, %eax
-; AVX512-NEXT: movl $1, %esi
+; AVX512-NEXT: movl $1, %eax
+; AVX512-NEXT: xorl %esi, %esi
+; AVX512-NEXT: shldq %cl, %rax, %rsi
; AVX512-NEXT: xorl %r8d, %r8d
-; AVX512-NEXT: shldq %cl, %rsi, %r8
-; AVX512-NEXT: shlxq %rcx, %rsi, %rsi
+; AVX512-NEXT: shlxq %rcx, %rax, %rax
; AVX512-NEXT: movl %edx, %edx
; AVX512-NEXT: xorl %r9d, %r9d
; AVX512-NEXT: shldq %cl, %rdx, %r9
; AVX512-NEXT: testb $64, %cl
-; AVX512-NEXT: cmovneq %rsi, %r8
; AVX512-NEXT: cmovneq %rax, %rsi
-; AVX512-NEXT: shlxq %rcx, %rdx, %rcx
-; AVX512-NEXT: cmovneq %rcx, %r9
-; AVX512-NEXT: cmovneq %rax, %rcx
-; AVX512-NEXT: movq (%rdi), %rax
-; AVX512-NEXT: movq 8(%rdi), %rdx
-; AVX512-NEXT: andnq %rdx, %r8, %r10
-; AVX512-NEXT: andq %r8, %rdx
-; AVX512-NEXT: andnq %rax, %rsi, %r8
-; AVX512-NEXT: andq %rsi, %rax
-; AVX512-NEXT: orq %r9, %r10
-; AVX512-NEXT: orq %rcx, %r8
-; AVX512-NEXT: orq %rdx, %rax
-; AVX512-NEXT: sete %al
+; AVX512-NEXT: cmovneq %r8, %rax
+; AVX512-NEXT: shlxq %rcx, %rdx, %rdx
+; AVX512-NEXT: cmovneq %rdx, %r9
+; AVX512-NEXT: cmovneq %r8, %rdx
+; AVX512-NEXT: andnq 8(%rdi), %rsi, %rsi
+; AVX512-NEXT: orq %r9, %rsi
+; AVX512-NEXT: andnq (%rdi), %rax, %r8
+; AVX512-NEXT: orq %rdx, %r8
+; AVX512-NEXT: movl %ecx, %eax
+; AVX512-NEXT: andl $96, %eax
+; AVX512-NEXT: shrl $3, %eax
+; AVX512-NEXT: movl (%rdi,%rax), %eax
+; AVX512-NEXT: btl %ecx, %eax
+; AVX512-NEXT: setae %al
; AVX512-NEXT: movq %r8, (%rdi)
-; AVX512-NEXT: movq %r10, 8(%rdi)
+; AVX512-NEXT: movq %rsi, 8(%rdi)
; AVX512-NEXT: retq
%rem = and i32 %position, 127
%ofs = zext nneg i32 %rem to i128
@@ -1252,344 +822,25 @@ define i1 @init_eq_i128(ptr %word, i32 %position, i1 zeroext %value) nounwind {
define i1 @test_ne_i512(ptr %word, i32 %position) nounwind {
; X86-LABEL: test_ne_i512:
; X86: # %bb.0:
-; X86-NEXT: pushl %ebp
-; X86-NEXT: movl %esp, %ebp
-; X86-NEXT: pushl %ebx
-; X86-NEXT: pushl %edi
-; X86-NEXT: pushl %esi
-; X86-NEXT: andl $-16, %esp
-; X86-NEXT: subl $224, %esp
-; X86-NEXT: movl 12(%ebp), %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: shrl $3, %eax
-; X86-NEXT: andl $60, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: leal {{[0-9]+}}(%esp), %edx
-; X86-NEXT: subl %eax, %edx
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $1, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl 24(%edx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 28(%edx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl $31, %ecx
-; X86-NEXT: shldl %cl, %esi, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 56(%edx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 60(%edx), %eax
-; X86-NEXT: shldl %cl, %esi, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 8(%edx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 12(%edx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %esi, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 40(%edx), %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 44(%edx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edi, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 16(%edx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 20(%edx), %edi
-; X86-NEXT: movl %edi, %ebx
-; X86-NEXT: shldl %cl, %eax, %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 32(%edx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 36(%edx), %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %esi, %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl 52(%edx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl 4(%edx), %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: shldl %cl, %edi, %esi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: shldl %cl, %edi, %eax
-; X86-NEXT: movl 8(%ebp), %ebx
-; X86-NEXT: andl 40(%ebx), %eax
-; X86-NEXT: andl 8(%ebx), %esi
-; X86-NEXT: orl %eax, %esi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 56(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: andl 24(%ebx), %edi
-; X86-NEXT: orl %eax, %edi
-; X86-NEXT: orl %esi, %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %ebx, %edi
-; X86-NEXT: andl 44(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: andl 12(%ebx), %esi
-; X86-NEXT: orl %eax, %esi
-; X86-NEXT: movl %esi, %ebx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: andl 60(%edi), %esi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 28(%edi), %eax
-; X86-NEXT: orl %esi, %eax
-; X86-NEXT: orl %ebx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl (%edx), %esi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: shldl %cl, %edx, %edi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: shldl %cl, %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: negl %edx
-; X86-NEXT: movl 192(%esp,%edx), %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: shldl %cl, %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
-; X86-NEXT: shldl %cl, %ebx, %edx
-; X86-NEXT: # kill: def $cl killed $cl killed $ecx
-; X86-NEXT: shll %cl, %esi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl 8(%ebp), %ebx
-; X86-NEXT: andl 32(%ebx), %ecx
-; X86-NEXT: andl (%ebx), %esi
-; X86-NEXT: orl %ecx, %esi
-; X86-NEXT: andl 16(%ebx), %edi
-; X86-NEXT: andl 48(%ebx), %edx
-; X86-NEXT: orl %edi, %edx
-; X86-NEXT: orl %esi, %edx
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 36(%ebx), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: andl 4(%ebx), %esi
-; X86-NEXT: orl %ecx, %esi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 20(%ebx), %ecx
-; X86-NEXT: andl 52(%ebx), %eax
-; X86-NEXT: orl %ecx, %eax
-; X86-NEXT: orl %esi, %eax
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: orl %edx, %eax
-; X86-NEXT: setne %al
-; X86-NEXT: leal -12(%ebp), %esp
-; X86-NEXT: popl %esi
-; X86-NEXT: popl %edi
-; X86-NEXT: popl %ebx
-; X86-NEXT: popl %ebp
+; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: shrl $3, %edx
+; X86-NEXT: andl $60, %edx
+; X86-NEXT: movl (%eax,%edx), %eax
+; X86-NEXT: btl %ecx, %eax
+; X86-NEXT: setb %al
; X86-NEXT: retl
;
-; SSE-LABEL: test_ne_i512:
-; SSE: # %bb.0:
-; SSE-NEXT: pushq %r15
-; SSE-NEXT: pushq %r14
-; SSE-NEXT: pushq %rbx
-; SSE-NEXT: xorps %xmm0, %xmm0
-; SSE-NEXT: movups %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movq $0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movq $1, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movl %esi, %ecx
-; SSE-NEXT: andl $63, %ecx
-; SSE-NEXT: shrl $3, %esi
-; SSE-NEXT: andl $56, %esi
-; SSE-NEXT: negl %esi
-; SSE-NEXT: movslq %esi, %rbx
-; SSE-NEXT: movq -48(%rsp,%rbx), %rdx
-; SSE-NEXT: movq -40(%rsp,%rbx), %r14
-; SSE-NEXT: movq %r14, %rax
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq -16(%rsp,%rbx), %r11
-; SSE-NEXT: movq -8(%rsp,%rbx), %r10
-; SSE-NEXT: shldq %cl, %r11, %r10
-; SSE-NEXT: movq -32(%rsp,%rbx), %r9
-; SSE-NEXT: movq -24(%rsp,%rbx), %r15
-; SSE-NEXT: movq %r15, %r8
-; SSE-NEXT: shldq %cl, %r9, %r8
-; SSE-NEXT: movq -56(%rsp,%rbx), %rsi
-; SSE-NEXT: shldq %cl, %rsi, %rdx
-; SSE-NEXT: shldq %cl, %r15, %r11
-; SSE-NEXT: shldq %cl, %r14, %r9
-; SSE-NEXT: movq -64(%rsp,%rbx), %rbx
-; SSE-NEXT: shldq %cl, %rbx, %rsi
-; SSE-NEXT: # kill: def $cl killed $cl killed $ecx
-; SSE-NEXT: shlq %cl, %rbx
-; SSE-NEXT: andq 32(%rdi), %r9
-; SSE-NEXT: andq 48(%rdi), %r11
-; SSE-NEXT: andq 16(%rdi), %rdx
-; SSE-NEXT: orq %r11, %rdx
-; SSE-NEXT: andq 40(%rdi), %r8
-; SSE-NEXT: andq 56(%rdi), %r10
-; SSE-NEXT: andq 24(%rdi), %rax
-; SSE-NEXT: orq %r10, %rax
-; SSE-NEXT: andq (%rdi), %rbx
-; SSE-NEXT: orq %r9, %rbx
-; SSE-NEXT: orq %rdx, %rbx
-; SSE-NEXT: andq 8(%rdi), %rsi
-; SSE-NEXT: orq %r8, %rsi
-; SSE-NEXT: orq %rax, %rsi
-; SSE-NEXT: orq %rbx, %rsi
-; SSE-NEXT: setne %al
-; SSE-NEXT: popq %rbx
-; SSE-NEXT: popq %r14
-; SSE-NEXT: popq %r15
-; SSE-NEXT: retq
-;
-; AVX2-LABEL: test_ne_i512:
-; AVX2: # %bb.0:
-; AVX2-NEXT: pushq %r15
-; AVX2-NEXT: pushq %r14
-; AVX2-NEXT: pushq %rbx
-; AVX2-NEXT: vxorps %xmm0, %xmm0, %xmm0
-; AVX2-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovss {{.*#+}} xmm0 = [1,0,0,0]
-; AVX2-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX2-NEXT: movl %esi, %ecx
-; AVX2-NEXT: andl $63, %ecx
-; AVX2-NEXT: shrl $3, %esi
-; AVX2-NEXT: andl $56, %esi
-; AVX2-NEXT: negl %esi
-; AVX2-NEXT: movslq %esi, %rsi
-; AVX2-NEXT: movq -48(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq -40(%rsp,%rsi), %rbx
-; AVX2-NEXT: movq %rbx, %rax
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq -16(%rsp,%rsi), %r11
-; AVX2-NEXT: movq -8(%rsp,%rsi), %r10
-; AVX2-NEXT: shldq %cl, %r11, %r10
-; AVX2-NEXT: movq -32(%rsp,%rsi), %r9
-; AVX2-NEXT: movq -24(%rsp,%rsi), %r14
-; AVX2-NEXT: movq %r14, %r8
-; AVX2-NEXT: shldq %cl, %r9, %r8
-; AVX2-NEXT: movq -64(%rsp,%rsi), %r15
-; AVX2-NEXT: movq -56(%rsp,%rsi), %rsi
-; AVX2-NEXT: shldq %cl, %rsi, %rdx
-; AVX2-NEXT: shldq %cl, %r14, %r11
-; AVX2-NEXT: shldq %cl, %rbx, %r9
-; AVX2-NEXT: shldq %cl, %r15, %rsi
-; AVX2-NEXT: shlxq %rcx, %r15, %rcx
-; AVX2-NEXT: andq 32(%rdi), %r9
-; AVX2-NEXT: andq 48(%rdi), %r11
-; AVX2-NEXT: andq 16(%rdi), %rdx
-; AVX2-NEXT: andq 40(%rdi), %r8
-; AVX2-NEXT: andq 56(%rdi), %r10
-; AVX2-NEXT: andq 24(%rdi), %rax
-; AVX2-NEXT: orq %r11, %rdx
-; AVX2-NEXT: orq %r10, %rax
-; AVX2-NEXT: andq (%rdi), %rcx
-; AVX2-NEXT: orq %r9, %rcx
-; AVX2-NEXT: orq %rdx, %rcx
-; AVX2-NEXT: andq 8(%rdi), %rsi
-; AVX2-NEXT: orq %r8, %rsi
-; AVX2-NEXT: orq %rax, %rsi
-; AVX2-NEXT: orq %rcx, %rsi
-; AVX2-NEXT: setne %al
-; AVX2-NEXT: popq %rbx
-; AVX2-NEXT: popq %r14
-; AVX2-NEXT: popq %r15
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
-;
-; AVX512-LABEL: test_ne_i512:
-; AVX512: # %bb.0:
-; AVX512-NEXT: pushq %r15
-; AVX512-NEXT: pushq %r14
-; AVX512-NEXT: pushq %rbx
-; AVX512-NEXT: vxorps %xmm0, %xmm0, %xmm0
-; AVX512-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovaps {{.*#+}} xmm0 = [1,0,0,0]
-; AVX512-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX512-NEXT: movl %esi, %ecx
-; AVX512-NEXT: andl $63, %ecx
-; AVX512-NEXT: shrl $3, %esi
-; AVX512-NEXT: andl $56, %esi
-; AVX512-NEXT: negl %esi
-; AVX512-NEXT: movslq %esi, %rbx
-; AVX512-NEXT: movq -48(%rsp,%rbx), %rdx
-; AVX512-NEXT: movq -40(%rsp,%rbx), %r14
-; AVX512-NEXT: movq %r14, %rax
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq -16(%rsp,%rbx), %r11
-; AVX512-NEXT: movq -8(%rsp,%rbx), %r10
-; AVX512-NEXT: shldq %cl, %r11, %r10
-; AVX512-NEXT: movq -32(%rsp,%rbx), %r9
-; AVX512-NEXT: movq -24(%rsp,%rbx), %r15
-; AVX512-NEXT: movq %r15, %r8
-; AVX512-NEXT: shldq %cl, %r9, %r8
-; AVX512-NEXT: movq -56(%rsp,%rbx), %rsi
-; AVX512-NEXT: shldq %cl, %rsi, %rdx
-; AVX512-NEXT: shldq %cl, %r15, %r11
-; AVX512-NEXT: shldq %cl, %r14, %r9
-; AVX512-NEXT: movq -64(%rsp,%rbx), %rbx
-; AVX512-NEXT: shldq %cl, %rbx, %rsi
-; AVX512-NEXT: shlxq %rcx, %rbx, %rcx
-; AVX512-NEXT: andq 32(%rdi), %r9
-; AVX512-NEXT: andq 48(%rdi), %r11
-; AVX512-NEXT: andq 16(%rdi), %rdx
-; AVX512-NEXT: andq 40(%rdi), %r8
-; AVX512-NEXT: andq 56(%rdi), %r10
-; AVX512-NEXT: andq 24(%rdi), %rax
-; AVX512-NEXT: orq %r11, %rdx
-; AVX512-NEXT: orq %r10, %rax
-; AVX512-NEXT: andq (%rdi), %rcx
-; AVX512-NEXT: orq %r9, %rcx
-; AVX512-NEXT: orq %rdx, %rcx
-; AVX512-NEXT: andq 8(%rdi), %rsi
-; AVX512-NEXT: orq %r8, %rsi
-; AVX512-NEXT: orq %rax, %rsi
-; AVX512-NEXT: orq %rcx, %rsi
-; AVX512-NEXT: setne %al
-; AVX512-NEXT: popq %rbx
-; AVX512-NEXT: popq %r14
-; AVX512-NEXT: popq %r15
-; AVX512-NEXT: vzeroupper
-; AVX512-NEXT: retq
+; X64-LABEL: test_ne_i512:
+; X64: # %bb.0:
+; X64-NEXT: movl %esi, %eax
+; X64-NEXT: shrl $3, %eax
+; X64-NEXT: andl $60, %eax
+; X64-NEXT: movl (%rdi,%rax), %eax
+; X64-NEXT: btl %esi, %eax
+; X64-NEXT: setb %al
+; X64-NEXT: retq
%rem = and i32 %position, 511
%ofs = zext nneg i32 %rem to i512
%bit = shl nuw i512 1, %ofs
@@ -1602,572 +853,33 @@ define i1 @test_ne_i512(ptr %word, i32 %position) nounwind {
define i1 @complement_ne_i512(ptr %word, i32 %position) nounwind {
; X86-LABEL: complement_ne_i512:
; X86: # %bb.0:
-; X86-NEXT: pushl %ebp
-; X86-NEXT: movl %esp, %ebp
-; X86-NEXT: pushl %ebx
; X86-NEXT: pushl %edi
; X86-NEXT: pushl %esi
-; X86-NEXT: andl $-16, %esp
-; X86-NEXT: subl $272, %esp # imm = 0x110
-; X86-NEXT: movl 12(%ebp), %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: shrl $3, %eax
-; X86-NEXT: andl $60, %eax
-; X86-NEXT: movl %eax, (%esp) # 4-byte Spill
-; X86-NEXT: leal {{[0-9]+}}(%esp), %edx
-; X86-NEXT: subl %eax, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $1, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl 24(%edx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 28(%edx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl $31, %ecx
-; X86-NEXT: shldl %cl, %eax, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 56(%edx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 60(%edx), %esi
-; X86-NEXT: shldl %cl, %eax, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 8(%edx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 12(%edx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %eax, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 40(%edx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 44(%edx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %eax, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 16(%edx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 20(%edx), %ebx
-; X86-NEXT: movl %ebx, %esi
-; X86-NEXT: shldl %cl, %eax, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 32(%edx), %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 36(%edx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edi, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl 52(%edx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: shldl %cl, %esi, %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 4(%edx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 8(%ebp), %edx
-; X86-NEXT: movl 40(%edx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %esi, %eax
-; X86-NEXT: movl 8(%edx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ebx, %esi
-; X86-NEXT: orl %eax, %esi
-; X86-NEXT: movl %edx, %eax
-; X86-NEXT: movl 56(%edx), %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %edi, %ebx
-; X86-NEXT: movl 24(%edx), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: orl %ebx, %edx
-; X86-NEXT: orl %esi, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 44(%eax), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
-; X86-NEXT: movl 12(%eax), %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
-; X86-NEXT: orl %esi, %ebx
-; X86-NEXT: movl 60(%eax), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl %eax, %esi
-; X86-NEXT: movl %edx, %eax
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: movl 28(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: orl %ebx, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl (%eax), %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl (%esp), %eax # 4-byte Reload
-; X86-NEXT: negl %eax
-; X86-NEXT: movl 240(%esp,%eax), %esi
-; X86-NEXT: shldl %cl, %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: shldl %cl, %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, %esi
-; X86-NEXT: movl %esi, (%esp) # 4-byte Spill
-; X86-NEXT: # kill: def $cl killed $cl killed $ecx
-; X86-NEXT: shll %cl, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 8(%ebp), %esi
-; X86-NEXT: movl 32(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %edi, %eax
-; X86-NEXT: movl (%esi), %ecx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %edx, %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl 16(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ebx, %eax
-; X86-NEXT: movl 48(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl (%esp), %edx # 4-byte Folded Reload
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: orl %ecx, %edx
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl 36(%esi), %ebx
-; X86-NEXT: movl %ebx, %eax
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: movl 4(%esi), %ecx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl %esi, %eax
-; X86-NEXT: movl 20(%esi), %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: andl %esi, %edi
-; X86-NEXT: movl 52(%eax), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: orl %edi, %eax
-; X86-NEXT: orl %ecx, %eax
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: xorl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: xorl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: xorl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: xorl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: xorl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: xorl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: xorl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: xorl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: xorl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: xorl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: xorl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
-; X86-NEXT: xorl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: xorl %ecx, (%esp) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: xorl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: xorl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: xorl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
-; X86-NEXT: orl %edx, %eax
-; X86-NEXT: movl 8(%ebp), %edx
-; X86-NEXT: movl %ebx, 60(%edx)
-; X86-NEXT: movl %edi, 56(%edx)
-; X86-NEXT: movl %ecx, 52(%edx)
-; X86-NEXT: movl %esi, 44(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 40(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 36(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 32(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 28(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 24(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 20(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 16(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 12(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 8(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 4(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, (%edx)
-; X86-NEXT: movl (%esp), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 48(%edx)
-; X86-NEXT: setne %al
-; X86-NEXT: leal -12(%ebp), %esp
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
+; X86-NEXT: movl %edx, %esi
+; X86-NEXT: shrl $3, %esi
+; X86-NEXT: andl $60, %esi
+; X86-NEXT: movl (%ecx,%esi), %edi
+; X86-NEXT: btl %edx, %edi
+; X86-NEXT: setb %al
+; X86-NEXT: btcl %edx, %edi
+; X86-NEXT: movl %edi, (%ecx,%esi)
; X86-NEXT: popl %esi
; X86-NEXT: popl %edi
-; X86-NEXT: popl %ebx
-; X86-NEXT: popl %ebp
; X86-NEXT: retl
;
-; SSE-LABEL: complement_ne_i512:
-; SSE: # %bb.0:
-; SSE-NEXT: pushq %rbp
-; SSE-NEXT: pushq %r15
-; SSE-NEXT: pushq %r14
-; SSE-NEXT: pushq %r13
-; SSE-NEXT: pushq %r12
-; SSE-NEXT: pushq %rbx
-; SSE-NEXT: subq $56, %rsp
-; SSE-NEXT: xorps %xmm0, %xmm0
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movq $0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movq $1, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movl %esi, %ecx
-; SSE-NEXT: andl $63, %ecx
-; SSE-NEXT: shrl $3, %esi
-; SSE-NEXT: andl $56, %esi
-; SSE-NEXT: negl %esi
-; SSE-NEXT: movslq %esi, %rbx
-; SSE-NEXT: movq (%rsp,%rbx), %rsi
-; SSE-NEXT: movq 8(%rsp,%rbx), %r14
-; SSE-NEXT: movq %r14, %rax
-; SSE-NEXT: shldq %cl, %rsi, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 32(%rsp,%rbx), %r8
-; SSE-NEXT: movq 40(%rsp,%rbx), %rbp
-; SSE-NEXT: shldq %cl, %r8, %rbp
-; SSE-NEXT: movq 16(%rsp,%rbx), %r9
-; SSE-NEXT: movq 24(%rsp,%rbx), %r15
-; SSE-NEXT: movq %r15, %r10
-; SSE-NEXT: shldq %cl, %r9, %r10
-; SSE-NEXT: movq -8(%rsp,%rbx), %r11
-; SSE-NEXT: shldq %cl, %r11, %rsi
-; SSE-NEXT: shldq %cl, %r15, %r8
-; SSE-NEXT: shldq %cl, %r14, %r9
-; SSE-NEXT: movq -16(%rsp,%rbx), %rbx
-; SSE-NEXT: shldq %cl, %rbx, %r11
-; SSE-NEXT: # kill: def $cl killed $cl killed $ecx
-; SSE-NEXT: shlq %cl, %rbx
-; SSE-NEXT: movq 24(%rdi), %r15
-; SSE-NEXT: movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 56(%rdi), %rcx
-; SSE-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 16(%rdi), %r12
-; SSE-NEXT: movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 48(%rdi), %r13
-; SSE-NEXT: movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: andq %r8, %r13
-; SSE-NEXT: andq %rsi, %r12
-; SSE-NEXT: orq %r13, %r12
-; SSE-NEXT: movq %rcx, %r13
-; SSE-NEXT: andq %rbp, %r13
-; SSE-NEXT: andq %rax, %r15
-; SSE-NEXT: orq %r13, %r15
-; SSE-NEXT: movq 32(%rdi), %r14
-; SSE-NEXT: movq %r14, %rcx
-; SSE-NEXT: andq %r9, %rcx
-; SSE-NEXT: movq (%rdi), %r13
-; SSE-NEXT: movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: andq %rbx, %r13
-; SSE-NEXT: orq %rcx, %r13
-; SSE-NEXT: orq %r12, %r13
-; SSE-NEXT: movq 40(%rdi), %rcx
-; SSE-NEXT: movq %rcx, %r12
-; SSE-NEXT: andq %r10, %r12
-; SSE-NEXT: movq 8(%rdi), %rdx
-; SSE-NEXT: movq %rdx, %rax
-; SSE-NEXT: andq %r11, %rax
-; SSE-NEXT: orq %r12, %rax
-; SSE-NEXT: orq %r15, %rax
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; SSE-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Folded Reload
-; SSE-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload
-; SSE-NEXT: xorq %rcx, %r10
-; SSE-NEXT: xorq %r14, %r9
-; SSE-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Folded Reload
-; SSE-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Folded Reload
-; SSE-NEXT: xorq %rdx, %r11
-; SSE-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Folded Reload
-; SSE-NEXT: orq %r13, %rax
-; SSE-NEXT: movq %r8, 48(%rdi)
-; SSE-NEXT: movq %rbp, 56(%rdi)
-; SSE-NEXT: movq %r9, 32(%rdi)
-; SSE-NEXT: movq %r10, 40(%rdi)
-; SSE-NEXT: movq %rsi, 16(%rdi)
-; SSE-NEXT: movq %r15, 24(%rdi)
-; SSE-NEXT: movq %rbx, (%rdi)
-; SSE-NEXT: movq %r11, 8(%rdi)
-; SSE-NEXT: setne %al
-; SSE-NEXT: addq $56, %rsp
-; SSE-NEXT: popq %rbx
-; SSE-NEXT: popq %r12
-; SSE-NEXT: popq %r13
-; SSE-NEXT: popq %r14
-; SSE-NEXT: popq %r15
-; SSE-NEXT: popq %rbp
-; SSE-NEXT: retq
-;
-; AVX2-LABEL: complement_ne_i512:
-; AVX2: # %bb.0:
-; AVX2-NEXT: pushq %rbp
-; AVX2-NEXT: pushq %r15
-; AVX2-NEXT: pushq %r14
-; AVX2-NEXT: pushq %r13
-; AVX2-NEXT: pushq %r12
-; AVX2-NEXT: pushq %rbx
-; AVX2-NEXT: subq $72, %rsp
-; AVX2-NEXT: vxorps %xmm0, %xmm0, %xmm0
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovss {{.*#+}} xmm0 = [1,0,0,0]
-; AVX2-NEXT: vmovups %ymm0, (%rsp)
-; AVX2-NEXT: movl %esi, %ecx
-; AVX2-NEXT: andl $63, %ecx
-; AVX2-NEXT: shrl $3, %esi
-; AVX2-NEXT: andl $56, %esi
-; AVX2-NEXT: negl %esi
-; AVX2-NEXT: movslq %esi, %rbx
-; AVX2-NEXT: movq 16(%rsp,%rbx), %rsi
-; AVX2-NEXT: movq 24(%rsp,%rbx), %rbp
-; AVX2-NEXT: movq %rbp, %rax
-; AVX2-NEXT: shldq %cl, %rsi, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 48(%rsp,%rbx), %r8
-; AVX2-NEXT: movq 56(%rsp,%rbx), %r13
-; AVX2-NEXT: shldq %cl, %r8, %r13
-; AVX2-NEXT: movq 32(%rsp,%rbx), %r9
-; AVX2-NEXT: movq 40(%rsp,%rbx), %r14
-; AVX2-NEXT: movq %r14, %r10
-; AVX2-NEXT: shldq %cl, %r9, %r10
-; AVX2-NEXT: movq 8(%rsp,%rbx), %r11
-; AVX2-NEXT: shldq %cl, %r11, %rsi
-; AVX2-NEXT: shldq %cl, %r14, %r8
-; AVX2-NEXT: movq 16(%rdi), %r12
-; AVX2-NEXT: movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 48(%rdi), %r14
-; AVX2-NEXT: movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: andq %r8, %r14
-; AVX2-NEXT: andq %rsi, %r12
-; AVX2-NEXT: orq %r14, %r12
-; AVX2-NEXT: movq 56(%rdi), %r15
-; AVX2-NEXT: movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: andq %r13, %r15
-; AVX2-NEXT: movq 24(%rdi), %r14
-; AVX2-NEXT: movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: andq %rax, %r14
-; AVX2-NEXT: orq %r15, %r14
-; AVX2-NEXT: shldq %cl, %rbp, %r9
-; AVX2-NEXT: movq (%rsp,%rbx), %rdx
-; AVX2-NEXT: movq 32(%rdi), %r15
-; AVX2-NEXT: movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: andq %r9, %r15
-; AVX2-NEXT: shlxq %rcx, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq (%rdi), %rbx
-; AVX2-NEXT: movq %rbx, %rbp
-; AVX2-NEXT: andq %rax, %rbp
-; AVX2-NEXT: orq %r15, %rbp
-; AVX2-NEXT: orq %r12, %rbp
-; AVX2-NEXT: # kill: def $cl killed $cl killed $rcx
-; AVX2-NEXT: shldq %cl, %rdx, %r11
-; AVX2-NEXT: movq 40(%rdi), %rax
-; AVX2-NEXT: movq %rax, %rcx
-; AVX2-NEXT: andq %r10, %rcx
-; AVX2-NEXT: movq 8(%rdi), %r15
-; AVX2-NEXT: movq %r15, %r12
-; AVX2-NEXT: andq %r11, %r12
-; AVX2-NEXT: orq %rcx, %r12
-; AVX2-NEXT: orq %r14, %r12
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
-; AVX2-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Folded Reload
-; AVX2-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload
-; AVX2-NEXT: xorq %rax, %r10
-; AVX2-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Folded Reload
-; AVX2-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Folded Reload
-; AVX2-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Folded Reload
-; AVX2-NEXT: xorq %r15, %r11
-; AVX2-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Folded Reload
-; AVX2-NEXT: orq %rbp, %r12
-; AVX2-NEXT: movq %r8, 48(%rdi)
-; AVX2-NEXT: movq %r13, 56(%rdi)
-; AVX2-NEXT: movq %r9, 32(%rdi)
-; AVX2-NEXT: movq %r10, 40(%rdi)
-; AVX2-NEXT: movq %rsi, 16(%rdi)
-; AVX2-NEXT: movq %rcx, 24(%rdi)
-; AVX2-NEXT: movq %rbx, (%rdi)
-; AVX2-NEXT: movq %r11, 8(%rdi)
-; AVX2-NEXT: setne %al
-; AVX2-NEXT: addq $72, %rsp
-; AVX2-NEXT: popq %rbx
-; AVX2-NEXT: popq %r12
-; AVX2-NEXT: popq %r13
-; AVX2-NEXT: popq %r14
-; AVX2-NEXT: popq %r15
-; AVX2-NEXT: popq %rbp
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
-;
-; AVX512-LABEL: complement_ne_i512:
-; AVX512: # %bb.0:
-; AVX512-NEXT: pushq %rbp
-; AVX512-NEXT: pushq %r15
-; AVX512-NEXT: pushq %r14
-; AVX512-NEXT: pushq %r13
-; AVX512-NEXT: pushq %r12
-; AVX512-NEXT: pushq %rbx
-; AVX512-NEXT: subq $72, %rsp
-; AVX512-NEXT: vxorps %xmm0, %xmm0, %xmm0
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovaps {{.*#+}} xmm0 = [1,0,0,0]
-; AVX512-NEXT: vmovups %ymm0, (%rsp)
-; AVX512-NEXT: movl %esi, %ecx
-; AVX512-NEXT: andl $63, %ecx
-; AVX512-NEXT: shrl $3, %esi
-; AVX512-NEXT: andl $56, %esi
-; AVX512-NEXT: negl %esi
-; AVX512-NEXT: movslq %esi, %rbx
-; AVX512-NEXT: movq 16(%rsp,%rbx), %rsi
-; AVX512-NEXT: movq 24(%rsp,%rbx), %rbp
-; AVX512-NEXT: movq %rbp, %rax
-; AVX512-NEXT: shldq %cl, %rsi, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 48(%rsp,%rbx), %r8
-; AVX512-NEXT: movq 56(%rsp,%rbx), %r13
-; AVX512-NEXT: shldq %cl, %r8, %r13
-; AVX512-NEXT: movq 32(%rsp,%rbx), %r9
-; AVX512-NEXT: movq 40(%rsp,%rbx), %r14
-; AVX512-NEXT: movq %r14, %r10
-; AVX512-NEXT: shldq %cl, %r9, %r10
-; AVX512-NEXT: movq 8(%rsp,%rbx), %r11
-; AVX512-NEXT: shldq %cl, %r11, %rsi
-; AVX512-NEXT: shldq %cl, %r14, %r8
-; AVX512-NEXT: movq 16(%rdi), %r12
-; AVX512-NEXT: movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 48(%rdi), %r14
-; AVX512-NEXT: movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: andq %r8, %r14
-; AVX512-NEXT: andq %rsi, %r12
-; AVX512-NEXT: orq %r14, %r12
-; AVX512-NEXT: movq 56(%rdi), %r15
-; AVX512-NEXT: movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: andq %r13, %r15
-; AVX512-NEXT: movq 24(%rdi), %r14
-; AVX512-NEXT: movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: andq %rax, %r14
-; AVX512-NEXT: orq %r15, %r14
-; AVX512-NEXT: shldq %cl, %rbp, %r9
-; AVX512-NEXT: movq (%rsp,%rbx), %rdx
-; AVX512-NEXT: movq 32(%rdi), %r15
-; AVX512-NEXT: movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: andq %r9, %r15
-; AVX512-NEXT: shlxq %rcx, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq (%rdi), %rbx
-; AVX512-NEXT: movq %rbx, %rbp
-; AVX512-NEXT: andq %rax, %rbp
-; AVX512-NEXT: orq %r15, %rbp
-; AVX512-NEXT: orq %r12, %rbp
-; AVX512-NEXT: # kill: def $cl killed $cl killed $rcx
-; AVX512-NEXT: shldq %cl, %rdx, %r11
-; AVX512-NEXT: movq 40(%rdi), %rax
-; AVX512-NEXT: movq %rax, %rcx
-; AVX512-NEXT: andq %r10, %rcx
-; AVX512-NEXT: movq 8(%rdi), %r15
-; AVX512-NEXT: movq %r15, %r12
-; AVX512-NEXT: andq %r11, %r12
-; AVX512-NEXT: orq %rcx, %r12
-; AVX512-NEXT: orq %r14, %r12
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
-; AVX512-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Folded Reload
-; AVX512-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload
-; AVX512-NEXT: xorq %rax, %r10
-; AVX512-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Folded Reload
-; AVX512-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Folded Reload
-; AVX512-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Folded Reload
-; AVX512-NEXT: xorq %r15, %r11
-; AVX512-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Folded Reload
-; AVX512-NEXT: orq %rbp, %r12
-; AVX512-NEXT: movq %r8, 48(%rdi)
-; AVX512-NEXT: movq %r13, 56(%rdi)
-; AVX512-NEXT: movq %r9, 32(%rdi)
-; AVX512-NEXT: movq %r10, 40(%rdi)
-; AVX512-NEXT: movq %rsi, 16(%rdi)
-; AVX512-NEXT: movq %rcx, 24(%rdi)
-; AVX512-NEXT: movq %rbx, (%rdi)
-; AVX512-NEXT: movq %r11, 8(%rdi)
-; AVX512-NEXT: setne %al
-; AVX512-NEXT: addq $72, %rsp
-; AVX512-NEXT: popq %rbx
-; AVX512-NEXT: popq %r12
-; AVX512-NEXT: popq %r13
-; AVX512-NEXT: popq %r14
-; AVX512-NEXT: popq %r15
-; AVX512-NEXT: popq %rbp
-; AVX512-NEXT: vzeroupper
-; AVX512-NEXT: retq
+; X64-LABEL: complement_ne_i512:
+; X64: # %bb.0:
+; X64-NEXT: movl %esi, %ecx
+; X64-NEXT: shrl $3, %ecx
+; X64-NEXT: andl $60, %ecx
+; X64-NEXT: movl (%rdi,%rcx), %edx
+; X64-NEXT: btl %esi, %edx
+; X64-NEXT: setb %al
+; X64-NEXT: btcl %esi, %edx
+; X64-NEXT: movl %edx, (%rdi,%rcx)
+; X64-NEXT: retq
%rem = and i32 %position, 511
%ofs = zext nneg i32 %rem to i512
%bit = shl nuw i512 1, %ofs
@@ -2182,606 +894,33 @@ define i1 @complement_ne_i512(ptr %word, i32 %position) nounwind {
define i1 @reset_eq_i512(ptr %word, i32 %position) nounwind {
; X86-LABEL: reset_eq_i512:
; X86: # %bb.0:
-; X86-NEXT: pushl %ebp
-; X86-NEXT: movl %esp, %ebp
-; X86-NEXT: pushl %ebx
; X86-NEXT: pushl %edi
; X86-NEXT: pushl %esi
-; X86-NEXT: andl $-16, %esp
-; X86-NEXT: subl $288, %esp # imm = 0x120
-; X86-NEXT: movl 12(%ebp), %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: shrl $3, %eax
-; X86-NEXT: andl $60, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: leal {{[0-9]+}}(%esp), %edi
-; X86-NEXT: subl %eax, %edi
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $1, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl 4(%edi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 8(%edi), %eax
-; X86-NEXT: andl $31, %ecx
-; X86-NEXT: movl %eax, %ebx
-; X86-NEXT: shldl %cl, %edx, %ebx
-; X86-NEXT: movl 12(%edi), %edx
-; X86-NEXT: movl %edx, %esi
-; X86-NEXT: shldl %cl, %eax, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 16(%edi), %eax
-; X86-NEXT: movl %eax, %esi
-; X86-NEXT: shldl %cl, %edx, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 20(%edi), %edx
-; X86-NEXT: movl %edx, %esi
-; X86-NEXT: shldl %cl, %eax, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 24(%edi), %eax
-; X86-NEXT: movl %eax, %esi
-; X86-NEXT: shldl %cl, %edx, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 28(%edi), %edx
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
; X86-NEXT: movl %edx, %esi
-; X86-NEXT: shldl %cl, %eax, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 32(%edi), %eax
-; X86-NEXT: movl %eax, %esi
-; X86-NEXT: shldl %cl, %edx, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 36(%edi), %esi
-; X86-NEXT: movl %esi, %edx
-; X86-NEXT: shldl %cl, %eax, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 40(%edi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %esi, %edx
-; X86-NEXT: movl 8(%ebp), %esi
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 40(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %eax, %edx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 8(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %eax, %ebx
-; X86-NEXT: orl %edx, %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 44(%edi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, %edx
-; X86-NEXT: movl 52(%edi), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 56(%edi), %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: # kill: def $cl killed $cl killed $ecx
-; X86-NEXT: shldl %cl, %esi, %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 8(%ebp), %esi
-; X86-NEXT: movl 56(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %eax, %ebx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 24(%esi), %ecx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ecx, %eax
-; X86-NEXT: orl %ebx, %eax
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl %esi, %ebx
-; X86-NEXT: movl 44(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %eax, %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 12(%esi), %ecx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ecx, %eax
-; X86-NEXT: orl %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 60(%edi), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: shldl %cl, %esi, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 60(%ebx), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %edx, %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 28(%ebx), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %edx, %esi
-; X86-NEXT: orl %eax, %esi
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl (%edi), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: negl %eax
-; X86-NEXT: movl 256(%esp,%eax), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: shldl %cl, %edi, %eax
-; X86-NEXT: movl %esi, %edi
-; X86-NEXT: # kill: def $cl killed $cl killed $ecx
-; X86-NEXT: shll %cl, %edi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl %ebx, %esi
-; X86-NEXT: movl 32(%ebx), %ecx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ecx, %edx
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl (%ebx), %ecx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ecx, %edi
-; X86-NEXT: orl %edx, %edi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 16(%esi), %ecx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ecx, %ebx
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 48(%esi), %ecx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ecx, %eax
-; X86-NEXT: orl %ebx, %eax
-; X86-NEXT: orl %edi, %eax
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: shldl %cl, %edx, %edi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 36(%esi), %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ebx, %edx
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 4(%esi), %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ebx, %edi
-; X86-NEXT: orl %edx, %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: # kill: def $cl killed $cl killed $ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: shldl %cl, %edi, %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 20(%esi), %edi
-; X86-NEXT: andl %edi, %ecx
-; X86-NEXT: movl %ecx, %esi
-; X86-NEXT: movl %edx, %ecx
-; X86-NEXT: movl 8(%ebp), %ebx
-; X86-NEXT: movl 52(%ebx), %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ebx, %edx
-; X86-NEXT: orl %esi, %edx
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
-; X86-NEXT: notl %ebx
-; X86-NEXT: andl %edi, %ebx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: notl %esi
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: notl %edi
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: notl %edi
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: notl %edi
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
-; X86-NEXT: notl %ecx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
-; X86-NEXT: orl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl 8(%ebp), %eax
-; X86-NEXT: movl %edx, 60(%eax)
-; X86-NEXT: movl %esi, 56(%eax)
-; X86-NEXT: movl %ecx, 52(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl %ecx, 44(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl %ecx, 40(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl %ecx, 36(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl %ecx, 32(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl %ecx, 28(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl %ecx, 24(%eax)
-; X86-NEXT: movl %ebx, 20(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl %ecx, 16(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl %ecx, 12(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl %ecx, 8(%eax)
-; X86-NEXT: movl %edi, 4(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl %ecx, (%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl %ecx, 48(%eax)
-; X86-NEXT: sete %al
-; X86-NEXT: leal -12(%ebp), %esp
+; X86-NEXT: shrl $3, %esi
+; X86-NEXT: andl $60, %esi
+; X86-NEXT: movl (%ecx,%esi), %edi
+; X86-NEXT: btl %edx, %edi
+; X86-NEXT: setae %al
+; X86-NEXT: btrl %edx, %edi
+; X86-NEXT: movl %edi, (%ecx,%esi)
; X86-NEXT: popl %esi
; X86-NEXT: popl %edi
-; X86-NEXT: popl %ebx
-; X86-NEXT: popl %ebp
; X86-NEXT: retl
;
-; SSE-LABEL: reset_eq_i512:
-; SSE: # %bb.0:
-; SSE-NEXT: pushq %rbp
-; SSE-NEXT: pushq %r15
-; SSE-NEXT: pushq %r14
-; SSE-NEXT: pushq %r13
-; SSE-NEXT: pushq %r12
-; SSE-NEXT: pushq %rbx
-; SSE-NEXT: subq $56, %rsp
-; SSE-NEXT: xorps %xmm0, %xmm0
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movq $0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movq $1, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movl %esi, %ecx
-; SSE-NEXT: andl $63, %ecx
-; SSE-NEXT: shrl $3, %esi
-; SSE-NEXT: andl $56, %esi
-; SSE-NEXT: negl %esi
-; SSE-NEXT: movslq %esi, %rdx
-; SSE-NEXT: movq (%rsp,%rdx), %r9
-; SSE-NEXT: movq 8(%rsp,%rdx), %r8
-; SSE-NEXT: movq %r8, %rsi
-; SSE-NEXT: shldq %cl, %r9, %rsi
-; SSE-NEXT: movq -8(%rsp,%rdx), %rax
-; SSE-NEXT: shldq %cl, %rax, %r9
-; SSE-NEXT: movq 16(%rsp,%rdx), %r14
-; SSE-NEXT: movq 24(%rsp,%rdx), %r10
-; SSE-NEXT: movq %r10, %rbx
-; SSE-NEXT: shldq %cl, %r14, %rbx
-; SSE-NEXT: shldq %cl, %r8, %r14
-; SSE-NEXT: movq 32(%rsp,%rdx), %r13
-; SSE-NEXT: movq 40(%rsp,%rdx), %r12
-; SSE-NEXT: shldq %cl, %r13, %r12
-; SSE-NEXT: shldq %cl, %r10, %r13
-; SSE-NEXT: movq -16(%rsp,%rdx), %rdx
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: # kill: def $cl killed $cl killed $ecx
-; SSE-NEXT: shlq %cl, %rdx
-; SSE-NEXT: movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq %r12, %rbp
-; SSE-NEXT: movq %r9, %r15
-; SSE-NEXT: movq %rsi, %r11
-; SSE-NEXT: movq 16(%rdi), %r8
-; SSE-NEXT: movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 48(%rdi), %rcx
-; SSE-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: andq %rcx, %r13
-; SSE-NEXT: andq %r8, %r9
-; SSE-NEXT: orq %r13, %r9
-; SSE-NEXT: movq 56(%rdi), %rcx
-; SSE-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: andq %rcx, %r12
-; SSE-NEXT: movq 24(%rdi), %r10
-; SSE-NEXT: andq %r10, %rsi
-; SSE-NEXT: orq %r12, %rsi
-; SSE-NEXT: movq %r14, %r13
-; SSE-NEXT: movq 32(%rdi), %rcx
-; SSE-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: andq %rcx, %r14
-; SSE-NEXT: movq %rdx, %r12
-; SSE-NEXT: movq (%rdi), %rcx
-; SSE-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: andq %rcx, %rdx
-; SSE-NEXT: orq %r14, %rdx
-; SSE-NEXT: orq %r9, %rdx
-; SSE-NEXT: movq %rbx, %r14
-; SSE-NEXT: movq 40(%rdi), %rcx
-; SSE-NEXT: andq %rcx, %rbx
-; SSE-NEXT: movq %rax, %r9
-; SSE-NEXT: movq 8(%rdi), %r8
-; SSE-NEXT: andq %r8, %rax
-; SSE-NEXT: orq %rbx, %rax
-; SSE-NEXT: orq %rsi, %rax
-; SSE-NEXT: notq %r11
-; SSE-NEXT: andq %r10, %r11
-; SSE-NEXT: notq %r15
-; SSE-NEXT: andq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Folded Reload
-; SSE-NEXT: notq %r14
-; SSE-NEXT: andq %rcx, %r14
-; SSE-NEXT: notq %r13
-; SSE-NEXT: andq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Folded Reload
-; SSE-NEXT: notq %rbp
-; SSE-NEXT: andq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Folded Reload
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
-; SSE-NEXT: notq %rcx
-; SSE-NEXT: andq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Folded Reload
-; SSE-NEXT: notq %r9
-; SSE-NEXT: andq %r8, %r9
-; SSE-NEXT: notq %r12
-; SSE-NEXT: andq {{[-0-9]+}}(%r{{[sb]}}p), %r12 # 8-byte Folded Reload
-; SSE-NEXT: orq %rdx, %rax
-; SSE-NEXT: movq %rcx, 48(%rdi)
-; SSE-NEXT: movq %rbp, 56(%rdi)
-; SSE-NEXT: movq %r13, 32(%rdi)
-; SSE-NEXT: movq %r14, 40(%rdi)
-; SSE-NEXT: movq %r15, 16(%rdi)
-; SSE-NEXT: movq %r11, 24(%rdi)
-; SSE-NEXT: movq %r12, (%rdi)
-; SSE-NEXT: movq %r9, 8(%rdi)
-; SSE-NEXT: sete %al
-; SSE-NEXT: addq $56, %rsp
-; SSE-NEXT: popq %rbx
-; SSE-NEXT: popq %r12
-; SSE-NEXT: popq %r13
-; SSE-NEXT: popq %r14
-; SSE-NEXT: popq %r15
-; SSE-NEXT: popq %rbp
-; SSE-NEXT: retq
-;
-; AVX2-LABEL: reset_eq_i512:
-; AVX2: # %bb.0:
-; AVX2-NEXT: pushq %rbp
-; AVX2-NEXT: pushq %r15
-; AVX2-NEXT: pushq %r14
-; AVX2-NEXT: pushq %r13
-; AVX2-NEXT: pushq %r12
-; AVX2-NEXT: pushq %rbx
-; AVX2-NEXT: pushq %rax
-; AVX2-NEXT: vxorps %xmm0, %xmm0, %xmm0
-; AVX2-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovss {{.*#+}} xmm0 = [1,0,0,0]
-; AVX2-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX2-NEXT: movl %esi, %ecx
-; AVX2-NEXT: andl $63, %ecx
-; AVX2-NEXT: shrl $3, %esi
-; AVX2-NEXT: andl $56, %esi
-; AVX2-NEXT: negl %esi
-; AVX2-NEXT: movslq %esi, %rdx
-; AVX2-NEXT: movq -48(%rsp,%rdx), %r8
-; AVX2-NEXT: movq -40(%rsp,%rdx), %rbx
-; AVX2-NEXT: movq %rbx, %rax
-; AVX2-NEXT: shldq %cl, %r8, %rax
-; AVX2-NEXT: movq -16(%rsp,%rdx), %r10
-; AVX2-NEXT: movq -8(%rsp,%rdx), %rsi
-; AVX2-NEXT: shldq %cl, %r10, %rsi
-; AVX2-NEXT: movq -32(%rsp,%rdx), %r11
-; AVX2-NEXT: movq -24(%rsp,%rdx), %r14
-; AVX2-NEXT: movq %r14, %r9
-; AVX2-NEXT: shldq %cl, %r11, %r9
-; AVX2-NEXT: movq -64(%rsp,%rdx), %r15
-; AVX2-NEXT: movq -56(%rsp,%rdx), %rdx
-; AVX2-NEXT: shldq %cl, %rdx, %r8
-; AVX2-NEXT: shldq %cl, %r14, %r10
-; AVX2-NEXT: shldq %cl, %rbx, %r11
-; AVX2-NEXT: shldq %cl, %r15, %rdx
-; AVX2-NEXT: shlxq %rcx, %r15, %rcx
-; AVX2-NEXT: movq 24(%rdi), %rbx
-; AVX2-NEXT: movq 56(%rdi), %r14
-; AVX2-NEXT: movq 16(%rdi), %r15
-; AVX2-NEXT: movq 48(%rdi), %r13
-; AVX2-NEXT: movq 32(%rdi), %rbp
-; AVX2-NEXT: andnq %rbp, %r11, %r12
-; AVX2-NEXT: andq %r11, %rbp
-; AVX2-NEXT: andnq %r13, %r10, %r11
-; AVX2-NEXT: andq %r10, %r13
-; AVX2-NEXT: andnq %r15, %r8, %r10
-; AVX2-NEXT: andq %r8, %r15
-; AVX2-NEXT: movq 40(%rdi), %r8
-; AVX2-NEXT: orq %r13, %r15
-; AVX2-NEXT: andnq %r8, %r9, %r13
-; AVX2-NEXT: andq %r9, %r8
-; AVX2-NEXT: andnq %r14, %rsi, %r9
-; AVX2-NEXT: andq %rsi, %r14
-; AVX2-NEXT: andnq %rbx, %rax, %rsi
-; AVX2-NEXT: andq %rax, %rbx
-; AVX2-NEXT: movq (%rdi), %rax
-; AVX2-NEXT: orq %r14, %rbx
-; AVX2-NEXT: andnq %rax, %rcx, %r14
-; AVX2-NEXT: andq %rcx, %rax
-; AVX2-NEXT: orq %rbp, %rax
-; AVX2-NEXT: movq 8(%rdi), %rcx
-; AVX2-NEXT: orq %r15, %rax
-; AVX2-NEXT: andnq %rcx, %rdx, %r15
-; AVX2-NEXT: andq %rdx, %rcx
-; AVX2-NEXT: orq %r8, %rcx
-; AVX2-NEXT: orq %rbx, %rcx
-; AVX2-NEXT: orq %rax, %rcx
-; AVX2-NEXT: movq %r11, 48(%rdi)
-; AVX2-NEXT: movq %r9, 56(%rdi)
-; AVX2-NEXT: movq %r12, 32(%rdi)
-; AVX2-NEXT: movq %r13, 40(%rdi)
-; AVX2-NEXT: movq %r10, 16(%rdi)
-; AVX2-NEXT: movq %rsi, 24(%rdi)
-; AVX2-NEXT: movq %r14, (%rdi)
-; AVX2-NEXT: movq %r15, 8(%rdi)
-; AVX2-NEXT: sete %al
-; AVX2-NEXT: addq $8, %rsp
-; AVX2-NEXT: popq %rbx
-; AVX2-NEXT: popq %r12
-; AVX2-NEXT: popq %r13
-; AVX2-NEXT: popq %r14
-; AVX2-NEXT: popq %r15
-; AVX2-NEXT: popq %rbp
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
-;
-; AVX512-LABEL: reset_eq_i512:
-; AVX512: # %bb.0:
-; AVX512-NEXT: pushq %rbp
-; AVX512-NEXT: pushq %r15
-; AVX512-NEXT: pushq %r14
-; AVX512-NEXT: pushq %r13
-; AVX512-NEXT: pushq %r12
-; AVX512-NEXT: pushq %rbx
-; AVX512-NEXT: pushq %rax
-; AVX512-NEXT: vxorps %xmm0, %xmm0, %xmm0
-; AVX512-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovaps {{.*#+}} xmm0 = [1,0,0,0]
-; AVX512-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX512-NEXT: movl %esi, %ecx
-; AVX512-NEXT: andl $63, %ecx
-; AVX512-NEXT: shrl $3, %esi
-; AVX512-NEXT: andl $56, %esi
-; AVX512-NEXT: negl %esi
-; AVX512-NEXT: movslq %esi, %rbx
-; AVX512-NEXT: movq -48(%rsp,%rbx), %r8
-; AVX512-NEXT: movq -40(%rsp,%rbx), %r14
-; AVX512-NEXT: movq %r14, %rax
-; AVX512-NEXT: shldq %cl, %r8, %rax
-; AVX512-NEXT: movq -16(%rsp,%rbx), %r10
-; AVX512-NEXT: movq -8(%rsp,%rbx), %rsi
-; AVX512-NEXT: shldq %cl, %r10, %rsi
-; AVX512-NEXT: movq -32(%rsp,%rbx), %r11
-; AVX512-NEXT: movq -24(%rsp,%rbx), %r15
-; AVX512-NEXT: movq %r15, %r9
-; AVX512-NEXT: shldq %cl, %r11, %r9
-; AVX512-NEXT: movq -56(%rsp,%rbx), %rdx
-; AVX512-NEXT: shldq %cl, %rdx, %r8
-; AVX512-NEXT: shldq %cl, %r15, %r10
-; AVX512-NEXT: shldq %cl, %r14, %r11
-; AVX512-NEXT: movq -64(%rsp,%rbx), %rbx
-; AVX512-NEXT: shldq %cl, %rbx, %rdx
-; AVX512-NEXT: shlxq %rcx, %rbx, %rcx
-; AVX512-NEXT: movq 24(%rdi), %rbx
-; AVX512-NEXT: movq 56(%rdi), %r14
-; AVX512-NEXT: movq 16(%rdi), %r15
-; AVX512-NEXT: movq 48(%rdi), %r13
-; AVX512-NEXT: movq 32(%rdi), %rbp
-; AVX512-NEXT: andnq %rbp, %r11, %r12
-; AVX512-NEXT: andq %r11, %rbp
-; AVX512-NEXT: andnq %r13, %r10, %r11
-; AVX512-NEXT: andq %r10, %r13
-; AVX512-NEXT: andnq %r15, %r8, %r10
-; AVX512-NEXT: andq %r8, %r15
-; AVX512-NEXT: movq 40(%rdi), %r8
-; AVX512-NEXT: orq %r13, %r15
-; AVX512-NEXT: andnq %r8, %r9, %r13
-; AVX512-NEXT: andq %r9, %r8
-; AVX512-NEXT: andnq %r14, %rsi, %r9
-; AVX512-NEXT: andq %rsi, %r14
-; AVX512-NEXT: andnq %rbx, %rax, %rsi
-; AVX512-NEXT: andq %rax, %rbx
-; AVX512-NEXT: movq (%rdi), %rax
-; AVX512-NEXT: orq %r14, %rbx
-; AVX512-NEXT: andnq %rax, %rcx, %r14
-; AVX512-NEXT: andq %rcx, %rax
-; AVX512-NEXT: orq %rbp, %rax
-; AVX512-NEXT: movq 8(%rdi), %rcx
-; AVX512-NEXT: orq %r15, %rax
-; AVX512-NEXT: andnq %rcx, %rdx, %r15
-; AVX512-NEXT: andq %rdx, %rcx
-; AVX512-NEXT: orq %r8, %rcx
-; AVX512-NEXT: orq %rbx, %rcx
-; AVX512-NEXT: orq %rax, %rcx
-; AVX512-NEXT: movq %r11, 48(%rdi)
-; AVX512-NEXT: movq %r9, 56(%rdi)
-; AVX512-NEXT: movq %r12, 32(%rdi)
-; AVX512-NEXT: movq %r13, 40(%rdi)
-; AVX512-NEXT: movq %r10, 16(%rdi)
-; AVX512-NEXT: movq %rsi, 24(%rdi)
-; AVX512-NEXT: movq %r14, (%rdi)
-; AVX512-NEXT: movq %r15, 8(%rdi)
-; AVX512-NEXT: sete %al
-; AVX512-NEXT: addq $8, %rsp
-; AVX512-NEXT: popq %rbx
-; AVX512-NEXT: popq %r12
-; AVX512-NEXT: popq %r13
-; AVX512-NEXT: popq %r14
-; AVX512-NEXT: popq %r15
-; AVX512-NEXT: popq %rbp
-; AVX512-NEXT: vzeroupper
-; AVX512-NEXT: retq
+; X64-LABEL: reset_eq_i512:
+; X64: # %bb.0:
+; X64-NEXT: movl %esi, %ecx
+; X64-NEXT: shrl $3, %ecx
+; X64-NEXT: andl $60, %ecx
+; X64-NEXT: movl (%rdi,%rcx), %edx
+; X64-NEXT: btl %esi, %edx
+; X64-NEXT: setae %al
+; X64-NEXT: btrl %esi, %edx
+; X64-NEXT: movl %edx, (%rdi,%rcx)
+; X64-NEXT: retq
%rem = and i32 %position, 511
%ofs = zext nneg i32 %rem to i512
%bit = shl nuw i512 1, %ofs
@@ -2797,572 +936,33 @@ define i1 @reset_eq_i512(ptr %word, i32 %position) nounwind {
define i1 @set_ne_i512(ptr %word, i32 %position) nounwind {
; X86-LABEL: set_ne_i512:
; X86: # %bb.0:
-; X86-NEXT: pushl %ebp
-; X86-NEXT: movl %esp, %ebp
-; X86-NEXT: pushl %ebx
; X86-NEXT: pushl %edi
; X86-NEXT: pushl %esi
-; X86-NEXT: andl $-16, %esp
-; X86-NEXT: subl $272, %esp # imm = 0x110
-; X86-NEXT: movl 12(%ebp), %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: shrl $3, %eax
-; X86-NEXT: andl $60, %eax
-; X86-NEXT: movl %eax, (%esp) # 4-byte Spill
-; X86-NEXT: leal {{[0-9]+}}(%esp), %edx
-; X86-NEXT: subl %eax, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $1, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl 24(%edx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 28(%edx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl $31, %ecx
-; X86-NEXT: shldl %cl, %eax, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 56(%edx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 60(%edx), %esi
-; X86-NEXT: shldl %cl, %eax, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 8(%edx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 12(%edx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %eax, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 40(%edx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 44(%edx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %eax, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 16(%edx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 20(%edx), %ebx
-; X86-NEXT: movl %ebx, %esi
-; X86-NEXT: shldl %cl, %eax, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 32(%edx), %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 36(%edx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edi, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl 52(%edx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: shldl %cl, %esi, %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 4(%edx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 8(%ebp), %edx
-; X86-NEXT: movl 40(%edx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %esi, %eax
-; X86-NEXT: movl 8(%edx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ebx, %esi
-; X86-NEXT: orl %eax, %esi
-; X86-NEXT: movl %edx, %eax
-; X86-NEXT: movl 56(%edx), %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %edi, %ebx
-; X86-NEXT: movl 24(%edx), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: orl %ebx, %edx
-; X86-NEXT: orl %esi, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 44(%eax), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
-; X86-NEXT: movl 12(%eax), %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
-; X86-NEXT: orl %esi, %ebx
-; X86-NEXT: movl 60(%eax), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl %eax, %esi
-; X86-NEXT: movl %edx, %eax
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: movl 28(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: orl %ebx, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl (%eax), %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl (%esp), %eax # 4-byte Reload
-; X86-NEXT: negl %eax
-; X86-NEXT: movl 240(%esp,%eax), %esi
-; X86-NEXT: shldl %cl, %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: shldl %cl, %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, %esi
-; X86-NEXT: movl %esi, (%esp) # 4-byte Spill
-; X86-NEXT: # kill: def $cl killed $cl killed $ecx
-; X86-NEXT: shll %cl, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 8(%ebp), %esi
-; X86-NEXT: movl 32(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %edi, %eax
-; X86-NEXT: movl (%esi), %ecx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %edx, %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl 16(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ebx, %eax
-; X86-NEXT: movl 48(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl (%esp), %edx # 4-byte Folded Reload
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: orl %ecx, %edx
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl 36(%esi), %ebx
-; X86-NEXT: movl %ebx, %eax
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: movl 4(%esi), %ecx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl %esi, %eax
-; X86-NEXT: movl 20(%esi), %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: andl %esi, %edi
-; X86-NEXT: movl 52(%eax), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: orl %edi, %eax
-; X86-NEXT: orl %ecx, %eax
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: orl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: orl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: orl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: orl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: orl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: orl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: orl %ecx, (%esp) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: orl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: orl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
-; X86-NEXT: orl %edx, %eax
-; X86-NEXT: movl 8(%ebp), %edx
-; X86-NEXT: movl %ebx, 60(%edx)
-; X86-NEXT: movl %edi, 56(%edx)
-; X86-NEXT: movl %ecx, 52(%edx)
-; X86-NEXT: movl %esi, 44(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 40(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 36(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 32(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 28(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 24(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 20(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 16(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 12(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 8(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 4(%edx)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, (%edx)
-; X86-NEXT: movl (%esp), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, 48(%edx)
-; X86-NEXT: setne %al
-; X86-NEXT: leal -12(%ebp), %esp
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
+; X86-NEXT: movl %edx, %esi
+; X86-NEXT: shrl $3, %esi
+; X86-NEXT: andl $60, %esi
+; X86-NEXT: movl (%ecx,%esi), %edi
+; X86-NEXT: btl %edx, %edi
+; X86-NEXT: setb %al
+; X86-NEXT: btsl %edx, %edi
+; X86-NEXT: movl %edi, (%ecx,%esi)
; X86-NEXT: popl %esi
; X86-NEXT: popl %edi
-; X86-NEXT: popl %ebx
-; X86-NEXT: popl %ebp
; X86-NEXT: retl
;
-; SSE-LABEL: set_ne_i512:
-; SSE: # %bb.0:
-; SSE-NEXT: pushq %rbp
-; SSE-NEXT: pushq %r15
-; SSE-NEXT: pushq %r14
-; SSE-NEXT: pushq %r13
-; SSE-NEXT: pushq %r12
-; SSE-NEXT: pushq %rbx
-; SSE-NEXT: subq $56, %rsp
-; SSE-NEXT: xorps %xmm0, %xmm0
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movq $0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movq $1, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movl %esi, %ecx
-; SSE-NEXT: andl $63, %ecx
-; SSE-NEXT: shrl $3, %esi
-; SSE-NEXT: andl $56, %esi
-; SSE-NEXT: negl %esi
-; SSE-NEXT: movslq %esi, %rbx
-; SSE-NEXT: movq (%rsp,%rbx), %rsi
-; SSE-NEXT: movq 8(%rsp,%rbx), %r14
-; SSE-NEXT: movq %r14, %rax
-; SSE-NEXT: shldq %cl, %rsi, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 32(%rsp,%rbx), %r8
-; SSE-NEXT: movq 40(%rsp,%rbx), %rbp
-; SSE-NEXT: shldq %cl, %r8, %rbp
-; SSE-NEXT: movq 16(%rsp,%rbx), %r9
-; SSE-NEXT: movq 24(%rsp,%rbx), %r15
-; SSE-NEXT: movq %r15, %r10
-; SSE-NEXT: shldq %cl, %r9, %r10
-; SSE-NEXT: movq -8(%rsp,%rbx), %r11
-; SSE-NEXT: shldq %cl, %r11, %rsi
-; SSE-NEXT: shldq %cl, %r15, %r8
-; SSE-NEXT: shldq %cl, %r14, %r9
-; SSE-NEXT: movq -16(%rsp,%rbx), %rbx
-; SSE-NEXT: shldq %cl, %rbx, %r11
-; SSE-NEXT: # kill: def $cl killed $cl killed $ecx
-; SSE-NEXT: shlq %cl, %rbx
-; SSE-NEXT: movq 24(%rdi), %r15
-; SSE-NEXT: movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 56(%rdi), %rcx
-; SSE-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 16(%rdi), %r12
-; SSE-NEXT: movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 48(%rdi), %r13
-; SSE-NEXT: movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: andq %r8, %r13
-; SSE-NEXT: andq %rsi, %r12
-; SSE-NEXT: orq %r13, %r12
-; SSE-NEXT: movq %rcx, %r13
-; SSE-NEXT: andq %rbp, %r13
-; SSE-NEXT: andq %rax, %r15
-; SSE-NEXT: orq %r13, %r15
-; SSE-NEXT: movq 32(%rdi), %r14
-; SSE-NEXT: movq %r14, %rcx
-; SSE-NEXT: andq %r9, %rcx
-; SSE-NEXT: movq (%rdi), %r13
-; SSE-NEXT: movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: andq %rbx, %r13
-; SSE-NEXT: orq %rcx, %r13
-; SSE-NEXT: orq %r12, %r13
-; SSE-NEXT: movq 40(%rdi), %rcx
-; SSE-NEXT: movq %rcx, %r12
-; SSE-NEXT: andq %r10, %r12
-; SSE-NEXT: movq 8(%rdi), %rdx
-; SSE-NEXT: movq %rdx, %rax
-; SSE-NEXT: andq %r11, %rax
-; SSE-NEXT: orq %r12, %rax
-; SSE-NEXT: orq %r15, %rax
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; SSE-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Folded Reload
-; SSE-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload
-; SSE-NEXT: orq %rcx, %r10
-; SSE-NEXT: orq %r14, %r9
-; SSE-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Folded Reload
-; SSE-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Folded Reload
-; SSE-NEXT: orq %rdx, %r11
-; SSE-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Folded Reload
-; SSE-NEXT: orq %r13, %rax
-; SSE-NEXT: movq %r8, 48(%rdi)
-; SSE-NEXT: movq %rbp, 56(%rdi)
-; SSE-NEXT: movq %r9, 32(%rdi)
-; SSE-NEXT: movq %r10, 40(%rdi)
-; SSE-NEXT: movq %rsi, 16(%rdi)
-; SSE-NEXT: movq %r15, 24(%rdi)
-; SSE-NEXT: movq %rbx, (%rdi)
-; SSE-NEXT: movq %r11, 8(%rdi)
-; SSE-NEXT: setne %al
-; SSE-NEXT: addq $56, %rsp
-; SSE-NEXT: popq %rbx
-; SSE-NEXT: popq %r12
-; SSE-NEXT: popq %r13
-; SSE-NEXT: popq %r14
-; SSE-NEXT: popq %r15
-; SSE-NEXT: popq %rbp
-; SSE-NEXT: retq
-;
-; AVX2-LABEL: set_ne_i512:
-; AVX2: # %bb.0:
-; AVX2-NEXT: pushq %rbp
-; AVX2-NEXT: pushq %r15
-; AVX2-NEXT: pushq %r14
-; AVX2-NEXT: pushq %r13
-; AVX2-NEXT: pushq %r12
-; AVX2-NEXT: pushq %rbx
-; AVX2-NEXT: subq $72, %rsp
-; AVX2-NEXT: vxorps %xmm0, %xmm0, %xmm0
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovss {{.*#+}} xmm0 = [1,0,0,0]
-; AVX2-NEXT: vmovups %ymm0, (%rsp)
-; AVX2-NEXT: movl %esi, %ecx
-; AVX2-NEXT: andl $63, %ecx
-; AVX2-NEXT: shrl $3, %esi
-; AVX2-NEXT: andl $56, %esi
-; AVX2-NEXT: negl %esi
-; AVX2-NEXT: movslq %esi, %rbx
-; AVX2-NEXT: movq 16(%rsp,%rbx), %rsi
-; AVX2-NEXT: movq 24(%rsp,%rbx), %rbp
-; AVX2-NEXT: movq %rbp, %rax
-; AVX2-NEXT: shldq %cl, %rsi, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 48(%rsp,%rbx), %r8
-; AVX2-NEXT: movq 56(%rsp,%rbx), %r13
-; AVX2-NEXT: shldq %cl, %r8, %r13
-; AVX2-NEXT: movq 32(%rsp,%rbx), %r9
-; AVX2-NEXT: movq 40(%rsp,%rbx), %r14
-; AVX2-NEXT: movq %r14, %r10
-; AVX2-NEXT: shldq %cl, %r9, %r10
-; AVX2-NEXT: movq 8(%rsp,%rbx), %r11
-; AVX2-NEXT: shldq %cl, %r11, %rsi
-; AVX2-NEXT: shldq %cl, %r14, %r8
-; AVX2-NEXT: movq 16(%rdi), %r12
-; AVX2-NEXT: movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 48(%rdi), %r14
-; AVX2-NEXT: movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: andq %r8, %r14
-; AVX2-NEXT: andq %rsi, %r12
-; AVX2-NEXT: orq %r14, %r12
-; AVX2-NEXT: movq 56(%rdi), %r15
-; AVX2-NEXT: movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: andq %r13, %r15
-; AVX2-NEXT: movq 24(%rdi), %r14
-; AVX2-NEXT: movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: andq %rax, %r14
-; AVX2-NEXT: orq %r15, %r14
-; AVX2-NEXT: shldq %cl, %rbp, %r9
-; AVX2-NEXT: movq (%rsp,%rbx), %rdx
-; AVX2-NEXT: movq 32(%rdi), %r15
-; AVX2-NEXT: movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: andq %r9, %r15
-; AVX2-NEXT: shlxq %rcx, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq (%rdi), %rbx
-; AVX2-NEXT: movq %rbx, %rbp
-; AVX2-NEXT: andq %rax, %rbp
-; AVX2-NEXT: orq %r15, %rbp
-; AVX2-NEXT: orq %r12, %rbp
-; AVX2-NEXT: # kill: def $cl killed $cl killed $rcx
-; AVX2-NEXT: shldq %cl, %rdx, %r11
-; AVX2-NEXT: movq 40(%rdi), %rax
-; AVX2-NEXT: movq %rax, %rcx
-; AVX2-NEXT: andq %r10, %rcx
-; AVX2-NEXT: movq 8(%rdi), %r15
-; AVX2-NEXT: movq %r15, %r12
-; AVX2-NEXT: andq %r11, %r12
-; AVX2-NEXT: orq %rcx, %r12
-; AVX2-NEXT: orq %r14, %r12
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
-; AVX2-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Folded Reload
-; AVX2-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload
-; AVX2-NEXT: orq %rax, %r10
-; AVX2-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Folded Reload
-; AVX2-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Folded Reload
-; AVX2-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Folded Reload
-; AVX2-NEXT: orq %r15, %r11
-; AVX2-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Folded Reload
-; AVX2-NEXT: orq %rbp, %r12
-; AVX2-NEXT: movq %r8, 48(%rdi)
-; AVX2-NEXT: movq %r13, 56(%rdi)
-; AVX2-NEXT: movq %r9, 32(%rdi)
-; AVX2-NEXT: movq %r10, 40(%rdi)
-; AVX2-NEXT: movq %rsi, 16(%rdi)
-; AVX2-NEXT: movq %rcx, 24(%rdi)
-; AVX2-NEXT: movq %rbx, (%rdi)
-; AVX2-NEXT: movq %r11, 8(%rdi)
-; AVX2-NEXT: setne %al
-; AVX2-NEXT: addq $72, %rsp
-; AVX2-NEXT: popq %rbx
-; AVX2-NEXT: popq %r12
-; AVX2-NEXT: popq %r13
-; AVX2-NEXT: popq %r14
-; AVX2-NEXT: popq %r15
-; AVX2-NEXT: popq %rbp
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
-;
-; AVX512-LABEL: set_ne_i512:
-; AVX512: # %bb.0:
-; AVX512-NEXT: pushq %rbp
-; AVX512-NEXT: pushq %r15
-; AVX512-NEXT: pushq %r14
-; AVX512-NEXT: pushq %r13
-; AVX512-NEXT: pushq %r12
-; AVX512-NEXT: pushq %rbx
-; AVX512-NEXT: subq $72, %rsp
-; AVX512-NEXT: vxorps %xmm0, %xmm0, %xmm0
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovaps {{.*#+}} xmm0 = [1,0,0,0]
-; AVX512-NEXT: vmovups %ymm0, (%rsp)
-; AVX512-NEXT: movl %esi, %ecx
-; AVX512-NEXT: andl $63, %ecx
-; AVX512-NEXT: shrl $3, %esi
-; AVX512-NEXT: andl $56, %esi
-; AVX512-NEXT: negl %esi
-; AVX512-NEXT: movslq %esi, %rbx
-; AVX512-NEXT: movq 16(%rsp,%rbx), %rsi
-; AVX512-NEXT: movq 24(%rsp,%rbx), %rbp
-; AVX512-NEXT: movq %rbp, %rax
-; AVX512-NEXT: shldq %cl, %rsi, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 48(%rsp,%rbx), %r8
-; AVX512-NEXT: movq 56(%rsp,%rbx), %r13
-; AVX512-NEXT: shldq %cl, %r8, %r13
-; AVX512-NEXT: movq 32(%rsp,%rbx), %r9
-; AVX512-NEXT: movq 40(%rsp,%rbx), %r14
-; AVX512-NEXT: movq %r14, %r10
-; AVX512-NEXT: shldq %cl, %r9, %r10
-; AVX512-NEXT: movq 8(%rsp,%rbx), %r11
-; AVX512-NEXT: shldq %cl, %r11, %rsi
-; AVX512-NEXT: shldq %cl, %r14, %r8
-; AVX512-NEXT: movq 16(%rdi), %r12
-; AVX512-NEXT: movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 48(%rdi), %r14
-; AVX512-NEXT: movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: andq %r8, %r14
-; AVX512-NEXT: andq %rsi, %r12
-; AVX512-NEXT: orq %r14, %r12
-; AVX512-NEXT: movq 56(%rdi), %r15
-; AVX512-NEXT: movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: andq %r13, %r15
-; AVX512-NEXT: movq 24(%rdi), %r14
-; AVX512-NEXT: movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: andq %rax, %r14
-; AVX512-NEXT: orq %r15, %r14
-; AVX512-NEXT: shldq %cl, %rbp, %r9
-; AVX512-NEXT: movq (%rsp,%rbx), %rdx
-; AVX512-NEXT: movq 32(%rdi), %r15
-; AVX512-NEXT: movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: andq %r9, %r15
-; AVX512-NEXT: shlxq %rcx, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq (%rdi), %rbx
-; AVX512-NEXT: movq %rbx, %rbp
-; AVX512-NEXT: andq %rax, %rbp
-; AVX512-NEXT: orq %r15, %rbp
-; AVX512-NEXT: orq %r12, %rbp
-; AVX512-NEXT: # kill: def $cl killed $cl killed $rcx
-; AVX512-NEXT: shldq %cl, %rdx, %r11
-; AVX512-NEXT: movq 40(%rdi), %rax
-; AVX512-NEXT: movq %rax, %rcx
-; AVX512-NEXT: andq %r10, %rcx
-; AVX512-NEXT: movq 8(%rdi), %r15
-; AVX512-NEXT: movq %r15, %r12
-; AVX512-NEXT: andq %r11, %r12
-; AVX512-NEXT: orq %rcx, %r12
-; AVX512-NEXT: orq %r14, %r12
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
-; AVX512-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Folded Reload
-; AVX512-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload
-; AVX512-NEXT: orq %rax, %r10
-; AVX512-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Folded Reload
-; AVX512-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Folded Reload
-; AVX512-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Folded Reload
-; AVX512-NEXT: orq %r15, %r11
-; AVX512-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Folded Reload
-; AVX512-NEXT: orq %rbp, %r12
-; AVX512-NEXT: movq %r8, 48(%rdi)
-; AVX512-NEXT: movq %r13, 56(%rdi)
-; AVX512-NEXT: movq %r9, 32(%rdi)
-; AVX512-NEXT: movq %r10, 40(%rdi)
-; AVX512-NEXT: movq %rsi, 16(%rdi)
-; AVX512-NEXT: movq %rcx, 24(%rdi)
-; AVX512-NEXT: movq %rbx, (%rdi)
-; AVX512-NEXT: movq %r11, 8(%rdi)
-; AVX512-NEXT: setne %al
-; AVX512-NEXT: addq $72, %rsp
-; AVX512-NEXT: popq %rbx
-; AVX512-NEXT: popq %r12
-; AVX512-NEXT: popq %r13
-; AVX512-NEXT: popq %r14
-; AVX512-NEXT: popq %r15
-; AVX512-NEXT: popq %rbp
-; AVX512-NEXT: vzeroupper
-; AVX512-NEXT: retq
+; X64-LABEL: set_ne_i512:
+; X64: # %bb.0:
+; X64-NEXT: movl %esi, %ecx
+; X64-NEXT: shrl $3, %ecx
+; X64-NEXT: andl $60, %ecx
+; X64-NEXT: movl (%rdi,%rcx), %edx
+; X64-NEXT: btl %esi, %edx
+; X64-NEXT: setb %al
+; X64-NEXT: btsl %esi, %edx
+; X64-NEXT: movl %edx, (%rdi,%rcx)
+; X64-NEXT: retq
%rem = and i32 %position, 511
%ofs = zext nneg i32 %rem to i512
%bit = shl nuw i512 1, %ofs
@@ -3383,13 +983,14 @@ define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {
; X86-NEXT: pushl %edi
; X86-NEXT: pushl %esi
; X86-NEXT: andl $-16, %esp
-; X86-NEXT: subl $432, %esp # imm = 0x1B0
+; X86-NEXT: subl $352, %esp # imm = 0x160
; X86-NEXT: movl 12(%ebp), %ecx
; X86-NEXT: movl %ecx, %edx
; X86-NEXT: shrl $3, %edx
; X86-NEXT: andl $60, %edx
-; X86-NEXT: leal {{[0-9]+}}(%esp), %esi
-; X86-NEXT: subl %edx, %esi
+; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: leal {{[0-9]+}}(%esp), %eax
+; X86-NEXT: subl %edx, %eax
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
@@ -3422,60 +1023,58 @@ define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl 56(%esi), %eax
+; X86-NEXT: movl 56(%eax), %esi
+; X86-NEXT: movl 60(%eax), %ebx
+; X86-NEXT: movl 52(%eax), %edi
+; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl 48(%eax), %edi
+; X86-NEXT: movl 44(%eax), %edx
+; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl 40(%eax), %edx
+; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl 36(%eax), %edx
+; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl 32(%eax), %edx
+; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl 28(%eax), %edx
+; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl 24(%eax), %edx
+; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl 20(%eax), %edx
+; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl 16(%eax), %edx
+; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl 12(%eax), %edx
+; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl 8(%eax), %edx
+; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl (%eax), %edx
+; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl 4(%eax), %eax
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 60(%esi), %eax
+; X86-NEXT: movzbl 16(%ebp), %eax
+; X86-NEXT: movzbl %al, %eax
+; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; X86-NEXT: andl $31, %ecx
+; X86-NEXT: shldl %cl, %esi, %ebx
+; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; X86-NEXT: shldl %cl, %eax, %esi
+; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: shldl %cl, %edi, %eax
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 52(%esi), %eax
-; X86-NEXT: movl 48(%esi), %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 40(%esi), %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 44(%esi), %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 36(%esi), %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 32(%esi), %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 28(%esi), %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 24(%esi), %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 20(%esi), %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 16(%esi), %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 12(%esi), %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 8(%esi), %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl (%esi), %edi
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; X86-NEXT: shldl %cl, %ebx, %edi
; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 4(%esi), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movzbl 16(%ebp), %ebx
-; X86-NEXT: movzbl %bl, %esi
-; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
-; X86-NEXT: leal {{[0-9]+}}(%esp), %esi
-; X86-NEXT: subl %edx, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl $31, %ecx
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: shldl %cl, %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; X86-NEXT: shldl %cl, %edx, %ebx
+; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
; X86-NEXT: shldl %cl, %eax, %edx
; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
-; X86-NEXT: shldl %cl, %ebx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl %edi, %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: shldl %cl, %esi, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: shldl %cl, %edx, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: shldl %cl, %edx, %eax
+; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
; X86-NEXT: shldl %cl, %eax, %edx
; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
@@ -3500,9 +1099,12 @@ define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
; X86-NEXT: shldl %cl, %eax, %esi
; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: # kill: def $cl killed $cl killed $ecx
-; X86-NEXT: movl %ebx, %edx
-; X86-NEXT: shldl %cl, %edi, %edx
+; X86-NEXT: shll %cl, %eax
+; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; X86-NEXT: notl %ebx
+; X86-NEXT: leal {{[0-9]+}}(%esp), %eax
+; X86-NEXT: subl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
@@ -3534,273 +1136,148 @@ define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl 8(%ebp), %ebx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 48(%ebx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %esi, %edx
+; X86-NEXT: movl 56(%eax), %esi
+; X86-NEXT: movl 60(%eax), %edi
+; X86-NEXT: shldl %cl, %esi, %edi
+; X86-NEXT: movl 8(%ebp), %edx
+; X86-NEXT: andl 60(%edx), %ebx
+; X86-NEXT: orl %edi, %ebx
+; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; X86-NEXT: notl %ebx
+; X86-NEXT: movl 52(%eax), %edi
+; X86-NEXT: shldl %cl, %edi, %esi
+; X86-NEXT: andl 56(%edx), %ebx
+; X86-NEXT: orl %esi, %ebx
+; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; X86-NEXT: notl %ebx
+; X86-NEXT: movl 48(%eax), %esi
+; X86-NEXT: shldl %cl, %esi, %edi
+; X86-NEXT: andl 52(%edx), %ebx
+; X86-NEXT: orl %edi, %ebx
+; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; X86-NEXT: notl %ebx
+; X86-NEXT: movl 44(%eax), %edi
+; X86-NEXT: shldl %cl, %edi, %esi
+; X86-NEXT: andl 48(%edx), %ebx
+; X86-NEXT: orl %esi, %ebx
+; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; X86-NEXT: notl %ebx
+; X86-NEXT: movl 40(%eax), %esi
+; X86-NEXT: shldl %cl, %esi, %edi
+; X86-NEXT: andl 44(%edx), %ebx
+; X86-NEXT: orl %edi, %ebx
+; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; X86-NEXT: notl %ebx
+; X86-NEXT: movl 36(%eax), %edi
+; X86-NEXT: shldl %cl, %edi, %esi
+; X86-NEXT: andl 40(%edx), %ebx
+; X86-NEXT: orl %esi, %ebx
+; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; X86-NEXT: notl %ebx
+; X86-NEXT: movl 32(%eax), %esi
+; X86-NEXT: shldl %cl, %esi, %edi
+; X86-NEXT: andl 36(%edx), %ebx
+; X86-NEXT: orl %edi, %ebx
+; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; X86-NEXT: notl %ebx
+; X86-NEXT: movl 28(%eax), %edi
+; X86-NEXT: shldl %cl, %edi, %esi
+; X86-NEXT: andl 32(%edx), %ebx
+; X86-NEXT: orl %esi, %ebx
+; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; X86-NEXT: notl %ebx
+; X86-NEXT: movl 24(%eax), %esi
+; X86-NEXT: shldl %cl, %esi, %edi
+; X86-NEXT: andl 28(%edx), %ebx
+; X86-NEXT: orl %edi, %ebx
+; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; X86-NEXT: notl %ebx
+; X86-NEXT: movl 20(%eax), %edi
+; X86-NEXT: shldl %cl, %edi, %esi
+; X86-NEXT: andl 24(%edx), %ebx
+; X86-NEXT: orl %esi, %ebx
+; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; X86-NEXT: notl %ebx
+; X86-NEXT: movl 16(%eax), %esi
+; X86-NEXT: shldl %cl, %esi, %edi
+; X86-NEXT: andl 20(%edx), %ebx
+; X86-NEXT: orl %edi, %ebx
+; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; X86-NEXT: notl %ebx
+; X86-NEXT: movl 12(%eax), %edi
+; X86-NEXT: shldl %cl, %edi, %esi
+; X86-NEXT: andl 16(%edx), %ebx
+; X86-NEXT: orl %esi, %ebx
+; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; X86-NEXT: notl %ebx
+; X86-NEXT: movl 8(%eax), %esi
+; X86-NEXT: shldl %cl, %esi, %edi
+; X86-NEXT: andl 12(%edx), %ebx
+; X86-NEXT: orl %edi, %ebx
+; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; X86-NEXT: notl %ebx
+; X86-NEXT: movl 4(%eax), %edi
+; X86-NEXT: shldl %cl, %edi, %esi
+; X86-NEXT: andl 8(%edx), %ebx
+; X86-NEXT: orl %esi, %ebx
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 16(%ebx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %eax, %esi
-; X86-NEXT: orl %edx, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 40(%ebx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %eax, %edx
-; X86-NEXT: movl %edx, %esi
+; X86-NEXT: notl %esi
+; X86-NEXT: movl (%eax), %eax
+; X86-NEXT: shldl %cl, %eax, %edi
+; X86-NEXT: andl 4(%edx), %esi
+; X86-NEXT: orl %edi, %esi
+; X86-NEXT: movl %esi, %edi
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; X86-NEXT: notl %esi
+; X86-NEXT: shll %cl, %eax
+; X86-NEXT: andl (%edx), %esi
+; X86-NEXT: orl %eax, %esi
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 8(%ebx), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %edx, %eax
-; X86-NEXT: orl %esi, %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 56(%ebx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %esi, %edx
-; X86-NEXT: movl %edx, %edi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 24(%ebx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %esi, %edx
-; X86-NEXT: orl %edi, %edx
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl (%edx,%eax), %eax
+; X86-NEXT: btl %ecx, %eax
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 52(%ebx), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %edx, %eax
-; X86-NEXT: movl %eax, %edx
+; X86-NEXT: movl %eax, 60(%edx)
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 20(%ebx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %esi, %eax
-; X86-NEXT: orl %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl %eax, 56(%edx)
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 44(%ebx), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %edx, %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 12(%ebx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %esi, %edi
-; X86-NEXT: orl %eax, %edi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 60(%ebx), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %edx, %esi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 28(%ebx), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %eax, %edx
-; X86-NEXT: orl %esi, %edx
-; X86-NEXT: orl %edi, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; X86-NEXT: movl %eax, 52(%edx)
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, %edx
-; X86-NEXT: # kill: def $cl killed $cl killed $ecx
-; X86-NEXT: shll %cl, %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 32(%ebx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %esi, %ecx
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl (%ebx), %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %edi, %eax
-; X86-NEXT: orl %ecx, %eax
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl %eax, 48(%edx)
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 36(%ebx), %ecx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ecx, %eax
-; X86-NEXT: movl %eax, %ecx
-; X86-NEXT: movl %edx, %eax
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 4(%ebx), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %edx, %eax
-; X86-NEXT: orl %ecx, %eax
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl 56(%edi), %ebx
-; X86-NEXT: movl 60(%edi), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: shldl %cl, %ebx, %eax
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl 52(%edi), %eax
-; X86-NEXT: shldl %cl, %eax, %ebx
-; X86-NEXT: orl %ebx, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl 48(%edi), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %esi, %eax
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl %eax, 44(%edx)
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: notl %eax
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: movl %eax, %edx
-; X86-NEXT: movl 40(%edi), %ebx
-; X86-NEXT: movl 44(%edi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %ebx, %eax
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl 36(%edi), %eax
-; X86-NEXT: shldl %cl, %eax, %ebx
-; X86-NEXT: orl %ebx, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl 32(%edi), %ebx
-; X86-NEXT: shldl %cl, %ebx, %eax
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl 28(%edi), %eax
-; X86-NEXT: shldl %cl, %eax, %ebx
-; X86-NEXT: orl %ebx, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl 24(%edi), %ebx
-; X86-NEXT: shldl %cl, %ebx, %eax
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl 20(%edi), %eax
-; X86-NEXT: shldl %cl, %eax, %ebx
-; X86-NEXT: orl %ebx, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl 16(%edi), %ebx
-; X86-NEXT: shldl %cl, %ebx, %eax
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl 12(%edi), %eax
-; X86-NEXT: # kill: def $cl killed $cl killed $ecx
-; X86-NEXT: shldl %cl, %eax, %ebx
-; X86-NEXT: orl %ebx, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: notl %esi
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
-; X86-NEXT: movl 8(%edi), %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: # kill: def $cl killed $cl killed $ecx
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: orl %eax, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl %eax, 40(%edx)
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: notl %eax
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: movl 4(%edi), %ebx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: shldl %cl, %ebx, %edx
-; X86-NEXT: orl %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: # kill: def $cl killed $cl killed $ecx
+; X86-NEXT: movl %eax, 36(%edx)
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: shldl %cl, %esi, %eax
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: movl %edx, %esi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl (%edi), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, %ebx
-; X86-NEXT: orl %ebx, %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: notl %edi
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
-; X86-NEXT: # kill: def $cl killed $cl killed $ecx
-; X86-NEXT: shll %cl, %eax
-; X86-NEXT: orl %eax, %edi
-; X86-NEXT: movl %edi, %ecx
+; X86-NEXT: movl %eax, 32(%edx)
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: movl 8(%ebp), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl %edi, 60(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl %edi, 56(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl %edi, 52(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl %edi, 44(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl %edi, 40(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl %edi, 36(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl %edi, 32(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl %edi, 28(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl %edi, 24(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl %edi, 20(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl %edi, 16(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl %edi, 12(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl %edi, 8(%eax)
-; X86-NEXT: movl %edx, 4(%eax)
-; X86-NEXT: movl %ecx, (%eax)
-; X86-NEXT: movl %esi, 48(%eax)
-; X86-NEXT: sete %al
+; X86-NEXT: movl %eax, 28(%edx)
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; X86-NEXT: movl %eax, 24(%edx)
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; X86-NEXT: movl %eax, 20(%edx)
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; X86-NEXT: movl %eax, 16(%edx)
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; X86-NEXT: movl %eax, 12(%edx)
+; X86-NEXT: movl %ebx, 8(%edx)
+; X86-NEXT: movl %edi, 4(%edx)
+; X86-NEXT: movl %esi, (%edx)
+; X86-NEXT: setae %al
; X86-NEXT: leal -12(%ebp), %esp
; X86-NEXT: popl %esi
; X86-NEXT: popl %edi
@@ -3816,7 +1293,8 @@ define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {
; SSE-NEXT: pushq %r13
; SSE-NEXT: pushq %r12
; SSE-NEXT: pushq %rbx
-; SSE-NEXT: subq $216, %rsp
+; SSE-NEXT: subq $168, %rsp
+; SSE-NEXT: movl %esi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
; SSE-NEXT: xorps %xmm0, %xmm0
; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
@@ -3829,139 +1307,107 @@ define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {
; SSE-NEXT: movq $1, {{[0-9]+}}(%rsp)
; SSE-NEXT: movl %esi, %ecx
; SSE-NEXT: andl $63, %ecx
-; SSE-NEXT: shrl $3, %esi
-; SSE-NEXT: andl $56, %esi
-; SSE-NEXT: negl %esi
-; SSE-NEXT: movslq %esi, %r10
-; SSE-NEXT: movq 184(%rsp,%r10), %r11
-; SSE-NEXT: movq 192(%rsp,%r10), %rsi
-; SSE-NEXT: movq %rsi, %r13
-; SSE-NEXT: shldq %cl, %r11, %r13
-; SSE-NEXT: movq 200(%rsp,%r10), %r15
-; SSE-NEXT: shldq %cl, %rsi, %r15
-; SSE-NEXT: movq 168(%rsp,%r10), %rbx
-; SSE-NEXT: movq 176(%rsp,%r10), %rsi
-; SSE-NEXT: movq %rsi, %r14
-; SSE-NEXT: shldq %cl, %rbx, %r14
-; SSE-NEXT: shldq %cl, %rsi, %r11
-; SSE-NEXT: movq 152(%rsp,%r10), %rax
-; SSE-NEXT: movq 160(%rsp,%r10), %r8
-; SSE-NEXT: movq %r8, %r12
-; SSE-NEXT: shldq %cl, %rax, %r12
-; SSE-NEXT: shldq %cl, %r8, %rbx
-; SSE-NEXT: movq 144(%rsp,%r10), %r9
-; SSE-NEXT: movq %r9, %r8
-; SSE-NEXT: shlq %cl, %r8
-; SSE-NEXT: shldq %cl, %r9, %rax
-; SSE-NEXT: movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movl %edx, %edx
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
+; SSE-NEXT: movl %esi, %eax
+; SSE-NEXT: shrl $3, %eax
+; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
+; SSE-NEXT: # kill: def $eax killed $eax killed $rax
+; SSE-NEXT: andl $56, %eax
+; SSE-NEXT: negl %eax
+; SSE-NEXT: movslq %eax, %r12
+; SSE-NEXT: movq 136(%rsp,%r12), %r9
+; SSE-NEXT: movq 144(%rsp,%r12), %rax
+; SSE-NEXT: movq %rax, %rsi
+; SSE-NEXT: shldq %cl, %r9, %rsi
+; SSE-NEXT: movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
+; SSE-NEXT: movq 152(%rsp,%r12), %r11
+; SSE-NEXT: shldq %cl, %rax, %r11
+; SSE-NEXT: movq 120(%rsp,%r12), %r10
+; SSE-NEXT: movq 128(%rsp,%r12), %rax
+; SSE-NEXT: movq %rax, %rbx
+; SSE-NEXT: shldq %cl, %r10, %rbx
+; SSE-NEXT: shldq %cl, %rax, %r9
+; SSE-NEXT: movq 104(%rsp,%r12), %r14
+; SSE-NEXT: movq 112(%rsp,%r12), %rax
+; SSE-NEXT: movq %rax, %r15
+; SSE-NEXT: shldq %cl, %r14, %r15
+; SSE-NEXT: shldq %cl, %rax, %r10
+; SSE-NEXT: movq 96(%rsp,%r12), %rax
+; SSE-NEXT: movq %rax, %r13
+; SSE-NEXT: shlq %cl, %r13
+; SSE-NEXT: shldq %cl, %rax, %r14
+; SSE-NEXT: movl %edx, %eax
; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, (%rsp)
+; SSE-NEXT: movups %xmm0, -{{[0-9]+}}(%rsp)
+; SSE-NEXT: movups %xmm0, -{{[0-9]+}}(%rsp)
+; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
-; SSE-NEXT: movq %rdx, {{[0-9]+}}(%rsp)
+; SSE-NEXT: movq %rax, -{{[0-9]+}}(%rsp)
; SSE-NEXT: movq $0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movq 16(%rdi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 48(%rdi), %rsi
-; SSE-NEXT: movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: andq %rsi, %r13
-; SSE-NEXT: andq %rdx, %r12
-; SSE-NEXT: orq %r13, %r12
-; SSE-NEXT: movq %r15, %rsi
-; SSE-NEXT: movq 56(%rdi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: andq %rdx, %r15
-; SSE-NEXT: movq %rbx, %r13
-; SSE-NEXT: movq 24(%rdi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: andq %rdx, %rbx
-; SSE-NEXT: orq %r15, %rbx
-; SSE-NEXT: movq %r14, %rbp
-; SSE-NEXT: movq 32(%rdi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: andq %rdx, %r14
-; SSE-NEXT: movq %r8, %r15
-; SSE-NEXT: movq (%rdi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: andq %rdx, %r8
-; SSE-NEXT: orq %r14, %r8
-; SSE-NEXT: orq %r12, %r8
-; SSE-NEXT: movq %r11, %r12
-; SSE-NEXT: movq 40(%rdi), %r9
-; SSE-NEXT: andq %r9, %r11
-; SSE-NEXT: movq %rax, %r14
-; SSE-NEXT: movq 8(%rdi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: andq %rdx, %rax
-; SSE-NEXT: orq %r11, %rax
-; SSE-NEXT: orq %rbx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
+; SSE-NEXT: movq 8(%rsp,%r12), %r8
+; SSE-NEXT: movq 16(%rsp,%r12), %rsi
+; SSE-NEXT: movq %rsi, %rbp
+; SSE-NEXT: shldq %cl, %r8, %rbp
; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
; SSE-NEXT: notq %rax
-; SSE-NEXT: andq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Folded Reload
-; SSE-NEXT: movq %rax, %rdx
-; SSE-NEXT: movq 56(%rsp,%r10), %r11
-; SSE-NEXT: movq 64(%rsp,%r10), %rax
-; SSE-NEXT: movq %rax, %rbx
-; SSE-NEXT: shldq %cl, %r11, %rbx
-; SSE-NEXT: orq %rbx, %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: notq %rsi
-; SSE-NEXT: movq 72(%rsp,%r10), %rbx
-; SSE-NEXT: shldq %cl, %rax, %rbx
-; SSE-NEXT: andq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload
-; SSE-NEXT: orq %rbx, %rsi
-; SSE-NEXT: notq %rbp
-; SSE-NEXT: andq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Folded Reload
-; SSE-NEXT: movq 40(%rsp,%r10), %rax
-; SSE-NEXT: movq 48(%rsp,%r10), %rdx
-; SSE-NEXT: movq %rdx, %rbx
-; SSE-NEXT: shldq %cl, %rax, %rbx
-; SSE-NEXT: orq %rbx, %rbp
-; SSE-NEXT: notq %r12
-; SSE-NEXT: andq %r9, %r12
-; SSE-NEXT: shldq %cl, %rdx, %r11
-; SSE-NEXT: movq 24(%rsp,%r10), %r9
-; SSE-NEXT: movq 32(%rsp,%r10), %rdx
-; SSE-NEXT: movq %rdx, %rbx
-; SSE-NEXT: shldq %cl, %r9, %rbx
-; SSE-NEXT: orq %r11, %r12
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload
+; SSE-NEXT: andq 48(%rdi), %rax
+; SSE-NEXT: orq %rbp, %rax
+; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
+; SSE-NEXT: notq %rbx
; SSE-NEXT: notq %r11
-; SSE-NEXT: andq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Folded Reload
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: orq %rbx, %r11
-; SSE-NEXT: notq %r13
-; SSE-NEXT: andq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Folded Reload
-; SSE-NEXT: orq %rax, %r13
+; SSE-NEXT: movq 24(%rsp,%r12), %rax
+; SSE-NEXT: shldq %cl, %rsi, %rax
+; SSE-NEXT: movq -8(%rsp,%r12), %rbp
+; SSE-NEXT: movq (%rsp,%r12), %rdx
+; SSE-NEXT: movq %rdx, %rsi
+; SSE-NEXT: shldq %cl, %rbp, %rsi
+; SSE-NEXT: andq 56(%rdi), %r11
+; SSE-NEXT: andq 32(%rdi), %rbx
+; SSE-NEXT: orq %rax, %r11
+; SSE-NEXT: orq %rsi, %rbx
; SSE-NEXT: notq %r15
-; SSE-NEXT: andq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Folded Reload
-; SSE-NEXT: movq 16(%rsp,%r10), %rax
-; SSE-NEXT: movq %rax, %rdx
-; SSE-NEXT: shlq %cl, %rdx
-; SSE-NEXT: orq %rdx, %r15
+; SSE-NEXT: shldq %cl, %rdx, %r8
+; SSE-NEXT: notq %r9
+; SSE-NEXT: andq 40(%rdi), %r9
+; SSE-NEXT: orq %r8, %r9
+; SSE-NEXT: movq -24(%rsp,%r12), %rax
+; SSE-NEXT: movq -16(%rsp,%r12), %rdx
+; SSE-NEXT: movq %rdx, %rsi
+; SSE-NEXT: shldq %cl, %rax, %rsi
+; SSE-NEXT: andq 16(%rdi), %r15
+; SSE-NEXT: orq %rsi, %r15
+; SSE-NEXT: shldq %cl, %rdx, %rbp
+; SSE-NEXT: notq %r10
+; SSE-NEXT: notq %r13
+; SSE-NEXT: movq -32(%rsp,%r12), %rdx
+; SSE-NEXT: movq %rdx, %rsi
+; SSE-NEXT: shlq %cl, %rsi
+; SSE-NEXT: andq 24(%rdi), %r10
+; SSE-NEXT: andq (%rdi), %r13
+; SSE-NEXT: orq %rbp, %r10
+; SSE-NEXT: orq %rsi, %r13
; SSE-NEXT: notq %r14
-; SSE-NEXT: andq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Folded Reload
; SSE-NEXT: # kill: def $cl killed $cl killed $ecx
-; SSE-NEXT: shldq %cl, %rax, %r9
-; SSE-NEXT: orq %r9, %r14
-; SSE-NEXT: orq %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
+; SSE-NEXT: shldq %cl, %rdx, %rax
+; SSE-NEXT: andq 8(%rdi), %r14
+; SSE-NEXT: orq %rax, %r14
+; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
+; SSE-NEXT: andl $60, %eax
+; SSE-NEXT: movl (%rdi,%rax), %eax
+; SSE-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload
+; SSE-NEXT: btl %ecx, %eax
; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
; SSE-NEXT: movq %rax, 48(%rdi)
-; SSE-NEXT: movq %rsi, 56(%rdi)
-; SSE-NEXT: movq %rbp, 32(%rdi)
-; SSE-NEXT: movq %r12, 40(%rdi)
-; SSE-NEXT: movq %r11, 16(%rdi)
-; SSE-NEXT: movq %r13, 24(%rdi)
-; SSE-NEXT: movq %r15, (%rdi)
+; SSE-NEXT: movq %r11, 56(%rdi)
+; SSE-NEXT: movq %rbx, 32(%rdi)
+; SSE-NEXT: movq %r9, 40(%rdi)
+; SSE-NEXT: movq %r15, 16(%rdi)
+; SSE-NEXT: movq %r10, 24(%rdi)
+; SSE-NEXT: movq %r13, (%rdi)
; SSE-NEXT: movq %r14, 8(%rdi)
-; SSE-NEXT: sete %al
-; SSE-NEXT: addq $216, %rsp
+; SSE-NEXT: setae %al
+; SSE-NEXT: addq $168, %rsp
; SSE-NEXT: popq %rbx
; SSE-NEXT: popq %r12
; SSE-NEXT: popq %r13
@@ -3978,132 +1424,105 @@ define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {
; AVX2-NEXT: pushq %r13
; AVX2-NEXT: pushq %r12
; AVX2-NEXT: pushq %rbx
-; AVX2-NEXT: subq $200, %rsp
+; AVX2-NEXT: subq $184, %rsp
; AVX2-NEXT: vxorps %xmm0, %xmm0, %xmm0
; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
; AVX2-NEXT: vmovss {{.*#+}} xmm1 = [1,0,0,0]
; AVX2-NEXT: vmovups %ymm1, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: movl %esi, %r8d
-; AVX2-NEXT: andl $63, %r8d
-; AVX2-NEXT: shrl $3, %esi
-; AVX2-NEXT: andl $56, %esi
-; AVX2-NEXT: negl %esi
-; AVX2-NEXT: movslq %esi, %rsi
-; AVX2-NEXT: movq 144(%rsp,%rsi), %r11
-; AVX2-NEXT: movq 152(%rsp,%rsi), %r12
-; AVX2-NEXT: movq %r12, %r10
-; AVX2-NEXT: movl %r8d, %ecx
-; AVX2-NEXT: shldq %cl, %r11, %r10
-; AVX2-NEXT: movq 176(%rsp,%rsi), %r14
-; AVX2-NEXT: movq 184(%rsp,%rsi), %r9
+; AVX2-NEXT: movl %esi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT: movl %esi, %ecx
+; AVX2-NEXT: andl $63, %ecx
+; AVX2-NEXT: movl %esi, %ebx
+; AVX2-NEXT: shrl $3, %ebx
+; AVX2-NEXT: movl %ebx, %eax
+; AVX2-NEXT: andl $56, %eax
+; AVX2-NEXT: negl %eax
+; AVX2-NEXT: movslq %eax, %r11
+; AVX2-NEXT: movq 128(%rsp,%r11), %r15
+; AVX2-NEXT: movq 136(%rsp,%r11), %rax
+; AVX2-NEXT: movq %rax, %rsi
+; AVX2-NEXT: shldq %cl, %r15, %rsi
+; AVX2-NEXT: movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
+; AVX2-NEXT: movq 120(%rsp,%r11), %r8
+; AVX2-NEXT: shldq %cl, %r8, %r15
+; AVX2-NEXT: movq 144(%rsp,%r11), %r14
+; AVX2-NEXT: movq 152(%rsp,%r11), %rsi
+; AVX2-NEXT: movq %rsi, %r9
; AVX2-NEXT: shldq %cl, %r14, %r9
-; AVX2-NEXT: movq 160(%rsp,%rsi), %r15
-; AVX2-NEXT: movq 168(%rsp,%rsi), %r13
-; AVX2-NEXT: movq %r13, %rbx
-; AVX2-NEXT: shldq %cl, %r15, %rbx
-; AVX2-NEXT: movq 128(%rsp,%rsi), %rbp
-; AVX2-NEXT: movq %rbp, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 136(%rsp,%rsi), %rax
-; AVX2-NEXT: shldq %cl, %rax, %r11
-; AVX2-NEXT: shldq %cl, %r13, %r14
-; AVX2-NEXT: shldq %cl, %r12, %r15
-; AVX2-NEXT: shldq %cl, %rbp, %rax
+; AVX2-NEXT: movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
+; AVX2-NEXT: shldq %cl, %rax, %r14
+; AVX2-NEXT: movq 112(%rsp,%r11), %rax
; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movl %edx, %edx
+; AVX2-NEXT: movq 160(%rsp,%r11), %r13
+; AVX2-NEXT: movq 168(%rsp,%r11), %r12
+; AVX2-NEXT: shldq %cl, %r13, %r12
+; AVX2-NEXT: shldq %cl, %rsi, %r13
+; AVX2-NEXT: shldq %cl, %rax, %r8
+; AVX2-NEXT: movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
+; AVX2-NEXT: movl %edx, %eax
; AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
; AVX2-NEXT: vmovups %xmm1, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
; AVX2-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
; AVX2-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
-; AVX2-NEXT: movq %rdx, (%rsp)
+; AVX2-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
+; AVX2-NEXT: movq %rax, -{{[0-9]+}}(%rsp)
; AVX2-NEXT: movq $0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: movq 16(%rdi), %r12
-; AVX2-NEXT: movq 48(%rdi), %rbp
-; AVX2-NEXT: movq 32(%rdi), %r13
-; AVX2-NEXT: andnq %r13, %r15, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: andq %r15, %r13
-; AVX2-NEXT: andnq %rbp, %r14, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: andq %r14, %rbp
-; AVX2-NEXT: andnq %r12, %r11, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: andq %r11, %r12
-; AVX2-NEXT: movq 40(%rdi), %rax
-; AVX2-NEXT: orq %rbp, %r12
-; AVX2-NEXT: andnq %rax, %rbx, %rcx
-; AVX2-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq %rax, %rbp
-; AVX2-NEXT: andq %rbx, %rbp
-; AVX2-NEXT: movq 56(%rdi), %rcx
-; AVX2-NEXT: andnq %rcx, %r9, %rbx
-; AVX2-NEXT: andq %r9, %rcx
-; AVX2-NEXT: movq 24(%rdi), %rax
-; AVX2-NEXT: andnq %rax, %r10, %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: andq %r10, %rax
-; AVX2-NEXT: orq %rcx, %rax
-; AVX2-NEXT: shlxq %r8, {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Folded Reload
-; AVX2-NEXT: movq (%rdi), %r10
-; AVX2-NEXT: andnq %r10, %rcx, %r15
-; AVX2-NEXT: andq %rcx, %r10
-; AVX2-NEXT: movq 40(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq 48(%rsp,%rsi), %r11
-; AVX2-NEXT: movq %r11, %r9
-; AVX2-NEXT: movl %r8d, %ecx
-; AVX2-NEXT: shldq %cl, %rdx, %r9
-; AVX2-NEXT: orq %r13, %r10
-; AVX2-NEXT: orq %r12, %r10
-; AVX2-NEXT: movq 8(%rdi), %r13
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
-; AVX2-NEXT: andnq %r13, %rcx, %r12
-; AVX2-NEXT: andq %rcx, %r13
-; AVX2-NEXT: orq %rbp, %r13
+; AVX2-NEXT: movq 24(%rsp,%r11), %rbp
+; AVX2-NEXT: movq 32(%rsp,%r11), %rdx
+; AVX2-NEXT: movq %rdx, %rax
+; AVX2-NEXT: shldq %cl, %rbp, %rax
+; AVX2-NEXT: movq 40(%rsp,%r11), %r10
+; AVX2-NEXT: shldq %cl, %rdx, %r10
+; AVX2-NEXT: movq 8(%rsp,%r11), %r9
+; AVX2-NEXT: movq 16(%rsp,%r11), %rdx
+; AVX2-NEXT: movq %rdx, %r8
+; AVX2-NEXT: shldq %cl, %r9, %r8
+; AVX2-NEXT: shldq %cl, %rdx, %rbp
+; AVX2-NEXT: andnq 48(%rdi), %r13, %r13
; AVX2-NEXT: orq %rax, %r13
-; AVX2-NEXT: movq 56(%rsp,%rsi), %rax
-; AVX2-NEXT: movl %r8d, %ecx
-; AVX2-NEXT: shldq %cl, %r11, %rax
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload
-; AVX2-NEXT: orq %r9, %r14
-; AVX2-NEXT: orq %rax, %rbx
-; AVX2-NEXT: movq %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 24(%rsp,%rsi), %rax
-; AVX2-NEXT: movq 32(%rsp,%rsi), %r9
-; AVX2-NEXT: movq %r9, %r11
-; AVX2-NEXT: shldq %cl, %rax, %r11
-; AVX2-NEXT: shldq %cl, %r9, %rdx
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
-; AVX2-NEXT: orq %r11, %rbp
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
-; AVX2-NEXT: orq %rdx, %rbx
-; AVX2-NEXT: movq 8(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq 16(%rsp,%rsi), %r9
-; AVX2-NEXT: movq %r9, %r11
-; AVX2-NEXT: shldq %cl, %rdx, %r11
-; AVX2-NEXT: shldq %cl, %r9, %rax
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload
-; AVX2-NEXT: orq %r11, %r9
-; AVX2-NEXT: movq (%rsp,%rsi), %rsi
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload
-; AVX2-NEXT: orq %rax, %r11
-; AVX2-NEXT: shlxq %r8, %rsi, %rax
-; AVX2-NEXT: shldq %cl, %rsi, %rdx
-; AVX2-NEXT: orq %rax, %r15
-; AVX2-NEXT: orq %rdx, %r12
-; AVX2-NEXT: orq %r10, %r13
-; AVX2-NEXT: movq %r14, 48(%rdi)
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX2-NEXT: movq %rax, 56(%rdi)
-; AVX2-NEXT: movq %rbp, 32(%rdi)
-; AVX2-NEXT: movq %rbx, 40(%rdi)
-; AVX2-NEXT: movq %r9, 16(%rdi)
-; AVX2-NEXT: movq %r11, 24(%rdi)
-; AVX2-NEXT: movq %r15, (%rdi)
-; AVX2-NEXT: movq %r12, 8(%rdi)
-; AVX2-NEXT: sete %al
-; AVX2-NEXT: addq $200, %rsp
+; AVX2-NEXT: movq -8(%rsp,%r11), %rax
+; AVX2-NEXT: movq (%rsp,%r11), %rdx
+; AVX2-NEXT: movq %rdx, %rsi
+; AVX2-NEXT: shldq %cl, %rax, %rsi
+; AVX2-NEXT: shldq %cl, %rdx, %r9
+; AVX2-NEXT: andnq 56(%rdi), %r12, %r12
+; AVX2-NEXT: andnq 32(%rdi), %r14, %r14
+; AVX2-NEXT: orq %r10, %r12
+; AVX2-NEXT: orq %r8, %r14
+; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
+; AVX2-NEXT: andnq 40(%rdi), %rdx, %rdx
+; AVX2-NEXT: orq %rbp, %rdx
+; AVX2-NEXT: shlxq %rcx, {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Folded Reload
+; AVX2-NEXT: movq -16(%rsp,%r11), %r10
+; AVX2-NEXT: shlxq %rcx, %r10, %r11
+; AVX2-NEXT: # kill: def $cl killed $cl killed $rcx
+; AVX2-NEXT: shldq %cl, %r10, %rax
+; AVX2-NEXT: andnq 16(%rdi), %r15, %rcx
+; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload
+; AVX2-NEXT: andnq 24(%rdi), %r10, %r10
+; AVX2-NEXT: orq %rsi, %rcx
+; AVX2-NEXT: orq %r9, %r10
+; AVX2-NEXT: andnq (%rdi), %r8, %rsi
+; AVX2-NEXT: orq %r11, %rsi
+; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
+; AVX2-NEXT: andnq 8(%rdi), %r8, %r8
+; AVX2-NEXT: orq %rax, %r8
+; AVX2-NEXT: andl $60, %ebx
+; AVX2-NEXT: movl (%rdi,%rbx), %eax
+; AVX2-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %r9d # 4-byte Reload
+; AVX2-NEXT: btl %r9d, %eax
+; AVX2-NEXT: movq %r13, 48(%rdi)
+; AVX2-NEXT: movq %r12, 56(%rdi)
+; AVX2-NEXT: movq %r14, 32(%rdi)
+; AVX2-NEXT: movq %rdx, 40(%rdi)
+; AVX2-NEXT: movq %rcx, 16(%rdi)
+; AVX2-NEXT: movq %r10, 24(%rdi)
+; AVX2-NEXT: movq %rsi, (%rdi)
+; AVX2-NEXT: movq %r8, 8(%rdi)
+; AVX2-NEXT: setae %al
+; AVX2-NEXT: addq $184, %rsp
; AVX2-NEXT: popq %rbx
; AVX2-NEXT: popq %r12
; AVX2-NEXT: popq %r13
@@ -4121,39 +1540,41 @@ define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {
; AVX512-NEXT: pushq %r13
; AVX512-NEXT: pushq %r12
; AVX512-NEXT: pushq %rbx
-; AVX512-NEXT: subq $184, %rsp
+; AVX512-NEXT: subq $168, %rsp
; AVX512-NEXT: vxorps %xmm0, %xmm0, %xmm0
; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
; AVX512-NEXT: vmovaps {{.*#+}} xmm1 = [1,0,0,0]
; AVX512-NEXT: vmovups %ymm1, {{[0-9]+}}(%rsp)
+; AVX512-NEXT: movl %esi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
; AVX512-NEXT: movl %esi, %ecx
; AVX512-NEXT: andl $63, %ecx
-; AVX512-NEXT: shrl $3, %esi
-; AVX512-NEXT: andl $56, %esi
-; AVX512-NEXT: negl %esi
-; AVX512-NEXT: movslq %esi, %rsi
-; AVX512-NEXT: movq 128(%rsp,%rsi), %r10
-; AVX512-NEXT: movq 136(%rsp,%rsi), %r12
-; AVX512-NEXT: movq %r12, %rax
-; AVX512-NEXT: shldq %cl, %r10, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 160(%rsp,%rsi), %r14
-; AVX512-NEXT: movq 168(%rsp,%rsi), %rax
-; AVX512-NEXT: shldq %cl, %r14, %rax
+; AVX512-NEXT: movl %esi, %r10d
+; AVX512-NEXT: shrl $3, %r10d
+; AVX512-NEXT: movl %r10d, %r8d
+; AVX512-NEXT: andl $56, %r8d
+; AVX512-NEXT: negl %r8d
+; AVX512-NEXT: movslq %r8d, %r9
+; AVX512-NEXT: movq 112(%rsp,%r9), %r11
+; AVX512-NEXT: movq 120(%rsp,%r9), %r14
+; AVX512-NEXT: movq %r14, %rax
+; AVX512-NEXT: shldq %cl, %r11, %rax
; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 144(%rsp,%rsi), %r15
-; AVX512-NEXT: movq 152(%rsp,%rsi), %r11
-; AVX512-NEXT: movq %r11, %rbx
+; AVX512-NEXT: movq 104(%rsp,%r9), %rax
+; AVX512-NEXT: shldq %cl, %rax, %r11
+; AVX512-NEXT: movq 128(%rsp,%r9), %r15
+; AVX512-NEXT: movq 136(%rsp,%r9), %rbp
+; AVX512-NEXT: movq %rbp, %rbx
; AVX512-NEXT: shldq %cl, %r15, %rbx
-; AVX512-NEXT: movq 120(%rsp,%rsi), %rax
+; AVX512-NEXT: shldq %cl, %r14, %r15
+; AVX512-NEXT: movq 144(%rsp,%r9), %r13
+; AVX512-NEXT: movq 152(%rsp,%r9), %r12
+; AVX512-NEXT: shldq %cl, %r13, %r12
+; AVX512-NEXT: movq 96(%rsp,%r9), %r14
+; AVX512-NEXT: shldq %cl, %rbp, %r13
+; AVX512-NEXT: shldq %cl, %r14, %rax
; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rax, %r10
-; AVX512-NEXT: shldq %cl, %r11, %r14
-; AVX512-NEXT: movq %rdi, %r9
-; AVX512-NEXT: movq 112(%rsp,%rsi), %r11
-; AVX512-NEXT: shldq %cl, %r12, %r15
; AVX512-NEXT: movl %edx, %edx
; AVX512-NEXT: vxorps %xmm1, %xmm1, %xmm1
; AVX512-NEXT: vmovups %xmm1, {{[0-9]+}}(%rsp)
@@ -4162,90 +1583,59 @@ define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {
; AVX512-NEXT: vmovups %ymm0, -{{[0-9]+}}(%rsp)
; AVX512-NEXT: movq %rdx, -{{[0-9]+}}(%rsp)
; AVX512-NEXT: movq $0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: movq 16(%rdi), %r12
-; AVX512-NEXT: movq 48(%rdi), %r13
-; AVX512-NEXT: movq 32(%rdi), %rbp
-; AVX512-NEXT: andnq %rbp, %r15, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: andq %r15, %rbp
-; AVX512-NEXT: andnq %r13, %r14, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: andq %r14, %r13
-; AVX512-NEXT: andnq %r12, %r10, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: andq %r10, %r12
-; AVX512-NEXT: movq 40(%rdi), %r8
-; AVX512-NEXT: orq %r13, %r12
-; AVX512-NEXT: andnq %r8, %rbx, %rdi
-; AVX512-NEXT: andq %rbx, %r8
-; AVX512-NEXT: movq 56(%r9), %r13
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
-; AVX512-NEXT: andnq %r13, %rdx, %r10
-; AVX512-NEXT: andq %rdx, %r13
-; AVX512-NEXT: movq 24(%r9), %rax
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
-; AVX512-NEXT: andnq %rax, %rdx, %r15
-; AVX512-NEXT: andq %rdx, %rax
-; AVX512-NEXT: orq %r13, %rax
-; AVX512-NEXT: shlxq %rcx, %r11, %r13
-; AVX512-NEXT: movq (%r9), %rdx
-; AVX512-NEXT: andnq %rdx, %r13, %r14
-; AVX512-NEXT: andq %r13, %rdx
-; AVX512-NEXT: orq %rbp, %rdx
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r11, %rbp
-; AVX512-NEXT: orq %r12, %rdx
-; AVX512-NEXT: movq 8(%r9), %r13
-; AVX512-NEXT: andnq %r13, %rbp, %rbx
-; AVX512-NEXT: andq %rbp, %r13
-; AVX512-NEXT: orq %r8, %r13
-; AVX512-NEXT: movq 24(%rsp,%rsi), %r8
-; AVX512-NEXT: orq %rax, %r13
-; AVX512-NEXT: movq 32(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, %r12
-; AVX512-NEXT: shldq %cl, %r8, %r12
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload
-; AVX512-NEXT: orq %r12, %r11
-; AVX512-NEXT: movq 40(%rsp,%rsi), %r12
-; AVX512-NEXT: shldq %cl, %rax, %r12
-; AVX512-NEXT: orq %r12, %r10
-; AVX512-NEXT: movq %r10, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 8(%rsp,%rsi), %rax
-; AVX512-NEXT: movq 16(%rsp,%rsi), %r12
-; AVX512-NEXT: movq %r12, %rbp
-; AVX512-NEXT: shldq %cl, %rax, %rbp
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload
-; AVX512-NEXT: orq %rbp, %r10
-; AVX512-NEXT: shldq %cl, %r12, %r8
-; AVX512-NEXT: orq %r8, %rdi
-; AVX512-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq -8(%rsp,%rsi), %r8
-; AVX512-NEXT: movq (%rsp,%rsi), %r12
-; AVX512-NEXT: movq %r12, %rbp
+; AVX512-NEXT: movq 8(%rsp,%r9), %r8
+; AVX512-NEXT: movq 16(%rsp,%r9), %rax
+; AVX512-NEXT: movq %rax, %rbp
; AVX512-NEXT: shldq %cl, %r8, %rbp
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi # 8-byte Reload
-; AVX512-NEXT: orq %rbp, %rdi
-; AVX512-NEXT: movq -16(%rsp,%rsi), %rsi
-; AVX512-NEXT: shldq %cl, %r12, %rax
-; AVX512-NEXT: orq %rax, %r15
-; AVX512-NEXT: shlxq %rcx, %rsi, %rax
-; AVX512-NEXT: # kill: def $cl killed $cl killed $rcx
+; AVX512-NEXT: andnq 48(%rdi), %r13, %r13
+; AVX512-NEXT: orq %rbp, %r13
+; AVX512-NEXT: movq 24(%rsp,%r9), %rbp
+; AVX512-NEXT: shldq %cl, %rax, %rbp
+; AVX512-NEXT: movq -8(%rsp,%r9), %rax
+; AVX512-NEXT: movq (%rsp,%r9), %rsi
+; AVX512-NEXT: movq %rsi, %rdx
+; AVX512-NEXT: shldq %cl, %rax, %rdx
+; AVX512-NEXT: andnq 56(%rdi), %r12, %r12
+; AVX512-NEXT: orq %rbp, %r12
+; AVX512-NEXT: andnq 32(%rdi), %r15, %r15
+; AVX512-NEXT: orq %rdx, %r15
; AVX512-NEXT: shldq %cl, %rsi, %r8
-; AVX512-NEXT: orq %rax, %r14
+; AVX512-NEXT: movq -24(%rsp,%r9), %rdx
+; AVX512-NEXT: movq -16(%rsp,%r9), %rsi
+; AVX512-NEXT: movq %rsi, %rbp
+; AVX512-NEXT: shldq %cl, %rdx, %rbp
+; AVX512-NEXT: andnq 40(%rdi), %rbx, %rbx
; AVX512-NEXT: orq %r8, %rbx
-; AVX512-NEXT: orq %rdx, %r13
-; AVX512-NEXT: movq %r11, 48(%r9)
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: movq %rax, 56(%r9)
-; AVX512-NEXT: movq %r10, 32(%r9)
+; AVX512-NEXT: andnq 16(%rdi), %r11, %r8
+; AVX512-NEXT: orq %rbp, %r8
+; AVX512-NEXT: shlxq %rcx, %r14, %r11
+; AVX512-NEXT: movq -32(%rsp,%r9), %r9
+; AVX512-NEXT: shldq %cl, %rsi, %rax
+; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
+; AVX512-NEXT: andnq 24(%rdi), %rsi, %rsi
+; AVX512-NEXT: orq %rax, %rsi
+; AVX512-NEXT: shlxq %rcx, %r9, %rax
+; AVX512-NEXT: # kill: def $cl killed $cl killed $rcx
+; AVX512-NEXT: shldq %cl, %r9, %rdx
+; AVX512-NEXT: andnq (%rdi), %r11, %rcx
+; AVX512-NEXT: orq %rax, %rcx
; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: movq %rax, 40(%r9)
-; AVX512-NEXT: movq %rdi, 16(%r9)
-; AVX512-NEXT: movq %r15, 24(%r9)
-; AVX512-NEXT: movq %r14, (%r9)
-; AVX512-NEXT: movq %rbx, 8(%r9)
-; AVX512-NEXT: sete %al
-; AVX512-NEXT: addq $184, %rsp
+; AVX512-NEXT: andnq 8(%rdi), %rax, %rax
+; AVX512-NEXT: orq %rdx, %rax
+; AVX512-NEXT: andl $60, %r10d
+; AVX512-NEXT: movl (%rdi,%r10), %edx
+; AVX512-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %r9d # 4-byte Reload
+; AVX512-NEXT: btl %r9d, %edx
+; AVX512-NEXT: movq %r13, 48(%rdi)
+; AVX512-NEXT: movq %r12, 56(%rdi)
+; AVX512-NEXT: movq %r15, 32(%rdi)
+; AVX512-NEXT: movq %rbx, 40(%rdi)
+; AVX512-NEXT: movq %r8, 16(%rdi)
+; AVX512-NEXT: movq %rsi, 24(%rdi)
+; AVX512-NEXT: movq %rcx, (%rdi)
+; AVX512-NEXT: movq %rax, 8(%rdi)
+; AVX512-NEXT: setae %al
+; AVX512-NEXT: addq $168, %rsp
; AVX512-NEXT: popq %rbx
; AVX512-NEXT: popq %r12
; AVX512-NEXT: popq %r13
@@ -4274,2749 +1664,25 @@ define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {
define i1 @test_ne_i4096(ptr %word, i32 %position) nounwind {
; X86-LABEL: test_ne_i4096:
; X86: # %bb.0:
-; X86-NEXT: pushl %ebp
-; X86-NEXT: movl %esp, %ebp
-; X86-NEXT: pushl %ebx
-; X86-NEXT: pushl %edi
-; X86-NEXT: pushl %esi
-; X86-NEXT: andl $-16, %esp
-; X86-NEXT: subl $1792, %esp # imm = 0x700
-; X86-NEXT: movl 12(%ebp), %ebx
-; X86-NEXT: movl %ebx, %ecx
-; X86-NEXT: shrl $3, %ecx
-; X86-NEXT: andl $508, %ecx # imm = 0x1FC
-; X86-NEXT: leal {{[0-9]+}}(%esp), %esi
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: subl %ecx, %esi
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $1, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: movl 248(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 252(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl $31, %ebx
-; X86-NEXT: movl %ebx, %ecx
-; X86-NEXT: shldl %cl, %eax, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 504(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 508(%esi), %edx
-; X86-NEXT: shldl %cl, %eax, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 120(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 124(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %eax, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 376(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 380(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %eax, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 184(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 188(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %eax, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 440(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 444(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 56(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 60(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 312(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 316(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 216(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 220(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 472(%esi), %edi
-; X86-NEXT: movl 476(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edi, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 88(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 92(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 344(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 348(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 152(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 156(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 408(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 412(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 24(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 28(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 280(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 284(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 232(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 236(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 488(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 492(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 104(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 108(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 360(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 364(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 168(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 172(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 424(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 428(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 40(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 44(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 296(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 300(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 200(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 204(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 456(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 460(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 72(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 76(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 328(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 332(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 136(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 140(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 392(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 396(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 8(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 12(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 264(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 268(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 240(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 244(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 496(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 500(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 112(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 116(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 368(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 372(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 176(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 180(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 432(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 436(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 48(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 52(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 304(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 308(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 208(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 212(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 464(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 468(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 80(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 84(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 336(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 340(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 144(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 148(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 400(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 404(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 16(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 20(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 272(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 276(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 224(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 228(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 480(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 484(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 96(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 100(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 352(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 356(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 160(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 164(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 416(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 420(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 32(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 36(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 288(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 292(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 192(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 196(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %eax, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 448(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 452(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 64(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 68(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 320(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 324(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 128(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 132(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl %edi, %edx
-; X86-NEXT: movl 256(%esi), %edi
-; X86-NEXT: movl 260(%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edi, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: shldl %cl, %edi, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl 388(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl 4(%esi), %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shrdl $1, %eax, %edi
-; X86-NEXT: shrl %eax
-; X86-NEXT: movl %ebx, %edx
-; X86-NEXT: movl %eax, %ebx
-; X86-NEXT: notb %cl
-; X86-NEXT: shrdl %cl, %eax, %edi
-; X86-NEXT: shrl %cl, %ebx
-; X86-NEXT: movb $32, %cl
-; X86-NEXT: testb %cl, %cl
-; X86-NEXT: movl (%esi), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 8(%ebp), %eax
-; X86-NEXT: jne .LBB20_2
-; X86-NEXT: # %bb.1:
-; X86-NEXT: movl %edi, %ebx
-; X86-NEXT: .LBB20_2:
-; X86-NEXT: movl %edx, %ecx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: # kill: def $cl killed $cl killed $ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: shll %cl, %edx
-; X86-NEXT: orl %ebx, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 320(%eax), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: andl 64(%eax), %esi
-; X86-NEXT: orl %ecx, %esi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 448(%eax), %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 192(%eax), %ecx
-; X86-NEXT: orl %edx, %ecx
-; X86-NEXT: orl %esi, %ecx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 288(%eax), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 32(%eax), %edx
-; X86-NEXT: orl %ecx, %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 416(%eax), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: andl 160(%eax), %edi
-; X86-NEXT: orl %ecx, %edi
-; X86-NEXT: orl %edx, %edi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 352(%eax), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: andl 96(%eax), %esi
-; X86-NEXT: orl %ecx, %esi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 480(%eax), %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 224(%eax), %ecx
-; X86-NEXT: orl %edx, %ecx
-; X86-NEXT: orl %esi, %ecx
-; X86-NEXT: orl %edi, %ecx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 272(%eax), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 16(%eax), %edx
-; X86-NEXT: orl %ecx, %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 400(%eax), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: andl 144(%eax), %esi
-; X86-NEXT: orl %ecx, %esi
-; X86-NEXT: orl %edx, %esi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 336(%eax), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 80(%eax), %edx
-; X86-NEXT: orl %ecx, %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 464(%eax), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: andl 208(%eax), %edi
-; X86-NEXT: orl %ecx, %edi
-; X86-NEXT: orl %edx, %edi
-; X86-NEXT: orl %esi, %edi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 304(%eax), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 48(%eax), %edx
-; X86-NEXT: orl %ecx, %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 432(%eax), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: andl 176(%eax), %esi
-; X86-NEXT: orl %ecx, %esi
-; X86-NEXT: orl %edx, %esi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 368(%eax), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 112(%eax), %edx
-; X86-NEXT: orl %ecx, %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 496(%eax), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
-; X86-NEXT: andl 240(%eax), %ebx
-; X86-NEXT: orl %ecx, %ebx
-; X86-NEXT: orl %edx, %ebx
-; X86-NEXT: orl %esi, %ebx
-; X86-NEXT: orl %edi, %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 264(%eax), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 8(%eax), %edx
-; X86-NEXT: orl %ecx, %edx
-; X86-NEXT: movl %eax, %ebx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 392(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 136(%ebx), %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: orl %edx, %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 328(%ebx), %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 72(%ebx), %eax
-; X86-NEXT: orl %edx, %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: andl 456(%ebx), %edi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: andl 200(%ebx), %esi
-; X86-NEXT: orl %edi, %esi
-; X86-NEXT: orl %eax, %esi
-; X86-NEXT: orl %ecx, %esi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: andl 296(%ebx), %edi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 40(%ebx), %eax
-; X86-NEXT: orl %edi, %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: andl 424(%ebx), %edi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 168(%ebx), %edx
-; X86-NEXT: orl %edi, %edx
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 360(%ebx), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 104(%ebx), %eax
-; X86-NEXT: orl %ecx, %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 488(%ebx), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: andl 232(%ebx), %edi
-; X86-NEXT: orl %ecx, %edi
-; X86-NEXT: orl %eax, %edi
-; X86-NEXT: orl %edx, %edi
-; X86-NEXT: orl %esi, %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 280(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 24(%ebx), %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 408(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 152(%ebx), %edx
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: orl %ecx, %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 344(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 88(%ebx), %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 472(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: andl 216(%ebx), %esi
-; X86-NEXT: orl %eax, %esi
-; X86-NEXT: orl %ecx, %esi
-; X86-NEXT: orl %edx, %esi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 312(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 56(%ebx), %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 440(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 184(%ebx), %edx
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: orl %ecx, %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 376(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 120(%ebx), %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 504(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: andl 248(%ebx), %edi
-; X86-NEXT: orl %eax, %edi
-; X86-NEXT: orl %ecx, %edi
-; X86-NEXT: orl %edx, %edi
-; X86-NEXT: orl %esi, %edi
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 324(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 68(%ebx), %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 452(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 196(%ebx), %edx
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: orl %ecx, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 292(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 36(%ebx), %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 420(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 164(%ebx), %edx
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: orl %ecx, %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 356(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 100(%ebx), %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 484(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: andl 228(%ebx), %esi
-; X86-NEXT: orl %eax, %esi
-; X86-NEXT: orl %ecx, %esi
-; X86-NEXT: orl %edx, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 276(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 20(%ebx), %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 404(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 148(%ebx), %edx
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: orl %ecx, %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 340(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 84(%ebx), %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 468(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: andl 212(%ebx), %esi
-; X86-NEXT: orl %eax, %esi
-; X86-NEXT: orl %ecx, %esi
-; X86-NEXT: orl %edx, %esi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 308(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 52(%ebx), %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 436(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 180(%ebx), %edx
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: orl %ecx, %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 372(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 116(%ebx), %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 500(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: andl 244(%ebx), %edi
-; X86-NEXT: orl %eax, %edi
-; X86-NEXT: orl %ecx, %edi
-; X86-NEXT: orl %edx, %edi
-; X86-NEXT: orl %esi, %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 268(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 12(%ebx), %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 396(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 140(%ebx), %edx
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: orl %ecx, %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 332(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 76(%ebx), %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 460(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: andl 204(%ebx), %edi
-; X86-NEXT: orl %eax, %edi
-; X86-NEXT: orl %ecx, %edi
-; X86-NEXT: orl %edx, %edi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 300(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 44(%ebx), %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 428(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 172(%ebx), %edx
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: orl %ecx, %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 364(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 108(%ebx), %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 492(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: andl 236(%ebx), %esi
-; X86-NEXT: orl %eax, %esi
-; X86-NEXT: orl %ecx, %esi
-; X86-NEXT: orl %edx, %esi
-; X86-NEXT: orl %edi, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 284(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 28(%ebx), %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 412(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: andl 156(%ebx), %edi
-; X86-NEXT: orl %eax, %edi
-; X86-NEXT: orl %ecx, %edi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 348(%ebx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 92(%ebx), %edx
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 476(%ebx), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 220(%ebx), %eax
-; X86-NEXT: orl %ecx, %eax
-; X86-NEXT: orl %edx, %eax
-; X86-NEXT: orl %edi, %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 316(%ebx), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 60(%ebx), %edx
-; X86-NEXT: orl %ecx, %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 444(%ebx), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: andl 188(%ebx), %edi
-; X86-NEXT: orl %ecx, %edi
-; X86-NEXT: orl %edx, %edi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 380(%ebx), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: andl 124(%ebx), %edx
-; X86-NEXT: orl %ecx, %edx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 508(%ebx), %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
-; X86-NEXT: movl 8(%ebp), %esi
-; X86-NEXT: andl 252(%esi), %ebx
-; X86-NEXT: orl %ecx, %ebx
-; X86-NEXT: orl %edx, %ebx
-; X86-NEXT: orl %edi, %ebx
-; X86-NEXT: orl %eax, %ebx
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: negl %ecx
-; X86-NEXT: movl 1648(%esp,%ecx), %edi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
-; X86-NEXT: shldl %cl, %edi, %esi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; X86-NEXT: # kill: def $cl killed $cl killed $ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: shldl %cl, %edx, %edi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl 8(%ebp), %edx
-; X86-NEXT: andl 128(%edx), %ecx
-; X86-NEXT: andl 384(%edx), %edi
-; X86-NEXT: orl %ecx, %edi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: # kill: def $cl killed $cl killed $ecx
-; X86-NEXT: shll %cl, %eax
-; X86-NEXT: andl (%edx), %eax
-; X86-NEXT: orl %eax, %edi
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 256(%edx), %eax
-; X86-NEXT: orl %eax, %edi
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 260(%edx), %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: andl 4(%edx), %ecx
-; X86-NEXT: orl %eax, %ecx
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: andl 132(%edx), %eax
-; X86-NEXT: andl 388(%edx), %esi
-; X86-NEXT: orl %eax, %esi
-; X86-NEXT: orl %ecx, %esi
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
-; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
-; X86-NEXT: orl %ebx, %esi
-; X86-NEXT: orl %edi, %esi
-; X86-NEXT: setne %al
-; X86-NEXT: leal -12(%ebp), %esp
-; X86-NEXT: popl %esi
-; X86-NEXT: popl %edi
-; X86-NEXT: popl %ebx
-; X86-NEXT: popl %ebp
+; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: andl $4064, %edx # imm = 0xFE0
+; X86-NEXT: shrl $3, %edx
+; X86-NEXT: movl (%eax,%edx), %eax
+; X86-NEXT: btl %ecx, %eax
+; X86-NEXT: setb %al
; X86-NEXT: retl
;
-; SSE-LABEL: test_ne_i4096:
-; SSE: # %bb.0:
-; SSE-NEXT: pushq %rbp
-; SSE-NEXT: pushq %r15
-; SSE-NEXT: pushq %r14
-; SSE-NEXT: pushq %r13
-; SSE-NEXT: pushq %r12
-; SSE-NEXT: pushq %rbx
-; SSE-NEXT: subq $1576, %rsp # imm = 0x628
-; SSE-NEXT: movl %esi, %ecx
-; SSE-NEXT: movl %esi, %eax
-; SSE-NEXT: andl $4032, %eax # imm = 0xFC0
-; SSE-NEXT: xorps %xmm0, %xmm0
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movups %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movq $0, {{[0-9]+}}(%rsp)
-; SSE-NEXT: movq $1, {{[0-9]+}}(%rsp)
-; SSE-NEXT: andl $63, %ecx
-; SSE-NEXT: shrl $3, %eax
-; SSE-NEXT: negl %eax
-; SSE-NEXT: movslq %eax, %rsi
-; SSE-NEXT: movq 1296(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1304(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1552(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1560(%rsp,%rsi), %rax
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1168(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1176(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1424(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1432(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1232(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1240(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1488(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1496(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1104(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1112(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1360(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, (%rsp) # 8-byte Spill
-; SSE-NEXT: movq 1368(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1264(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1272(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1520(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1528(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1136(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1144(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1392(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1400(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1200(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1208(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1456(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1464(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1072(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1080(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1328(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1336(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1280(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1288(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1536(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1544(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1152(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1160(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1408(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1416(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1216(%rsp,%rsi), %r11
-; SSE-NEXT: movq 1224(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %r11, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1472(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1480(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1088(%rsp,%rsi), %r9
-; SSE-NEXT: movq 1096(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %r9, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1344(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1352(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1248(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1256(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rax, %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1504(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1512(%rsp,%rsi), %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rdx, %rax
-; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1120(%rsp,%rsi), %rax
-; SSE-NEXT: movq 1128(%rsp,%rsi), %r8
-; SSE-NEXT: movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: shldq %cl, %rax, %r8
-; SSE-NEXT: movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1376(%rsp,%rsi), %r13
-; SSE-NEXT: movq 1384(%rsp,%rsi), %rbx
-; SSE-NEXT: movq %rbx, %r8
-; SSE-NEXT: shldq %cl, %r13, %r8
-; SSE-NEXT: movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1184(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1192(%rsp,%rsi), %r15
-; SSE-NEXT: movq %r15, %r14
-; SSE-NEXT: shldq %cl, %rdx, %r14
-; SSE-NEXT: movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1440(%rsp,%rsi), %r10
-; SSE-NEXT: movq 1448(%rsp,%rsi), %rdx
-; SSE-NEXT: movq %rdx, %r14
-; SSE-NEXT: shldq %cl, %r10, %r14
-; SSE-NEXT: movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1312(%rsp,%rsi), %r14
-; SSE-NEXT: movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq 1320(%rsp,%rsi), %rbp
-; SSE-NEXT: movq %rbp, %r12
-; SSE-NEXT: shldq %cl, %r14, %r12
-; SSE-NEXT: movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r8, (%rsp) # 8-byte Folded Spill
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; SSE-NEXT: shldq %cl, %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; SSE-NEXT: shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; SSE-NEXT: shldq %cl, %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; SSE-NEXT: movq 1064(%rsp,%rsi), %rbx
-; SSE-NEXT: shldq %cl, %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %rbp, %r14
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
-; SSE-NEXT: shldq %cl, %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
-; SSE-NEXT: shldq %cl, %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
-; SSE-NEXT: shldq %cl, %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
-; SSE-NEXT: shldq %cl, %rdx, %r11
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r15, %rdx
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r15, %r9
-; SSE-NEXT: movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r15, %r8
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r15, %rbp
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r15, %r9
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r15, %rax
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r15, %r13
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r12, %r15
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 # 8-byte Reload
-; SSE-NEXT: shldq %cl, %r12, %r10
-; SSE-NEXT: andq 384(%rdi), %r10
-; SSE-NEXT: andq 128(%rdi), %r15
-; SSE-NEXT: andq 320(%rdi), %r13
-; SSE-NEXT: andq 64(%rdi), %rax
-; SSE-NEXT: orq %r10, %r15
-; SSE-NEXT: movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: orq %r13, %rax
-; SSE-NEXT: andq 448(%rdi), %r9
-; SSE-NEXT: andq 192(%rdi), %rbp
-; SSE-NEXT: orq %r9, %rbp
-; SSE-NEXT: orq %rax, %rbp
-; SSE-NEXT: movq %rbp, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: andq 288(%rdi), %r8
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload
-; SSE-NEXT: andq 32(%rdi), %r9
-; SSE-NEXT: andq 416(%rdi), %rdx
-; SSE-NEXT: andq 160(%rdi), %r11
-; SSE-NEXT: orq %r8, %r9
-; SSE-NEXT: orq %rdx, %r11
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
-; SSE-NEXT: andq 352(%rdi), %rdx
-; SSE-NEXT: orq %r9, %r11
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; SSE-NEXT: andq 96(%rdi), %rax
-; SSE-NEXT: orq %rdx, %rax
-; SSE-NEXT: movq %rax, %rdx
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; SSE-NEXT: andq 480(%rdi), %rax
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: andq 224(%rdi), %r8
-; SSE-NEXT: orq %rax, %r8
-; SSE-NEXT: orq %rdx, %r8
-; SSE-NEXT: andq 272(%rdi), %r14
-; SSE-NEXT: orq %r11, %r8
-; SSE-NEXT: movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; SSE-NEXT: andq 16(%rdi), %rax
-; SSE-NEXT: orq %r14, %rax
-; SSE-NEXT: movq %rax, %r8
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
-; SSE-NEXT: andq 400(%rdi), %rdx
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; SSE-NEXT: andq 144(%rdi), %rax
-; SSE-NEXT: orq %rdx, %rax
-; SSE-NEXT: orq %r8, %rax
-; SSE-NEXT: movq %rax, %r8
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload
-; SSE-NEXT: andq 336(%rdi), %r9
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; SSE-NEXT: andq 80(%rdi), %rax
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
-; SSE-NEXT: andq 464(%rdi), %rdx
-; SSE-NEXT: orq %r9, %rax
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload
-; SSE-NEXT: andq 208(%rdi), %r11
-; SSE-NEXT: orq %rdx, %r11
-; SSE-NEXT: orq %rax, %r11
-; SSE-NEXT: orq %r8, %r11
-; SSE-NEXT: movq (%rsp), %rdx # 8-byte Reload
-; SSE-NEXT: andq 304(%rdi), %rdx
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; SSE-NEXT: andq 48(%rdi), %rax
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload
-; SSE-NEXT: andq 432(%rdi), %r9
-; SSE-NEXT: orq %rdx, %rax
-; SSE-NEXT: movq %rax, %r10
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: andq 176(%rdi), %r8
-; SSE-NEXT: orq %r9, %r8
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload
-; SSE-NEXT: andq 368(%rdi), %r9
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; SSE-NEXT: andq 112(%rdi), %rax
-; SSE-NEXT: orq %r10, %r8
-; SSE-NEXT: movq %r8, %r10
-; SSE-NEXT: orq %r9, %rax
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: andq 496(%rdi), %r8
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
-; SSE-NEXT: andq 240(%rdi), %rbp
-; SSE-NEXT: orq %r8, %rbp
-; SSE-NEXT: orq %rax, %rbp
-; SSE-NEXT: orq %r10, %rbp
-; SSE-NEXT: orq %r11, %rbp
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; SSE-NEXT: andq 392(%rdi), %rax
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 # 8-byte Reload
-; SSE-NEXT: andq 136(%rdi), %r12
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
-; SSE-NEXT: andq 328(%rdi), %rdx
-; SSE-NEXT: orq %rax, %r12
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; SSE-NEXT: andq 72(%rdi), %rax
-; SSE-NEXT: orq %rdx, %rax
-; SSE-NEXT: movq %rax, %rdx
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; SSE-NEXT: andq 456(%rdi), %rax
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
-; SSE-NEXT: andq 200(%rdi), %r13
-; SSE-NEXT: orq %rax, %r13
-; SSE-NEXT: orq %rdx, %r13
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
-; SSE-NEXT: andq 296(%rdi), %rdx
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; SSE-NEXT: andq 40(%rdi), %rax
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: andq 424(%rdi), %r8
-; SSE-NEXT: orq %rdx, %rax
-; SSE-NEXT: movq %rax, %r9
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
-; SSE-NEXT: andq 168(%rdi), %rdx
-; SSE-NEXT: orq %r8, %rdx
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: andq 360(%rdi), %r8
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; SSE-NEXT: andq 104(%rdi), %rax
-; SSE-NEXT: orq %r9, %rdx
-; SSE-NEXT: orq %r8, %rax
-; SSE-NEXT: movq %rax, %r8
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; SSE-NEXT: andq 488(%rdi), %rax
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; SSE-NEXT: andq 232(%rdi), %r15
-; SSE-NEXT: orq %rax, %r15
-; SSE-NEXT: orq %r8, %r15
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: andq 280(%rdi), %r8
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; SSE-NEXT: andq 24(%rdi), %rax
-; SSE-NEXT: orq %rdx, %r15
-; SSE-NEXT: orq %r8, %rax
-; SSE-NEXT: movq %rax, %r10
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: andq 408(%rdi), %r8
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; SSE-NEXT: andq 152(%rdi), %rax
-; SSE-NEXT: orq %r8, %rax
-; SSE-NEXT: orq %r10, %rax
-; SSE-NEXT: movq %rax, %r10
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload
-; SSE-NEXT: andq 344(%rdi), %r11
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: andq 88(%rdi), %r8
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; SSE-NEXT: andq 472(%rdi), %rax
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload
-; SSE-NEXT: andq 216(%rdi), %r14
-; SSE-NEXT: orq %r11, %r8
-; SSE-NEXT: orq %rax, %r14
-; SSE-NEXT: orq %r8, %r14
-; SSE-NEXT: orq %r10, %r14
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload
-; SSE-NEXT: andq 312(%rdi), %r11
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload
-; SSE-NEXT: andq 56(%rdi), %r10
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: andq 440(%rdi), %r8
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload
-; SSE-NEXT: andq 184(%rdi), %r9
-; SSE-NEXT: orq %r11, %r10
-; SSE-NEXT: orq %r8, %r9
-; SSE-NEXT: orq %r10, %r9
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
-; SSE-NEXT: shldq %cl, %rax, %rdx
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload
-; SSE-NEXT: andq 376(%rdi), %r10
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; SSE-NEXT: andq 120(%rdi), %rax
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload
-; SSE-NEXT: andq 504(%rdi), %r11
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; SSE-NEXT: andq 248(%rdi), %r8
-; SSE-NEXT: orq %r10, %rax
-; SSE-NEXT: movq %rax, %r10
-; SSE-NEXT: orq %r11, %r8
-; SSE-NEXT: movq 1056(%rsp,%rsi), %rax
-; SSE-NEXT: shldq %cl, %rax, %rbx
-; SSE-NEXT: # kill: def $cl killed $cl killed $ecx
-; SSE-NEXT: shlq %cl, %rax
-; SSE-NEXT: orq %r10, %r8
-; SSE-NEXT: orq %r9, %r8
-; SSE-NEXT: andq 256(%rdi), %rdx
-; SSE-NEXT: orq %r14, %r8
-; SSE-NEXT: andq (%rdi), %rax
-; SSE-NEXT: orq %rdx, %rax
-; SSE-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Folded Reload
-; SSE-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Folded Reload
-; SSE-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Folded Reload
-; SSE-NEXT: orq %rbp, %rax
-; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
-; SSE-NEXT: andq 264(%rdi), %rcx
-; SSE-NEXT: andq 8(%rdi), %rbx
-; SSE-NEXT: orq %rcx, %rbx
-; SSE-NEXT: orq %r12, %rbx
-; SSE-NEXT: orq %r13, %rbx
-; SSE-NEXT: orq %r15, %rbx
-; SSE-NEXT: orq %r8, %rbx
-; SSE-NEXT: orq %rax, %rbx
-; SSE-NEXT: setne %al
-; SSE-NEXT: addq $1576, %rsp # imm = 0x628
-; SSE-NEXT: popq %rbx
-; SSE-NEXT: popq %r12
-; SSE-NEXT: popq %r13
-; SSE-NEXT: popq %r14
-; SSE-NEXT: popq %r15
-; SSE-NEXT: popq %rbp
-; SSE-NEXT: retq
-;
-; AVX2-LABEL: test_ne_i4096:
-; AVX2: # %bb.0:
-; AVX2-NEXT: pushq %rbp
-; AVX2-NEXT: pushq %r15
-; AVX2-NEXT: pushq %r14
-; AVX2-NEXT: pushq %r13
-; AVX2-NEXT: pushq %r12
-; AVX2-NEXT: pushq %rbx
-; AVX2-NEXT: subq $1560, %rsp # imm = 0x618
-; AVX2-NEXT: movl %esi, %ecx
-; AVX2-NEXT: movl %esi, %eax
-; AVX2-NEXT: vxorps %xmm0, %xmm0, %xmm0
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: andl $4032, %eax # imm = 0xFC0
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: vmovss {{.*#+}} xmm0 = [1,0,0,0]
-; AVX2-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX2-NEXT: andl $63, %ecx
-; AVX2-NEXT: shrl $3, %eax
-; AVX2-NEXT: negl %eax
-; AVX2-NEXT: movslq %eax, %rsi
-; AVX2-NEXT: movq 1280(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1288(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1536(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1544(%rsp,%rsi), %rax
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1152(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1160(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1408(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1416(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1216(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, (%rsp) # 8-byte Spill
-; AVX2-NEXT: movq 1224(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1472(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1480(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1088(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1096(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1344(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1352(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1248(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1256(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1504(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1512(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1120(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1128(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1376(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1384(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1184(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1192(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1440(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1448(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1056(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1064(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1312(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1320(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1264(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1272(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1520(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1528(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1136(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1144(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1392(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1400(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1200(%rsp,%rsi), %r11
-; AVX2-NEXT: movq 1208(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %r11, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1456(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1464(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1072(%rsp,%rsi), %r12
-; AVX2-NEXT: movq 1080(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %r12, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1328(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1336(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rdx, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1232(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1240(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rax, %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1488(%rsp,%rsi), %rbp
-; AVX2-NEXT: movq 1496(%rsp,%rsi), %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rbp, %rax
-; AVX2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1104(%rsp,%rsi), %rax
-; AVX2-NEXT: movq 1112(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: shldq %cl, %rax, %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1360(%rsp,%rsi), %r10
-; AVX2-NEXT: movq 1368(%rsp,%rsi), %r8
-; AVX2-NEXT: movq %r8, %rdx
-; AVX2-NEXT: shldq %cl, %r10, %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1168(%rsp,%rsi), %r9
-; AVX2-NEXT: movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1176(%rsp,%rsi), %rbx
-; AVX2-NEXT: movq %rbx, %rdx
-; AVX2-NEXT: shldq %cl, %r9, %rdx
-; AVX2-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1424(%rsp,%rsi), %r9
-; AVX2-NEXT: movq 1432(%rsp,%rsi), %rdx
-; AVX2-NEXT: movq %rdx, %r14
-; AVX2-NEXT: shldq %cl, %r9, %r14
-; AVX2-NEXT: movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1296(%rsp,%rsi), %r15
-; AVX2-NEXT: movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq 1304(%rsp,%rsi), %r14
-; AVX2-NEXT: movq %r14, %r13
-; AVX2-NEXT: shldq %cl, %r15, %r13
-; AVX2-NEXT: movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r15, (%rsp) # 8-byte Folded Spill
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX2-NEXT: shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX2-NEXT: shldq %cl, %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX2-NEXT: shldq %cl, %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX2-NEXT: movq 1048(%rsp,%rsi), %rdx
-; AVX2-NEXT: shldq %cl, %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX2-NEXT: shldq %cl, %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r14, %rbx
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r14, %r11
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r14, %r12
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r14, %r8
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r14, %r13
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r14, %rbp
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r14, %rax
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r14, %r10
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r15, %r14
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r15, %r9
-; AVX2-NEXT: andq 384(%rdi), %r9
-; AVX2-NEXT: andq 128(%rdi), %r14
-; AVX2-NEXT: andq 320(%rdi), %r10
-; AVX2-NEXT: orq %r9, %r14
-; AVX2-NEXT: movq %r14, %r15
-; AVX2-NEXT: andq 64(%rdi), %rax
-; AVX2-NEXT: orq %r10, %rax
-; AVX2-NEXT: andq 448(%rdi), %rbp
-; AVX2-NEXT: andq 192(%rdi), %r13
-; AVX2-NEXT: orq %rbp, %r13
-; AVX2-NEXT: orq %rax, %r13
-; AVX2-NEXT: movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX2-NEXT: andq 288(%rdi), %r8
-; AVX2-NEXT: andq 32(%rdi), %r12
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX2-NEXT: andq 416(%rdi), %rax
-; AVX2-NEXT: orq %r8, %r12
-; AVX2-NEXT: andq 160(%rdi), %r11
-; AVX2-NEXT: orq %rax, %r11
-; AVX2-NEXT: andq 352(%rdi), %rbx
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX2-NEXT: andq 96(%rdi), %rax
-; AVX2-NEXT: orq %r12, %r11
-; AVX2-NEXT: orq %rbx, %rax
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload
-; AVX2-NEXT: andq 480(%rdi), %r10
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
-; AVX2-NEXT: andq 224(%rdi), %r13
-; AVX2-NEXT: orq %r10, %r13
-; AVX2-NEXT: orq %rax, %r13
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX2-NEXT: andq 272(%rdi), %r8
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX2-NEXT: andq 16(%rdi), %rax
-; AVX2-NEXT: orq %r11, %r13
-; AVX2-NEXT: orq %r8, %rax
-; AVX2-NEXT: movq %rax, %r8
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload
-; AVX2-NEXT: andq 400(%rdi), %r9
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX2-NEXT: andq 144(%rdi), %rax
-; AVX2-NEXT: orq %r9, %rax
-; AVX2-NEXT: orq %r8, %rax
-; AVX2-NEXT: movq %rax, %r9
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload
-; AVX2-NEXT: andq 336(%rdi), %r10
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX2-NEXT: andq 80(%rdi), %rax
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX2-NEXT: andq 464(%rdi), %r8
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload
-; AVX2-NEXT: andq 208(%rdi), %r11
-; AVX2-NEXT: orq %r10, %rax
-; AVX2-NEXT: orq %r8, %r11
-; AVX2-NEXT: orq %rax, %r11
-; AVX2-NEXT: orq %r9, %r11
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload
-; AVX2-NEXT: andq 304(%rdi), %r9
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX2-NEXT: andq 48(%rdi), %r8
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload
-; AVX2-NEXT: andq 432(%rdi), %r10
-; AVX2-NEXT: movq (%rsp), %rax # 8-byte Reload
-; AVX2-NEXT: andq 176(%rdi), %rax
-; AVX2-NEXT: orq %r9, %r8
-; AVX2-NEXT: movq %r8, %r9
-; AVX2-NEXT: orq %r10, %rax
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX2-NEXT: andq 368(%rdi), %r8
-; AVX2-NEXT: orq %r9, %rax
-; AVX2-NEXT: movq %rax, %r10
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX2-NEXT: andq 112(%rdi), %rax
-; AVX2-NEXT: orq %r8, %rax
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX2-NEXT: andq 496(%rdi), %r8
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload
-; AVX2-NEXT: andq 240(%rdi), %r9
-; AVX2-NEXT: orq %r8, %r9
-; AVX2-NEXT: orq %rax, %r9
-; AVX2-NEXT: orq %r10, %r9
-; AVX2-NEXT: orq %r11, %r9
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload
-; AVX2-NEXT: andq 392(%rdi), %r10
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
-; AVX2-NEXT: andq 136(%rdi), %rbp
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX2-NEXT: andq 328(%rdi), %r8
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX2-NEXT: andq 72(%rdi), %rax
-; AVX2-NEXT: orq %r10, %rbp
-; AVX2-NEXT: orq %r8, %rax
-; AVX2-NEXT: movq %rax, %r8
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX2-NEXT: andq 456(%rdi), %rax
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 # 8-byte Reload
-; AVX2-NEXT: andq 200(%rdi), %r12
-; AVX2-NEXT: orq %rax, %r12
-; AVX2-NEXT: orq %r8, %r12
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload
-; AVX2-NEXT: andq 296(%rdi), %r10
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX2-NEXT: andq 40(%rdi), %r8
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload
-; AVX2-NEXT: andq 424(%rdi), %r11
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX2-NEXT: andq 168(%rdi), %rax
-; AVX2-NEXT: orq %r10, %r8
-; AVX2-NEXT: movq %r8, %r10
-; AVX2-NEXT: orq %r11, %rax
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX2-NEXT: andq 360(%rdi), %r8
-; AVX2-NEXT: orq %r10, %rax
-; AVX2-NEXT: movq %rax, %r10
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX2-NEXT: andq 104(%rdi), %rax
-; AVX2-NEXT: orq %r8, %rax
-; AVX2-NEXT: movq %rax, %r8
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX2-NEXT: andq 488(%rdi), %rax
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload
-; AVX2-NEXT: andq 232(%rdi), %r14
-; AVX2-NEXT: orq %rax, %r14
-; AVX2-NEXT: orq %r8, %r14
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX2-NEXT: andq 280(%rdi), %r8
-; AVX2-NEXT: orq %r10, %r14
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX2-NEXT: andq 24(%rdi), %rax
-; AVX2-NEXT: orq %r8, %rax
-; AVX2-NEXT: movq %rax, %r10
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX2-NEXT: andq 408(%rdi), %r8
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX2-NEXT: andq 152(%rdi), %rax
-; AVX2-NEXT: orq %r8, %rax
-; AVX2-NEXT: orq %r10, %rax
-; AVX2-NEXT: movq %rax, %r10
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload
-; AVX2-NEXT: andq 344(%rdi), %r11
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX2-NEXT: andq 88(%rdi), %r8
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX2-NEXT: andq 472(%rdi), %rax
-; AVX2-NEXT: orq %r11, %r8
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
-; AVX2-NEXT: andq 216(%rdi), %rbx
-; AVX2-NEXT: orq %rax, %rbx
-; AVX2-NEXT: orq %r8, %rbx
-; AVX2-NEXT: orq %r10, %rbx
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX2-NEXT: andq 312(%rdi), %r8
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX2-NEXT: andq 56(%rdi), %rax
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload
-; AVX2-NEXT: andq 440(%rdi), %r10
-; AVX2-NEXT: orq %r8, %rax
-; AVX2-NEXT: movq %rax, %r11
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX2-NEXT: andq 184(%rdi), %r8
-; AVX2-NEXT: orq %r10, %r8
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload
-; AVX2-NEXT: andq 376(%rdi), %r10
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX2-NEXT: andq 120(%rdi), %rax
-; AVX2-NEXT: orq %r11, %r8
-; AVX2-NEXT: movq %r8, %r11
-; AVX2-NEXT: orq %r10, %rax
-; AVX2-NEXT: movq %rax, %r10
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX2-NEXT: andq 504(%rdi), %r8
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX2-NEXT: andq 248(%rdi), %rax
-; AVX2-NEXT: orq %r8, %rax
-; AVX2-NEXT: orq %r10, %rax
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload
-; AVX2-NEXT: shldq %cl, %r8, %r10
-; AVX2-NEXT: orq %r11, %rax
-; AVX2-NEXT: movq 1040(%rsp,%rsi), %rsi
-; AVX2-NEXT: orq %rbx, %rax
-; AVX2-NEXT: movq %rax, %r8
-; AVX2-NEXT: shlxq %rcx, %rsi, %rax
-; AVX2-NEXT: andq 256(%rdi), %r10
-; AVX2-NEXT: andq (%rdi), %rax
-; AVX2-NEXT: orq %r10, %rax
-; AVX2-NEXT: orq %r15, %rax
-; AVX2-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Folded Reload
-; AVX2-NEXT: orq %r13, %rax
-; AVX2-NEXT: # kill: def $cl killed $cl killed $rcx
-; AVX2-NEXT: shldq %cl, %rsi, %rdx
-; AVX2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
-; AVX2-NEXT: andq 264(%rdi), %rcx
-; AVX2-NEXT: andq 8(%rdi), %rdx
-; AVX2-NEXT: orq %r9, %rax
-; AVX2-NEXT: orq %rcx, %rdx
-; AVX2-NEXT: orq %rbp, %rdx
-; AVX2-NEXT: orq %r12, %rdx
-; AVX2-NEXT: orq %r14, %rdx
-; AVX2-NEXT: orq %r8, %rdx
-; AVX2-NEXT: orq %rax, %rdx
-; AVX2-NEXT: setne %al
-; AVX2-NEXT: addq $1560, %rsp # imm = 0x618
-; AVX2-NEXT: popq %rbx
-; AVX2-NEXT: popq %r12
-; AVX2-NEXT: popq %r13
-; AVX2-NEXT: popq %r14
-; AVX2-NEXT: popq %r15
-; AVX2-NEXT: popq %rbp
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
-;
-; AVX512-LABEL: test_ne_i4096:
-; AVX512: # %bb.0:
-; AVX512-NEXT: pushq %rbp
-; AVX512-NEXT: pushq %r15
-; AVX512-NEXT: pushq %r14
-; AVX512-NEXT: pushq %r13
-; AVX512-NEXT: pushq %r12
-; AVX512-NEXT: pushq %rbx
-; AVX512-NEXT: subq $1560, %rsp # imm = 0x618
-; AVX512-NEXT: movl %esi, %ecx
-; AVX512-NEXT: movl %esi, %eax
-; AVX512-NEXT: andl $4032, %eax # imm = 0xFC0
-; AVX512-NEXT: vxorps %xmm0, %xmm0, %xmm0
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: vmovaps {{.*#+}} xmm0 = [1,0,0,0]
-; AVX512-NEXT: vmovups %ymm0, {{[0-9]+}}(%rsp)
-; AVX512-NEXT: andl $63, %ecx
-; AVX512-NEXT: shrl $3, %eax
-; AVX512-NEXT: negl %eax
-; AVX512-NEXT: movslq %eax, %rsi
-; AVX512-NEXT: movq 1280(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1288(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1536(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1544(%rsp,%rsi), %rax
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1152(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1160(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1408(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1416(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1216(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, (%rsp) # 8-byte Spill
-; AVX512-NEXT: movq 1224(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1472(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1480(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1088(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1096(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1344(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1352(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1248(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1256(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1504(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1512(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1120(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1128(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1376(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1384(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1184(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1192(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1440(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1448(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1056(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1064(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1312(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1320(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1264(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1272(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1520(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1528(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1136(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1144(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1392(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1400(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1200(%rsp,%rsi), %r10
-; AVX512-NEXT: movq 1208(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %r10, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1456(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1464(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1072(%rsp,%rsi), %r14
-; AVX512-NEXT: movq 1080(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %r14, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1328(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1336(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rdx, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1232(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1240(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rax, %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1488(%rsp,%rsi), %r12
-; AVX512-NEXT: movq 1496(%rsp,%rsi), %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %r12, %rax
-; AVX512-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1104(%rsp,%rsi), %rax
-; AVX512-NEXT: movq 1112(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: shldq %cl, %rax, %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1360(%rsp,%rsi), %r11
-; AVX512-NEXT: movq 1368(%rsp,%rsi), %rbx
-; AVX512-NEXT: movq %rbx, %rdx
-; AVX512-NEXT: shldq %cl, %r11, %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1168(%rsp,%rsi), %r9
-; AVX512-NEXT: movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1176(%rsp,%rsi), %r8
-; AVX512-NEXT: movq %r8, %rdx
-; AVX512-NEXT: shldq %cl, %r9, %rdx
-; AVX512-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1424(%rsp,%rsi), %r9
-; AVX512-NEXT: movq 1432(%rsp,%rsi), %rdx
-; AVX512-NEXT: movq %rdx, %r15
-; AVX512-NEXT: shldq %cl, %r9, %r15
-; AVX512-NEXT: movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1296(%rsp,%rsi), %rbp
-; AVX512-NEXT: movq %rbp, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq 1304(%rsp,%rsi), %r15
-; AVX512-NEXT: movq %r15, %r13
-; AVX512-NEXT: shldq %cl, %rbp, %r13
-; AVX512-NEXT: movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r13, (%rsp) # 8-byte Folded Spill
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX512-NEXT: shldq %cl, %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX512-NEXT: shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX512-NEXT: shldq %cl, %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX512-NEXT: movq 1048(%rsp,%rsi), %rdx
-; AVX512-NEXT: shldq %cl, %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX512-NEXT: shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r15, %rbx
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r15, %r10
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r15, %r14
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r15, %r8
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r15, %r13
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r15, %r12
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r15, %rax
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %r15, %r11
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %rbp, %r15
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %rbp, %r9
-; AVX512-NEXT: andq 384(%rdi), %r9
-; AVX512-NEXT: andq 128(%rdi), %r15
-; AVX512-NEXT: orq %r9, %r15
-; AVX512-NEXT: movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; AVX512-NEXT: andq 320(%rdi), %r11
-; AVX512-NEXT: andq 64(%rdi), %rax
-; AVX512-NEXT: orq %r11, %rax
-; AVX512-NEXT: andq 448(%rdi), %r12
-; AVX512-NEXT: andq 192(%rdi), %r13
-; AVX512-NEXT: orq %r12, %r13
-; AVX512-NEXT: orq %rax, %r13
-; AVX512-NEXT: andq 288(%rdi), %r8
-; AVX512-NEXT: andq 32(%rdi), %r14
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 416(%rdi), %rax
-; AVX512-NEXT: orq %r8, %r14
-; AVX512-NEXT: andq 160(%rdi), %r10
-; AVX512-NEXT: orq %rax, %r10
-; AVX512-NEXT: andq 352(%rdi), %rbx
-; AVX512-NEXT: orq %r14, %r10
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 96(%rdi), %rax
-; AVX512-NEXT: orq %rbx, %rax
-; AVX512-NEXT: movq %rax, %r8
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 480(%rdi), %rax
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload
-; AVX512-NEXT: andq 224(%rdi), %r15
-; AVX512-NEXT: orq %rax, %r15
-; AVX512-NEXT: orq %r8, %r15
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX512-NEXT: andq 272(%rdi), %r8
-; AVX512-NEXT: orq %r10, %r15
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 16(%rdi), %rax
-; AVX512-NEXT: orq %r8, %rax
-; AVX512-NEXT: movq %rax, %r8
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload
-; AVX512-NEXT: andq 400(%rdi), %r9
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 144(%rdi), %rax
-; AVX512-NEXT: orq %r9, %rax
-; AVX512-NEXT: orq %r8, %rax
-; AVX512-NEXT: movq %rax, %r9
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload
-; AVX512-NEXT: andq 336(%rdi), %r10
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 80(%rdi), %rax
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX512-NEXT: andq 464(%rdi), %r8
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload
-; AVX512-NEXT: andq 208(%rdi), %r11
-; AVX512-NEXT: orq %r10, %rax
-; AVX512-NEXT: orq %r8, %r11
-; AVX512-NEXT: orq %rax, %r11
-; AVX512-NEXT: orq %r9, %r11
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload
-; AVX512-NEXT: andq 304(%rdi), %r10
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 48(%rdi), %rax
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload
-; AVX512-NEXT: andq 432(%rdi), %r9
-; AVX512-NEXT: movq (%rsp), %r8 # 8-byte Reload
-; AVX512-NEXT: andq 176(%rdi), %r8
-; AVX512-NEXT: orq %r10, %rax
-; AVX512-NEXT: movq %rax, %r10
-; AVX512-NEXT: orq %r9, %r8
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload
-; AVX512-NEXT: andq 368(%rdi), %r9
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 112(%rdi), %rax
-; AVX512-NEXT: orq %r10, %r8
-; AVX512-NEXT: movq %r8, %r10
-; AVX512-NEXT: orq %r9, %rax
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX512-NEXT: andq 496(%rdi), %r8
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload
-; AVX512-NEXT: andq 240(%rdi), %r9
-; AVX512-NEXT: orq %r8, %r9
-; AVX512-NEXT: orq %rax, %r9
-; AVX512-NEXT: orq %r10, %r9
-; AVX512-NEXT: orq %r11, %r9
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload
-; AVX512-NEXT: andq 392(%rdi), %r10
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
-; AVX512-NEXT: andq 136(%rdi), %rbp
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX512-NEXT: andq 328(%rdi), %r8
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 72(%rdi), %rax
-; AVX512-NEXT: orq %r10, %rbp
-; AVX512-NEXT: orq %r8, %rax
-; AVX512-NEXT: movq %rax, %r8
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 456(%rdi), %rax
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 # 8-byte Reload
-; AVX512-NEXT: andq 200(%rdi), %r12
-; AVX512-NEXT: orq %rax, %r12
-; AVX512-NEXT: orq %r8, %r12
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX512-NEXT: andq 296(%rdi), %r8
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 40(%rdi), %rax
-; AVX512-NEXT: orq %r8, %rax
-; AVX512-NEXT: movq %rax, %r10
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX512-NEXT: andq 424(%rdi), %r8
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 168(%rdi), %rax
-; AVX512-NEXT: orq %r8, %rax
-; AVX512-NEXT: orq %r10, %rax
-; AVX512-NEXT: movq %rax, %r10
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX512-NEXT: andq 360(%rdi), %r8
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 104(%rdi), %rax
-; AVX512-NEXT: orq %r8, %rax
-; AVX512-NEXT: movq %rax, %r8
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 488(%rdi), %rax
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload
-; AVX512-NEXT: andq 232(%rdi), %r14
-; AVX512-NEXT: orq %rax, %r14
-; AVX512-NEXT: orq %r8, %r14
-; AVX512-NEXT: orq %r10, %r14
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX512-NEXT: andq 280(%rdi), %r8
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 24(%rdi), %rax
-; AVX512-NEXT: orq %r8, %rax
-; AVX512-NEXT: movq %rax, %r10
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX512-NEXT: andq 408(%rdi), %r8
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 152(%rdi), %rax
-; AVX512-NEXT: orq %r8, %rax
-; AVX512-NEXT: orq %r10, %rax
-; AVX512-NEXT: movq %rax, %r10
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload
-; AVX512-NEXT: andq 344(%rdi), %r11
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX512-NEXT: andq 88(%rdi), %r8
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 472(%rdi), %rax
-; AVX512-NEXT: orq %r11, %r8
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
-; AVX512-NEXT: andq 216(%rdi), %rbx
-; AVX512-NEXT: orq %rax, %rbx
-; AVX512-NEXT: orq %r8, %rbx
-; AVX512-NEXT: orq %r10, %rbx
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload
-; AVX512-NEXT: andq 312(%rdi), %r10
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 56(%rdi), %rax
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX512-NEXT: andq 440(%rdi), %r8
-; AVX512-NEXT: orq %r10, %rax
-; AVX512-NEXT: movq %rax, %r10
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 184(%rdi), %rax
-; AVX512-NEXT: orq %r8, %rax
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX512-NEXT: andq 376(%rdi), %r8
-; AVX512-NEXT: orq %r10, %rax
-; AVX512-NEXT: movq %rax, %r11
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 120(%rdi), %rax
-; AVX512-NEXT: orq %r8, %rax
-; AVX512-NEXT: movq %rax, %r10
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 504(%rdi), %rax
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload
-; AVX512-NEXT: andq 248(%rdi), %r8
-; AVX512-NEXT: orq %rax, %r8
-; AVX512-NEXT: orq %r10, %r8
-; AVX512-NEXT: orq %r11, %r8
-; AVX512-NEXT: movq 1040(%rsp,%rsi), %rax
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload
-; AVX512-NEXT: shldq %cl, %rsi, %r10
-; AVX512-NEXT: orq %rbx, %r8
-; AVX512-NEXT: shlxq %rcx, %rax, %rsi
-; AVX512-NEXT: andq 256(%rdi), %r10
-; AVX512-NEXT: andq (%rdi), %rsi
-; AVX512-NEXT: orq %r10, %rsi
-; AVX512-NEXT: orq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload
-; AVX512-NEXT: orq %r13, %rsi
-; AVX512-NEXT: orq %r15, %rsi
-; AVX512-NEXT: # kill: def $cl killed $cl killed $rcx
-; AVX512-NEXT: shldq %cl, %rax, %rdx
-; AVX512-NEXT: orq %r9, %rsi
-; AVX512-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
-; AVX512-NEXT: andq 264(%rdi), %rax
-; AVX512-NEXT: andq 8(%rdi), %rdx
-; AVX512-NEXT: orq %rax, %rdx
-; AVX512-NEXT: orq %rbp, %rdx
-; AVX512-NEXT: orq %r12, %rdx
-; AVX512-NEXT: orq %r14, %rdx
-; AVX512-NEXT: orq %r8, %rdx
-; AVX512-NEXT: orq %rsi, %rdx
-; AVX512-NEXT: setne %al
-; AVX512-NEXT: addq $1560, %rsp # imm = 0x618
-; AVX512-NEXT: popq %rbx
-; AVX512-NEXT: popq %r12
-; AVX512-NEXT: popq %r13
-; AVX512-NEXT: popq %r14
-; AVX512-NEXT: popq %r15
-; AVX512-NEXT: popq %rbp
-; AVX512-NEXT: vzeroupper
-; AVX512-NEXT: retq
+; X64-LABEL: test_ne_i4096:
+; X64: # %bb.0:
+; X64-NEXT: movl %esi, %eax
+; X64-NEXT: andl $4064, %eax # imm = 0xFE0
+; X64-NEXT: shrl $3, %eax
+; X64-NEXT: movl (%rdi,%rax), %eax
+; X64-NEXT: btl %esi, %eax
+; X64-NEXT: setb %al
+; X64-NEXT: retq
%rem = and i32 %position, 4095
%ofs = zext nneg i32 %rem to i4096
%bit = shl nuw i4096 1, %ofs
@@ -7161,8 +1827,8 @@ define i32 @reset_multiload_i128(ptr %word, i32 %position, ptr %p) nounwind {
; X86-NEXT: pushl %edi
; X86-NEXT: pushl %esi
; X86-NEXT: andl $-16, %esp
-; X86-NEXT: subl $80, %esp
-; X86-NEXT: movzbl 12(%ebp), %ecx
+; X86-NEXT: subl $64, %esp
+; X86-NEXT: movl 12(%ebp), %ecx
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
@@ -7176,51 +1842,33 @@ define i32 @reset_multiload_i128(ptr %word, i32 %position, ptr %p) nounwind {
; X86-NEXT: andb $12, %al
; X86-NEXT: negb %al
; X86-NEXT: movsbl %al, %eax
-; X86-NEXT: movl 56(%esp,%eax), %esi
-; X86-NEXT: movl 60(%esp,%eax), %edx
-; X86-NEXT: shldl %cl, %esi, %edx
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl 48(%esp,%eax), %edi
-; X86-NEXT: movl 52(%esp,%eax), %eax
-; X86-NEXT: shldl %cl, %eax, %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: shldl %cl, %edi, %eax
-; X86-NEXT: movl 8(%ebp), %ebx
-; X86-NEXT: shll %cl, %edi
-; X86-NEXT: movl 8(%ebx), %ecx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %esi, %ecx
-; X86-NEXT: movl (%ebx), %esi
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %edi, %esi
-; X86-NEXT: orl %ecx, %esi
-; X86-NEXT: movl 12(%ebx), %ecx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
-; X86-NEXT: movl %eax, %edx
-; X86-NEXT: movl 4(%ebx), %ebx
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: andl %ebx, %eax
-; X86-NEXT: orl %ecx, %eax
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: notl %ecx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; X86-NEXT: movl 40(%esp,%eax), %edx
+; X86-NEXT: movl 44(%esp,%eax), %esi
+; X86-NEXT: shldl %cl, %edx, %esi
+; X86-NEXT: movl 32(%esp,%eax), %edi
+; X86-NEXT: movl 36(%esp,%eax), %ebx
+; X86-NEXT: shldl %cl, %ebx, %edx
+; X86-NEXT: shldl %cl, %edi, %ebx
; X86-NEXT: notl %ebx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
-; X86-NEXT: notl %edx
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: notl %edi
-; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
-; X86-NEXT: orl %esi, %eax
; X86-NEXT: movl 16(%ebp), %eax
; X86-NEXT: movl (%eax), %eax
-; X86-NEXT: movl 8(%ebp), %esi
-; X86-NEXT: movl %ebx, 8(%esi)
-; X86-NEXT: movl %ecx, 12(%esi)
-; X86-NEXT: movl %edi, (%esi)
-; X86-NEXT: movl %edx, 4(%esi)
-; X86-NEXT: je .LBB22_2
+; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl 8(%ebp), %eax
+; X86-NEXT: andl %ebx, 4(%eax)
+; X86-NEXT: shll %cl, %edi
+; X86-NEXT: notl %edi
+; X86-NEXT: movl %ecx, %ebx
+; X86-NEXT: andl $96, %ebx
+; X86-NEXT: shrl $3, %ebx
+; X86-NEXT: movl (%eax,%ebx), %ebx
+; X86-NEXT: andl %edi, (%eax)
+; X86-NEXT: notl %esi
+; X86-NEXT: andl %esi, 12(%eax)
+; X86-NEXT: notl %edx
+; X86-NEXT: andl %edx, 8(%eax)
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; X86-NEXT: btl %ecx, %ebx
+; X86-NEXT: jae .LBB22_2
; X86-NEXT: # %bb.1:
; X86-NEXT: xorl %eax, %eax
; X86-NEXT: .LBB22_2:
@@ -7242,52 +1890,75 @@ define i32 @reset_multiload_i128(ptr %word, i32 %position, ptr %p) nounwind {
; SSE-NEXT: testb $64, %cl
; SSE-NEXT: cmovneq %rsi, %r8
; SSE-NEXT: cmovneq %rax, %rsi
-; SSE-NEXT: movq (%rdi), %rcx
-; SSE-NEXT: movq 8(%rdi), %r9
-; SSE-NEXT: movq %r9, %r10
-; SSE-NEXT: andq %r8, %r10
; SSE-NEXT: notq %r8
-; SSE-NEXT: movq %rcx, %r11
-; SSE-NEXT: andq %rsi, %r11
; SSE-NEXT: notq %rsi
-; SSE-NEXT: andq %r9, %r8
-; SSE-NEXT: andq %rcx, %rsi
-; SSE-NEXT: orq %r10, %r11
-; SSE-NEXT: jne .LBB22_2
+; SSE-NEXT: movl %ecx, %r9d
+; SSE-NEXT: andl $96, %r9d
+; SSE-NEXT: shrl $3, %r9d
+; SSE-NEXT: movl (%rdi,%r9), %r9d
+; SSE-NEXT: btl %ecx, %r9d
+; SSE-NEXT: jb .LBB22_2
; SSE-NEXT: # %bb.1:
; SSE-NEXT: movl (%rdx), %eax
; SSE-NEXT: .LBB22_2:
-; SSE-NEXT: movq %rsi, (%rdi)
-; SSE-NEXT: movq %r8, 8(%rdi)
+; SSE-NEXT: andq %rsi, (%rdi)
+; SSE-NEXT: andq %r8, 8(%rdi)
; SSE-NEXT: # kill: def $eax killed $eax killed $rax
; SSE-NEXT: retq
;
-; AVX-LABEL: reset_multiload_i128:
-; AVX: # %bb.0:
-; AVX-NEXT: movl %esi, %ecx
-; AVX-NEXT: movl $1, %esi
-; AVX-NEXT: xorl %r8d, %r8d
-; AVX-NEXT: shldq %cl, %rsi, %r8
-; AVX-NEXT: xorl %eax, %eax
-; AVX-NEXT: shlxq %rcx, %rsi, %r9
-; AVX-NEXT: testb $64, %cl
-; AVX-NEXT: cmovneq %r9, %r8
-; AVX-NEXT: cmovneq %rax, %r9
-; AVX-NEXT: movq (%rdi), %r10
-; AVX-NEXT: movq 8(%rdi), %r11
-; AVX-NEXT: andnq %r11, %r8, %rcx
-; AVX-NEXT: andq %r8, %r11
-; AVX-NEXT: andnq %r10, %r9, %rsi
-; AVX-NEXT: andq %r9, %r10
-; AVX-NEXT: orq %r11, %r10
-; AVX-NEXT: jne .LBB22_2
-; AVX-NEXT: # %bb.1:
-; AVX-NEXT: movl (%rdx), %eax
-; AVX-NEXT: .LBB22_2:
-; AVX-NEXT: movq %rsi, (%rdi)
-; AVX-NEXT: movq %rcx, 8(%rdi)
-; AVX-NEXT: # kill: def $eax killed $eax killed $rax
-; AVX-NEXT: retq
+; AVX2-LABEL: reset_multiload_i128:
+; AVX2: # %bb.0:
+; AVX2-NEXT: movl %esi, %ecx
+; AVX2-NEXT: xorl %eax, %eax
+; AVX2-NEXT: movl $1, %r8d
+; AVX2-NEXT: xorl %esi, %esi
+; AVX2-NEXT: shldq %cl, %r8, %rsi
+; AVX2-NEXT: shlxq %rcx, %r8, %r8
+; AVX2-NEXT: testb $64, %cl
+; AVX2-NEXT: cmovneq %r8, %rsi
+; AVX2-NEXT: cmovneq %rax, %r8
+; AVX2-NEXT: notq %rsi
+; AVX2-NEXT: notq %r8
+; AVX2-NEXT: movl %ecx, %r9d
+; AVX2-NEXT: andl $96, %r9d
+; AVX2-NEXT: shrl $3, %r9d
+; AVX2-NEXT: movl (%rdi,%r9), %r9d
+; AVX2-NEXT: btl %ecx, %r9d
+; AVX2-NEXT: jb .LBB22_2
+; AVX2-NEXT: # %bb.1:
+; AVX2-NEXT: movl (%rdx), %eax
+; AVX2-NEXT: .LBB22_2:
+; AVX2-NEXT: andq %r8, (%rdi)
+; AVX2-NEXT: andq %rsi, 8(%rdi)
+; AVX2-NEXT: # kill: def $eax killed $eax killed $rax
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: reset_multiload_i128:
+; AVX512: # %bb.0:
+; AVX512-NEXT: movl %esi, %ecx
+; AVX512-NEXT: movl $1, %r8d
+; AVX512-NEXT: xorl %esi, %esi
+; AVX512-NEXT: shldq %cl, %r8, %rsi
+; AVX512-NEXT: xorl %eax, %eax
+; AVX512-NEXT: shlxq %rcx, %r8, %r8
+; AVX512-NEXT: testb $64, %cl
+; AVX512-NEXT: cmovneq %r8, %rsi
+; AVX512-NEXT: cmovneq %rax, %r8
+; AVX512-NEXT: notq %rsi
+; AVX512-NEXT: notq %r8
+; AVX512-NEXT: movl %ecx, %r9d
+; AVX512-NEXT: andl $96, %r9d
+; AVX512-NEXT: shrl $3, %r9d
+; AVX512-NEXT: movl (%rdi,%r9), %r9d
+; AVX512-NEXT: btl %ecx, %r9d
+; AVX512-NEXT: jb .LBB22_2
+; AVX512-NEXT: # %bb.1:
+; AVX512-NEXT: movl (%rdx), %eax
+; AVX512-NEXT: .LBB22_2:
+; AVX512-NEXT: andq %r8, (%rdi)
+; AVX512-NEXT: andq %rsi, 8(%rdi)
+; AVX512-NEXT: # kill: def $eax killed $eax killed $rax
+; AVX512-NEXT: retq
%rem = and i32 %position, 127
%ofs = zext nneg i32 %rem to i128
%bit = shl nuw i128 1, %ofs
diff --git a/llvm/test/CodeGen/X86/isel-llvm.sincos.ll b/llvm/test/CodeGen/X86/isel-llvm.sincos.ll
index 065710f..8576f8f 100644
--- a/llvm/test/CodeGen/X86/isel-llvm.sincos.ll
+++ b/llvm/test/CodeGen/X86/isel-llvm.sincos.ll
@@ -3,6 +3,9 @@
; RUN: llc < %s -mtriple=x86_64-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X64,FASTISEL-X64
; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel=0 -fast-isel=0 | FileCheck %s --check-prefixes=X86,SDAG-X86
; RUN: llc < %s -mtriple=x86_64-linux-gnu -global-isel=0 -fast-isel=0 | FileCheck %s --check-prefixes=X64,SDAG-X64
+; RUN: llc < %s -mtriple=x86_64-apple-macosx10.9.0 -mcpu=core2 | FileCheck %s --check-prefix=MACOS-SINCOS-STRET
+; RUN: llc < %s -mtriple=x86_64-apple-macosx10.8.0 -mcpu=core2 | FileCheck %s --check-prefix=MACOS-NOSINCOS-STRET
+
; TODO: The below RUN line will fails GISEL selection and will fallback to DAG selection due to lack of support for loads/stores in i686 mode, support is expected soon enough, for this reason the llvm/test/CodeGen/X86/GlobalISel/llvm.sincos.mir test is added for now because of the lack of support for i686 in GlobalISel.
; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel=1 -global-isel-abort=2 | FileCheck %s --check-prefixes=GISEL-X86
; RUN: llc < %s -mtriple=x86_64-linux-gnu -global-isel=1 -global-isel-abort=1 | FileCheck %s --check-prefixes=GISEL-X64
@@ -34,6 +37,29 @@ define { float, float } @test_sincos_f32(float %Val) nounwind {
; X64-NEXT: popq %rax
; X64-NEXT: retq
;
+; MACOS-SINCOS-STRET-LABEL: test_sincos_f32:
+; MACOS-SINCOS-STRET: ## %bb.0:
+; MACOS-SINCOS-STRET-NEXT: pushq %rax
+; MACOS-SINCOS-STRET-NEXT: callq ___sincosf_stret
+; MACOS-SINCOS-STRET-NEXT: movshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
+; MACOS-SINCOS-STRET-NEXT: popq %rax
+; MACOS-SINCOS-STRET-NEXT: retq
+;
+; MACOS-NOSINCOS-STRET-LABEL: test_sincos_f32:
+; MACOS-NOSINCOS-STRET: ## %bb.0:
+; MACOS-NOSINCOS-STRET-NEXT: pushq %rax
+; MACOS-NOSINCOS-STRET-NEXT: movss %xmm0, (%rsp) ## 4-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: callq _sinf
+; MACOS-NOSINCOS-STRET-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: movss (%rsp), %xmm0 ## 4-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: ## xmm0 = mem[0],zero,zero,zero
+; MACOS-NOSINCOS-STRET-NEXT: callq _cosf
+; MACOS-NOSINCOS-STRET-NEXT: movaps %xmm0, %xmm1
+; MACOS-NOSINCOS-STRET-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 4-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: ## xmm0 = mem[0],zero,zero,zero
+; MACOS-NOSINCOS-STRET-NEXT: popq %rax
+; MACOS-NOSINCOS-STRET-NEXT: retq
+;
; GISEL-X86-LABEL: test_sincos_f32:
; GISEL-X86: # %bb.0:
; GISEL-X86-NEXT: subl $28, %esp
@@ -93,6 +119,28 @@ define { double, double } @test_sincos_f64(double %Val) nounwind {
; X64-NEXT: addq $24, %rsp
; X64-NEXT: retq
;
+; MACOS-SINCOS-STRET-LABEL: test_sincos_f64:
+; MACOS-SINCOS-STRET: ## %bb.0:
+; MACOS-SINCOS-STRET-NEXT: pushq %rax
+; MACOS-SINCOS-STRET-NEXT: callq ___sincos_stret
+; MACOS-SINCOS-STRET-NEXT: popq %rax
+; MACOS-SINCOS-STRET-NEXT: retq
+;
+; MACOS-NOSINCOS-STRET-LABEL: test_sincos_f64:
+; MACOS-NOSINCOS-STRET: ## %bb.0:
+; MACOS-NOSINCOS-STRET-NEXT: subq $24, %rsp
+; MACOS-NOSINCOS-STRET-NEXT: movsd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: callq _sin
+; MACOS-NOSINCOS-STRET-NEXT: movsd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: movsd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 8-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: ## xmm0 = mem[0],zero
+; MACOS-NOSINCOS-STRET-NEXT: callq _cos
+; MACOS-NOSINCOS-STRET-NEXT: movaps %xmm0, %xmm1
+; MACOS-NOSINCOS-STRET-NEXT: movsd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 8-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: ## xmm0 = mem[0],zero
+; MACOS-NOSINCOS-STRET-NEXT: addq $24, %rsp
+; MACOS-NOSINCOS-STRET-NEXT: retq
+;
; GISEL-X86-LABEL: test_sincos_f64:
; GISEL-X86: # %bb.0:
; GISEL-X86-NEXT: subl $44, %esp
@@ -153,6 +201,40 @@ define { x86_fp80, x86_fp80 } @test_sincos_f80(x86_fp80 %Val) nounwind {
; X64-NEXT: addq $56, %rsp
; X64-NEXT: retq
;
+; MACOS-SINCOS-STRET-LABEL: test_sincos_f80:
+; MACOS-SINCOS-STRET: ## %bb.0:
+; MACOS-SINCOS-STRET-NEXT: subq $40, %rsp
+; MACOS-SINCOS-STRET-NEXT: fldt {{[0-9]+}}(%rsp)
+; MACOS-SINCOS-STRET-NEXT: fld %st(0)
+; MACOS-SINCOS-STRET-NEXT: fstpt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Spill
+; MACOS-SINCOS-STRET-NEXT: fstpt (%rsp)
+; MACOS-SINCOS-STRET-NEXT: callq _cosl
+; MACOS-SINCOS-STRET-NEXT: fstpt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Spill
+; MACOS-SINCOS-STRET-NEXT: fldt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Reload
+; MACOS-SINCOS-STRET-NEXT: fstpt (%rsp)
+; MACOS-SINCOS-STRET-NEXT: callq _sinl
+; MACOS-SINCOS-STRET-NEXT: fldt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Reload
+; MACOS-SINCOS-STRET-NEXT: fxch %st(1)
+; MACOS-SINCOS-STRET-NEXT: addq $40, %rsp
+; MACOS-SINCOS-STRET-NEXT: retq
+;
+; MACOS-NOSINCOS-STRET-LABEL: test_sincos_f80:
+; MACOS-NOSINCOS-STRET: ## %bb.0:
+; MACOS-NOSINCOS-STRET-NEXT: subq $40, %rsp
+; MACOS-NOSINCOS-STRET-NEXT: fldt {{[0-9]+}}(%rsp)
+; MACOS-NOSINCOS-STRET-NEXT: fld %st(0)
+; MACOS-NOSINCOS-STRET-NEXT: fstpt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Spill
+; MACOS-NOSINCOS-STRET-NEXT: fstpt (%rsp)
+; MACOS-NOSINCOS-STRET-NEXT: callq _cosl
+; MACOS-NOSINCOS-STRET-NEXT: fstpt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Spill
+; MACOS-NOSINCOS-STRET-NEXT: fldt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Reload
+; MACOS-NOSINCOS-STRET-NEXT: fstpt (%rsp)
+; MACOS-NOSINCOS-STRET-NEXT: callq _sinl
+; MACOS-NOSINCOS-STRET-NEXT: fldt {{[-0-9]+}}(%r{{[sb]}}p) ## 10-byte Folded Reload
+; MACOS-NOSINCOS-STRET-NEXT: fxch %st(1)
+; MACOS-NOSINCOS-STRET-NEXT: addq $40, %rsp
+; MACOS-NOSINCOS-STRET-NEXT: retq
+;
; GISEL-X86-LABEL: test_sincos_f80:
; GISEL-X86: # %bb.0:
; GISEL-X86-NEXT: subl $60, %esp
@@ -288,6 +370,57 @@ define void @can_fold_with_call_in_chain(float %x, ptr noalias %a, ptr noalias %
; SDAG-X64-NEXT: popq %r14
; SDAG-X64-NEXT: retq
;
+; MACOS-SINCOS-STRET-LABEL: can_fold_with_call_in_chain:
+; MACOS-SINCOS-STRET: ## %bb.0: ## %entry
+; MACOS-SINCOS-STRET-NEXT: pushq %r14
+; MACOS-SINCOS-STRET-NEXT: pushq %rbx
+; MACOS-SINCOS-STRET-NEXT: subq $40, %rsp
+; MACOS-SINCOS-STRET-NEXT: movq %rsi, %rbx
+; MACOS-SINCOS-STRET-NEXT: movq %rdi, %r14
+; MACOS-SINCOS-STRET-NEXT: callq ___sincosf_stret
+; MACOS-SINCOS-STRET-NEXT: movaps %xmm0, (%rsp) ## 16-byte Spill
+; MACOS-SINCOS-STRET-NEXT: movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
+; MACOS-SINCOS-STRET-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill
+; MACOS-SINCOS-STRET-NEXT: movq %r14, %rdi
+; MACOS-SINCOS-STRET-NEXT: movq %rbx, %rsi
+; MACOS-SINCOS-STRET-NEXT: callq _foo
+; MACOS-SINCOS-STRET-NEXT: movaps (%rsp), %xmm0 ## 16-byte Reload
+; MACOS-SINCOS-STRET-NEXT: movss %xmm0, (%r14)
+; MACOS-SINCOS-STRET-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload
+; MACOS-SINCOS-STRET-NEXT: movss %xmm0, (%rbx)
+; MACOS-SINCOS-STRET-NEXT: addq $40, %rsp
+; MACOS-SINCOS-STRET-NEXT: popq %rbx
+; MACOS-SINCOS-STRET-NEXT: popq %r14
+; MACOS-SINCOS-STRET-NEXT: retq
+;
+; MACOS-NOSINCOS-STRET-LABEL: can_fold_with_call_in_chain:
+; MACOS-NOSINCOS-STRET: ## %bb.0: ## %entry
+; MACOS-NOSINCOS-STRET-NEXT: pushq %r14
+; MACOS-NOSINCOS-STRET-NEXT: pushq %rbx
+; MACOS-NOSINCOS-STRET-NEXT: pushq %rax
+; MACOS-NOSINCOS-STRET-NEXT: movq %rsi, %rbx
+; MACOS-NOSINCOS-STRET-NEXT: movq %rdi, %r14
+; MACOS-NOSINCOS-STRET-NEXT: movss %xmm0, (%rsp) ## 4-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: callq _sinf
+; MACOS-NOSINCOS-STRET-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: movss (%rsp), %xmm0 ## 4-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: ## xmm0 = mem[0],zero,zero,zero
+; MACOS-NOSINCOS-STRET-NEXT: callq _cosf
+; MACOS-NOSINCOS-STRET-NEXT: movss %xmm0, (%rsp) ## 4-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: movq %r14, %rdi
+; MACOS-NOSINCOS-STRET-NEXT: movq %rbx, %rsi
+; MACOS-NOSINCOS-STRET-NEXT: callq _foo
+; MACOS-NOSINCOS-STRET-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 4-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: ## xmm0 = mem[0],zero,zero,zero
+; MACOS-NOSINCOS-STRET-NEXT: movss %xmm0, (%r14)
+; MACOS-NOSINCOS-STRET-NEXT: movss (%rsp), %xmm0 ## 4-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: ## xmm0 = mem[0],zero,zero,zero
+; MACOS-NOSINCOS-STRET-NEXT: movss %xmm0, (%rbx)
+; MACOS-NOSINCOS-STRET-NEXT: addq $8, %rsp
+; MACOS-NOSINCOS-STRET-NEXT: popq %rbx
+; MACOS-NOSINCOS-STRET-NEXT: popq %r14
+; MACOS-NOSINCOS-STRET-NEXT: retq
+;
; GISEL-X86-LABEL: can_fold_with_call_in_chain:
; GISEL-X86: # %bb.0: # %entry
; GISEL-X86-NEXT: pushl %ebx
diff --git a/llvm/test/CodeGen/X86/llvm.sincos.vec.ll b/llvm/test/CodeGen/X86/llvm.sincos.vec.ll
index 834dd78..9b02438 100644
--- a/llvm/test/CodeGen/X86/llvm.sincos.vec.ll
+++ b/llvm/test/CodeGen/X86/llvm.sincos.vec.ll
@@ -1,59 +1,213 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --no_x86_scrub_sp --version 5
-; RUN: llc < %s -mtriple=i386-unknown-linux-gnu | FileCheck %s
+; RUN: llc < %s -mtriple=i386-unknown-linux-gnu | FileCheck -check-prefix=X86 %s
+; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck -check-prefix=X64 %s
+; RUN: llc < %s -mtriple=x86_64-apple-macosx10.9.0 | FileCheck --check-prefix=MACOS-SINCOS-STRET %s
+; RUN: llc < %s -mtriple=x86_64-apple-macosx10.8.0 | FileCheck --check-prefix=MACOS-NOSINCOS-STRET %s
define void @test_sincos_v4f32(<4 x float> %x, ptr noalias %out_sin, ptr noalias %out_cos) nounwind {
-; CHECK-LABEL: test_sincos_v4f32:
-; CHECK: # %bb.0:
-; CHECK-NEXT: pushl %edi
-; CHECK-NEXT: pushl %esi
-; CHECK-NEXT: subl $52, %esp
-; CHECK-NEXT: movl 84(%esp), %esi
-; CHECK-NEXT: flds 76(%esp)
-; CHECK-NEXT: fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; CHECK-NEXT: flds 64(%esp)
-; CHECK-NEXT: fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; CHECK-NEXT: flds 72(%esp)
-; CHECK-NEXT: fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
-; CHECK-NEXT: flds 68(%esp)
-; CHECK-NEXT: movl 80(%esp), %edi
-; CHECK-NEXT: leal 40(%esp), %eax
-; CHECK-NEXT: movl %eax, 8(%esp)
-; CHECK-NEXT: leal 4(%edi), %eax
-; CHECK-NEXT: movl %eax, 4(%esp)
-; CHECK-NEXT: fstps (%esp)
-; CHECK-NEXT: calll sincosf
-; CHECK-NEXT: leal 44(%esp), %eax
-; CHECK-NEXT: movl %eax, 8(%esp)
-; CHECK-NEXT: leal 8(%edi), %eax
-; CHECK-NEXT: movl %eax, 4(%esp)
-; CHECK-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
-; CHECK-NEXT: fstps (%esp)
-; CHECK-NEXT: calll sincosf
-; CHECK-NEXT: leal 36(%esp), %eax
-; CHECK-NEXT: movl %eax, 8(%esp)
-; CHECK-NEXT: movl %edi, 4(%esp)
-; CHECK-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
-; CHECK-NEXT: fstps (%esp)
-; CHECK-NEXT: calll sincosf
-; CHECK-NEXT: leal 48(%esp), %eax
-; CHECK-NEXT: movl %eax, 8(%esp)
-; CHECK-NEXT: addl $12, %edi
-; CHECK-NEXT: movl %edi, 4(%esp)
-; CHECK-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
-; CHECK-NEXT: fstps (%esp)
-; CHECK-NEXT: calll sincosf
-; CHECK-NEXT: flds 36(%esp)
-; CHECK-NEXT: flds 40(%esp)
-; CHECK-NEXT: flds 44(%esp)
-; CHECK-NEXT: flds 48(%esp)
-; CHECK-NEXT: fstps 12(%esi)
-; CHECK-NEXT: fstps 8(%esi)
-; CHECK-NEXT: fstps 4(%esi)
-; CHECK-NEXT: fstps (%esi)
-; CHECK-NEXT: addl $52, %esp
-; CHECK-NEXT: popl %esi
-; CHECK-NEXT: popl %edi
-; CHECK-NEXT: retl
+; X86-LABEL: test_sincos_v4f32:
+; X86: # %bb.0:
+; X86-NEXT: pushl %edi
+; X86-NEXT: pushl %esi
+; X86-NEXT: subl $52, %esp
+; X86-NEXT: movl 84(%esp), %esi
+; X86-NEXT: flds 76(%esp)
+; X86-NEXT: fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; X86-NEXT: flds 64(%esp)
+; X86-NEXT: fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; X86-NEXT: flds 72(%esp)
+; X86-NEXT: fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; X86-NEXT: flds 68(%esp)
+; X86-NEXT: movl 80(%esp), %edi
+; X86-NEXT: leal 40(%esp), %eax
+; X86-NEXT: movl %eax, 8(%esp)
+; X86-NEXT: leal 4(%edi), %eax
+; X86-NEXT: movl %eax, 4(%esp)
+; X86-NEXT: fstps (%esp)
+; X86-NEXT: calll sincosf
+; X86-NEXT: leal 44(%esp), %eax
+; X86-NEXT: movl %eax, 8(%esp)
+; X86-NEXT: leal 8(%edi), %eax
+; X86-NEXT: movl %eax, 4(%esp)
+; X86-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
+; X86-NEXT: fstps (%esp)
+; X86-NEXT: calll sincosf
+; X86-NEXT: leal 36(%esp), %eax
+; X86-NEXT: movl %eax, 8(%esp)
+; X86-NEXT: movl %edi, 4(%esp)
+; X86-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
+; X86-NEXT: fstps (%esp)
+; X86-NEXT: calll sincosf
+; X86-NEXT: leal 48(%esp), %eax
+; X86-NEXT: movl %eax, 8(%esp)
+; X86-NEXT: addl $12, %edi
+; X86-NEXT: movl %edi, 4(%esp)
+; X86-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
+; X86-NEXT: fstps (%esp)
+; X86-NEXT: calll sincosf
+; X86-NEXT: flds 36(%esp)
+; X86-NEXT: flds 40(%esp)
+; X86-NEXT: flds 44(%esp)
+; X86-NEXT: flds 48(%esp)
+; X86-NEXT: fstps 12(%esi)
+; X86-NEXT: fstps 8(%esi)
+; X86-NEXT: fstps 4(%esi)
+; X86-NEXT: fstps (%esi)
+; X86-NEXT: addl $52, %esp
+; X86-NEXT: popl %esi
+; X86-NEXT: popl %edi
+; X86-NEXT: retl
+;
+; X64-LABEL: test_sincos_v4f32:
+; X64: # %bb.0:
+; X64-NEXT: pushq %r14
+; X64-NEXT: pushq %rbx
+; X64-NEXT: subq $56, %rsp
+; X64-NEXT: movq %rsi, %rbx
+; X64-NEXT: movq %rdi, %r14
+; X64-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
+; X64-NEXT: leaq 4(%rsp), %rdi
+; X64-NEXT: movq %rsp, %rsi
+; X64-NEXT: callq sincosf@PLT
+; X64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; X64-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]
+; X64-NEXT: leaq 12(%rsp), %rdi
+; X64-NEXT: leaq 8(%rsp), %rsi
+; X64-NEXT: callq sincosf@PLT
+; X64-NEXT: leaq 28(%rsp), %rdi
+; X64-NEXT: leaq 24(%rsp), %rsi
+; X64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; X64-NEXT: callq sincosf@PLT
+; X64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
+; X64-NEXT: leaq 20(%rsp), %rdi
+; X64-NEXT: leaq 16(%rsp), %rsi
+; X64-NEXT: callq sincosf@PLT
+; X64-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
+; X64-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
+; X64-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
+; X64-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
+; X64-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
+; X64-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
+; X64-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; X64-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
+; X64-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
+; X64-NEXT: unpcklps {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
+; X64-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
+; X64-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
+; X64-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
+; X64-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
+; X64-NEXT: movups %xmm1, (%r14)
+; X64-NEXT: movups %xmm0, (%rbx)
+; X64-NEXT: addq $56, %rsp
+; X64-NEXT: popq %rbx
+; X64-NEXT: popq %r14
+; X64-NEXT: retq
+;
+; MACOS-SINCOS-STRET-LABEL: test_sincos_v4f32:
+; MACOS-SINCOS-STRET: ## %bb.0:
+; MACOS-SINCOS-STRET-NEXT: pushq %r14
+; MACOS-SINCOS-STRET-NEXT: pushq %rbx
+; MACOS-SINCOS-STRET-NEXT: subq $104, %rsp
+; MACOS-SINCOS-STRET-NEXT: movq %rsi, %rbx
+; MACOS-SINCOS-STRET-NEXT: movq %rdi, %r14
+; MACOS-SINCOS-STRET-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill
+; MACOS-SINCOS-STRET-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
+; MACOS-SINCOS-STRET-NEXT: callq ___sincosf_stret
+; MACOS-SINCOS-STRET-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill
+; MACOS-SINCOS-STRET-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
+; MACOS-SINCOS-STRET-NEXT: movaps %xmm0, (%rsp) ## 16-byte Spill
+; MACOS-SINCOS-STRET-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload
+; MACOS-SINCOS-STRET-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]
+; MACOS-SINCOS-STRET-NEXT: callq ___sincosf_stret
+; MACOS-SINCOS-STRET-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill
+; MACOS-SINCOS-STRET-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
+; MACOS-SINCOS-STRET-NEXT: unpcklps (%rsp), %xmm0 ## 16-byte Folded Reload
+; MACOS-SINCOS-STRET-NEXT: ## xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
+; MACOS-SINCOS-STRET-NEXT: movaps %xmm0, (%rsp) ## 16-byte Spill
+; MACOS-SINCOS-STRET-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload
+; MACOS-SINCOS-STRET-NEXT: callq ___sincosf_stret
+; MACOS-SINCOS-STRET-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill
+; MACOS-SINCOS-STRET-NEXT: movaps %xmm0, %xmm1
+; MACOS-SINCOS-STRET-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1]
+; MACOS-SINCOS-STRET-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill
+; MACOS-SINCOS-STRET-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload
+; MACOS-SINCOS-STRET-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
+; MACOS-SINCOS-STRET-NEXT: callq ___sincosf_stret
+; MACOS-SINCOS-STRET-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Reload
+; MACOS-SINCOS-STRET-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
+; MACOS-SINCOS-STRET-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
+; MACOS-SINCOS-STRET-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 ## 16-byte Reload
+; MACOS-SINCOS-STRET-NEXT: unpcklps {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
+; MACOS-SINCOS-STRET-NEXT: unpcklpd (%rsp), %xmm2 ## 16-byte Folded Reload
+; MACOS-SINCOS-STRET-NEXT: ## xmm2 = xmm2[0],mem[0]
+; MACOS-SINCOS-STRET-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload
+; MACOS-SINCOS-STRET-NEXT: unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Folded Reload
+; MACOS-SINCOS-STRET-NEXT: ## xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
+; MACOS-SINCOS-STRET-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
+; MACOS-SINCOS-STRET-NEXT: movups %xmm1, (%r14)
+; MACOS-SINCOS-STRET-NEXT: movups %xmm2, (%rbx)
+; MACOS-SINCOS-STRET-NEXT: addq $104, %rsp
+; MACOS-SINCOS-STRET-NEXT: popq %rbx
+; MACOS-SINCOS-STRET-NEXT: popq %r14
+; MACOS-SINCOS-STRET-NEXT: retq
+;
+; MACOS-NOSINCOS-STRET-LABEL: test_sincos_v4f32:
+; MACOS-NOSINCOS-STRET: ## %bb.0:
+; MACOS-NOSINCOS-STRET-NEXT: pushq %r14
+; MACOS-NOSINCOS-STRET-NEXT: pushq %rbx
+; MACOS-NOSINCOS-STRET-NEXT: subq $104, %rsp
+; MACOS-NOSINCOS-STRET-NEXT: movq %rsi, %rbx
+; MACOS-NOSINCOS-STRET-NEXT: movq %rdi, %r14
+; MACOS-NOSINCOS-STRET-NEXT: movaps %xmm0, (%rsp) ## 16-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
+; MACOS-NOSINCOS-STRET-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: callq _cosf
+; MACOS-NOSINCOS-STRET-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: movaps (%rsp), %xmm0 ## 16-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]
+; MACOS-NOSINCOS-STRET-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: callq _cosf
+; MACOS-NOSINCOS-STRET-NEXT: unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Folded Reload
+; MACOS-NOSINCOS-STRET-NEXT: ## xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
+; MACOS-NOSINCOS-STRET-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: movaps (%rsp), %xmm0 ## 16-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: callq _cosf
+; MACOS-NOSINCOS-STRET-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: movaps (%rsp), %xmm0 ## 16-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
+; MACOS-NOSINCOS-STRET-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: callq _cosf
+; MACOS-NOSINCOS-STRET-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
+; MACOS-NOSINCOS-STRET-NEXT: unpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Folded Reload
+; MACOS-NOSINCOS-STRET-NEXT: ## xmm1 = xmm1[0],mem[0]
+; MACOS-NOSINCOS-STRET-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: callq _sinf
+; MACOS-NOSINCOS-STRET-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: callq _sinf
+; MACOS-NOSINCOS-STRET-NEXT: unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Folded Reload
+; MACOS-NOSINCOS-STRET-NEXT: ## xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
+; MACOS-NOSINCOS-STRET-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: movaps (%rsp), %xmm0 ## 16-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: callq _sinf
+; MACOS-NOSINCOS-STRET-NEXT: movaps %xmm0, (%rsp) ## 16-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: callq _sinf
+; MACOS-NOSINCOS-STRET-NEXT: movaps (%rsp), %xmm1 ## 16-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
+; MACOS-NOSINCOS-STRET-NEXT: unpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Folded Reload
+; MACOS-NOSINCOS-STRET-NEXT: ## xmm1 = xmm1[0],mem[0]
+; MACOS-NOSINCOS-STRET-NEXT: movups %xmm1, (%r14)
+; MACOS-NOSINCOS-STRET-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: movups %xmm0, (%rbx)
+; MACOS-NOSINCOS-STRET-NEXT: addq $104, %rsp
+; MACOS-NOSINCOS-STRET-NEXT: popq %rbx
+; MACOS-NOSINCOS-STRET-NEXT: popq %r14
+; MACOS-NOSINCOS-STRET-NEXT: retq
%result = call { <4 x float>, <4 x float> } @llvm.sincos.v4f32(<4 x float> %x)
%result.0 = extractvalue { <4 x float>, <4 x float> } %result, 0
%result.1 = extractvalue { <4 x float>, <4 x float> } %result, 1
@@ -63,36 +217,120 @@ define void @test_sincos_v4f32(<4 x float> %x, ptr noalias %out_sin, ptr noalias
}
define void @test_sincos_v2f64(<2 x double> %x, ptr noalias %out_sin, ptr noalias %out_cos) nounwind {
-; CHECK-LABEL: test_sincos_v2f64:
-; CHECK: # %bb.0:
-; CHECK-NEXT: pushl %edi
-; CHECK-NEXT: pushl %esi
-; CHECK-NEXT: subl $52, %esp
-; CHECK-NEXT: movl 84(%esp), %esi
-; CHECK-NEXT: fldl 72(%esp)
-; CHECK-NEXT: fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
-; CHECK-NEXT: fldl 64(%esp)
-; CHECK-NEXT: movl 80(%esp), %edi
-; CHECK-NEXT: leal 24(%esp), %eax
-; CHECK-NEXT: movl %eax, 12(%esp)
-; CHECK-NEXT: movl %edi, 8(%esp)
-; CHECK-NEXT: fstpl (%esp)
-; CHECK-NEXT: calll sincos
-; CHECK-NEXT: leal 32(%esp), %eax
-; CHECK-NEXT: movl %eax, 12(%esp)
-; CHECK-NEXT: addl $8, %edi
-; CHECK-NEXT: movl %edi, 8(%esp)
-; CHECK-NEXT: fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload
-; CHECK-NEXT: fstpl (%esp)
-; CHECK-NEXT: calll sincos
-; CHECK-NEXT: fldl 24(%esp)
-; CHECK-NEXT: fldl 32(%esp)
-; CHECK-NEXT: fstpl 8(%esi)
-; CHECK-NEXT: fstpl (%esi)
-; CHECK-NEXT: addl $52, %esp
-; CHECK-NEXT: popl %esi
-; CHECK-NEXT: popl %edi
-; CHECK-NEXT: retl
+; X86-LABEL: test_sincos_v2f64:
+; X86: # %bb.0:
+; X86-NEXT: pushl %edi
+; X86-NEXT: pushl %esi
+; X86-NEXT: subl $52, %esp
+; X86-NEXT: movl 84(%esp), %esi
+; X86-NEXT: fldl 72(%esp)
+; X86-NEXT: fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
+; X86-NEXT: fldl 64(%esp)
+; X86-NEXT: movl 80(%esp), %edi
+; X86-NEXT: leal 24(%esp), %eax
+; X86-NEXT: movl %eax, 12(%esp)
+; X86-NEXT: movl %edi, 8(%esp)
+; X86-NEXT: fstpl (%esp)
+; X86-NEXT: calll sincos
+; X86-NEXT: leal 32(%esp), %eax
+; X86-NEXT: movl %eax, 12(%esp)
+; X86-NEXT: addl $8, %edi
+; X86-NEXT: movl %edi, 8(%esp)
+; X86-NEXT: fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload
+; X86-NEXT: fstpl (%esp)
+; X86-NEXT: calll sincos
+; X86-NEXT: fldl 24(%esp)
+; X86-NEXT: fldl 32(%esp)
+; X86-NEXT: fstpl 8(%esi)
+; X86-NEXT: fstpl (%esi)
+; X86-NEXT: addl $52, %esp
+; X86-NEXT: popl %esi
+; X86-NEXT: popl %edi
+; X86-NEXT: retl
+;
+; X64-LABEL: test_sincos_v2f64:
+; X64: # %bb.0:
+; X64-NEXT: pushq %r14
+; X64-NEXT: pushq %rbx
+; X64-NEXT: subq $56, %rsp
+; X64-NEXT: movq %rsi, %rbx
+; X64-NEXT: movq %rdi, %r14
+; X64-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; X64-NEXT: leaq 24(%rsp), %rdi
+; X64-NEXT: leaq 16(%rsp), %rsi
+; X64-NEXT: callq sincos@PLT
+; X64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; X64-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]
+; X64-NEXT: leaq 8(%rsp), %rdi
+; X64-NEXT: movq %rsp, %rsi
+; X64-NEXT: callq sincos@PLT
+; X64-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
+; X64-NEXT: movhps {{.*#+}} xmm0 = xmm0[0,1],mem[0,1]
+; X64-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero
+; X64-NEXT: movhps {{.*#+}} xmm1 = xmm1[0,1],mem[0,1]
+; X64-NEXT: movups %xmm1, (%r14)
+; X64-NEXT: movups %xmm0, (%rbx)
+; X64-NEXT: addq $56, %rsp
+; X64-NEXT: popq %rbx
+; X64-NEXT: popq %r14
+; X64-NEXT: retq
+;
+; MACOS-SINCOS-STRET-LABEL: test_sincos_v2f64:
+; MACOS-SINCOS-STRET: ## %bb.0:
+; MACOS-SINCOS-STRET-NEXT: pushq %r14
+; MACOS-SINCOS-STRET-NEXT: pushq %rbx
+; MACOS-SINCOS-STRET-NEXT: subq $56, %rsp
+; MACOS-SINCOS-STRET-NEXT: movq %rsi, %rbx
+; MACOS-SINCOS-STRET-NEXT: movq %rdi, %r14
+; MACOS-SINCOS-STRET-NEXT: movaps %xmm0, (%rsp) ## 16-byte Spill
+; MACOS-SINCOS-STRET-NEXT: callq ___sincos_stret
+; MACOS-SINCOS-STRET-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill
+; MACOS-SINCOS-STRET-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill
+; MACOS-SINCOS-STRET-NEXT: movaps (%rsp), %xmm0 ## 16-byte Reload
+; MACOS-SINCOS-STRET-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]
+; MACOS-SINCOS-STRET-NEXT: callq ___sincos_stret
+; MACOS-SINCOS-STRET-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 ## 16-byte Reload
+; MACOS-SINCOS-STRET-NEXT: movlhps {{.*#+}} xmm2 = xmm2[0],xmm1[0]
+; MACOS-SINCOS-STRET-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Reload
+; MACOS-SINCOS-STRET-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
+; MACOS-SINCOS-STRET-NEXT: movups %xmm1, (%r14)
+; MACOS-SINCOS-STRET-NEXT: movups %xmm2, (%rbx)
+; MACOS-SINCOS-STRET-NEXT: addq $56, %rsp
+; MACOS-SINCOS-STRET-NEXT: popq %rbx
+; MACOS-SINCOS-STRET-NEXT: popq %r14
+; MACOS-SINCOS-STRET-NEXT: retq
+;
+; MACOS-NOSINCOS-STRET-LABEL: test_sincos_v2f64:
+; MACOS-NOSINCOS-STRET: ## %bb.0:
+; MACOS-NOSINCOS-STRET-NEXT: pushq %r14
+; MACOS-NOSINCOS-STRET-NEXT: pushq %rbx
+; MACOS-NOSINCOS-STRET-NEXT: subq $56, %rsp
+; MACOS-NOSINCOS-STRET-NEXT: movq %rsi, %rbx
+; MACOS-NOSINCOS-STRET-NEXT: movq %rdi, %r14
+; MACOS-NOSINCOS-STRET-NEXT: movaps %xmm0, (%rsp) ## 16-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: callq _cos
+; MACOS-NOSINCOS-STRET-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: movaps (%rsp), %xmm0 ## 16-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]
+; MACOS-NOSINCOS-STRET-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: callq _cos
+; MACOS-NOSINCOS-STRET-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
+; MACOS-NOSINCOS-STRET-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: movaps (%rsp), %xmm0 ## 16-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: callq _sin
+; MACOS-NOSINCOS-STRET-NEXT: movaps %xmm0, (%rsp) ## 16-byte Spill
+; MACOS-NOSINCOS-STRET-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: callq _sin
+; MACOS-NOSINCOS-STRET-NEXT: movaps (%rsp), %xmm1 ## 16-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
+; MACOS-NOSINCOS-STRET-NEXT: movups %xmm1, (%r14)
+; MACOS-NOSINCOS-STRET-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload
+; MACOS-NOSINCOS-STRET-NEXT: movups %xmm0, (%rbx)
+; MACOS-NOSINCOS-STRET-NEXT: addq $56, %rsp
+; MACOS-NOSINCOS-STRET-NEXT: popq %rbx
+; MACOS-NOSINCOS-STRET-NEXT: popq %r14
+; MACOS-NOSINCOS-STRET-NEXT: retq
%result = call { <2 x double>, <2 x double> } @llvm.sincos.v2f64(<2 x double> %x)
%result.0 = extractvalue { <2 x double>, <2 x double> } %result, 0
%result.1 = extractvalue { <2 x double>, <2 x double> } %result, 1
diff --git a/llvm/test/MC/Disassembler/PowerPC/ppc-encoding-ISAFuture.txt b/llvm/test/MC/Disassembler/PowerPC/ppc-encoding-ISAFuture.txt
index f5cb4b7..2661ed5 100644
--- a/llvm/test/MC/Disassembler/PowerPC/ppc-encoding-ISAFuture.txt
+++ b/llvm/test/MC/Disassembler/PowerPC/ppc-encoding-ISAFuture.txt
@@ -82,12 +82,18 @@
#CHECK: lxvprll 6, 2, 1
0x7c 0xc2 0x0c 0xda
+#CHECK: lxvpb32x 2, 15, 16
+0x7c,0x4f,0x86,0xda
+
#CHECK: stxvprl 0, 1, 2
0x7c 0x01 0x15 0x9a
#CHECK: stxvprll 6, 0, 1
0x7c 0xc0 0x0d 0xda
+#CHECK: stxvpb32x 2, 15, 16
+0x7c,0x4f,0x87,0xda
+
#CHECK: dmxvi8gerx4 1, 2, 4
0xec,0x82,0x20,0x58
diff --git a/llvm/test/MC/Disassembler/PowerPC/ppc64le-encoding-ISAFuture.txt b/llvm/test/MC/Disassembler/PowerPC/ppc64le-encoding-ISAFuture.txt
index f0df8ce..7fb8254 100644
--- a/llvm/test/MC/Disassembler/PowerPC/ppc64le-encoding-ISAFuture.txt
+++ b/llvm/test/MC/Disassembler/PowerPC/ppc64le-encoding-ISAFuture.txt
@@ -76,12 +76,18 @@
#CHECK: lxvprll 6, 2, 1
0xda 0x0c 0xc2 0x7c
+#CHECK: lxvpb32x 2, 15, 16
+0xda,0x86,0x4f,0x7c
+
#CHECK: stxvprl 0, 1, 2
0x9a 0x15 0x01 0x7c
#CHECK: stxvprll 6, 0, 1
0xda 0x0d 0xc0 0x7c
+#CHECK: stxvpb32x 2, 15, 16
+0xda,0x87,0x4f,0x7c
+
#CHECK: dmxvi8gerx4 1, 2, 4
0x58,0x20,0x82,0xec
diff --git a/llvm/test/MC/PowerPC/ppc-encoding-ISAFuture.s b/llvm/test/MC/PowerPC/ppc-encoding-ISAFuture.s
index bc0683e..40059c4 100644
--- a/llvm/test/MC/PowerPC/ppc-encoding-ISAFuture.s
+++ b/llvm/test/MC/PowerPC/ppc-encoding-ISAFuture.s
@@ -105,6 +105,10 @@
# CHECK-LE: lxvprll 6, 2, 1 # encoding: [0xda,0x0c,0xc2,0x7c]
lxvprll 6, 2, 1
+ lxvpb32x 2, 15, 16
+#CHECK-BE: lxvpb32x 2, 15, 16 # encoding: [0x7c,0x4f,0x86,0xda]
+#CHECK-LE: lxvpb32x 2, 15, 16 # encoding: [0xda,0x86,0x4f,0x7c]
+
# CHECK-BE: stxvprl 0, 1, 2 # encoding: [0x7c,0x01,0x15,0x9a]
# CHECK-LE: stxvprl 0, 1, 2 # encoding: [0x9a,0x15,0x01,0x7c]
stxvprl 0, 1, 2
@@ -113,6 +117,10 @@
# CHECK-LE: stxvprll 6, 0, 1 # encoding: [0xda,0x0d,0xc0,0x7c]
stxvprll 6, 0, 1
+ stxvpb32x 2, 15, 16
+#CHECK-BE: stxvpb32x 2, 15, 16 # encoding: [0x7c,0x4f,0x87,0xda]
+#CHECK-LE: stxvpb32x 2, 15, 16 # encoding: [0xda,0x87,0x4f,0x7c]
+
dmxvi8gerx4 1, 2, 4
# CHECK-BE: dmxvi8gerx4 1, 2, 4 # encoding: [0xec,0x82,0x20,0x58]
# CHECK-LE: dmxvi8gerx4 1, 2, 4 # encoding: [0x58,0x20,0x82,0xec]
diff --git a/llvm/test/Transforms/DropUnnecessaryAssumes/basic.ll b/llvm/test/Transforms/DropUnnecessaryAssumes/basic.ll
index 8a6f60b..87aed77 100644
--- a/llvm/test/Transforms/DropUnnecessaryAssumes/basic.ll
+++ b/llvm/test/Transforms/DropUnnecessaryAssumes/basic.ll
@@ -184,6 +184,18 @@ define void @type_test(ptr %x) {
ret void
}
+define void @public_type_test(ptr %x) {
+; CHECK-LABEL: define void @public_type_test(
+; CHECK-SAME: ptr [[X:%.*]]) {
+; CHECK-NEXT: [[TEST:%.*]] = call i1 @llvm.public.type.test(ptr [[X]], metadata !"typeid")
+; CHECK-NEXT: call void @llvm.assume(i1 [[TEST]])
+; CHECK-NEXT: ret void
+;
+ %test = call i1 @llvm.public.type.test(ptr %x, metadata !"typeid")
+ call void @llvm.assume(i1 %test)
+ ret void
+}
+
define void @multiple_dead_conds(i32 %x) {
; CHECK-LABEL: define void @multiple_dead_conds(
; CHECK-SAME: i32 [[X:%.*]]) {
diff --git a/llvm/test/Transforms/IndVarSimplify/loop-guard-order.ll b/llvm/test/Transforms/IndVarSimplify/loop-guard-order.ll
index 14ee00d..2763860 100644
--- a/llvm/test/Transforms/IndVarSimplify/loop-guard-order.ll
+++ b/llvm/test/Transforms/IndVarSimplify/loop-guard-order.ll
@@ -114,7 +114,7 @@ define i32 @urem_order1(i32 %n) {
; CHECK: [[LOOP]]:
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[LOOP_PREHEADER]] ]
; CHECK-NEXT: call void @foo()
-; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 3
+; CHECK-NEXT: [[IV_NEXT]] = add nuw i32 [[IV]], 3
; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], [[N]]
; CHECK-NEXT: br i1 [[EC]], label %[[EXIT_LOOPEXIT:.*]], label %[[LOOP]]
; CHECK: [[EXIT_LOOPEXIT]]:
@@ -205,13 +205,12 @@ define i64 @test_loop_with_div_order_1(i64 %n) {
; CHECK-NEXT: [[PARITY_CHECK:%.*]] = icmp eq i64 [[IS_ODD]], 0
; CHECK-NEXT: br i1 [[PARITY_CHECK]], label %[[LOOP_PREHEADER:.*]], label %[[EXIT]]
; CHECK: [[LOOP_PREHEADER]]:
-; CHECK-NEXT: [[UMAX:%.*]] = call i64 @llvm.umax.i64(i64 [[UPPER_BOUND]], i64 1)
; CHECK-NEXT: br label %[[LOOP:.*]]
; CHECK: [[LOOP]]:
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ 0, %[[LOOP_PREHEADER]] ]
; CHECK-NEXT: [[DUMMY:%.*]] = load volatile i64, ptr null, align 8
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
-; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[IV_NEXT]], [[UMAX]]
+; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[IV_NEXT]], [[UPPER_BOUND]]
; CHECK-NEXT: br i1 [[EXITCOND]], label %[[LOOP]], label %[[EXIT_LOOPEXIT:.*]]
; CHECK: [[EXIT_LOOPEXIT]]:
; CHECK-NEXT: br label %[[EXIT]]
diff --git a/llvm/test/Transforms/InstCombine/or.ll b/llvm/test/Transforms/InstCombine/or.ll
index 6b090e9..f61a197 100644
--- a/llvm/test/Transforms/InstCombine/or.ll
+++ b/llvm/test/Transforms/InstCombine/or.ll
@@ -2113,3 +2113,98 @@ define <4 x i32> @or_zext_nneg_minus_constant_splat(<4 x i8> %a) {
%or = or <4 x i32> %zext, splat (i32 -9)
ret <4 x i32> %or
}
+
+define i8 @or_positive_minus_non_positive_to_abs(i8 %a){
+; CHECK-LABEL: @or_positive_minus_non_positive_to_abs(
+; CHECK-NEXT: [[TMP2:%.*]] = call i8 @llvm.abs.i8(i8 [[A:%.*]], i1 false)
+; CHECK-NEXT: ret i8 [[TMP2]]
+;
+ %b = icmp sgt i8 %a, 0
+ %mask = sext i1 %b to i8
+ %neg = sub i8 0, %a
+ %mask_inv = xor i8 %mask, -1
+ %c = and i8 %neg, %mask_inv
+ %d = and i8 %a, %mask
+ %or = or i8 %c, %d
+ ret i8 %or
+}
+
+; TODO: Fold to smax https://alive2.llvm.org/ce/z/wDiDh2
+define i8 @or_select_smax_neg_to_abs(i8 %a){
+; CHECK-LABEL: @or_select_smax_neg_to_abs(
+; CHECK-NEXT: [[SGT0:%.*]] = icmp sgt i8 [[A:%.*]], 0
+; CHECK-NEXT: [[NEG:%.*]] = sub nsw i8 0, [[A]]
+; CHECK-NEXT: [[OR:%.*]] = select i1 [[SGT0]], i8 0, i8 [[NEG]]
+; CHECK-NEXT: ret i8 [[OR]]
+;
+ %sgt0 = icmp sgt i8 %a, 0
+ %neg = sub nsw i8 0, %a
+ %sel = select i1 %sgt0, i8 0, i8 %neg
+ ret i8 %sel
+}
+
+; TODO: Fold to abs https://alive2.llvm.org/ce/z/DybfHG
+define i8 @or_select_smax_smax_to_abs(i8 %a){
+; CHECK-LABEL: @or_select_smax_smax_to_abs(
+; CHECK-NEXT: [[NEG:%.*]] = sub nsw i8 0, [[A:%.*]]
+; CHECK-NEXT: [[SEL:%.*]] = call i8 @llvm.smax.i8(i8 [[NEG]], i8 0)
+; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[A]], i8 0)
+; CHECK-NEXT: [[OR:%.*]] = or i8 [[SEL]], [[MAX]]
+; CHECK-NEXT: ret i8 [[OR]]
+;
+ %neg = sub nsw i8 0, %a
+ %sel = call i8 @llvm.smax.i8(i8 %neg, i8 0)
+ %max = call i8 @llvm.smax.i8(i8 %a, i8 0)
+ %or = or i8 %sel, %max
+ ret i8 %or
+}
+
+declare i8 @llvm.abs.i8(i8, i1)
+declare <2 x i8> @llvm.abs.v2i8(<2 x i8>, i1)
+
+define <2 x i8> @or_sgt_select_smax_to_abs(<2 x i8> %a){
+; CHECK-LABEL: @or_sgt_select_smax_to_abs(
+; CHECK-NEXT: [[OR:%.*]] = call <2 x i8> @llvm.abs.v2i8(<2 x i8> [[A:%.*]], i1 false)
+; CHECK-NEXT: ret <2 x i8> [[OR]]
+;
+ %sgt0 = icmp sgt <2 x i8> %a, zeroinitializer
+ %neg = sub <2 x i8> zeroinitializer, %a
+ %sel = select <2 x i1> %sgt0, <2 x i8> zeroinitializer, <2 x i8> %neg
+ %max = call <2 x i8> @llvm.smax.v2i8(<2 x i8> %a, <2 x i8> zeroinitializer)
+ %or = or <2 x i8> %sel, %max
+ ret <2 x i8> %or
+}
+
+define <2 x i8> @or_slt_select_smax_to_abs(<2 x i8> %a){
+; CHECK-LABEL: @or_slt_select_smax_to_abs(
+; CHECK-NEXT: [[OR:%.*]] = call <2 x i8> @llvm.abs.v2i8(<2 x i8> [[A:%.*]], i1 false)
+; CHECK-NEXT: ret <2 x i8> [[OR]]
+;
+ %slt0 = icmp slt <2 x i8> %a, zeroinitializer
+ %neg = sub <2 x i8> zeroinitializer, %a
+ %sel = select <2 x i1> %slt0, <2 x i8> %neg, <2 x i8> zeroinitializer
+ %max = call <2 x i8> @llvm.smax.v2i8(<2 x i8> %a, <2 x i8> zeroinitializer)
+ %or = or <2 x i8> %sel, %max
+ ret <2 x i8> %or
+}
+
+; negative test - %d has multiple uses. %or is not folded to abs.
+
+define <2 x i8> @or_select_smax_multi_uses(<2 x i8> %a){
+; CHECK-LABEL: @or_select_smax_multi_uses(
+; CHECK-NEXT: [[B:%.*]] = icmp sgt <2 x i8> [[A:%.*]], zeroinitializer
+; CHECK-NEXT: [[NEG:%.*]] = sub <2 x i8> zeroinitializer, [[A]]
+; CHECK-NEXT: [[C:%.*]] = select <2 x i1> [[B]], <2 x i8> zeroinitializer, <2 x i8> [[NEG]]
+; CHECK-NEXT: [[D:%.*]] = call <2 x i8> @llvm.smax.v2i8(<2 x i8> [[A]], <2 x i8> zeroinitializer)
+; CHECK-NEXT: [[OR1:%.*]] = or <2 x i8> [[C]], [[D]]
+; CHECK-NEXT: [[OR:%.*]] = add <2 x i8> [[OR1]], [[D]]
+; CHECK-NEXT: ret <2 x i8> [[OR]]
+;
+ %sgt0 = icmp sgt <2 x i8> %a, zeroinitializer
+ %neg = sub <2 x i8> zeroinitializer, %a
+ %sel = select <2 x i1> %sgt0, <2 x i8> zeroinitializer, <2 x i8> %neg
+ %max = call <2 x i8> @llvm.smax.v2i8(<2 x i8> %a, <2 x i8> zeroinitializer)
+ %or = or <2 x i8> %sel, %max
+ %add = add <2 x i8> %or, %max
+ ret <2 x i8> %add
+}
diff --git a/llvm/test/Transforms/InstCombine/select-safe-transforms.ll b/llvm/test/Transforms/InstCombine/select-safe-transforms.ll
index 3d97048..8b3c050 100644
--- a/llvm/test/Transforms/InstCombine/select-safe-transforms.ll
+++ b/llvm/test/Transforms/InstCombine/select-safe-transforms.ll
@@ -256,27 +256,27 @@ define <2 x i1> @not_logical_or2(i1 %b, <2 x i32> %a) {
ret <2 x i1> %and
}
-define i1 @bools_logical_commute0(i1 %a, i1 %b, i1 %c) {
+define i1 @bools_logical_commute0(i1 %a, i1 %b, i1 %c) !prof !0 {
; CHECK-LABEL: @bools_logical_commute0(
-; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[B:%.*]], i1 [[A:%.*]]
+; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[B:%.*]], i1 [[A:%.*]], !prof [[PROF2]]
; CHECK-NEXT: ret i1 [[OR]]
;
%not = xor i1 %c, -1
- %and1 = select i1 %not, i1 %a, i1 false
- %and2 = select i1 %c, i1 %b, i1 false
- %or = select i1 %and1, i1 true, i1 %and2
+ %and1 = select i1 %not, i1 %a, i1 false, !prof!1
+ %and2 = select i1 %c, i1 %b, i1 false, !prof !2
+ %or = select i1 %and1, i1 true, i1 %and2, !prof !3
ret i1 %or
}
-define i1 @bools_logical_commute0_and1(i1 %a, i1 %b, i1 %c) {
+define i1 @bools_logical_commute0_and1(i1 %a, i1 %b, i1 %c) !prof !0 {
; CHECK-LABEL: @bools_logical_commute0_and1(
-; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[B:%.*]], i1 [[A:%.*]]
+; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[B:%.*]], i1 [[A:%.*]], !prof [[PROF1]]
; CHECK-NEXT: ret i1 [[OR]]
;
%not = xor i1 %c, -1
%and1 = and i1 %not, %a
- %and2 = select i1 %c, i1 %b, i1 false
- %or = select i1 %and1, i1 true, i1 %and2
+ %and2 = select i1 %c, i1 %b, i1 false, !prof !1
+ %or = select i1 %and1, i1 true, i1 %and2, !prof !2
ret i1 %or
}
@@ -292,15 +292,15 @@ define i1 @bools_logical_commute0_and2(i1 %a, i1 %b, i1 %c) {
ret i1 %or
}
-define i1 @bools_logical_commute0_and1_and2(i1 %a, i1 %b, i1 %c) {
+define i1 @bools_logical_commute0_and1_and2(i1 %a, i1 %b, i1 %c) !prof !0 {
; CHECK-LABEL: @bools_logical_commute0_and1_and2(
-; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[B:%.*]], i1 [[A:%.*]]
+; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[B:%.*]], i1 [[A:%.*]], !prof [[PROF3:![0-9]+]]
; CHECK-NEXT: ret i1 [[OR]]
;
%not = xor i1 %c, -1
%and1 = and i1 %not, %a
%and2 = and i1 %c, %b
- %or = select i1 %and1, i1 true, i1 %and2
+ %or = select i1 %and1, i1 true, i1 %and2, !prof !1
ret i1 %or
}
@@ -457,27 +457,27 @@ define i1 @bools_logical_commute3_and1_and2(i1 %b, i1 %c) {
ret i1 %or
}
-define i1 @bools2_logical_commute0(i1 %a, i1 %b, i1 %c) {
+define i1 @bools2_logical_commute0(i1 %a, i1 %b, i1 %c) !prof !0 {
; CHECK-LABEL: @bools2_logical_commute0(
-; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 [[B:%.*]]
+; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 [[B:%.*]], !prof [[PROF1]]
; CHECK-NEXT: ret i1 [[OR]]
;
%not = xor i1 %c, -1
- %and1 = select i1 %c, i1 %a, i1 false
- %and2 = select i1 %not, i1 %b, i1 false
- %or = select i1 %and1, i1 true, i1 %and2
+ %and1 = select i1 %c, i1 %a, i1 false, !prof !1
+ %and2 = select i1 %not, i1 %b, i1 false, !prof !2
+ %or = select i1 %and1, i1 true, i1 %and2, !prof !3
ret i1 %or
}
-define i1 @bools2_logical_commute0_and1(i1 %a, i1 %b, i1 %c) {
+define i1 @bools2_logical_commute0_and1(i1 %a, i1 %b, i1 %c) !prof !0 {
; CHECK-LABEL: @bools2_logical_commute0_and1(
-; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 [[B:%.*]]
+; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 [[B:%.*]], !prof [[PROF2]]
; CHECK-NEXT: ret i1 [[OR]]
;
%not = xor i1 %c, -1
%and1 = and i1 %c, %a
- %and2 = select i1 %not, i1 %b, i1 false
- %or = select i1 %and1, i1 true, i1 %and2
+ %and2 = select i1 %not, i1 %b, i1 false, !prof !1
+ %or = select i1 %and1, i1 true, i1 %and2, !prof !2
ret i1 %or
}
@@ -493,15 +493,15 @@ define i1 @bools2_logical_commute0_and2(i1 %a, i1 %b, i1 %c) {
ret i1 %or
}
-define i1 @bools2_logical_commute0_and1_and2(i1 %a, i1 %b, i1 %c) {
+define i1 @bools2_logical_commute0_and1_and2(i1 %a, i1 %b, i1 %c) !prof !0 {
; CHECK-LABEL: @bools2_logical_commute0_and1_and2(
-; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 [[B:%.*]]
+; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 [[B:%.*]], !prof [[PROF3]]
; CHECK-NEXT: ret i1 [[OR]]
;
%not = xor i1 %c, -1
%and1 = and i1 %c, %a
%and2 = and i1 %not, %b
- %or = select i1 %and1, i1 true, i1 %and2
+ %or = select i1 %and1, i1 true, i1 %and2, !prof !1
ret i1 %or
}
@@ -799,8 +799,11 @@ define <2 x i1> @not_logical_and2(i1 %b, <2 x i32> %a) {
!0 = !{!"function_entry_count", i64 1000}
!1 = !{!"branch_weights", i32 2, i32 3}
+!2 = !{!"branch_weights", i32 5, i32 7}
+!3 = !{!"branch_weights", i32 11, i32 13}
;.
; CHECK: [[META0:![0-9]+]] = !{!"function_entry_count", i64 1000}
; CHECK: [[PROF1]] = !{!"branch_weights", i32 2, i32 3}
; CHECK: [[PROF2]] = !{!"branch_weights", i32 3, i32 2}
+; CHECK: [[PROF3]] = !{!"unknown", !"instcombine"}
;.
diff --git a/llvm/test/Transforms/LoopUnroll/zeroed-branch-weights.ll b/llvm/test/Transforms/LoopUnroll/zeroed-branch-weights.ll
new file mode 100644
index 0000000..4d378b0
--- /dev/null
+++ b/llvm/test/Transforms/LoopUnroll/zeroed-branch-weights.ll
@@ -0,0 +1,30 @@
+; Check that zeroed branch weights do not crash or otherwise break basic
+; LoopUnroll behavior when it tries to compute a probability from them.
+
+; RUN: opt < %s -S -unroll-count=2 -passes='loop-unroll' 2>&1 | FileCheck %s
+
+define void @test() {
+entry:
+ br label %loop
+
+loop:
+ br i1 false, label %end, label %loop, !prof !0
+
+end:
+ ret void
+}
+
+!0 = !{!"branch_weights", i32 0, i32 0}
+
+; CHECK: define void @test() {
+; CHECK: entry:
+; CHECK: br label %loop
+; CHECK: loop:
+; CHECK: br i1 false, label %end, label %loop.1, !prof !0
+; CHECK: loop.1:
+; CHECK: br i1 false, label %end, label %loop, !prof !0, !llvm.loop !1
+; CHECK-NOT: loop.2
+; CHECK: end:
+; CHECK: ret void
+; CHECK: }
+; CHECK: !0 = !{!"branch_weights", i32 0, i32 0}
diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/vplan-printing.ll b/llvm/test/Transforms/LoopVectorize/AArch64/vplan-printing.ll
index 49f663f..62e248b 100644
--- a/llvm/test/Transforms/LoopVectorize/AArch64/vplan-printing.ll
+++ b/llvm/test/Transforms/LoopVectorize/AArch64/vplan-printing.ll
@@ -1,12 +1,12 @@
; REQUIRES: asserts
-; RUN: opt -mattr=+neon,+dotprod -passes=loop-vectorize -debug-only=loop-vectorize -force-vector-interleave=1 -enable-epilogue-vectorization -epilogue-vectorization-force-VF=2 -disable-output %s 2>&1 | FileCheck %s
+; RUN: opt -passes=loop-vectorize -debug-only=loop-vectorize -disable-output %s 2>&1 | FileCheck %s
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
target triple = "aarch64-none-unknown-elf"
; Tests for printing VPlans that are enabled under AArch64
-define i32 @print_partial_reduction(ptr %a, ptr %b) {
+define i32 @print_partial_reduction(ptr %a, ptr %b) "target-features"="+neon,+dotprod" {
; CHECK: VPlan 'Initial VPlan for VF={8,16},UF>=1' {
; CHECK-NEXT: Live-in vp<[[VF:%.]]> = VF
; CHECK-NEXT: Live-in vp<[[VFxUF:%.]]> = VF * UF
@@ -69,60 +69,37 @@ define i32 @print_partial_reduction(ptr %a, ptr %b) {
; CHECK-NEXT: No successors
; CHECK-NEXT: }
; CHECK: VPlan 'Final VPlan for VF={8,16},UF={1}' {
+; CHECK-NEXT: Live-in ir<1024> = vector-trip-count
; CHECK-NEXT: Live-in ir<1024> = original trip-count
; CHECK-EMPTY:
; CHECK-NEXT: ir-bb<entry>:
-; CHECK-NEXT: Successor(s): ir-bb<scalar.ph>, ir-bb<vector.main.loop.iter.check>
+; CHECK-NEXT: Successor(s): vector.ph
; CHECK-EMPTY:
-; CHECK-NEXT: ir-bb<vector.main.loop.iter.check>:
-; CHECK-NEXT: Successor(s): ir-bb<scalar.ph>, ir-bb<vector.ph>
-; CHECK-EMPTY:
-; CHECK-NEXT: ir-bb<vector.ph>:
-; CHECK-NEXT: EMIT vp<[[RDX_START:%.+]]> = reduction-start-vector ir<0>, ir<0>, ir<4>
+; CHECK-NEXT: vector.ph:
+; CHECK-NEXT: EMIT vp<%1> = reduction-start-vector ir<0>, ir<0>, ir<4>
; CHECK-NEXT: Successor(s): vector.body
; CHECK-EMPTY:
; CHECK-NEXT: vector.body:
-; CHECK-NEXT: EMIT-SCALAR vp<[[EP_IV:%.+]]> = phi [ ir<0>, ir-bb<vector.ph> ], [ vp<%index.next>, vector.body ]
-; CHECK-NEXT: WIDEN-REDUCTION-PHI ir<%accum> = phi vp<[[RDX_START]]>, ir<%add> (VF scaled by 1/4)
-; CHECK-NEXT: CLONE ir<%gep.a> = getelementptr ir<%a>, vp<[[EP_IV]]>
+; CHECK-NEXT: EMIT-SCALAR vp<%index> = phi [ ir<0>, vector.ph ], [ vp<%index.next>, vector.body ]
+; CHECK-NEXT: WIDEN-REDUCTION-PHI ir<%accum> = phi vp<%1>, ir<%add> (VF scaled by 1/4)
+; CHECK-NEXT: CLONE ir<%gep.a> = getelementptr ir<%a>, vp<%index>
; CHECK-NEXT: WIDEN ir<%load.a> = load ir<%gep.a>
-; CHECK-NEXT: CLONE ir<%gep.b> = getelementptr ir<%b>, vp<[[EP_IV]]>
+; CHECK-NEXT: CLONE ir<%gep.b> = getelementptr ir<%b>, vp<%index>
; CHECK-NEXT: WIDEN ir<%load.b> = load ir<%gep.b>
; CHECK-NEXT: WIDEN-CAST ir<%ext.b> = zext ir<%load.b> to i32
; CHECK-NEXT: WIDEN-CAST ir<%ext.a> = zext ir<%load.a> to i32
; CHECK-NEXT: WIDEN ir<%mul> = mul ir<%ext.b>, ir<%ext.a>
; CHECK-NEXT: PARTIAL-REDUCE ir<%add> = add ir<%accum>, ir<%mul>
-; CHECK-NEXT: EMIT vp<[[EP_IV_NEXT:%.+]]> = add nuw vp<[[EP_IV]]>, ir<16>
-; CHECK-NEXT: EMIT branch-on-count vp<[[EP_IV_NEXT]]>, ir<1024>
+; CHECK-NEXT: EMIT vp<%index.next> = add nuw vp<%index>, ir<16>
+; CHECK-NEXT: EMIT branch-on-count vp<%index.next>, ir<1024>
; CHECK-NEXT: Successor(s): middle.block, vector.body
; CHECK-EMPTY:
; CHECK-NEXT: middle.block:
-; CHECK-NEXT: EMIT vp<[[RED_RESULT:%.+]]> = compute-reduction-result ir<%accum>, ir<%add>
-; CHECK-NEXT: EMIT branch-on-cond ir<true>
-; CHECK-NEXT: Successor(s): ir-bb<exit>, ir-bb<scalar.ph>
+; CHECK-NEXT: EMIT vp<%3> = compute-reduction-result ir<%accum>, ir<%add>
+; CHECK-NEXT: Successor(s): ir-bb<exit>
; CHECK-EMPTY:
; CHECK-NEXT: ir-bb<exit>:
-; CHECK-NEXT: IR %add.lcssa = phi i32 [ %add, %for.body ] (extra operand: vp<[[RED_RESULT]]> from middle.block)
-; CHECK-NEXT: No successors
-; CHECK-EMPTY:
-; CHECK-NEXT: ir-bb<scalar.ph>:
-; CHECK-NEXT: EMIT-SCALAR vp<[[EP_RESUME:%.+]]> = phi [ ir<1024>, middle.block ], [ ir<0>, ir-bb<entry> ]
-; CHECK-NEXT: EMIT-SCALAR vp<[[EP_MERGE:%.+]]> = phi [ vp<[[RED_RESULT]]>, middle.block ], [ ir<0>, ir-bb<entry> ]
-; CHECK-NEXT: EMIT-SCALAR vp<%6> = resume-for-epilogue vp<%vec.epilog.resume.val>
-; CHECK-NEXT: Successor(s): ir-bb<for.body>
-; CHECK-EMPTY:
-; CHECK-NEXT: ir-bb<for.body>:
-; CHECK-NEXT: IR %accum = phi i32 [ 0, %scalar.ph ], [ %add, %for.body ] (extra operand: vp<[[EP_MERGE]]> from ir-bb<scalar.ph>)
-; CHECK-NEXT: IR %gep.a = getelementptr i8, ptr %a, i64 %iv
-; CHECK-NEXT: IR %load.a = load i8, ptr %gep.a, align 1
-; CHECK-NEXT: IR %ext.a = zext i8 %load.a to i32
-; CHECK-NEXT: IR %gep.b = getelementptr i8, ptr %b, i64 %iv
-; CHECK-NEXT: IR %load.b = load i8, ptr %gep.b, align 1
-; CHECK-NEXT: IR %ext.b = zext i8 %load.b to i32
-; CHECK-NEXT: IR %mul = mul i32 %ext.b, %ext.a
-; CHECK-NEXT: IR %add = add i32 %mul, %accum
-; CHECK-NEXT: IR %iv.next = add i64 %iv, 1
-; CHECK-NEXT: IR %exitcond.not = icmp eq i64 %iv.next, 1024
+; CHECK-NEXT: IR %add.lcssa = phi i32 [ %add, %for.body ] (extra operand: vp<%3> from middle.block)
; CHECK-NEXT: No successors
; CHECK-NEXT: }
entry:
@@ -141,8 +118,12 @@ for.body: ; preds = %for.body, %entry
%add = add i32 %mul, %accum
%iv.next = add i64 %iv, 1
%exitcond.not = icmp eq i64 %iv.next, 1024
- br i1 %exitcond.not, label %exit, label %for.body
+ br i1 %exitcond.not, label %exit, label %for.body, !llvm.loop !0
exit:
ret i32 %add
}
+
+!0 = distinct !{!0, !2, !3}
+!2 = !{!"llvm.loop.interleave.count", i32 1}
+!3 = !{!"llvm.loop.vectorize.predicate.enable", i1 false}
diff --git a/llvm/test/Transforms/LoopVectorize/first-order-recurrence-sink-replicate-region.ll b/llvm/test/Transforms/LoopVectorize/first-order-recurrence-sink-replicate-region.ll
index 9deab90..fe230fa 100644
--- a/llvm/test/Transforms/LoopVectorize/first-order-recurrence-sink-replicate-region.ll
+++ b/llvm/test/Transforms/LoopVectorize/first-order-recurrence-sink-replicate-region.ll
@@ -102,7 +102,7 @@ exit:
ret void
}
-define void @sink_replicate_region_2(i32 %x, i8 %y, ptr %ptr) optsize {
+define void @sink_replicate_region_2(i32 %x, i8 %y, ptr %ptr, i32 %z) optsize {
; CHECK-LABEL: sink_replicate_region_2
; CHECK: VPlan 'Initial VPlan for VF={2},UF>=1' {
; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF
@@ -125,16 +125,18 @@ define void @sink_replicate_region_2(i32 %x, i8 %y, ptr %ptr) optsize {
; CHECK-NEXT: ir<%iv> = WIDEN-INDUCTION ir<0>, ir<1>, vp<[[VF]]>
; CHECK-NEXT: EMIT vp<[[MASK:%.+]]> = icmp ule ir<%iv>, vp<[[BTC]]>
; CHECK-NEXT: EMIT vp<[[SPLICE:%.+]]> = first-order splice ir<%recur>, ir<%recur.next>
+; CHECK-NEXT: WIDEN ir<%cond> = icmp eq ir<%iv>, ir<%z>
+; CHECK-NEXT: EMIT vp<[[AND:%.+]]> = logical-and vp<[[MASK]]>, ir<%cond>
; CHECK-NEXT: Successor(s): pred.store
; CHECK-EMPTY:
; CHECK-NEXT: <xVFxUF> pred.store: {
; CHECK-NEXT: pred.store.entry:
-; CHECK-NEXT: BRANCH-ON-MASK vp<[[MASK]]>
+; CHECK-NEXT: BRANCH-ON-MASK vp<[[AND]]>
; CHECK-NEXT: Successor(s): pred.store.if, pred.store.continue
; CHECK-EMPTY:
; CHECK-NEXT: pred.store.if:
-; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
; CHECK-NEXT: REPLICATE ir<%rem> = srem vp<[[SPLICE]]>, ir<%x>
+; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
; CHECK-NEXT: REPLICATE ir<%gep> = getelementptr ir<%ptr>, vp<[[STEPS]]>
; CHECK-NEXT: REPLICATE ir<%add> = add ir<%rem>, ir<%recur.next>
; CHECK-NEXT: REPLICATE store ir<%add>, ir<%gep>
@@ -143,9 +145,9 @@ define void @sink_replicate_region_2(i32 %x, i8 %y, ptr %ptr) optsize {
; CHECK-NEXT: pred.store.continue:
; CHECK-NEXT: No successors
; CHECK-NEXT: }
-; CHECK-NEXT: Successor(s): loop.0
+; CHECK-NEXT: Successor(s): if.1
; CHECK-EMPTY:
-; CHECK-NEXT: loop.0:
+; CHECK-NEXT: if.1:
; CHECK-NEXT: EMIT vp<[[CAN_IV_NEXT:%.+]]> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>
; CHECK-NEXT: EMIT branch-on-count vp<[[CAN_IV_NEXT]]>, vp<[[VEC_TC]]>
; CHECK-NEXT: No successors
@@ -162,13 +164,20 @@ entry:
br label %loop
loop:
- %recur = phi i32 [ 0, %entry ], [ %recur.next, %loop ]
- %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
- %rem = srem i32 %recur, %x
+ %recur = phi i32 [ 0, %entry ], [ %recur.next, %latch ]
+ %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ]
%recur.next = sext i8 %y to i32
+ %cond = icmp eq i32 %iv, %z
+ br i1 %cond, label %if, label %latch
+
+if:
+ %rem = srem i32 %recur, %x
%add = add i32 %rem, %recur.next
%gep = getelementptr i32, ptr %ptr, i32 %iv
store i32 %add, ptr %gep
+ br label %latch
+
+latch:
%iv.next = add nsw i32 %iv, 1
%ec = icmp eq i32 %iv.next, 20001
br i1 %ec, label %exit, label %loop
diff --git a/llvm/test/Transforms/LoopVectorize/hoist-and-sink-mem-ops-with-invariant-pointers.ll b/llvm/test/Transforms/LoopVectorize/hoist-and-sink-mem-ops-with-invariant-pointers.ll
new file mode 100644
index 0000000..8615401
--- /dev/null
+++ b/llvm/test/Transforms/LoopVectorize/hoist-and-sink-mem-ops-with-invariant-pointers.ll
@@ -0,0 +1,247 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 6
+; RUN: opt -passes=loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -S %s | FileCheck %s
+
+define void @hoist_invariant_load_noalias_due_to_memchecks(ptr %dst, ptr %invariant_ptr, i32 %n) {
+; CHECK-LABEL: define void @hoist_invariant_load_noalias_due_to_memchecks(
+; CHECK-SAME: ptr [[DST:%.*]], ptr [[INVARIANT_PTR:%.*]], i32 [[N:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*]]:
+; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[N]], 4
+; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]
+; CHECK: [[VECTOR_MEMCHECK]]:
+; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[N]], -1
+; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64
+; CHECK-NEXT: [[TMP2:%.*]] = shl nuw nsw i64 [[TMP1]], 2
+; CHECK-NEXT: [[TMP3:%.*]] = add nuw nsw i64 [[TMP2]], 4
+; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[DST]], i64 [[TMP3]]
+; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[INVARIANT_PTR]], i64 4
+; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[DST]], [[SCEVGEP1]]
+; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr [[INVARIANT_PTR]], [[SCEVGEP]]
+; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]
+; CHECK-NEXT: br i1 [[FOUND_CONFLICT]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]
+; CHECK: [[VECTOR_PH]]:
+; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[N]], 4
+; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[N]], [[N_MOD_VF]]
+; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
+; CHECK: [[VECTOR_BODY]]:
+; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
+; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[INVARIANT_PTR]], align 4, !alias.scope [[META0:![0-9]+]]
+; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[TMP4]], i64 0
+; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x i32> [[BROADCAST_SPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
+; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[INDEX]]
+; CHECK-NEXT: store <4 x i32> [[BROADCAST_SPLAT]], ptr [[TMP5]], align 4, !alias.scope [[META3:![0-9]+]], !noalias [[META0]]
+; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
+; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]
+; CHECK-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
+; CHECK: [[MIDDLE_BLOCK]]:
+; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[N]], [[N_VEC]]
+; CHECK-NEXT: br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]
+; CHECK: [[SCALAR_PH]]:
+; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ], [ 0, %[[VECTOR_MEMCHECK]] ]
+; CHECK-NEXT: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
+; CHECK-NEXT: [[INV_VAL:%.*]] = load i32, ptr [[INVARIANT_PTR]], align 4
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[IV]]
+; CHECK-NEXT: store i32 [[INV_VAL]], ptr [[GEP]], align 4
+; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
+; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], [[N]]
+; CHECK-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], !llvm.loop [[LOOP8:![0-9]+]]
+; CHECK: [[EXIT]]:
+; CHECK-NEXT: ret void
+;
+entry:
+ br label %loop
+
+loop:
+ %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
+ %inv_val = load i32, ptr %invariant_ptr, align 4
+ %gep = getelementptr inbounds i32, ptr %dst, i32 %iv
+ store i32 %inv_val, ptr %gep, align 4
+ %iv.next = add nuw nsw i32 %iv, 1
+ %ec = icmp eq i32 %iv.next, %n
+ br i1 %ec, label %exit, label %loop
+
+exit:
+ ret void
+}
+
+; Test that loads with non-invariant addresses are not hoisted.
+define void @dont_hoist_variant_address(ptr %dst, ptr %src, i32 %n) {
+; CHECK-LABEL: define void @dont_hoist_variant_address(
+; CHECK-SAME: ptr [[DST:%.*]], ptr [[SRC:%.*]], i32 [[N:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*]]:
+; CHECK-NEXT: [[SRC2:%.*]] = ptrtoint ptr [[SRC]] to i64
+; CHECK-NEXT: [[A1:%.*]] = ptrtoint ptr [[DST]] to i64
+; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[N]], 4
+; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]
+; CHECK: [[VECTOR_MEMCHECK]]:
+; CHECK-NEXT: [[TMP0:%.*]] = sub i64 [[A1]], [[SRC2]]
+; CHECK-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP0]], 16
+; CHECK-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]
+; CHECK: [[VECTOR_PH]]:
+; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[N]], 4
+; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[N]], [[N_MOD_VF]]
+; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
+; CHECK: [[VECTOR_BODY]]:
+; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
+; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i32 [[INDEX]]
+; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4
+; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[INDEX]]
+; CHECK-NEXT: store <4 x i32> [[WIDE_LOAD]], ptr [[TMP2]], align 4
+; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
+; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]
+; CHECK-NEXT: br i1 [[TMP3]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
+; CHECK: [[MIDDLE_BLOCK]]:
+; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[N]], [[N_VEC]]
+; CHECK-NEXT: br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]
+; CHECK: [[SCALAR_PH]]:
+; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ], [ 0, %[[VECTOR_MEMCHECK]] ]
+; CHECK-NEXT: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
+; CHECK-NEXT: [[GEP_SRC:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i32 [[IV]]
+; CHECK-NEXT: [[VAL:%.*]] = load i32, ptr [[GEP_SRC]], align 4
+; CHECK-NEXT: [[GEP_DST:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[IV]]
+; CHECK-NEXT: store i32 [[VAL]], ptr [[GEP_DST]], align 4
+; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
+; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], [[N]]
+; CHECK-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], !llvm.loop [[LOOP10:![0-9]+]]
+; CHECK: [[EXIT]]:
+; CHECK-NEXT: ret void
+;
+entry:
+ br label %loop
+
+loop:
+ %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
+ %gep.src = getelementptr inbounds i32, ptr %src, i32 %iv
+ %val = load i32, ptr %gep.src, align 4
+ %gep.dst = getelementptr inbounds i32, ptr %dst, i32 %iv
+ store i32 %val, ptr %gep.dst, align 4
+ %iv.next = add nuw nsw i32 %iv, 1
+ %ec = icmp eq i32 %iv.next, %n
+ br i1 %ec, label %exit, label %loop
+
+exit:
+ ret void
+}
+
+; Test that predicated loads are not hoisted.
+define void @dont_hoist_predicated_load(ptr %dst, ptr %invariant_ptr, ptr %cond_ptr, i32 %n) {
+; CHECK-LABEL: define void @dont_hoist_predicated_load(
+; CHECK-SAME: ptr [[DST:%.*]], ptr [[INVARIANT_PTR:%.*]], ptr [[COND_PTR:%.*]], i32 [[N:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*]]:
+; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[N]], 4
+; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_MEMCHECK:.*]]
+; CHECK: [[VECTOR_MEMCHECK]]:
+; CHECK-NEXT: [[TMP5:%.*]] = add i32 [[N]], -1
+; CHECK-NEXT: [[TMP20:%.*]] = zext i32 [[TMP5]] to i64
+; CHECK-NEXT: [[TMP22:%.*]] = shl nuw nsw i64 [[TMP20]], 2
+; CHECK-NEXT: [[TMP3:%.*]] = add nuw nsw i64 [[TMP22]], 4
+; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[DST]], i64 [[TMP3]]
+; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[COND_PTR]], i64 [[TMP3]]
+; CHECK-NEXT: [[SCEVGEP2:%.*]] = getelementptr i8, ptr [[INVARIANT_PTR]], i64 4
+; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[DST]], [[SCEVGEP1]]
+; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr [[COND_PTR]], [[SCEVGEP]]
+; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]
+; CHECK-NEXT: [[BOUND03:%.*]] = icmp ult ptr [[DST]], [[SCEVGEP2]]
+; CHECK-NEXT: [[BOUND14:%.*]] = icmp ult ptr [[INVARIANT_PTR]], [[SCEVGEP]]
+; CHECK-NEXT: [[FOUND_CONFLICT5:%.*]] = and i1 [[BOUND03]], [[BOUND14]]
+; CHECK-NEXT: [[CONFLICT_RDX:%.*]] = or i1 [[FOUND_CONFLICT]], [[FOUND_CONFLICT5]]
+; CHECK-NEXT: br i1 [[CONFLICT_RDX]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]]
+; CHECK: [[VECTOR_PH]]:
+; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[N]], 4
+; CHECK-NEXT: [[N_VEC:%.*]] = sub i32 [[N]], [[N_MOD_VF]]
+; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
+; CHECK: [[VECTOR_BODY]]:
+; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_STORE_CONTINUE11:.*]] ]
+; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[COND_PTR]], i32 [[INDEX]]
+; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP0]], align 4, !alias.scope [[META11:![0-9]+]]
+; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt <4 x i32> [[WIDE_LOAD]], zeroinitializer
+; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x i1> [[TMP1]], i32 0
+; CHECK-NEXT: br i1 [[TMP2]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]
+; CHECK: [[PRED_STORE_IF]]:
+; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[INVARIANT_PTR]], align 4, !alias.scope [[META14:![0-9]+]]
+; CHECK-NEXT: [[TMP4:%.*]] = add i32 [[INDEX]], 0
+; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[TMP4]]
+; CHECK-NEXT: store i32 [[TMP7]], ptr [[TMP9]], align 4, !alias.scope [[META16:![0-9]+]], !noalias [[META18:![0-9]+]]
+; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE]]
+; CHECK: [[PRED_STORE_CONTINUE]]:
+; CHECK-NEXT: [[TMP6:%.*]] = extractelement <4 x i1> [[TMP1]], i32 1
+; CHECK-NEXT: br i1 [[TMP6]], label %[[PRED_STORE_IF6:.*]], label %[[PRED_STORE_CONTINUE7:.*]]
+; CHECK: [[PRED_STORE_IF6]]:
+; CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[INVARIANT_PTR]], align 4, !alias.scope [[META14]]
+; CHECK-NEXT: [[TMP8:%.*]] = add i32 [[INDEX]], 1
+; CHECK-NEXT: [[TMP13:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[TMP8]]
+; CHECK-NEXT: store i32 [[TMP11]], ptr [[TMP13]], align 4, !alias.scope [[META16]], !noalias [[META18]]
+; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE7]]
+; CHECK: [[PRED_STORE_CONTINUE7]]:
+; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP1]], i32 2
+; CHECK-NEXT: br i1 [[TMP10]], label %[[PRED_STORE_IF8:.*]], label %[[PRED_STORE_CONTINUE9:.*]]
+; CHECK: [[PRED_STORE_IF8]]:
+; CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[INVARIANT_PTR]], align 4, !alias.scope [[META14]]
+; CHECK-NEXT: [[TMP12:%.*]] = add i32 [[INDEX]], 2
+; CHECK-NEXT: [[TMP17:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[TMP12]]
+; CHECK-NEXT: store i32 [[TMP15]], ptr [[TMP17]], align 4, !alias.scope [[META16]], !noalias [[META18]]
+; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE9]]
+; CHECK: [[PRED_STORE_CONTINUE9]]:
+; CHECK-NEXT: [[TMP14:%.*]] = extractelement <4 x i1> [[TMP1]], i32 3
+; CHECK-NEXT: br i1 [[TMP14]], label %[[PRED_STORE_IF10:.*]], label %[[PRED_STORE_CONTINUE11]]
+; CHECK: [[PRED_STORE_IF10]]:
+; CHECK-NEXT: [[TMP19:%.*]] = load i32, ptr [[INVARIANT_PTR]], align 4, !alias.scope [[META14]]
+; CHECK-NEXT: [[TMP16:%.*]] = add i32 [[INDEX]], 3
+; CHECK-NEXT: [[TMP21:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[TMP16]]
+; CHECK-NEXT: store i32 [[TMP19]], ptr [[TMP21]], align 4, !alias.scope [[META16]], !noalias [[META18]]
+; CHECK-NEXT: br label %[[PRED_STORE_CONTINUE11]]
+; CHECK: [[PRED_STORE_CONTINUE11]]:
+; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
+; CHECK-NEXT: [[TMP18:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]
+; CHECK-NEXT: br i1 [[TMP18]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP19:![0-9]+]]
+; CHECK: [[MIDDLE_BLOCK]]:
+; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[N]], [[N_VEC]]
+; CHECK-NEXT: br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]
+; CHECK: [[SCALAR_PH]]:
+; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ], [ 0, %[[VECTOR_MEMCHECK]] ]
+; CHECK-NEXT: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
+; CHECK-NEXT: [[GEP_COND:%.*]] = getelementptr inbounds i32, ptr [[COND_PTR]], i32 [[IV]]
+; CHECK-NEXT: [[COND:%.*]] = load i32, ptr [[GEP_COND]], align 4
+; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[COND]], 0
+; CHECK-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[LOOP_LATCH]]
+; CHECK: [[IF_THEN]]:
+; CHECK-NEXT: [[INV_VAL:%.*]] = load i32, ptr [[INVARIANT_PTR]], align 4
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[IV]]
+; CHECK-NEXT: store i32 [[INV_VAL]], ptr [[GEP]], align 4
+; CHECK-NEXT: br label %[[LOOP_LATCH]]
+; CHECK: [[LOOP_LATCH]]:
+; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
+; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], [[N]]
+; CHECK-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], !llvm.loop [[LOOP20:![0-9]+]]
+; CHECK: [[EXIT]]:
+; CHECK-NEXT: ret void
+;
+entry:
+ br label %loop
+
+loop:
+ %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]
+ %gep.cond = getelementptr inbounds i32, ptr %cond_ptr, i32 %iv
+ %cond = load i32, ptr %gep.cond, align 4
+ %cmp = icmp sgt i32 %cond, 0
+ br i1 %cmp, label %if.then, label %loop.latch
+
+if.then:
+ %inv_val = load i32, ptr %invariant_ptr, align 4
+ %gep = getelementptr inbounds i32, ptr %dst, i32 %iv
+ store i32 %inv_val, ptr %gep, align 4
+ br label %loop.latch
+
+loop.latch:
+ %iv.next = add nuw nsw i32 %iv, 1
+ %ec = icmp eq i32 %iv.next, %n
+ br i1 %ec, label %exit, label %loop
+
+exit:
+ ret void
+}
diff --git a/llvm/test/Transforms/LoopVectorize/vplan-sink-scalars-and-merge.ll b/llvm/test/Transforms/LoopVectorize/vplan-sink-scalars-and-merge.ll
index 994e9c1..2dd6a04 100644
--- a/llvm/test/Transforms/LoopVectorize/vplan-sink-scalars-and-merge.ll
+++ b/llvm/test/Transforms/LoopVectorize/vplan-sink-scalars-and-merge.ll
@@ -29,11 +29,13 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
; CHECK-NEXT: ir<%iv> = WIDEN-INDUCTION ir<0>, ir<1>, vp<[[VF]]>
; CHECK-NEXT: EMIT vp<[[MASK:%.+]]> = icmp ule ir<%iv>, vp<[[BTC]]>
+; CHECK-NEXT: WIDEN ir<%cond> = icmp eq ir<%iv>, ir<%x>
+; CHECK-NEXT: EMIT vp<[[AND:%.+]]> = logical-and vp<[[MASK]]>, ir<%cond>
; CHECK-NEXT: Successor(s): pred.store
; CHECK: <xVFxUF> pred.store: {
; CHECK-NEXT: pred.store.entry:
-; CHECK-NEXT: BRANCH-ON-MASK vp<[[MASK]]>
+; CHECK-NEXT: BRANCH-ON-MASK vp<[[AND]]>
; CHECK-NEXT: Successor(s): pred.store.if, pred.store.continue
; CHECK: pred.store.if:
@@ -50,24 +52,31 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
; CHECK-NEXT: No successors
; CHECK-NEXT: }
-; CHECK: loop.1:
+; CHECK: if.1:
; CHECK-NEXT: EMIT vp<[[CAN_IV_NEXT:%.+]]> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>
; CHECK-NEXT: EMIT branch-on-count vp<[[CAN_IV_NEXT]]>, vp<[[VEC_TC]]>
; CHECK-NEXT: No successors
; CHECK-NEXT: }
;
-define void @sink1(i32 %k) {
+define void @sink1(i32 %k, i32 %x) {
entry:
br label %loop
loop:
- %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
+ %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ]
+ %cond = icmp eq i32 %iv, %x
+ br i1 %cond, label %if, label %latch
+
+if:
%gep.b = getelementptr inbounds [2048 x i32], ptr @b, i32 0, i32 %iv
%lv.b = load i32, ptr %gep.b, align 4
%add = add i32 %lv.b, 10
%mul = mul i32 2, %add
%gep.a = getelementptr inbounds [2048 x i32], ptr @a, i32 0, i32 %iv
store i32 %mul, ptr %gep.a, align 4
+ br label %latch
+
+latch:
%iv.next = add i32 %iv, 1
%large = icmp sge i32 %iv, 8
%exitcond = icmp eq i32 %iv, %k
diff --git a/llvm/test/Transforms/PhaseOrdering/AArch64/hoist-load-from-vector-loop.ll b/llvm/test/Transforms/PhaseOrdering/AArch64/hoist-load-from-vector-loop.ll
new file mode 100644
index 0000000..a35bcf1
--- /dev/null
+++ b/llvm/test/Transforms/PhaseOrdering/AArch64/hoist-load-from-vector-loop.ll
@@ -0,0 +1,46 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 6
+; RUN: opt -passes='default<O3>' -S %s | FileCheck %s
+
+target triple = "arm64-apple-macosx"
+
+%"class.dealii::VectorizedArray" = type { [4 x double] }
+
+define void @hoist_invariant_load(ptr %invariant_ptr, i64 %num_elements, ptr %array) {
+; CHECK-LABEL: define void @hoist_invariant_load(
+; CHECK-SAME: ptr readonly captures(none) [[INVARIANT_PTR:%.*]], i64 [[NUM_ELEMENTS:%.*]], ptr captures(none) [[ARRAY:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: [[ENTRY:.*]]:
+; CHECK-NEXT: [[CMP1_NOT:%.*]] = icmp eq i64 [[NUM_ELEMENTS]], 0
+; CHECK-NEXT: br i1 [[CMP1_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH:.*]]
+; CHECK: [[LOOP_LATCH]]:
+; CHECK-NEXT: [[I2:%.*]] = phi i64 [ [[I_NEXT:%.*]], %[[LOOP_LATCH]] ], [ 0, %[[ENTRY]] ]
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr nusw %"class.dealii::VectorizedArray", ptr [[ARRAY]], i64 [[I2]]
+; CHECK-NEXT: [[INVARIANT_VAL:%.*]] = load double, ptr [[INVARIANT_PTR]], align 8
+; CHECK-NEXT: [[ARRAY_VAL:%.*]] = load double, ptr [[GEP]], align 8
+; CHECK-NEXT: [[SUM:%.*]] = fadd double [[INVARIANT_VAL]], [[ARRAY_VAL]]
+; CHECK-NEXT: store double [[SUM]], ptr [[GEP]], align 8
+; CHECK-NEXT: [[I_NEXT]] = add nuw i64 [[I2]], 1
+; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[I_NEXT]], [[NUM_ELEMENTS]]
+; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT]], label %[[LOOP_LATCH]]
+; CHECK: [[EXIT]]:
+; CHECK-NEXT: ret void
+;
+entry:
+ br label %loop.header
+
+loop.header: ; preds = %loop.latch, %entry
+ %i = phi i64 [ 0, %entry ], [ %i.next, %loop.latch ]
+ %cmp = icmp ult i64 %i, %num_elements
+ br i1 %cmp, label %loop.latch, label %exit
+
+loop.latch: ; preds = %loop.header
+ %gep = getelementptr nusw %"class.dealii::VectorizedArray", ptr %array, i64 %i
+ %invariant_val = load double, ptr %invariant_ptr, align 8
+ %array_val = load double, ptr %gep, align 8
+ %sum = fadd double %array_val, %invariant_val
+ store double %sum, ptr %gep, align 8
+ %i.next = add i64 %i, 1
+ br label %loop.header
+
+exit: ; preds = %loop.header
+ ret void
+}
diff --git a/llvm/test/Transforms/SLPVectorizer/X86/parent-non-schedule-multi-use-in-binop.ll b/llvm/test/Transforms/SLPVectorizer/X86/parent-non-schedule-multi-use-in-binop.ll
new file mode 100644
index 0000000..590b0be
--- /dev/null
+++ b/llvm/test/Transforms/SLPVectorizer/X86/parent-non-schedule-multi-use-in-binop.ll
@@ -0,0 +1,40 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -passes=slp-vectorizer -S --mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
+
+@a = common global [100 x i64] zeroinitializer, align 64
+
+define void @test() {
+; CHECK-LABEL: define void @test() {
+; CHECK-NEXT: [[ENTRY:.*]]:
+; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, ptr getelementptr inbounds nuw (i8, ptr @a, i64 48), align 8
+; CHECK-NEXT: [[TMP1:%.*]] = add <2 x i64> [[TMP0]], splat (i64 1)
+; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <2 x i64> [[TMP0]], <2 x i64> [[TMP1]], <2 x i32> <i32 0, i32 3>
+; CHECK-NEXT: [[TMP3:%.*]] = add <2 x i64> [[TMP2]], splat (i64 1)
+; CHECK-NEXT: br i1 false, label %[[LOP_RHSCNT_I_PEEL:.*]], label %[[LAND_END_I_PEEL:.*]]
+; CHECK: [[LOP_RHSCNT_I_PEEL]]:
+; CHECK-NEXT: [[TMP4:%.*]] = or <2 x i64> [[TMP1]], <i64 1, i64 0>
+; CHECK-NEXT: br label %[[LAND_END_I_PEEL]]
+; CHECK: [[LAND_END_I_PEEL]]:
+; CHECK-NEXT: [[TMP5:%.*]] = phi <2 x i64> [ [[TMP3]], %[[ENTRY]] ], [ [[TMP4]], %[[LOP_RHSCNT_I_PEEL]] ]
+; CHECK-NEXT: store <2 x i64> [[TMP5]], ptr getelementptr inbounds nuw (i8, ptr @a, i64 48), align 8
+; CHECK-NEXT: ret void
+;
+entry:
+ %.promoted104.i = load i64, ptr getelementptr inbounds nuw (i8, ptr @a, i64 56), align 8
+ %.promoted103.i = load i64, ptr getelementptr inbounds nuw (i8, ptr @a, i64 48), align 8
+ %0 = add i64 %.promoted104.i, 1
+ %1 = add i64 %.promoted103.i, 1
+ %2 = add i64 %0, 1
+ br i1 false, label %lop.rhscnt.i.peel, label %land.end.i.peel
+
+lop.rhscnt.i.peel:
+ %3 = or i64 %1, 1
+ br label %land.end.i.peel
+
+land.end.i.peel:
+ %4 = phi i64 [ %2, %entry ], [ %0, %lop.rhscnt.i.peel ]
+ %5 = phi i64 [ %1, %entry ], [ %3, %lop.rhscnt.i.peel ]
+ store i64 %5, ptr getelementptr inbounds nuw (i8, ptr @a, i64 48), align 8
+ store i64 %4, ptr getelementptr inbounds nuw (i8, ptr @a, i64 56), align 8
+ ret void
+}
diff --git a/llvm/test/lit.cfg.py b/llvm/test/lit.cfg.py
index 11a5a57..974af4b 100644
--- a/llvm/test/lit.cfg.py
+++ b/llvm/test/lit.cfg.py
@@ -474,7 +474,7 @@ if config.host_ldflags.find("-m32") < 0 and any(
config.available_features.add("host-byteorder-" + sys.byteorder + "-endian")
if config.target_triple:
if re.match(
- r"(aarch64_be|arc|armeb|bpfeb|lanai|m68k|mips|mips64|powerpc|powerpc64|sparc|sparcv9|s390x|s390|tce|thumbeb)-.*",
+ r"(aarch64_be|arc|armeb|bpfeb|lanai|m68k|mips|mips64|powerpc|powerpc64|sparc|sparcv9|sparc64|s390x|s390|tce|thumbeb)-.*",
config.target_triple,
):
config.available_features.add("target-byteorder-big-endian")
diff --git a/llvm/tools/bugpoint/ListReducer.h b/llvm/tools/bugpoint/ListReducer.h
index 06f8ddb2..ceee853 100644
--- a/llvm/tools/bugpoint/ListReducer.h
+++ b/llvm/tools/bugpoint/ListReducer.h
@@ -32,7 +32,7 @@ template <typename ElTy> struct ListReducer {
KeepPrefix // The prefix alone satisfies the predicate
};
- virtual ~ListReducer() {}
+ virtual ~ListReducer() = default;
/// This virtual function should be overriden by subclasses to implement the
/// test desired. The testcase is only required to test to see if the Kept
diff --git a/llvm/tools/bugpoint/ToolRunner.h b/llvm/tools/bugpoint/ToolRunner.h
index c9da9af..9ff0663 100644
--- a/llvm/tools/bugpoint/ToolRunner.h
+++ b/llvm/tools/bugpoint/ToolRunner.h
@@ -105,7 +105,7 @@ public:
createCustomExecutor(const char *Argv0, std::string &Message,
const std::string &ExecCommandLine);
- virtual ~AbstractInterpreter() {}
+ virtual ~AbstractInterpreter() = default;
/// compileProgram - Compile the specified program from bitcode to executable
/// code. This does not produce any output, it is only used when debugging
diff --git a/llvm/tools/dsymutil/BinaryHolder.h b/llvm/tools/dsymutil/BinaryHolder.h
index cb5bd95..27d7151 100644
--- a/llvm/tools/dsymutil/BinaryHolder.h
+++ b/llvm/tools/dsymutil/BinaryHolder.h
@@ -110,7 +110,7 @@ public:
std::string Filename;
TimestampTy Timestamp;
- KeyTy() {}
+ KeyTy() = default;
KeyTy(StringRef Filename, TimestampTy Timestamp)
: Filename(Filename.str()), Timestamp(Timestamp) {}
};
diff --git a/llvm/tools/lli/lli.cpp b/llvm/tools/lli/lli.cpp
index 7fee06b..017e210 100644
--- a/llvm/tools/lli/lli.cpp
+++ b/llvm/tools/lli/lli.cpp
@@ -305,7 +305,7 @@ public:
this->CacheDir[this->CacheDir.size() - 1] != '/')
this->CacheDir += '/';
}
- ~LLIObjectCache() override {}
+ ~LLIObjectCache() override = default;
void notifyObjectCompiled(const Module *M, MemoryBufferRef Obj) override {
const std::string &ModuleID = M->getModuleIdentifier();
diff --git a/llvm/tools/llvm-cov/CoverageExporter.h b/llvm/tools/llvm-cov/CoverageExporter.h
index 751e55d..ba946a1 100644
--- a/llvm/tools/llvm-cov/CoverageExporter.h
+++ b/llvm/tools/llvm-cov/CoverageExporter.h
@@ -37,7 +37,7 @@ protected:
: Coverage(CoverageMapping), Options(Options), OS(OS) {}
public:
- virtual ~CoverageExporter(){};
+ virtual ~CoverageExporter() = default;
/// Render the CoverageMapping object.
virtual void renderRoot(const CoverageFilters &IgnoreFilters) = 0;
diff --git a/llvm/tools/llvm-cov/CoverageFilters.h b/llvm/tools/llvm-cov/CoverageFilters.h
index 5345b0c..3cee23a 100644
--- a/llvm/tools/llvm-cov/CoverageFilters.h
+++ b/llvm/tools/llvm-cov/CoverageFilters.h
@@ -28,7 +28,7 @@ struct FunctionRecord;
/// Matches specific functions that pass the requirement of this filter.
class CoverageFilter {
public:
- virtual ~CoverageFilter() {}
+ virtual ~CoverageFilter() = default;
/// Return true if the function passes the requirements of this filter.
virtual bool matches(const coverage::CoverageMapping &CM,
diff --git a/llvm/tools/llvm-cov/SourceCoverageView.h b/llvm/tools/llvm-cov/SourceCoverageView.h
index 43fb890a..bde187e 100644
--- a/llvm/tools/llvm-cov/SourceCoverageView.h
+++ b/llvm/tools/llvm-cov/SourceCoverageView.h
@@ -122,7 +122,7 @@ public:
static std::unique_ptr<CoveragePrinter>
create(const CoverageViewOptions &Opts);
- virtual ~CoveragePrinter() {}
+ virtual ~CoveragePrinter() = default;
/// @name File Creation Interface
/// @{
@@ -288,7 +288,7 @@ public:
create(StringRef SourceName, const MemoryBuffer &File,
const CoverageViewOptions &Options, CoverageData &&CoverageInfo);
- virtual ~SourceCoverageView() {}
+ virtual ~SourceCoverageView() = default;
/// Return the source name formatted for the host OS.
std::string getSourceName() const;
diff --git a/llvm/tools/llvm-diff/lib/DiffConsumer.h b/llvm/tools/llvm-diff/lib/DiffConsumer.h
index 08c3afc..d4f339b 100644
--- a/llvm/tools/llvm-diff/lib/DiffConsumer.h
+++ b/llvm/tools/llvm-diff/lib/DiffConsumer.h
@@ -49,7 +49,7 @@ class StringRef;
virtual void logd(const DiffLogBuilder &Log) = 0;
protected:
- virtual ~Consumer() {}
+ virtual ~Consumer() = default;
};
class DiffConsumer : public Consumer {
diff --git a/llvm/tools/llvm-diff/lib/DifferenceEngine.h b/llvm/tools/llvm-diff/lib/DifferenceEngine.h
index 436a355..b829b2c 100644
--- a/llvm/tools/llvm-diff/lib/DifferenceEngine.h
+++ b/llvm/tools/llvm-diff/lib/DifferenceEngine.h
@@ -54,7 +54,7 @@ namespace llvm {
virtual bool operator()(const Value *L, const Value *R) = 0;
protected:
- virtual ~Oracle() {}
+ virtual ~Oracle() = default;
};
DifferenceEngine(Consumer &consumer)
diff --git a/llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp b/llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp
index 2c13dd5..0e73ada 100644
--- a/llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp
+++ b/llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp
@@ -112,7 +112,7 @@ namespace {
// Use X19 as the loop counter register since it's a callee-saved register
// that's available for temporary use.
-constexpr const MCPhysReg kDefaultLoopCounterReg = AArch64::X19;
+constexpr MCPhysReg kDefaultLoopCounterReg = AArch64::X19;
class ExegesisAArch64Target : public ExegesisTarget {
public:
diff --git a/llvm/tools/llvm-exegesis/lib/Analysis.cpp b/llvm/tools/llvm-exegesis/lib/Analysis.cpp
index fb84328..f3bf9690 100644
--- a/llvm/tools/llvm-exegesis/lib/Analysis.cpp
+++ b/llvm/tools/llvm-exegesis/lib/Analysis.cpp
@@ -446,7 +446,7 @@ void Analysis::printClusterRawHtml(const BenchmarkClustering::ClusterId &Id,
} // namespace exegesis
-static constexpr const char kHtmlHead[] = R"(
+static constexpr char kHtmlHead[] = R"(
<head>
<title>llvm-exegesis Analysis Results</title>
<style>
diff --git a/llvm/tools/llvm-exegesis/lib/Assembler.cpp b/llvm/tools/llvm-exegesis/lib/Assembler.cpp
index fd7924d..163f141 100644
--- a/llvm/tools/llvm-exegesis/lib/Assembler.cpp
+++ b/llvm/tools/llvm-exegesis/lib/Assembler.cpp
@@ -44,8 +44,8 @@
namespace llvm {
namespace exegesis {
-static constexpr const char ModuleID[] = "ExegesisInfoTest";
-static constexpr const char FunctionID[] = "foo";
+static constexpr char ModuleID[] = "ExegesisInfoTest";
+static constexpr char FunctionID[] = "foo";
static const Align kFunctionAlignment(4096);
// Fills the given basic block with register setup code, and returns true if
diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp
index ba14d56..c6164b6 100644
--- a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp
+++ b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp
@@ -21,9 +21,9 @@
#include "llvm/Support/Format.h"
#include "llvm/Support/raw_ostream.h"
-static constexpr const char kIntegerPrefix[] = "i_0x";
-static constexpr const char kDoublePrefix[] = "f_";
-static constexpr const char kInvalidOperand[] = "INVALID";
+static constexpr char kIntegerPrefix[] = "i_0x";
+static constexpr char kDoublePrefix[] = "f_";
+static constexpr char kInvalidOperand[] = "INVALID";
namespace llvm {
@@ -245,8 +245,8 @@ template <> struct SequenceElementTraits<exegesis::RegisterValue> {
};
template <> struct ScalarTraits<exegesis::RegisterValue> {
- static constexpr const unsigned kRadix = 16;
- static constexpr const bool kSigned = false;
+ static constexpr unsigned kRadix = 16;
+ static constexpr bool kSigned = false;
static void output(const exegesis::RegisterValue &RV, void *Ctx,
raw_ostream &Out) {
diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp
index 1fd0a15..12fad7d 100644
--- a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp
+++ b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp
@@ -155,7 +155,7 @@ private:
#ifdef LLVM_ON_UNIX
// See "Exit Status for Commands":
// https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html
- constexpr const int kSigOffset = 128;
+ constexpr int kSigOffset = 128;
return make_error<SnippetSignal>(CRC.RetCode - kSigOffset);
#else
// The exit code of the process on windows is not meaningful as a
@@ -877,7 +877,7 @@ Error BenchmarkRunner::getValidationCountersToRun(
return Error::success();
}
-BenchmarkRunner::FunctionExecutor::~FunctionExecutor() {}
+BenchmarkRunner::FunctionExecutor::~FunctionExecutor() = default;
} // namespace exegesis
} // namespace llvm
diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.h b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.h
index e688b81..16d3c9c 100644
--- a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.h
+++ b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.h
@@ -73,8 +73,8 @@ public:
// Scratch space to run instructions that touch memory.
struct ScratchSpace {
- static constexpr const size_t kAlignment = 1024;
- static constexpr const size_t kSize = 1 << 20; // 1MB.
+ static constexpr size_t kAlignment = 1024;
+ static constexpr size_t kSize = 1 << 20; // 1MB.
ScratchSpace()
: UnalignedPtr(std::make_unique<char[]>(kSize + kAlignment)),
AlignedPtr(
diff --git a/llvm/tools/llvm-exegesis/lib/Clustering.h b/llvm/tools/llvm-exegesis/lib/Clustering.h
index 9d6c110..2b0f5b4 100644
--- a/llvm/tools/llvm-exegesis/lib/Clustering.h
+++ b/llvm/tools/llvm-exegesis/lib/Clustering.h
@@ -67,11 +67,11 @@ public:
ClusterId(size_t Id, bool IsUnstable = false)
: Id_(Id), IsUnstable_(IsUnstable) {}
- static constexpr const size_t kMaxValid =
+ static constexpr size_t kMaxValid =
(std::numeric_limits<size_t>::max() >> 1) - 4;
- static constexpr const size_t kNoise = kMaxValid + 1;
- static constexpr const size_t kError = kMaxValid + 2;
- static constexpr const size_t kUndef = kMaxValid + 3;
+ static constexpr size_t kNoise = kMaxValid + 1;
+ static constexpr size_t kError = kMaxValid + 2;
+ static constexpr size_t kUndef = kMaxValid + 3;
size_t Id_ : (std::numeric_limits<size_t>::digits - 1);
size_t IsUnstable_ : 1;
diff --git a/llvm/tools/llvm-exegesis/lib/Error.h b/llvm/tools/llvm-exegesis/lib/Error.h
index 9b71fe8..c899023 100644
--- a/llvm/tools/llvm-exegesis/lib/Error.h
+++ b/llvm/tools/llvm-exegesis/lib/Error.h
@@ -81,7 +81,7 @@ private:
struct PerfCounterNotFullyEnabled
: public ErrorInfo<PerfCounterNotFullyEnabled> {
static char ID;
- PerfCounterNotFullyEnabled() {}
+ PerfCounterNotFullyEnabled() = default;
void log(raw_ostream &OS) const override;
diff --git a/llvm/tools/llvm-exegesis/lib/ParallelSnippetGenerator.cpp b/llvm/tools/llvm-exegesis/lib/ParallelSnippetGenerator.cpp
index 79a585e..aa40913 100644
--- a/llvm/tools/llvm-exegesis/lib/ParallelSnippetGenerator.cpp
+++ b/llvm/tools/llvm-exegesis/lib/ParallelSnippetGenerator.cpp
@@ -350,7 +350,5 @@ ParallelSnippetGenerator::generateCodeTemplates(
return Result;
}
-constexpr const size_t ParallelSnippetGenerator::kMinNumDifferentAddresses;
-
} // namespace exegesis
} // namespace llvm
diff --git a/llvm/tools/llvm-exegesis/lib/ParallelSnippetGenerator.h b/llvm/tools/llvm-exegesis/lib/ParallelSnippetGenerator.h
index 8a6b856..d3c85c0 100644
--- a/llvm/tools/llvm-exegesis/lib/ParallelSnippetGenerator.h
+++ b/llvm/tools/llvm-exegesis/lib/ParallelSnippetGenerator.h
@@ -28,7 +28,7 @@ public:
generateCodeTemplates(InstructionTemplate Variant,
const BitVector &ForbiddenRegisters) const override;
- static constexpr const size_t kMinNumDifferentAddresses = 6;
+ static constexpr size_t kMinNumDifferentAddresses = 6;
private:
// Instantiates memory operands within a snippet.
diff --git a/llvm/tools/llvm-exegesis/lib/SnippetRepetitor.cpp b/llvm/tools/llvm-exegesis/lib/SnippetRepetitor.cpp
index 80f5ce4..37dcc7c 100644
--- a/llvm/tools/llvm-exegesis/lib/SnippetRepetitor.cpp
+++ b/llvm/tools/llvm-exegesis/lib/SnippetRepetitor.cpp
@@ -131,7 +131,7 @@ private:
} // namespace
-SnippetRepetitor::~SnippetRepetitor() {}
+SnippetRepetitor::~SnippetRepetitor() = default;
std::unique_ptr<const SnippetRepetitor>
SnippetRepetitor::Create(Benchmark::RepetitionModeE Mode,
diff --git a/llvm/tools/llvm-exegesis/lib/SubprocessMemory.h b/llvm/tools/llvm-exegesis/lib/SubprocessMemory.h
index 572d108..52ee980 100644
--- a/llvm/tools/llvm-exegesis/lib/SubprocessMemory.h
+++ b/llvm/tools/llvm-exegesis/lib/SubprocessMemory.h
@@ -32,8 +32,8 @@ namespace exegesis {
class SubprocessMemory {
public:
- static constexpr const size_t AuxiliaryMemoryOffset = 1;
- static constexpr const size_t AuxiliaryMemorySize = 4096;
+ static constexpr size_t AuxiliaryMemoryOffset = 1;
+ static constexpr size_t AuxiliaryMemorySize = 4096;
// Gets the thread ID for the calling thread.
static long getCurrentTID();
diff --git a/llvm/tools/llvm-exegesis/lib/Target.cpp b/llvm/tools/llvm-exegesis/lib/Target.cpp
index fc5f82f..2ad6c5a 100644
--- a/llvm/tools/llvm-exegesis/lib/Target.cpp
+++ b/llvm/tools/llvm-exegesis/lib/Target.cpp
@@ -23,7 +23,7 @@ cl::OptionCategory Options("llvm-exegesis options");
cl::OptionCategory BenchmarkOptions("llvm-exegesis benchmark options");
cl::OptionCategory AnalysisOptions("llvm-exegesis analysis options");
-ExegesisTarget::~ExegesisTarget() {} // anchor.
+ExegesisTarget::~ExegesisTarget() = default; // anchor.
static ExegesisTarget *FirstTarget = nullptr;
@@ -215,7 +215,7 @@ const PfmCountersInfo &ExegesisTarget::getDummyPfmCounters() const {
return PfmCountersInfo::Dummy;
}
-ExegesisTarget::SavedState::~SavedState() {} // anchor.
+ExegesisTarget::SavedState::~SavedState() = default; // anchor.
namespace {
diff --git a/llvm/tools/llvm-exegesis/lib/UopsBenchmarkRunner.h b/llvm/tools/llvm-exegesis/lib/UopsBenchmarkRunner.h
index ef47b7f..74a18da 100644
--- a/llvm/tools/llvm-exegesis/lib/UopsBenchmarkRunner.h
+++ b/llvm/tools/llvm-exegesis/lib/UopsBenchmarkRunner.h
@@ -30,7 +30,7 @@ public:
ExecutionMode, ValCounters) {}
~UopsBenchmarkRunner() override;
- static constexpr const size_t kMinNumDifferentAddresses = 6;
+ static constexpr size_t kMinNumDifferentAddresses = 6;
private:
Expected<std::vector<BenchmarkMeasure>>
diff --git a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp
index b4437f7..6dc64765 100644
--- a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp
+++ b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp
@@ -278,9 +278,9 @@ static Expected<std::vector<CodeTemplate>> generateLEATemplatesCommon(
assert(X86II::getMemoryOperandNo(Instr.Description.TSFlags) == 1 &&
"invalid LEA");
- constexpr const int kDestOp = 0;
- constexpr const int kBaseOp = 1;
- constexpr const int kIndexOp = 3;
+ constexpr int kDestOp = 0;
+ constexpr int kBaseOp = 1;
+ constexpr int kIndexOp = 3;
auto PossibleDestRegs =
Instr.Operands[kDestOp].getRegisterAliasing().sourceBits();
remove(PossibleDestRegs, ForbiddenRegisters);
@@ -548,7 +548,7 @@ private:
void initStack(unsigned Bytes);
- static constexpr const unsigned kF80Bytes = 10; // 80 bits.
+ static constexpr unsigned kF80Bytes = 10; // 80 bits.
APInt Constant_;
std::vector<MCInst> Instructions;
@@ -864,7 +864,7 @@ const MCPhysReg ExegesisX86Target::kUnavailableRegistersSSE[12] = {
// We're using one of R8-R15 because these registers are never hardcoded in
// instructions (e.g. MOVS writes to EDI, ESI, EDX), so they have less
// conflicts.
-constexpr const MCPhysReg kDefaultLoopCounterReg = X86::R8;
+constexpr MCPhysReg kDefaultLoopCounterReg = X86::R8;
} // namespace
@@ -1110,9 +1110,9 @@ std::vector<MCInst> ExegesisX86Target::setRegTo(const MCSubtargetInfo &STI,
#ifdef __linux__
#ifdef __arm__
-static constexpr const uintptr_t VAddressSpaceCeiling = 0xC0000000;
+static constexpr uintptr_t VAddressSpaceCeiling = 0xC0000000;
#else
-static constexpr const uintptr_t VAddressSpaceCeiling = 0x0000800000000000;
+static constexpr uintptr_t VAddressSpaceCeiling = 0x0000800000000000;
#endif
void generateRoundToNearestPage(unsigned int Register,
diff --git a/llvm/tools/llvm-libtool-darwin/DependencyInfo.h b/llvm/tools/llvm-libtool-darwin/DependencyInfo.h
index 784ec3f..80bad8f 100644
--- a/llvm/tools/llvm-libtool-darwin/DependencyInfo.h
+++ b/llvm/tools/llvm-libtool-darwin/DependencyInfo.h
@@ -18,7 +18,7 @@ public:
explicit DependencyInfo(std::string DependencyInfoPath)
: DependencyInfoPath(DependencyInfoPath) {}
- virtual ~DependencyInfo(){};
+ virtual ~DependencyInfo() = default;
virtual void addMissingInput(llvm::StringRef Path) {
NotFounds.insert(Path.str());
diff --git a/llvm/tools/llvm-mca/CodeRegionGenerator.cpp b/llvm/tools/llvm-mca/CodeRegionGenerator.cpp
index f7f929e..1469071 100644
--- a/llvm/tools/llvm-mca/CodeRegionGenerator.cpp
+++ b/llvm/tools/llvm-mca/CodeRegionGenerator.cpp
@@ -26,7 +26,7 @@ namespace llvm {
namespace mca {
// This virtual dtor serves as the anchor for the CodeRegionGenerator class.
-CodeRegionGenerator::~CodeRegionGenerator() {}
+CodeRegionGenerator::~CodeRegionGenerator() = default;
Expected<const CodeRegions &> AsmCodeRegionGenerator::parseCodeRegions(
const std::unique_ptr<MCInstPrinter> &IP, bool SkipFailures) {
diff --git a/llvm/tools/llvm-mca/CodeRegionGenerator.h b/llvm/tools/llvm-mca/CodeRegionGenerator.h
index a48c67a..c30f67a 100644
--- a/llvm/tools/llvm-mca/CodeRegionGenerator.h
+++ b/llvm/tools/llvm-mca/CodeRegionGenerator.h
@@ -151,7 +151,7 @@ protected:
bool SkipFailures) = 0;
public:
- CodeRegionGenerator() {}
+ CodeRegionGenerator() = default;
virtual ~CodeRegionGenerator();
};
diff --git a/llvm/tools/llvm-objdump/SourcePrinter.h b/llvm/tools/llvm-objdump/SourcePrinter.h
index 5c131a0..19acc87 100644
--- a/llvm/tools/llvm-objdump/SourcePrinter.h
+++ b/llvm/tools/llvm-objdump/SourcePrinter.h
@@ -34,7 +34,7 @@ public:
LiveElement(const char *Name, DWARFUnit *Unit, const DWARFDie FuncDie)
: Name(Name), Unit(Unit), FuncDie(FuncDie) {}
- virtual ~LiveElement() {};
+ virtual ~LiveElement() = default;
const char *getName() const { return Name; }
virtual bool liveAtAddress(object::SectionedAddress Addr) const = 0;
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.h b/llvm/tools/llvm-objdump/llvm-objdump.h
index 3525be9..bac8589 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.h
+++ b/llvm/tools/llvm-objdump/llvm-objdump.h
@@ -84,7 +84,7 @@ protected:
public:
Dumper(const object::ObjectFile &O);
- virtual ~Dumper() {}
+ virtual ~Dumper() = default;
void reportUniqueWarning(Error Err);
void reportUniqueWarning(const Twine &Msg);
diff --git a/llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp b/llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp
index b2362ec..d836d98 100644
--- a/llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp
+++ b/llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp
@@ -68,7 +68,7 @@ DumpOutputStyle::DumpOutputStyle(InputFile &File)
RefTracker.reset(new TypeReferenceTracker(File));
}
-DumpOutputStyle::~DumpOutputStyle() {}
+DumpOutputStyle::~DumpOutputStyle() = default;
PDBFile &DumpOutputStyle::getPdb() { return File.pdb(); }
object::COFFObjectFile &DumpOutputStyle::getObj() { return File.obj(); }
diff --git a/llvm/tools/llvm-pdbutil/DumpOutputStyle.h b/llvm/tools/llvm-pdbutil/DumpOutputStyle.h
index 6714a6a..ea4a47f 100644
--- a/llvm/tools/llvm-pdbutil/DumpOutputStyle.h
+++ b/llvm/tools/llvm-pdbutil/DumpOutputStyle.h
@@ -29,7 +29,7 @@ class TypeReferenceTracker;
struct StatCollection {
struct Stat {
- Stat() {}
+ Stat() = default;
Stat(uint32_t Count, uint32_t Size) : Count(Count), Size(Size) {}
uint32_t Count = 0;
uint32_t Size = 0;
diff --git a/llvm/tools/llvm-pdbutil/OutputStyle.h b/llvm/tools/llvm-pdbutil/OutputStyle.h
index 8cc9016..a09fb82 100644
--- a/llvm/tools/llvm-pdbutil/OutputStyle.h
+++ b/llvm/tools/llvm-pdbutil/OutputStyle.h
@@ -17,7 +17,7 @@ namespace pdb {
class OutputStyle {
public:
- virtual ~OutputStyle() {}
+ virtual ~OutputStyle() = default;
virtual Error dump() = 0;
};
diff --git a/llvm/tools/llvm-pdbutil/StreamUtil.h b/llvm/tools/llvm-pdbutil/StreamUtil.h
index 9d6030c..6b8c13f 100644
--- a/llvm/tools/llvm-pdbutil/StreamUtil.h
+++ b/llvm/tools/llvm-pdbutil/StreamUtil.h
@@ -35,7 +35,7 @@ enum class StreamPurpose {
struct StreamInfo {
public:
- StreamInfo() {}
+ StreamInfo() = default;
uint32_t getModuleIndex() const { return *ModuleIndex; }
StreamPurpose getPurpose() const { return Purpose; }
diff --git a/llvm/tools/llvm-profgen/ProfiledBinary.cpp b/llvm/tools/llvm-profgen/ProfiledBinary.cpp
index 94728ce..96db6a7 100644
--- a/llvm/tools/llvm-profgen/ProfiledBinary.cpp
+++ b/llvm/tools/llvm-profgen/ProfiledBinary.cpp
@@ -187,7 +187,7 @@ ProfiledBinary::ProfiledBinary(const StringRef ExeBinPath,
load();
}
-ProfiledBinary::~ProfiledBinary() {}
+ProfiledBinary::~ProfiledBinary() = default;
void ProfiledBinary::warnNoFuncEntry() {
uint64_t NoFuncEntryNum = 0;
diff --git a/llvm/tools/llvm-rc/ResourceScriptStmt.h b/llvm/tools/llvm-rc/ResourceScriptStmt.h
index a81e384f..84da9be 100644
--- a/llvm/tools/llvm-rc/ResourceScriptStmt.h
+++ b/llvm/tools/llvm-rc/ResourceScriptStmt.h
@@ -242,9 +242,9 @@ public:
virtual raw_ostream &log(raw_ostream &OS) const {
return OS << "Base statement\n";
};
- RCResource() {}
+ RCResource() = default;
RCResource(uint16_t Flags) : MemoryFlags(Flags) {}
- virtual ~RCResource() {}
+ virtual ~RCResource() = default;
virtual Error visit(Visitor *) const {
llvm_unreachable("This is unable to call methods from Visitor base");
@@ -290,7 +290,7 @@ class OptionalStmtList : public OptionalStmt {
std::vector<std::unique_ptr<OptionalStmt>> Statements;
public:
- OptionalStmtList() {}
+ OptionalStmtList() = default;
raw_ostream &log(raw_ostream &OS) const override;
void addStmt(std::unique_ptr<OptionalStmt> Stmt) {
@@ -510,7 +510,7 @@ public:
virtual raw_ostream &log(raw_ostream &OS) const {
return OS << "Base menu definition\n";
}
- virtual ~MenuDefinition() {}
+ virtual ~MenuDefinition() = default;
virtual uint16_t getResFlags() const { return 0; }
virtual MenuDefKind getKind() const { return MkBase; }
@@ -818,7 +818,7 @@ public:
enum StmtKind { StBase = 0, StBlock = 1, StValue = 2 };
virtual raw_ostream &log(raw_ostream &OS) const { return OS << "VI stmt\n"; }
- virtual ~VersionInfoStmt() {}
+ virtual ~VersionInfoStmt() = default;
virtual StmtKind getKind() const { return StBase; }
static bool classof(const VersionInfoStmt *S) {
diff --git a/llvm/tools/llvm-rc/ResourceVisitor.h b/llvm/tools/llvm-rc/ResourceVisitor.h
index a121a0a..1815c6b 100644
--- a/llvm/tools/llvm-rc/ResourceVisitor.h
+++ b/llvm/tools/llvm-rc/ResourceVisitor.h
@@ -55,7 +55,7 @@ public:
virtual Error visitVersionStmt(const VersionStmt *) = 0;
virtual Error visitMenuStmt(const MenuStmt *) = 0;
- virtual ~Visitor() {}
+ virtual ~Visitor() = default;
};
} // namespace rc
diff --git a/llvm/tools/llvm-readobj/ObjDumper.cpp b/llvm/tools/llvm-readobj/ObjDumper.cpp
index 0b59dd4..20e027a 100644
--- a/llvm/tools/llvm-readobj/ObjDumper.cpp
+++ b/llvm/tools/llvm-readobj/ObjDumper.cpp
@@ -41,7 +41,7 @@ ObjDumper::ObjDumper(ScopedPrinter &Writer, StringRef ObjName) : W(Writer) {
};
}
-ObjDumper::~ObjDumper() {}
+ObjDumper::~ObjDumper() = default;
void ObjDumper::reportUniqueWarning(Error Err) const {
reportUniqueWarning(toString(std::move(Err)));
diff --git a/llvm/tools/llvm-readtapi/DiffEngine.h b/llvm/tools/llvm-readtapi/DiffEngine.h
index 7ab57d4..b350ceef 100644
--- a/llvm/tools/llvm-readtapi/DiffEngine.h
+++ b/llvm/tools/llvm-readtapi/DiffEngine.h
@@ -39,7 +39,7 @@ enum DiffAttrKind {
class AttributeDiff {
public:
AttributeDiff(DiffAttrKind Kind) : Kind(Kind){};
- virtual ~AttributeDiff(){};
+ virtual ~AttributeDiff() = default;
DiffAttrKind getKind() const { return Kind; }
private:
diff --git a/llvm/tools/llvm-xray/xray-graph.h b/llvm/tools/llvm-xray/xray-graph.h
index fd96449..bf25f8d 100644
--- a/llvm/tools/llvm-xray/xray-graph.h
+++ b/llvm/tools/llvm-xray/xray-graph.h
@@ -86,7 +86,7 @@ public:
};
GraphT G;
- using VertexIdentifier = typename decltype(G)::VertexIdentifier;
+ using VertexIdentifier = decltype(G)::VertexIdentifier;
using EdgeIdentifier = decltype(G)::EdgeIdentifier;
/// Use a Map to store the Function stack for each thread whilst building the
diff --git a/llvm/unittests/ADT/APFloatTest.cpp b/llvm/unittests/ADT/APFloatTest.cpp
index fbe96bb..99cc38b 100644
--- a/llvm/unittests/ADT/APFloatTest.cpp
+++ b/llvm/unittests/ADT/APFloatTest.cpp
@@ -10118,7 +10118,7 @@ TEST(APFloatTest, Float4E2M1FNToFloat) {
}
TEST(APFloatTest, AddOrSubtractSignificand) {
- typedef detail::IEEEFloatUnitTestHelper Helper;
+ using Helper = detail::IEEEFloatUnitTestHelper;
// Test cases are all combinations of:
// {equal exponents, LHS larger exponent, RHS larger exponent}
// {equal significands, LHS larger significand, RHS larger significand}
diff --git a/llvm/unittests/ADT/BitVectorTest.cpp b/llvm/unittests/ADT/BitVectorTest.cpp
index 12ba004..e13523b 100644
--- a/llvm/unittests/ADT/BitVectorTest.cpp
+++ b/llvm/unittests/ADT/BitVectorTest.cpp
@@ -21,7 +21,7 @@ template <typename T>
class BitVectorTest : public ::testing::Test { };
// Test both BitVector and SmallBitVector with the same suite of tests.
-typedef ::testing::Types<BitVector, SmallBitVector> BitVectorTestTypes;
+using BitVectorTestTypes = ::testing::Types<BitVector, SmallBitVector>;
TYPED_TEST_SUITE(BitVectorTest, BitVectorTestTypes, );
TYPED_TEST(BitVectorTest, TrivialOperation) {
@@ -857,7 +857,7 @@ TYPED_TEST(BitVectorTest, BinOps) {
EXPECT_FALSE(B.anyCommon(A));
}
-typedef std::vector<std::pair<int, int>> RangeList;
+using RangeList = std::vector<std::pair<int, int>>;
template <typename VecType>
static inline VecType createBitVector(uint32_t Size,
diff --git a/llvm/unittests/ADT/BreadthFirstIteratorTest.cpp b/llvm/unittests/ADT/BreadthFirstIteratorTest.cpp
index 0cd7fd3..571e4d2 100644
--- a/llvm/unittests/ADT/BreadthFirstIteratorTest.cpp
+++ b/llvm/unittests/ADT/BreadthFirstIteratorTest.cpp
@@ -21,7 +21,7 @@ using namespace llvm;
namespace llvm {
TEST(BreadthFristIteratorTest, Basic) {
- typedef bf_iterator<Graph<4>> BFIter;
+ using BFIter = bf_iterator<Graph<4>>;
Graph<4> G;
G.AddEdge(0, 1);
@@ -46,7 +46,7 @@ TEST(BreadthFristIteratorTest, Basic) {
}
TEST(BreadthFristIteratorTest, Cycle) {
- typedef bf_iterator<Graph<4>> BFIter;
+ using BFIter = bf_iterator<Graph<4>>;
Graph<4> G;
G.AddEdge(0, 1);
@@ -78,7 +78,7 @@ TEST(BreadthFristIteratorTest, Cycle) {
static_assert(
std::is_convertible_v<decltype(*std::declval<bf_iterator<Graph<3>>>()),
- typename bf_iterator<Graph<3>>::reference>);
+ bf_iterator<Graph<3>>::reference>);
// bf_iterator should be (at-least) a forward-iterator
static_assert(std::is_base_of_v<std::forward_iterator_tag,
diff --git a/llvm/unittests/ADT/DAGDeltaAlgorithmTest.cpp b/llvm/unittests/ADT/DAGDeltaAlgorithmTest.cpp
index f5439478..918a2e6 100644
--- a/llvm/unittests/ADT/DAGDeltaAlgorithmTest.cpp
+++ b/llvm/unittests/ADT/DAGDeltaAlgorithmTest.cpp
@@ -15,7 +15,7 @@ using namespace llvm;
namespace {
-typedef DAGDeltaAlgorithm::edge_ty edge_ty;
+using edge_ty = DAGDeltaAlgorithm::edge_ty;
class FixedDAGDeltaAlgorithm : public DAGDeltaAlgorithm {
changeset_ty FailingSet;
diff --git a/llvm/unittests/ADT/DenseMapTest.cpp b/llvm/unittests/ADT/DenseMapTest.cpp
index aceb4f3..273ee09 100644
--- a/llvm/unittests/ADT/DenseMapTest.cpp
+++ b/llvm/unittests/ADT/DenseMapTest.cpp
@@ -129,18 +129,17 @@ typename T::mapped_type *const DenseMapTest<T>::dummy_value_ptr = nullptr;
// Register these types for testing.
// clang-format off
-typedef ::testing::Types<DenseMap<uint32_t, uint32_t>,
- DenseMap<uint32_t *, uint32_t *>,
- DenseMap<CtorTester, CtorTester, CtorTesterMapInfo>,
- DenseMap<EnumClass, uint32_t>,
- DenseMap<std::optional<uint32_t>, uint32_t>,
- SmallDenseMap<uint32_t, uint32_t>,
- SmallDenseMap<uint32_t *, uint32_t *>,
- SmallDenseMap<CtorTester, CtorTester, 4,
- CtorTesterMapInfo>,
- SmallDenseMap<EnumClass, uint32_t>,
- SmallDenseMap<std::optional<uint32_t>, uint32_t>
- > DenseMapTestTypes;
+using DenseMapTestTypes = ::testing::Types<
+ DenseMap<uint32_t, uint32_t>,
+ DenseMap<uint32_t *, uint32_t *>,
+ DenseMap<CtorTester, CtorTester, CtorTesterMapInfo>,
+ DenseMap<EnumClass, uint32_t>,
+ DenseMap<std::optional<uint32_t>, uint32_t>,
+ SmallDenseMap<uint32_t, uint32_t>,
+ SmallDenseMap<uint32_t *, uint32_t *>,
+ SmallDenseMap<CtorTester, CtorTester, 4, CtorTesterMapInfo>,
+ SmallDenseMap<EnumClass, uint32_t>,
+ SmallDenseMap<std::optional<uint32_t>, uint32_t>>;
// clang-format on
TYPED_TEST_SUITE(DenseMapTest, DenseMapTestTypes, );
diff --git a/llvm/unittests/ADT/DenseSetTest.cpp b/llvm/unittests/ADT/DenseSetTest.cpp
index a24f99b..a2a062b 100644
--- a/llvm/unittests/ADT/DenseSetTest.cpp
+++ b/llvm/unittests/ADT/DenseSetTest.cpp
@@ -96,13 +96,13 @@ private:
};
// Register these types for testing.
-typedef ::testing::Types<DenseSet<unsigned, TestDenseSetInfo>,
- const DenseSet<unsigned, TestDenseSetInfo>,
- SmallDenseSet<unsigned, 1, TestDenseSetInfo>,
- SmallDenseSet<unsigned, 4, TestDenseSetInfo>,
- const SmallDenseSet<unsigned, 4, TestDenseSetInfo>,
- SmallDenseSet<unsigned, 64, TestDenseSetInfo>>
- DenseSetTestTypes;
+using DenseSetTestTypes =
+ ::testing::Types<DenseSet<unsigned, TestDenseSetInfo>,
+ const DenseSet<unsigned, TestDenseSetInfo>,
+ SmallDenseSet<unsigned, 1, TestDenseSetInfo>,
+ SmallDenseSet<unsigned, 4, TestDenseSetInfo>,
+ const SmallDenseSet<unsigned, 4, TestDenseSetInfo>,
+ SmallDenseSet<unsigned, 64, TestDenseSetInfo>>;
TYPED_TEST_SUITE(DenseSetTest, DenseSetTestTypes, );
TYPED_TEST(DenseSetTest, Constructor) {
diff --git a/llvm/unittests/ADT/DepthFirstIteratorTest.cpp b/llvm/unittests/ADT/DepthFirstIteratorTest.cpp
index 95923b8..00312ca 100644
--- a/llvm/unittests/ADT/DepthFirstIteratorTest.cpp
+++ b/llvm/unittests/ADT/DepthFirstIteratorTest.cpp
@@ -21,7 +21,7 @@ using namespace llvm;
namespace llvm {
template <typename T> struct CountedSet {
- typedef typename SmallPtrSet<T, 4>::iterator iterator;
+ using iterator = typename SmallPtrSet<T, 4>::iterator;
SmallPtrSet<T, 4> S;
int InsertVisited = 0;
@@ -44,8 +44,8 @@ public:
};
TEST(DepthFirstIteratorTest, ActuallyUpdateIterator) {
- typedef CountedSet<Graph<3>::NodeType *> StorageT;
- typedef df_iterator<Graph<3>, StorageT, true> DFIter;
+ using StorageT = CountedSet<Graph<3>::NodeType *>;
+ using DFIter = df_iterator<Graph<3>, StorageT, true>;
Graph<3> G;
G.AddEdge(0, 1);
@@ -59,7 +59,7 @@ TEST(DepthFirstIteratorTest, ActuallyUpdateIterator) {
static_assert(
std::is_convertible_v<decltype(*std::declval<df_iterator<Graph<3>>>()),
- typename df_iterator<Graph<3>>::reference>);
+ df_iterator<Graph<3>>::reference>);
// df_iterator should be (at-least) a forward-iterator
static_assert(std::is_base_of_v<std::forward_iterator_tag,
diff --git a/llvm/unittests/ADT/IListBaseTest.cpp b/llvm/unittests/ADT/IListBaseTest.cpp
index bd91568..eeed488 100644
--- a/llvm/unittests/ADT/IListBaseTest.cpp
+++ b/llvm/unittests/ADT/IListBaseTest.cpp
@@ -19,13 +19,14 @@ template <typename T> class IListBaseTest : public ::testing::Test {};
class Parent;
// Test variants with the same test.
-typedef ::testing::Types<ilist_base<false, void>, ilist_base<true, void>, ilist_base<false, Parent*>, ilist_base<true, Parent*>>
- IListBaseTestTypes;
+using IListBaseTestTypes =
+ ::testing::Types<ilist_base<false, void>, ilist_base<true, void>,
+ ilist_base<false, Parent *>, ilist_base<true, Parent *>>;
TYPED_TEST_SUITE(IListBaseTest, IListBaseTestTypes, );
TYPED_TEST(IListBaseTest, insertBeforeImpl) {
- typedef TypeParam list_base_type;
- typedef typename list_base_type::node_base_type node_base_type;
+ using list_base_type = TypeParam;
+ using node_base_type = typename list_base_type::node_base_type;
node_base_type S, A, B;
@@ -51,8 +52,8 @@ TYPED_TEST(IListBaseTest, insertBeforeImpl) {
}
TYPED_TEST(IListBaseTest, removeImpl) {
- typedef TypeParam list_base_type;
- typedef typename list_base_type::node_base_type node_base_type;
+ using list_base_type = TypeParam;
+ using node_base_type = typename list_base_type::node_base_type;
node_base_type S, A, B;
@@ -80,8 +81,8 @@ TYPED_TEST(IListBaseTest, removeImpl) {
}
TYPED_TEST(IListBaseTest, removeRangeImpl) {
- typedef TypeParam list_base_type;
- typedef typename list_base_type::node_base_type node_base_type;
+ using list_base_type = TypeParam;
+ using node_base_type = typename list_base_type::node_base_type;
node_base_type S, A, B, C, D;
@@ -106,8 +107,8 @@ TYPED_TEST(IListBaseTest, removeRangeImpl) {
}
TYPED_TEST(IListBaseTest, removeRangeImplAllButSentinel) {
- typedef TypeParam list_base_type;
- typedef typename list_base_type::node_base_type node_base_type;
+ using list_base_type = TypeParam;
+ using node_base_type = typename list_base_type::node_base_type;
node_base_type S, A, B;
@@ -126,8 +127,8 @@ TYPED_TEST(IListBaseTest, removeRangeImplAllButSentinel) {
}
TYPED_TEST(IListBaseTest, transferBeforeImpl) {
- typedef TypeParam list_base_type;
- typedef typename list_base_type::node_base_type node_base_type;
+ using list_base_type = TypeParam;
+ using node_base_type = typename list_base_type::node_base_type;
node_base_type S1, S2, A, B, C, D, E;
diff --git a/llvm/unittests/ADT/IListIteratorBitsTest.cpp b/llvm/unittests/ADT/IListIteratorBitsTest.cpp
index 97c14265..b430bcb 100644
--- a/llvm/unittests/ADT/IListIteratorBitsTest.cpp
+++ b/llvm/unittests/ADT/IListIteratorBitsTest.cpp
@@ -93,8 +93,8 @@ TEST(IListIteratorBitsTest, ConsAndAssignment) {
class dummy {
// Test that we get an ilist_iterator_w_bits out of the node given that the
// options are enabled.
- using node_options = typename ilist_detail::compute_node_options<
- Node, ilist_iterator_bits<true>>::type;
+ using node_options =
+ ilist_detail::compute_node_options<Node, ilist_iterator_bits<true>>::type;
static_assert(std::is_same<Node::self_iterator,
llvm::ilist_iterator_w_bits<node_options, false,
false>>::value);
@@ -102,7 +102,7 @@ class dummy {
// Now test that a plain node, without the option, gets a plain
// ilist_iterator.
using plain_node_options =
- typename ilist_detail::compute_node_options<PlainNode>::type;
+ ilist_detail::compute_node_options<PlainNode>::type;
static_assert(std::is_same<
PlainNode::self_iterator,
llvm::ilist_iterator<plain_node_options, false, false>>::value);
diff --git a/llvm/unittests/ADT/IListIteratorTest.cpp b/llvm/unittests/ADT/IListIteratorTest.cpp
index 4e5b847b..54a42582 100644
--- a/llvm/unittests/ADT/IListIteratorTest.cpp
+++ b/llvm/unittests/ADT/IListIteratorTest.cpp
@@ -141,10 +141,10 @@ TEST(IListIteratorTest, ReverseConstructor) {
L.insert(L.end(), B);
// Save typing.
- typedef simple_ilist<Node>::iterator iterator;
- typedef simple_ilist<Node>::reverse_iterator reverse_iterator;
- typedef simple_ilist<Node>::const_iterator const_iterator;
- typedef simple_ilist<Node>::const_reverse_iterator const_reverse_iterator;
+ using iterator = simple_ilist<Node>::iterator;
+ using reverse_iterator = simple_ilist<Node>::reverse_iterator;
+ using const_iterator = simple_ilist<Node>::const_iterator;
+ using const_reverse_iterator = simple_ilist<Node>::const_reverse_iterator;
// Check conversion values.
EXPECT_EQ(L.begin(), iterator(L.rend()));
diff --git a/llvm/unittests/ADT/IListNodeBaseTest.cpp b/llvm/unittests/ADT/IListNodeBaseTest.cpp
index ef90c71..393f83a 100644
--- a/llvm/unittests/ADT/IListNodeBaseTest.cpp
+++ b/llvm/unittests/ADT/IListNodeBaseTest.cpp
@@ -17,10 +17,10 @@ namespace {
class Parent {};
-typedef ilist_node_base<false, void> RawNode;
-typedef ilist_node_base<true, void> TrackingNode;
-typedef ilist_node_base<false, Parent> ParentNode;
-typedef ilist_node_base<true, Parent> ParentTrackingNode;
+using RawNode = ilist_node_base<false, void>;
+using TrackingNode = ilist_node_base<true, void>;
+using ParentNode = ilist_node_base<false, Parent>;
+using ParentTrackingNode = ilist_node_base<true, Parent>;
TEST(IListNodeBaseTest, DefaultConstructor) {
RawNode A;
diff --git a/llvm/unittests/ADT/IListSentinelTest.cpp b/llvm/unittests/ADT/IListSentinelTest.cpp
index 1f4a831..709a1a4 100644
--- a/llvm/unittests/ADT/IListSentinelTest.cpp
+++ b/llvm/unittests/ADT/IListSentinelTest.cpp
@@ -14,18 +14,17 @@ using namespace llvm;
namespace {
template <class T, class... Options> struct PickSentinel {
- typedef ilist_sentinel<
- typename ilist_detail::compute_node_options<T, Options...>::type>
- type;
+ using type = ilist_sentinel<
+ typename ilist_detail::compute_node_options<T, Options...>::type>;
};
class Node : public ilist_node<Node> {};
class TrackingNode : public ilist_node<Node, ilist_sentinel_tracking<true>> {};
-typedef PickSentinel<Node>::type Sentinel;
-typedef PickSentinel<Node, ilist_sentinel_tracking<true>>::type
- TrackingSentinel;
-typedef PickSentinel<Node, ilist_sentinel_tracking<false>>::type
- NoTrackingSentinel;
+using Sentinel = PickSentinel<Node>::type;
+using TrackingSentinel =
+ PickSentinel<Node, ilist_sentinel_tracking<true>>::type;
+using NoTrackingSentinel =
+ PickSentinel<Node, ilist_sentinel_tracking<false>>::type;
struct LocalAccess : ilist_detail::NodeAccess {
using NodeAccess::getPrev;
diff --git a/llvm/unittests/ADT/IntervalMapTest.cpp b/llvm/unittests/ADT/IntervalMapTest.cpp
index 99a93ab..38f397f 100644
--- a/llvm/unittests/ADT/IntervalMapTest.cpp
+++ b/llvm/unittests/ADT/IntervalMapTest.cpp
@@ -14,9 +14,9 @@ using namespace llvm;
namespace {
-typedef IntervalMap<unsigned, unsigned, 4> UUMap;
-typedef IntervalMap<unsigned, unsigned, 4,
- IntervalMapHalfOpenInfo<unsigned>> UUHalfOpenMap;
+using UUMap = IntervalMap<unsigned, unsigned, 4>;
+using UUHalfOpenMap =
+ IntervalMap<unsigned, unsigned, 4, IntervalMapHalfOpenInfo<unsigned>>;
// Empty map tests
TEST(IntervalMapTest, EmptyMap) {
@@ -713,7 +713,7 @@ TEST(IntervalMapTest, OverlapsHalfOpen) {
}
TEST(IntervalMapOverlapsTest, SmallMaps) {
- typedef IntervalMapOverlaps<UUMap,UUMap> UUOverlaps;
+ using UUOverlaps = IntervalMapOverlaps<UUMap, UUMap>;
UUMap::Allocator allocator;
UUMap mapA(allocator);
UUMap mapB(allocator);
@@ -757,7 +757,7 @@ TEST(IntervalMapOverlapsTest, SmallMaps) {
}
TEST(IntervalMapOverlapsTest, BigMaps) {
- typedef IntervalMapOverlaps<UUMap,UUMap> UUOverlaps;
+ using UUOverlaps = IntervalMapOverlaps<UUMap, UUMap>;
UUMap::Allocator allocator;
UUMap mapA(allocator);
UUMap mapB(allocator);
diff --git a/llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp b/llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp
index f4f2083..6da4227 100644
--- a/llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp
+++ b/llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp
@@ -25,9 +25,9 @@ struct SimpleRefCounted : Base<SimpleRefCounted<Base>> {
template <typename T> struct IntrusiveRefCntPtrTest : testing::Test {};
-typedef ::testing::Types<SimpleRefCounted<RefCountedBase>,
- SimpleRefCounted<ThreadSafeRefCountedBase>>
- IntrusiveRefCntTypes;
+using IntrusiveRefCntTypes =
+ ::testing::Types<SimpleRefCounted<RefCountedBase>,
+ SimpleRefCounted<ThreadSafeRefCountedBase>>;
TYPED_TEST_SUITE(IntrusiveRefCntPtrTest, IntrusiveRefCntTypes, );
TYPED_TEST(IntrusiveRefCntPtrTest, RefCountedBaseCopyDoesNotLeak) {
diff --git a/llvm/unittests/ADT/IteratorTest.cpp b/llvm/unittests/ADT/IteratorTest.cpp
index 691fbce..9dd8c1a 100644
--- a/llvm/unittests/ADT/IteratorTest.cpp
+++ b/llvm/unittests/ADT/IteratorTest.cpp
@@ -48,11 +48,10 @@ struct AdaptedIter : iterator_adaptor_base<AdaptedIter, WeirdIter> {};
// Test that iterator_adaptor_base forwards typedefs, if value_type is
// unchanged.
-static_assert(std::is_same_v<typename AdaptedIter::value_type, Shadow<0>>, "");
-static_assert(std::is_same_v<typename AdaptedIter::difference_type, Shadow<1>>,
- "");
-static_assert(std::is_same_v<typename AdaptedIter::pointer, Shadow<2>>, "");
-static_assert(std::is_same_v<typename AdaptedIter::reference, Shadow<3>>, "");
+static_assert(std::is_same_v<AdaptedIter::value_type, Shadow<0>>, "");
+static_assert(std::is_same_v<AdaptedIter::difference_type, Shadow<1>>, "");
+static_assert(std::is_same_v<AdaptedIter::pointer, Shadow<2>>, "");
+static_assert(std::is_same_v<AdaptedIter::reference, Shadow<3>>, "");
// Ensure that pointe{e,r}_iterator adaptors correctly forward the category of
// the underlying iterator.
@@ -178,8 +177,8 @@ TEST(PointeeIteratorTest, Basic) {
V.push_back(&arr[2]);
V.push_back(&arr[3]);
- typedef pointee_iterator<SmallVectorImpl<int *>::const_iterator>
- test_iterator;
+ using test_iterator =
+ pointee_iterator<SmallVectorImpl<int *>::const_iterator>;
test_iterator Begin, End;
Begin = V.begin();
@@ -219,9 +218,8 @@ TEST(PointeeIteratorTest, SmartPointer) {
V.push_back(std::make_unique<int>(3));
V.push_back(std::make_unique<int>(4));
- typedef pointee_iterator<
- SmallVectorImpl<std::unique_ptr<int>>::const_iterator>
- test_iterator;
+ using test_iterator =
+ pointee_iterator<SmallVectorImpl<std::unique_ptr<int>>::const_iterator>;
test_iterator Begin, End;
Begin = V.begin();
diff --git a/llvm/unittests/ADT/PointerSumTypeTest.cpp b/llvm/unittests/ADT/PointerSumTypeTest.cpp
index fbf59f3..11e657a 100644
--- a/llvm/unittests/ADT/PointerSumTypeTest.cpp
+++ b/llvm/unittests/ADT/PointerSumTypeTest.cpp
@@ -17,10 +17,9 @@ struct PointerSumTypeTest : public testing::Test {
float f;
int i1, i2;
- typedef PointerSumType<Kinds, PointerSumTypeMember<Float, float *>,
- PointerSumTypeMember<Int1, int *>,
- PointerSumTypeMember<Int2, int *>>
- SumType;
+ using SumType = PointerSumType<Kinds, PointerSumTypeMember<Float, float *>,
+ PointerSumTypeMember<Int1, int *>,
+ PointerSumTypeMember<Int2, int *>>;
SumType a, b, c, n;
PointerSumTypeTest()
diff --git a/llvm/unittests/ADT/PointerUnionTest.cpp b/llvm/unittests/ADT/PointerUnionTest.cpp
index acddb78..d8ac3ae 100644
--- a/llvm/unittests/ADT/PointerUnionTest.cpp
+++ b/llvm/unittests/ADT/PointerUnionTest.cpp
@@ -12,9 +12,9 @@ using namespace llvm;
namespace {
-typedef PointerUnion<int *, float *> PU;
-typedef PointerUnion<int *, float *, long long *> PU3;
-typedef PointerUnion<int *, float *, long long *, double *> PU4;
+using PU = PointerUnion<int *, float *>;
+using PU3 = PointerUnion<int *, float *, long long *>;
+using PU4 = PointerUnion<int *, float *, long long *, double *>;
struct PointerUnionTest : public testing::Test {
float f;
@@ -116,9 +116,9 @@ TEST_F(PointerUnionTest, Get) {
template<int I> struct alignas(8) Aligned {};
-typedef PointerUnion<Aligned<0> *, Aligned<1> *, Aligned<2> *, Aligned<3> *,
- Aligned<4> *, Aligned<5> *, Aligned<6> *, Aligned<7> *>
- PU8;
+using PU8 =
+ PointerUnion<Aligned<0> *, Aligned<1> *, Aligned<2> *, Aligned<3> *,
+ Aligned<4> *, Aligned<5> *, Aligned<6> *, Aligned<7> *>;
TEST_F(PointerUnionTest, ManyElements) {
Aligned<0> a0;
diff --git a/llvm/unittests/ADT/PostOrderIteratorTest.cpp b/llvm/unittests/ADT/PostOrderIteratorTest.cpp
index 4c2a66e..e875dd6 100644
--- a/llvm/unittests/ADT/PostOrderIteratorTest.cpp
+++ b/llvm/unittests/ADT/PostOrderIteratorTest.cpp
@@ -23,7 +23,7 @@ namespace {
// Whether we're able to compile
TEST(PostOrderIteratorTest, Compiles) {
- typedef SmallPtrSet<void *, 4> ExtSetTy;
+ using ExtSetTy = SmallPtrSet<void *, 4>;
// Tests that template specializations are kept up to date
void *Null = nullptr;
@@ -44,7 +44,7 @@ TEST(PostOrderIteratorTest, Compiles) {
static_assert(
std::is_convertible_v<decltype(*std::declval<po_iterator<Graph<3>>>()),
- typename po_iterator<Graph<3>>::reference>);
+ po_iterator<Graph<3>>::reference>);
// Test post-order and reverse post-order traversals for simple graph type.
TEST(PostOrderIteratorTest, PostOrderAndReversePostOrderTraverrsal) {
diff --git a/llvm/unittests/ADT/PriorityWorklistTest.cpp b/llvm/unittests/ADT/PriorityWorklistTest.cpp
index f12d32a..08a4773 100644
--- a/llvm/unittests/ADT/PriorityWorklistTest.cpp
+++ b/llvm/unittests/ADT/PriorityWorklistTest.cpp
@@ -20,8 +20,8 @@ namespace {
using namespace llvm;
template <typename T> class PriorityWorklistTest : public ::testing::Test {};
-typedef ::testing::Types<PriorityWorklist<int>, SmallPriorityWorklist<int, 2>>
- TestTypes;
+using TestTypes =
+ ::testing::Types<PriorityWorklist<int>, SmallPriorityWorklist<int, 2>>;
TYPED_TEST_SUITE(PriorityWorklistTest, TestTypes, );
TYPED_TEST(PriorityWorklistTest, Basic) {
diff --git a/llvm/unittests/ADT/RangeAdapterTest.cpp b/llvm/unittests/ADT/RangeAdapterTest.cpp
index c1a8a98..6849ccbc 100644
--- a/llvm/unittests/ADT/RangeAdapterTest.cpp
+++ b/llvm/unittests/ADT/RangeAdapterTest.cpp
@@ -24,8 +24,8 @@ class ReverseOnlyVector {
public:
ReverseOnlyVector(std::initializer_list<int> list) : Vec(list) {}
- typedef std::vector<int>::reverse_iterator reverse_iterator;
- typedef std::vector<int>::const_reverse_iterator const_reverse_iterator;
+ using reverse_iterator = std::vector<int>::reverse_iterator;
+ using const_reverse_iterator = std::vector<int>::const_reverse_iterator;
reverse_iterator rbegin() { return Vec.rbegin(); }
reverse_iterator rend() { return Vec.rend(); }
const_reverse_iterator rbegin() const { return Vec.rbegin(); }
@@ -41,11 +41,11 @@ class BidirectionalVector {
public:
BidirectionalVector(std::initializer_list<int> list) : Vec(list) {}
- typedef std::vector<int>::iterator iterator;
+ using iterator = std::vector<int>::iterator;
iterator begin() const;
iterator end() const;
- typedef std::vector<int>::reverse_iterator reverse_iterator;
+ using reverse_iterator = std::vector<int>::reverse_iterator;
reverse_iterator rbegin() const { return Vec.rbegin(); }
reverse_iterator rend() const { return Vec.rend(); }
};
@@ -58,15 +58,15 @@ class BidirectionalVectorConsts {
public:
BidirectionalVectorConsts(std::initializer_list<int> list) : Vec(list) {}
- typedef std::vector<int>::iterator iterator;
- typedef std::vector<int>::const_iterator const_iterator;
+ using iterator = std::vector<int>::iterator;
+ using const_iterator = std::vector<int>::const_iterator;
iterator begin();
iterator end();
const_iterator begin() const;
const_iterator end() const;
- typedef std::vector<int>::reverse_iterator reverse_iterator;
- typedef std::vector<int>::const_reverse_iterator const_reverse_iterator;
+ using reverse_iterator = std::vector<int>::reverse_iterator;
+ using const_reverse_iterator = std::vector<int>::const_reverse_iterator;
reverse_iterator rbegin() { return Vec.rbegin(); }
reverse_iterator rend() { return Vec.rend(); }
const_reverse_iterator rbegin() const { return Vec.rbegin(); }
@@ -80,7 +80,7 @@ class CustomIteratorVector {
public:
CustomIteratorVector(std::initializer_list<int> list) : V(list) {}
- typedef std::vector<int>::iterator iterator;
+ using iterator = std::vector<int>::iterator;
class reverse_iterator {
std::vector<int>::iterator I;
@@ -126,8 +126,8 @@ template <typename R> void TestRev(const R &r) {
// Test fixture
template <typename T> class RangeAdapterLValueTest : public ::testing::Test {};
-typedef ::testing::Types<std::vector<int>, std::list<int>, int[4]>
- RangeAdapterLValueTestTypes;
+using RangeAdapterLValueTestTypes =
+ ::testing::Types<std::vector<int>, std::list<int>, int[4]>;
TYPED_TEST_SUITE(RangeAdapterLValueTest, RangeAdapterLValueTestTypes, );
TYPED_TEST(RangeAdapterLValueTest, TrivialOperation) {
@@ -140,10 +140,10 @@ TYPED_TEST(RangeAdapterLValueTest, TrivialOperation) {
template <typename T> struct RangeAdapterRValueTest : testing::Test {};
-typedef ::testing::Types<std::vector<int>, std::list<int>, CustomIteratorVector,
- ReverseOnlyVector, BidirectionalVector,
- BidirectionalVectorConsts>
- RangeAdapterRValueTestTypes;
+using RangeAdapterRValueTestTypes =
+ ::testing::Types<std::vector<int>, std::list<int>, CustomIteratorVector,
+ ReverseOnlyVector, BidirectionalVector,
+ BidirectionalVectorConsts>;
TYPED_TEST_SUITE(RangeAdapterRValueTest, RangeAdapterRValueTestTypes, );
TYPED_TEST(RangeAdapterRValueTest, TrivialOperation) {
diff --git a/llvm/unittests/ADT/SCCIteratorTest.cpp b/llvm/unittests/ADT/SCCIteratorTest.cpp
index 4835095..5f08829 100644
--- a/llvm/unittests/ADT/SCCIteratorTest.cpp
+++ b/llvm/unittests/ADT/SCCIteratorTest.cpp
@@ -21,7 +21,7 @@ TEST(SCCIteratorTest, AllSmallGraphs) {
// create graphs for which every node has a self-edge.
#define NUM_NODES 4
#define NUM_GRAPHS (NUM_NODES * (NUM_NODES - 1))
- typedef Graph<NUM_NODES> GT;
+ using GT = Graph<NUM_NODES>;
/// Enumerate all graphs using NUM_GRAPHS bits.
static_assert(NUM_GRAPHS < sizeof(unsigned) * CHAR_BIT, "Too many graphs!");
diff --git a/llvm/unittests/ADT/STLExtrasTest.cpp b/llvm/unittests/ADT/STLExtrasTest.cpp
index 966b1f0..8556777 100644
--- a/llvm/unittests/ADT/STLExtrasTest.cpp
+++ b/llvm/unittests/ADT/STLExtrasTest.cpp
@@ -60,7 +60,7 @@ TEST(STLExtrasTest, EnumerateLValue) {
// Test that a simple LValue can be enumerated and gives correct results with
// multiple types, including the empty container.
std::vector<char> foo = {'a', 'b', 'c'};
- typedef std::pair<std::size_t, char> CharPairType;
+ using CharPairType = std::pair<std::size_t, char>;
std::vector<CharPairType> CharResults;
for (auto [index, value] : llvm::enumerate(foo)) {
@@ -72,7 +72,7 @@ TEST(STLExtrasTest, EnumerateLValue) {
CharPairType(2u, 'c')));
// Test a const range of a different type.
- typedef std::pair<std::size_t, int> IntPairType;
+ using IntPairType = std::pair<std::size_t, int>;
std::vector<IntPairType> IntResults;
const std::vector<int> bar = {1, 2, 3};
for (auto [index, value] : llvm::enumerate(bar)) {
@@ -111,7 +111,7 @@ TEST(STLExtrasTest, EnumerateModifyLValue) {
TEST(STLExtrasTest, EnumerateRValueRef) {
// Test that an rvalue can be enumerated.
- typedef std::pair<std::size_t, int> PairType;
+ using PairType = std::pair<std::size_t, int>;
std::vector<PairType> Results;
auto Enumerator = llvm::enumerate(std::vector<int>{1, 2, 3});
@@ -138,7 +138,7 @@ TEST(STLExtrasTest, EnumerateModifyRValue) {
// Test that when enumerating an rvalue, modification still works (even if
// this isn't terribly useful, it at least shows that we haven't snuck an
// extra const in there somewhere.
- typedef std::pair<std::size_t, char> PairType;
+ using PairType = std::pair<std::size_t, char>;
std::vector<PairType> Results;
for (auto X : llvm::enumerate(std::vector<char>{'1', '2', '3'})) {
diff --git a/llvm/unittests/ADT/SimpleIListTest.cpp b/llvm/unittests/ADT/SimpleIListTest.cpp
index c2992ba..cf3df8c 100644
--- a/llvm/unittests/ADT/SimpleIListTest.cpp
+++ b/llvm/unittests/ADT/SimpleIListTest.cpp
@@ -605,8 +605,8 @@ struct Tag2 {};
struct DoubleNode : ilist_node<DoubleNode, ilist_tag<Tag1>>,
ilist_node<DoubleNode, ilist_tag<Tag2>> {
- typedef ilist_node<DoubleNode, ilist_tag<Tag1>> Node1Type;
- typedef ilist_node<DoubleNode, ilist_tag<Tag2>> Node2Type;
+ using Node1Type = ilist_node<DoubleNode, ilist_tag<Tag1>>;
+ using Node2Type = ilist_node<DoubleNode, ilist_tag<Tag2>>;
Node1Type::self_iterator getIterator1() { return Node1Type::getIterator(); }
Node2Type::self_iterator getIterator2() { return Node2Type::getIterator(); }
@@ -617,8 +617,8 @@ struct DoubleNode : ilist_node<DoubleNode, ilist_tag<Tag1>>,
return Node2Type::getIterator();
}
};
-typedef simple_ilist<DoubleNode, ilist_tag<Tag1>> TaggedList1Type;
-typedef simple_ilist<DoubleNode, ilist_tag<Tag2>> TaggedList2Type;
+using TaggedList1Type = simple_ilist<DoubleNode, ilist_tag<Tag1>>;
+using TaggedList2Type = simple_ilist<DoubleNode, ilist_tag<Tag2>>;
TEST(SimpleIListTest, TaggedLists) {
TaggedList1Type L1;
diff --git a/llvm/unittests/ADT/SmallPtrSetTest.cpp b/llvm/unittests/ADT/SmallPtrSetTest.cpp
index a627091..fe7a827 100644
--- a/llvm/unittests/ADT/SmallPtrSetTest.cpp
+++ b/llvm/unittests/ADT/SmallPtrSetTest.cpp
@@ -57,7 +57,7 @@ TEST(SmallPtrSetTest, GrowthTest) {
SmallPtrSet<int *, 4> s;
- typedef SmallPtrSet<int *, 4>::iterator iter;
+ using iter = SmallPtrSet<int *, 4>::iterator;
s.insert(&buf[0]);
s.insert(&buf[1]);
diff --git a/llvm/unittests/ADT/SmallStringTest.cpp b/llvm/unittests/ADT/SmallStringTest.cpp
index 2f4df8a..db85824 100644
--- a/llvm/unittests/ADT/SmallStringTest.cpp
+++ b/llvm/unittests/ADT/SmallStringTest.cpp
@@ -23,7 +23,7 @@ namespace {
// Test fixture class
class SmallStringTest : public testing::Test {
protected:
- typedef SmallString<40> StringType;
+ using StringType = SmallString<40>;
StringType theString;
diff --git a/llvm/unittests/ADT/SmallVectorTest.cpp b/llvm/unittests/ADT/SmallVectorTest.cpp
index 74fc737..dbc626d 100644
--- a/llvm/unittests/ADT/SmallVectorTest.cpp
+++ b/llvm/unittests/ADT/SmallVectorTest.cpp
@@ -226,13 +226,10 @@ protected:
VectorT otherVector;
};
-
-typedef ::testing::Types<SmallVector<Constructable, 0>,
- SmallVector<Constructable, 1>,
- SmallVector<Constructable, 2>,
- SmallVector<Constructable, 4>,
- SmallVector<Constructable, 5>
- > SmallVectorTestTypes;
+using SmallVectorTestTypes = ::testing::Types<
+ SmallVector<Constructable, 0>, SmallVector<Constructable, 1>,
+ SmallVector<Constructable, 2>, SmallVector<Constructable, 4>,
+ SmallVector<Constructable, 5>>;
TYPED_TEST_SUITE(SmallVectorTest, SmallVectorTestTypes, );
// Constructor test.
@@ -537,11 +534,11 @@ TYPED_TEST(SmallVectorTest, AppendNonIterTest) {
}
struct output_iterator {
- typedef std::output_iterator_tag iterator_category;
- typedef int value_type;
- typedef int difference_type;
- typedef value_type *pointer;
- typedef value_type &reference;
+ using iterator_category = std::output_iterator_tag;
+ using value_type = int;
+ using difference_type = int;
+ using pointer = value_type *;
+ using reference = value_type &;
operator int() { return 2; }
operator Constructable() { return 7; }
};
@@ -896,7 +893,7 @@ protected:
VectorT2 otherVector;
};
-typedef ::testing::Types<
+using DualSmallVectorTestTypes = ::testing::Types<
// Small mode -> Small mode.
std::pair<SmallVector<Constructable, 4>, SmallVector<Constructable, 4>>,
// Small mode -> Big mode.
@@ -904,8 +901,7 @@ typedef ::testing::Types<
// Big mode -> Small mode.
std::pair<SmallVector<Constructable, 2>, SmallVector<Constructable, 4>>,
// Big mode -> Big mode.
- std::pair<SmallVector<Constructable, 2>, SmallVector<Constructable, 2>>
- > DualSmallVectorTestTypes;
+ std::pair<SmallVector<Constructable, 2>, SmallVector<Constructable, 2>>>;
TYPED_TEST_SUITE(DualSmallVectorsTest, DualSmallVectorTestTypes, );
diff --git a/llvm/unittests/ADT/SparseMultiSetTest.cpp b/llvm/unittests/ADT/SparseMultiSetTest.cpp
index 54f7bc99..91d37f4 100644
--- a/llvm/unittests/ADT/SparseMultiSetTest.cpp
+++ b/llvm/unittests/ADT/SparseMultiSetTest.cpp
@@ -13,7 +13,7 @@ using namespace llvm;
namespace {
-typedef SparseMultiSet<unsigned> USet;
+using USet = SparseMultiSet<unsigned>;
// Empty set tests.
TEST(SparseMultiSetTest, EmptySet) {
@@ -211,7 +211,7 @@ struct Alt {
};
TEST(SparseMultiSetTest, AltStructSet) {
- typedef SparseMultiSet<Alt> ASet;
+ using ASet = SparseMultiSet<Alt>;
ASet Set;
Set.setUniverse(10);
Set.insert(Alt(1005));
diff --git a/llvm/unittests/ADT/SparseSetTest.cpp b/llvm/unittests/ADT/SparseSetTest.cpp
index 4fbf1ca..f2b9329 100644
--- a/llvm/unittests/ADT/SparseSetTest.cpp
+++ b/llvm/unittests/ADT/SparseSetTest.cpp
@@ -13,7 +13,7 @@ using namespace llvm;
namespace {
-typedef SparseSet<unsigned> USet;
+using USet = SparseSet<unsigned>;
// Empty set tests.
TEST(SparseSetTest, EmptySet) {
@@ -166,7 +166,7 @@ struct Alt {
};
TEST(SparseSetTest, AltStructSet) {
- typedef SparseSet<Alt> ASet;
+ using ASet = SparseSet<Alt>;
ASet Set;
Set.setUniverse(10);
Set.insert(Alt(1005));
diff --git a/llvm/unittests/ADT/StringSwitchTest.cpp b/llvm/unittests/ADT/StringSwitchTest.cpp
index c94feb5..75d50f4 100644
--- a/llvm/unittests/ADT/StringSwitchTest.cpp
+++ b/llvm/unittests/ADT/StringSwitchTest.cpp
@@ -240,6 +240,23 @@ TEST(StringSwitchTest, CasesCopies) {
EXPECT_EQ(NumCopies, 1u);
}
+TEST(StringSwitchTest, StringSwitchMultipleMatches) {
+ auto Translate = [](StringRef S) {
+ return llvm::StringSwitch<int>(S)
+ .CaseLower("A", 0)
+ .Case("b", 1)
+ .Case("a", 2)
+ .CasesLower({"a", "b"}, 3)
+ .DefaultUnreachable();
+ };
+
+ // Check that the value of the first match is returned.
+ EXPECT_EQ(0, Translate("A"));
+ EXPECT_EQ(0, Translate("a"));
+ EXPECT_EQ(3, Translate("B"));
+ EXPECT_EQ(1, Translate("b"));
+}
+
TEST(StringSwitchTest, DefaultUnreachable) {
auto Translate = [](StringRef S) {
return llvm::StringSwitch<int>(S)
diff --git a/llvm/unittests/ADT/TestGraph.h b/llvm/unittests/ADT/TestGraph.h
index a59ab50..bb2ec47 100644
--- a/llvm/unittests/ADT/TestGraph.h
+++ b/llvm/unittests/ADT/TestGraph.h
@@ -34,7 +34,7 @@ public:
/// NodeSubset - A subset of the graph's nodes.
class NodeSubset {
- typedef unsigned char BitVector; // Where the limitation N <= 8 comes from.
+ using BitVector = unsigned char; // Where the limitation N <= 8 comes from.
BitVector Elements;
NodeSubset(BitVector e) : Elements(e) {}
public:
@@ -96,7 +96,7 @@ public:
};
/// NodeType - Node index and set of children of the node.
- typedef std::pair<unsigned, NodeSubset> NodeType;
+ using NodeType = std::pair<unsigned, NodeSubset>;
private:
/// Nodes - The list of nodes for this graph.
@@ -233,8 +233,8 @@ public:
template <unsigned N>
struct GraphTraits<Graph<N> > {
- typedef typename Graph<N>::NodeType *NodeRef;
- typedef typename Graph<N>::ChildIterator ChildIteratorType;
+ using NodeRef = typename Graph<N>::NodeType *;
+ using ChildIteratorType = typename Graph<N>::ChildIterator;
static NodeRef getEntryNode(const Graph<N> &G) { return G.AccessNode(0); }
static ChildIteratorType child_begin(NodeRef Node) {
diff --git a/llvm/unittests/ADT/TinyPtrVectorTest.cpp b/llvm/unittests/ADT/TinyPtrVectorTest.cpp
index af4ae4f..c77721d 100644
--- a/llvm/unittests/ADT/TinyPtrVectorTest.cpp
+++ b/llvm/unittests/ADT/TinyPtrVectorTest.cpp
@@ -28,14 +28,14 @@ template <typename PointerTy, unsigned IntBits, typename IntType,
typename PtrTraits, typename Info>
struct RemovePointer<
PointerIntPair<PointerTy, IntBits, IntType, PtrTraits, Info>> {
- typedef typename RemovePointer<PointerTy>::type type;
+ using type = typename RemovePointer<PointerTy>::type;
};
template <typename VectorT>
class TinyPtrVectorTest : public testing::Test {
protected:
- typedef typename VectorT::value_type PtrT;
- typedef typename RemovePointer<PtrT>::type ValueT;
+ using PtrT = typename VectorT::value_type;
+ using ValueT = typename RemovePointer<PtrT>::type;
using PtrTraits = PointerLikeTypeTraits<PtrT>;
VectorT V;
@@ -78,9 +78,9 @@ protected:
}
};
-typedef ::testing::Types<TinyPtrVector<int *>, TinyPtrVector<double *>,
- TinyPtrVector<PointerIntPair<int *, 1>>>
- TinyPtrVectorTestTypes;
+using TinyPtrVectorTestTypes =
+ ::testing::Types<TinyPtrVector<int *>, TinyPtrVector<double *>,
+ TinyPtrVector<PointerIntPair<int *, 1>>>;
TYPED_TEST_SUITE(TinyPtrVectorTest, TinyPtrVectorTestTypes, );
TYPED_TEST(TinyPtrVectorTest, EmptyTest) {
diff --git a/llvm/unittests/CAS/ActionCacheTest.cpp b/llvm/unittests/CAS/ActionCacheTest.cpp
index db67e30..692da23 100644
--- a/llvm/unittests/CAS/ActionCacheTest.cpp
+++ b/llvm/unittests/CAS/ActionCacheTest.cpp
@@ -21,7 +21,7 @@ using namespace llvm;
using namespace llvm::cas;
TEST_P(CASTest, ActionCacheHit) {
- std::shared_ptr<ObjectStore> CAS = createObjectStore();
+ std::unique_ptr<ObjectStore> CAS = createObjectStore();
std::unique_ptr<ActionCache> Cache = createActionCache();
std::optional<ObjectProxy> ID;
@@ -36,7 +36,7 @@ TEST_P(CASTest, ActionCacheHit) {
}
TEST_P(CASTest, ActionCacheMiss) {
- std::shared_ptr<ObjectStore> CAS = createObjectStore();
+ std::unique_ptr<ObjectStore> CAS = createObjectStore();
std::unique_ptr<ActionCache> Cache = createActionCache();
std::optional<ObjectProxy> ID1, ID2;
@@ -59,7 +59,7 @@ TEST_P(CASTest, ActionCacheMiss) {
}
TEST_P(CASTest, ActionCacheRewrite) {
- std::shared_ptr<ObjectStore> CAS = createObjectStore();
+ std::unique_ptr<ObjectStore> CAS = createObjectStore();
std::unique_ptr<ActionCache> Cache = createActionCache();
std::optional<ObjectProxy> ID1, ID2;
diff --git a/llvm/unittests/CAS/BuiltinUnifiedCASDatabasesTest.cpp b/llvm/unittests/CAS/BuiltinUnifiedCASDatabasesTest.cpp
new file mode 100644
index 0000000..19522e9
--- /dev/null
+++ b/llvm/unittests/CAS/BuiltinUnifiedCASDatabasesTest.cpp
@@ -0,0 +1,67 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/CAS/BuiltinUnifiedCASDatabases.h"
+#include "CASTestConfig.h"
+#include "llvm/CAS/ActionCache.h"
+#include "llvm/CAS/ObjectStore.h"
+#include "llvm/Testing/Support/Error.h"
+#include "llvm/Testing/Support/SupportHelpers.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+using namespace llvm::cas;
+
+TEST_F(OnDiskCASTest, UnifiedCASMaterializationCheckPreventsGarbageCollection) {
+ unittest::TempDir Temp("on-disk-unified-cas", /*Unique=*/true);
+
+ auto WithCAS = [&](llvm::function_ref<void(ObjectStore &)> Action) {
+ std::pair<std::unique_ptr<ObjectStore>, std::unique_ptr<ActionCache>> DBs;
+ ASSERT_THAT_ERROR(
+ createOnDiskUnifiedCASDatabases(Temp.path()).moveInto(DBs),
+ Succeeded());
+ ObjectStore &CAS = *DBs.first;
+ ASSERT_THAT_ERROR(CAS.setSizeLimit(1), Succeeded());
+ Action(CAS);
+ };
+
+ std::optional<CASID> ID;
+
+ // Create an object in the CAS.
+ WithCAS([&ID](ObjectStore &CAS) {
+ std::optional<ObjectRef> Ref;
+ ASSERT_THAT_ERROR(CAS.store({}, "blah").moveInto(Ref), Succeeded());
+ ASSERT_TRUE(Ref.has_value());
+
+ ID = CAS.getID(*Ref);
+ });
+
+ // Check materialization and prune the storage.
+ WithCAS([&ID](ObjectStore &CAS) {
+ std::optional<ObjectRef> Ref = CAS.getReference(*ID);
+ ASSERT_TRUE(Ref.has_value());
+
+ std::optional<bool> IsMaterialized;
+ ASSERT_THAT_ERROR(CAS.isMaterialized(*Ref).moveInto(IsMaterialized),
+ Succeeded());
+ ASSERT_TRUE(IsMaterialized);
+
+ ASSERT_THAT_ERROR(CAS.pruneStorageData(), Succeeded());
+ });
+
+ // Verify that the previous materialization check kept the object in the CAS.
+ WithCAS([&ID](ObjectStore &CAS) {
+ std::optional<ObjectRef> Ref = CAS.getReference(*ID);
+ ASSERT_TRUE(Ref.has_value());
+
+ std::optional<bool> IsMaterialized;
+ ASSERT_THAT_ERROR(CAS.isMaterialized(*Ref).moveInto(IsMaterialized),
+ Succeeded());
+ ASSERT_TRUE(IsMaterialized);
+ });
+}
diff --git a/llvm/unittests/CAS/CASTestConfig.cpp b/llvm/unittests/CAS/CASTestConfig.cpp
index 10e4b68..08cbf1d 100644
--- a/llvm/unittests/CAS/CASTestConfig.cpp
+++ b/llvm/unittests/CAS/CASTestConfig.cpp
@@ -8,6 +8,7 @@
#include "CASTestConfig.h"
#include "llvm/CAS/ObjectStore.h"
+#include "llvm/Testing/Support/Error.h"
#include "gtest/gtest.h"
#include <mutex>
@@ -15,7 +16,8 @@ using namespace llvm;
using namespace llvm::cas;
static CASTestingEnv createInMemory(int I) {
- return CASTestingEnv{createInMemoryCAS(), createInMemoryActionCache()};
+ return CASTestingEnv{createInMemoryCAS(), createInMemoryActionCache(),
+ std::nullopt};
}
INSTANTIATE_TEST_SUITE_P(InMemoryCAS, CASTest,
@@ -23,7 +25,7 @@ INSTANTIATE_TEST_SUITE_P(InMemoryCAS, CASTest,
#if LLVM_ENABLE_ONDISK_CAS
namespace llvm::cas::ondisk {
-extern void setMaxMappingSize(uint64_t Size);
+void setMaxMappingSize(uint64_t Size);
} // namespace llvm::cas::ondisk
void setMaxOnDiskCASMappingSize() {
@@ -31,6 +33,17 @@ void setMaxOnDiskCASMappingSize() {
std::call_once(
Flag, [] { llvm::cas::ondisk::setMaxMappingSize(100 * 1024 * 1024); });
}
+
+static CASTestingEnv createOnDisk(int I) {
+ unittest::TempDir Temp("on-disk-cas", /*Unique=*/true);
+ std::unique_ptr<ObjectStore> CAS;
+ EXPECT_THAT_ERROR(createOnDiskCAS(Temp.path()).moveInto(CAS), Succeeded());
+ std::unique_ptr<ActionCache> Cache;
+ EXPECT_THAT_ERROR(createOnDiskActionCache(Temp.path()).moveInto(Cache),
+ Succeeded());
+ return CASTestingEnv{std::move(CAS), std::move(Cache), std::move(Temp)};
+}
+INSTANTIATE_TEST_SUITE_P(OnDiskCAS, CASTest, ::testing::Values(createOnDisk));
#else
void setMaxOnDiskCASMappingSize() {}
#endif /* LLVM_ENABLE_ONDISK_CAS */
diff --git a/llvm/unittests/CAS/CASTestConfig.h b/llvm/unittests/CAS/CASTestConfig.h
index 8d3c553..b1c0e59 100644
--- a/llvm/unittests/CAS/CASTestConfig.h
+++ b/llvm/unittests/CAS/CASTestConfig.h
@@ -6,16 +6,28 @@
//
//===----------------------------------------------------------------------===//
+#ifndef LLVM_UNITTESTS_CASTESTCONFIG_H
+#define LLVM_UNITTESTS_CASTESTCONFIG_H
+
#include "llvm/CAS/ActionCache.h"
#include "llvm/CAS/ObjectStore.h"
+#include "llvm/Testing/Support/SupportHelpers.h"
#include "gtest/gtest.h"
+#include <memory>
-#ifndef LLVM_UNITTESTS_CASTESTCONFIG_H
-#define LLVM_UNITTESTS_CASTESTCONFIG_H
+namespace llvm::unittest::cas {
+class MockEnv {
+ void anchor();
+
+public:
+ virtual ~MockEnv();
+};
+} // namespace llvm::unittest::cas
struct CASTestingEnv {
std::unique_ptr<llvm::cas::ObjectStore> CAS;
std::unique_ptr<llvm::cas::ActionCache> Cache;
+ std::optional<llvm::unittest::TempDir> Temp;
};
void setMaxOnDiskCASMappingSize();
@@ -24,26 +36,47 @@ void setMaxOnDiskCASMappingSize();
class OnDiskCASTest : public ::testing::Test {
protected:
void SetUp() override {
+#if !LLVM_ENABLE_ONDISK_CAS
+ GTEST_SKIP() << "OnDiskCAS is not enabled";
+#endif
// Use a smaller database size for testing to conserve disk space.
setMaxOnDiskCASMappingSize();
}
};
+// Parametered test fixture for ObjectStore and ActionCache tests.
class CASTest
: public testing::TestWithParam<std::function<CASTestingEnv(int)>> {
protected:
std::optional<int> NextCASIndex;
+ llvm::SmallVector<llvm::unittest::TempDir> Dirs;
+
+ llvm::SmallVector<std::unique_ptr<llvm::unittest::cas::MockEnv>> Envs;
+
std::unique_ptr<llvm::cas::ObjectStore> createObjectStore() {
auto TD = GetParam()(++(*NextCASIndex));
+ if (TD.Temp)
+ Dirs.push_back(std::move(*TD.Temp));
return std::move(TD.CAS);
}
std::unique_ptr<llvm::cas::ActionCache> createActionCache() {
auto TD = GetParam()(++(*NextCASIndex));
+ if (TD.Temp)
+ Dirs.push_back(std::move(*TD.Temp));
return std::move(TD.Cache);
}
- void SetUp() override { NextCASIndex = 0; }
- void TearDown() override { NextCASIndex = std::nullopt; }
+
+ void SetUp() override {
+ NextCASIndex = 0;
+ setMaxOnDiskCASMappingSize();
+ }
+
+ void TearDown() override {
+ NextCASIndex = std::nullopt;
+ Dirs.clear();
+ Envs.clear();
+ }
};
#endif
diff --git a/llvm/unittests/CAS/CMakeLists.txt b/llvm/unittests/CAS/CMakeLists.txt
index da469f7..91e49be 100644
--- a/llvm/unittests/CAS/CMakeLists.txt
+++ b/llvm/unittests/CAS/CMakeLists.txt
@@ -1,9 +1,11 @@
set(ONDISK_CAS_TEST_SOURCES
+ BuiltinUnifiedCASDatabasesTest.cpp
OnDiskGraphDBTest.cpp
OnDiskDataAllocatorTest.cpp
OnDiskKeyValueDBTest.cpp
OnDiskTrieRawHashMapTest.cpp
ProgramTest.cpp
+ UnifiedOnDiskCacheTest.cpp
)
set(LLVM_OPTIONAL_SOURCES
diff --git a/llvm/unittests/CAS/ObjectStoreTest.cpp b/llvm/unittests/CAS/ObjectStoreTest.cpp
index 54083fd..b43ae33 100644
--- a/llvm/unittests/CAS/ObjectStoreTest.cpp
+++ b/llvm/unittests/CAS/ObjectStoreTest.cpp
@@ -1,4 +1,4 @@
-//===- ObjectStoreTest.cpp ------------------------------------------------===//
+//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -76,7 +76,7 @@ multiline text multiline text multiline text multiline text multiline text)",
// Run validation on all CASIDs.
for (int I = 0, E = IDs.size(); I != E; ++I)
- ASSERT_THAT_ERROR(CAS1->validate(IDs[I]), Succeeded());
+ ASSERT_THAT_ERROR(CAS1->validateObject(IDs[I]), Succeeded());
// Check that the blobs can be retrieved multiple times.
for (int I = 0, E = IDs.size(); I != E; ++I) {
@@ -120,15 +120,15 @@ TEST_P(CASTest, BlobsBig) {
std::optional<CASID> ID2;
ASSERT_THAT_ERROR(CAS->createProxy({}, String1).moveInto(ID1), Succeeded());
ASSERT_THAT_ERROR(CAS->createProxy({}, String1).moveInto(ID2), Succeeded());
- ASSERT_THAT_ERROR(CAS->validate(*ID1), Succeeded());
- ASSERT_THAT_ERROR(CAS->validate(*ID2), Succeeded());
+ ASSERT_THAT_ERROR(CAS->validateObject(*ID1), Succeeded());
+ ASSERT_THAT_ERROR(CAS->validateObject(*ID2), Succeeded());
ASSERT_EQ(ID1, ID2);
String1.append(String2);
ASSERT_THAT_ERROR(CAS->createProxy({}, String2).moveInto(ID1), Succeeded());
ASSERT_THAT_ERROR(CAS->createProxy({}, String2).moveInto(ID2), Succeeded());
- ASSERT_THAT_ERROR(CAS->validate(*ID1), Succeeded());
- ASSERT_THAT_ERROR(CAS->validate(*ID2), Succeeded());
+ ASSERT_THAT_ERROR(CAS->validateObject(*ID1), Succeeded());
+ ASSERT_THAT_ERROR(CAS->validateObject(*ID2), Succeeded());
ASSERT_EQ(ID1, ID2);
String2.append(String1);
}
@@ -176,10 +176,11 @@ multiline text multiline text multiline text multiline text multiline text)",
// Check basic printing of IDs.
IDs.push_back(CAS1->getID(*Node));
- auto ID = CAS1->getID(Nodes.back());
- EXPECT_EQ(ID.toString(), IDs.back().toString());
- EXPECT_EQ(*Node, Nodes.back());
- EXPECT_EQ(ID, IDs.back());
+ EXPECT_EQ(IDs.back().toString(), IDs.back().toString());
+ EXPECT_EQ(Nodes.front(), Nodes.front());
+ EXPECT_EQ(Nodes.back(), Nodes.back());
+ EXPECT_EQ(IDs.front(), IDs.front());
+ EXPECT_EQ(IDs.back(), IDs.back());
if (Nodes.size() <= 1)
continue;
EXPECT_NE(Nodes.front(), Nodes.back());
@@ -266,7 +267,7 @@ TEST_P(CASTest, NodesBig) {
}
for (auto ID : CreatedNodes)
- ASSERT_THAT_ERROR(CAS->validate(CAS->getID(ID)), Succeeded());
+ ASSERT_THAT_ERROR(CAS->validateObject(CAS->getID(ID)), Succeeded());
}
#if LLVM_ENABLE_THREADS
@@ -332,17 +333,124 @@ static void testBlobsParallel1(ObjectStore &CAS, uint64_t BlobSize) {
}
TEST_P(CASTest, BlobsParallel) {
- std::shared_ptr<ObjectStore> CAS = createObjectStore();
+ std::unique_ptr<ObjectStore> CAS = createObjectStore();
uint64_t Size = 1ULL * 1024;
ASSERT_NO_FATAL_FAILURE(testBlobsParallel1(*CAS, Size));
}
#ifdef EXPENSIVE_CHECKS
TEST_P(CASTest, BlobsBigParallel) {
- std::shared_ptr<ObjectStore> CAS = createObjectStore();
+ std::unique_ptr<ObjectStore> CAS = createObjectStore();
// 100k is large enough to be standalone files in our on-disk cas.
uint64_t Size = 100ULL * 1024;
ASSERT_NO_FATAL_FAILURE(testBlobsParallel1(*CAS, Size));
}
#endif // EXPENSIVE_CHECKS
+
+#ifndef _WIN32 // create_link won't work for directories on Windows
+TEST_F(OnDiskCASTest, OnDiskCASBlobsParallelMultiCAS) {
+ // This test intentionally uses symlinked paths to the same CAS to subvert the
+ // shared memory mappings that would normally be created within a single
+ // process. This breaks the lock file guarantees, so we must be careful not
+ // to create or destroy the CAS objects concurrently, which is when the locks
+ // are normally important.
+ unittest::TempDir Temp("on-disk-cas", /*Unique=*/true);
+ ASSERT_EQ(sys::fs::create_directory(Temp.path("real_cas")),
+ std::error_code());
+ ASSERT_EQ(sys::fs::create_link("real_cas", Temp.path("sym_cas1")),
+ std::error_code());
+ ASSERT_EQ(sys::fs::create_link("real_cas", Temp.path("sym_cas2")),
+ std::error_code());
+ ASSERT_EQ(sys::fs::create_link("real_cas", Temp.path("sym_cas3")),
+ std::error_code());
+
+ std::unique_ptr<ObjectStore> CAS1, CAS2, CAS3, CAS4;
+ ASSERT_THAT_ERROR(createOnDiskCAS(Temp.path("real_cas")).moveInto(CAS1),
+ Succeeded());
+ ASSERT_THAT_ERROR(createOnDiskCAS(Temp.path("sym_cas1")).moveInto(CAS2),
+ Succeeded());
+ ASSERT_THAT_ERROR(createOnDiskCAS(Temp.path("sym_cas2")).moveInto(CAS3),
+ Succeeded());
+ ASSERT_THAT_ERROR(createOnDiskCAS(Temp.path("sym_cas3")).moveInto(CAS4),
+ Succeeded());
+
+ uint64_t Size = 1ULL * 1024;
+ ASSERT_NO_FATAL_FAILURE(testBlobsParallel(*CAS1, *CAS2, *CAS3, *CAS4, Size));
+}
+
+TEST_F(OnDiskCASTest, OnDiskCASBlobsBigParallelMultiCAS) {
+ // See comment in BlobsParallelMultiCAS.
+ unittest::TempDir Temp("on-disk-cas", /*Unique=*/true);
+ ASSERT_EQ(sys::fs::create_directory(Temp.path("real_cas")),
+ std::error_code());
+ ASSERT_EQ(sys::fs::create_link("real_cas", Temp.path("sym_cas1")),
+ std::error_code());
+ ASSERT_EQ(sys::fs::create_link("real_cas", Temp.path("sym_cas2")),
+ std::error_code());
+ ASSERT_EQ(sys::fs::create_link("real_cas", Temp.path("sym_cas3")),
+ std::error_code());
+
+ std::unique_ptr<ObjectStore> CAS1, CAS2, CAS3, CAS4;
+ ASSERT_THAT_ERROR(createOnDiskCAS(Temp.path("real_cas")).moveInto(CAS1),
+ Succeeded());
+ ASSERT_THAT_ERROR(createOnDiskCAS(Temp.path("sym_cas1")).moveInto(CAS2),
+ Succeeded());
+ ASSERT_THAT_ERROR(createOnDiskCAS(Temp.path("sym_cas2")).moveInto(CAS3),
+ Succeeded());
+ ASSERT_THAT_ERROR(createOnDiskCAS(Temp.path("sym_cas3")).moveInto(CAS4),
+ Succeeded());
+
+ // 100k is large enough to be standalone files in our on-disk cas.
+ uint64_t Size = 100ULL * 1024;
+ ASSERT_NO_FATAL_FAILURE(testBlobsParallel(*CAS1, *CAS2, *CAS3, *CAS4, Size));
+}
+#endif // _WIN32
#endif // LLVM_ENABLE_THREADS
+
+TEST_F(OnDiskCASTest, OnDiskCASDiskSize) {
+ unittest::TempDir Temp("on-disk-cas", /*Unique=*/true);
+ std::unique_ptr<ObjectStore> CAS;
+ ASSERT_THAT_ERROR(createOnDiskCAS(Temp.path()).moveInto(CAS), Succeeded());
+
+ uint64_t MaxSize = 100 * 1024 * 1024;
+
+ // Check that we map the files to the correct size.
+ auto CheckFileSizes = [&](bool Mapped) {
+ bool FoundIndex = false, FoundData = false;
+ std::error_code EC;
+ for (sys::fs::directory_iterator I(Temp.path(), EC), E; I != E && !EC;
+ I.increment(EC)) {
+ StringRef Filename = sys::path::filename(I->path());
+ if (Filename.starts_with("index.") && !Filename.ends_with(".shared")) {
+ FoundIndex = true;
+ ASSERT_TRUE(I->status());
+ if (Mapped)
+ EXPECT_EQ(I->status()->getSize(), MaxSize);
+ else
+ EXPECT_LT(I->status()->getSize(), MaxSize);
+ }
+ if (Filename.starts_with("data.") && !Filename.ends_with(".shared")) {
+ FoundData = true;
+ ASSERT_TRUE(I->status());
+ if (Mapped)
+ EXPECT_EQ(I->status()->getSize(), MaxSize);
+ else
+ EXPECT_LT(I->status()->getSize(), MaxSize);
+ }
+ }
+ ASSERT_TRUE(FoundIndex);
+ ASSERT_TRUE(FoundData);
+ };
+
+ // Check that we have the full mapping size when the CAS is open.
+ CheckFileSizes(/*Mapped=*/true);
+ CAS.reset();
+ // Check that the CAS is shrunk to a smaller size.
+ CheckFileSizes(/*Mapped=*/false);
+
+ // Repeat the checks when starting from an existing CAS.
+ ASSERT_THAT_ERROR(createOnDiskCAS(Temp.path()).moveInto(CAS), Succeeded());
+ CheckFileSizes(/*Mapped=*/true);
+ CAS.reset();
+ CheckFileSizes(/*Mapped=*/false);
+}
diff --git a/llvm/unittests/CAS/OnDiskCommonUtils.h b/llvm/unittests/CAS/OnDiskCommonUtils.h
index 89f93e0..48a1830 100644
--- a/llvm/unittests/CAS/OnDiskCommonUtils.h
+++ b/llvm/unittests/CAS/OnDiskCommonUtils.h
@@ -12,6 +12,8 @@
#include "llvm/CAS/BuiltinObjectHasher.h"
#include "llvm/CAS/OnDiskGraphDB.h"
+#include "llvm/CAS/OnDiskKeyValueDB.h"
+#include "llvm/CAS/UnifiedOnDiskCache.h"
#include "llvm/Support/BLAKE3.h"
#include "llvm/Testing/Support/Error.h"
@@ -58,6 +60,25 @@ inline Expected<ObjectID> store(OnDiskGraphDB &DB, StringRef Data,
return ID;
}
+inline Expected<ObjectID> cachePut(OnDiskKeyValueDB &DB, ArrayRef<uint8_t> Key,
+ ObjectID ID) {
+ auto Value = UnifiedOnDiskCache::getValueFromObjectID(ID);
+ auto Result = DB.put(Key, Value);
+ if (!Result)
+ return Result.takeError();
+ return UnifiedOnDiskCache::getObjectIDFromValue(*Result);
+}
+
+inline Expected<std::optional<ObjectID>> cacheGet(OnDiskKeyValueDB &DB,
+ ArrayRef<uint8_t> Key) {
+ auto Result = DB.get(Key);
+ if (!Result)
+ return Result.takeError();
+ if (!*Result)
+ return std::nullopt;
+ return UnifiedOnDiskCache::getObjectIDFromValue(**Result);
+}
+
inline Error printTree(OnDiskGraphDB &DB, ObjectID ID, raw_ostream &OS,
unsigned Indent = 0) {
std::optional<ondisk::ObjectHandle> Obj;
diff --git a/llvm/unittests/CAS/OnDiskGraphDBTest.cpp b/llvm/unittests/CAS/OnDiskGraphDBTest.cpp
index 3c2e963..e9c73bf 100644
--- a/llvm/unittests/CAS/OnDiskGraphDBTest.cpp
+++ b/llvm/unittests/CAS/OnDiskGraphDBTest.cpp
@@ -102,7 +102,7 @@ TEST_F(OnDiskCASTest, OnDiskGraphDBFaultInSingleNode) {
std::unique_ptr<OnDiskGraphDB> DB;
ASSERT_THAT_ERROR(
OnDiskGraphDB::open(Temp.path(), "blake3", sizeof(HashType),
- std::move(UpstreamDB),
+ UpstreamDB.get(),
OnDiskGraphDB::FaultInPolicy::SingleNode)
.moveInto(DB),
Succeeded());
@@ -208,7 +208,7 @@ TEST_F(OnDiskCASTest, OnDiskGraphDBFaultInFullTree) {
unittest::TempDir Temp("ondiskcas", /*Unique=*/true);
std::unique_ptr<OnDiskGraphDB> DB;
ASSERT_THAT_ERROR(OnDiskGraphDB::open(Temp.path(), "blake3", sizeof(HashType),
- std::move(UpstreamDB),
+ UpstreamDB.get(),
OnDiskGraphDB::FaultInPolicy::FullTree)
.moveInto(DB),
Succeeded());
@@ -264,14 +264,14 @@ TEST_F(OnDiskCASTest, OnDiskGraphDBFaultInPolicyConflict) {
unittest::TempDir Temp("ondiskcas", /*Unique=*/true);
std::unique_ptr<OnDiskGraphDB> DB;
ASSERT_THAT_ERROR(OnDiskGraphDB::open(Temp.path(), "blake3",
- sizeof(HashType),
- std::move(UpstreamDB), Policy1)
+ sizeof(HashType), UpstreamDB.get(),
+ Policy1)
.moveInto(DB),
Succeeded());
DB.reset();
ASSERT_THAT_ERROR(OnDiskGraphDB::open(Temp.path(), "blake3",
- sizeof(HashType),
- std::move(UpstreamDB), Policy2)
+ sizeof(HashType), UpstreamDB.get(),
+ Policy2)
.moveInto(DB),
Failed());
};
diff --git a/llvm/unittests/CAS/UnifiedOnDiskCacheTest.cpp b/llvm/unittests/CAS/UnifiedOnDiskCacheTest.cpp
new file mode 100644
index 0000000..09aebc2
--- /dev/null
+++ b/llvm/unittests/CAS/UnifiedOnDiskCacheTest.cpp
@@ -0,0 +1,198 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/CAS/UnifiedOnDiskCache.h"
+#include "CASTestConfig.h"
+#include "OnDiskCommonUtils.h"
+#include "llvm/Testing/Support/Error.h"
+#include "llvm/Testing/Support/SupportHelpers.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+using namespace llvm::cas;
+using namespace llvm::cas::ondisk;
+using namespace llvm::unittest::cas;
+
+/// Visits all the files of a directory recursively and returns the sum of their
+/// sizes.
+static Expected<size_t> countFileSizes(StringRef Path) {
+ size_t TotalSize = 0;
+ std::error_code EC;
+ for (sys::fs::directory_iterator DirI(Path, EC), DirE; !EC && DirI != DirE;
+ DirI.increment(EC)) {
+ if (DirI->type() == sys::fs::file_type::directory_file) {
+ Expected<size_t> Subsize = countFileSizes(DirI->path());
+ if (!Subsize)
+ return Subsize.takeError();
+ TotalSize += *Subsize;
+ continue;
+ }
+ ErrorOr<sys::fs::basic_file_status> Stat = DirI->status();
+ if (!Stat)
+ return createFileError(DirI->path(), Stat.getError());
+ TotalSize += Stat->getSize();
+ }
+ if (EC)
+ return createFileError(Path, EC);
+ return TotalSize;
+}
+
+TEST_F(OnDiskCASTest, UnifiedOnDiskCacheTest) {
+ unittest::TempDir Temp("ondisk-unified", /*Unique=*/true);
+ std::unique_ptr<UnifiedOnDiskCache> UniDB;
+
+ const uint64_t SizeLimit = 1024ull * 64;
+ auto reopenDB = [&]() {
+ UniDB.reset();
+ ASSERT_THAT_ERROR(UnifiedOnDiskCache::open(Temp.path(), SizeLimit, "blake3",
+ sizeof(HashType))
+ .moveInto(UniDB),
+ Succeeded());
+ };
+
+ reopenDB();
+
+ HashType RootHash;
+ HashType OtherHash;
+ HashType Key1Hash;
+ HashType Key2Hash;
+ {
+ OnDiskGraphDB &DB = UniDB->getGraphDB();
+ std::optional<ObjectID> ID1;
+ ASSERT_THAT_ERROR(store(DB, "1", {}).moveInto(ID1), Succeeded());
+ std::optional<ObjectID> ID2;
+ ASSERT_THAT_ERROR(store(DB, "2", {}).moveInto(ID2), Succeeded());
+ std::optional<ObjectID> IDRoot;
+ ASSERT_THAT_ERROR(store(DB, "root", {*ID1, *ID2}).moveInto(IDRoot),
+ Succeeded());
+ ArrayRef<uint8_t> Digest = DB.getDigest(*IDRoot);
+ ASSERT_EQ(Digest.size(), RootHash.size());
+ llvm::copy(Digest, RootHash.data());
+
+ std::optional<ObjectID> IDOther;
+ ASSERT_THAT_ERROR(store(DB, "other", {}).moveInto(IDOther), Succeeded());
+ Digest = DB.getDigest(*IDOther);
+ ASSERT_EQ(Digest.size(), OtherHash.size());
+ llvm::copy(Digest, OtherHash.data());
+
+ Key1Hash = digest("key1");
+ std::optional<ObjectID> Val;
+ ASSERT_THAT_ERROR(
+ cachePut(UniDB->getKeyValueDB(), Key1Hash, *IDRoot).moveInto(Val),
+ Succeeded());
+ EXPECT_EQ(IDRoot, Val);
+
+ Key2Hash = digest("key2");
+ std::optional<ObjectID> KeyID;
+ ASSERT_THAT_ERROR(DB.getReference(Key2Hash).moveInto(KeyID), Succeeded());
+ ASSERT_THAT_ERROR(cachePut(UniDB->getKeyValueDB(),
+ UniDB->getGraphDB().getDigest(*KeyID), *ID1)
+ .moveInto(Val),
+ Succeeded());
+ }
+
+ auto checkTree = [&](const HashType &Digest, StringRef ExpectedTree) {
+ OnDiskGraphDB &DB = UniDB->getGraphDB();
+ std::optional<ObjectID> ID;
+ ASSERT_THAT_ERROR(DB.getReference(Digest).moveInto(ID), Succeeded());
+ std::string PrintedTree;
+ raw_string_ostream OS(PrintedTree);
+ ASSERT_THAT_ERROR(printTree(DB, *ID, OS), Succeeded());
+ EXPECT_EQ(PrintedTree, ExpectedTree);
+ };
+ auto checkRootTree = [&]() {
+ return checkTree(RootHash, "root\n 1\n 2\n");
+ };
+
+ auto checkKey = [&](const HashType &Key, StringRef ExpectedData) {
+ OnDiskGraphDB &DB = UniDB->getGraphDB();
+ std::optional<ObjectID> Val;
+ ASSERT_THAT_ERROR(cacheGet(UniDB->getKeyValueDB(), Key).moveInto(Val),
+ Succeeded());
+
+ ASSERT_TRUE(Val.has_value());
+ std::optional<ondisk::ObjectHandle> Obj;
+ ASSERT_THAT_ERROR(DB.load(*Val).moveInto(Obj), Succeeded());
+ EXPECT_EQ(toStringRef(DB.getObjectData(*Obj)), ExpectedData);
+ };
+
+ checkRootTree();
+ checkTree(OtherHash, "other\n");
+ checkKey(Key1Hash, "root");
+ checkKey(Key2Hash, "1");
+
+ auto storeBigObject = [&](unsigned Index) {
+ SmallString<1000> Buf;
+ Buf.append(970, 'a');
+ raw_svector_ostream(Buf) << Index;
+ std::optional<ObjectID> ID;
+ ASSERT_THAT_ERROR(store(UniDB->getGraphDB(), Buf, {}).moveInto(ID),
+ Succeeded());
+ };
+
+ uint64_t PrevStoreSize = UniDB->getStorageSize();
+ unsigned Index = 0;
+ while (!UniDB->hasExceededSizeLimit()) {
+ storeBigObject(Index++);
+ }
+ EXPECT_GT(UniDB->getStorageSize(), PrevStoreSize);
+ UniDB->setSizeLimit(SizeLimit * 2);
+ EXPECT_FALSE(UniDB->hasExceededSizeLimit());
+ UniDB->setSizeLimit(SizeLimit);
+ EXPECT_TRUE(UniDB->hasExceededSizeLimit());
+
+ reopenDB();
+
+ EXPECT_FALSE(UniDB->hasExceededSizeLimit());
+ EXPECT_FALSE(UniDB->needsGarbageCollection());
+
+ checkRootTree();
+ checkKey(Key1Hash, "root");
+
+ while (!UniDB->hasExceededSizeLimit()) {
+ storeBigObject(Index++);
+ }
+ PrevStoreSize = UniDB->getStorageSize();
+ ASSERT_THAT_ERROR(UniDB->close(), Succeeded());
+ EXPECT_TRUE(UniDB->needsGarbageCollection());
+
+ reopenDB();
+ EXPECT_TRUE(UniDB->needsGarbageCollection());
+
+ std::optional<size_t> DirSizeBefore;
+ ASSERT_THAT_ERROR(countFileSizes(Temp.path()).moveInto(DirSizeBefore),
+ Succeeded());
+
+ ASSERT_THAT_ERROR(UnifiedOnDiskCache::collectGarbage(Temp.path()),
+ Succeeded());
+
+ std::optional<size_t> DirSizeAfter;
+ ASSERT_THAT_ERROR(countFileSizes(Temp.path()).moveInto(DirSizeAfter),
+ Succeeded());
+ EXPECT_LT(*DirSizeAfter, *DirSizeBefore);
+
+ reopenDB();
+ EXPECT_FALSE(UniDB->needsGarbageCollection());
+
+ checkRootTree();
+ checkKey(Key1Hash, "root");
+
+ EXPECT_LT(UniDB->getStorageSize(), PrevStoreSize);
+
+ // 'Other' tree and 'Key2' got garbage-collected.
+ {
+ OnDiskGraphDB &DB = UniDB->getGraphDB();
+ std::optional<ObjectID> ID;
+ ASSERT_THAT_ERROR(DB.getReference(OtherHash).moveInto(ID), Succeeded());
+ EXPECT_FALSE(DB.containsObject(*ID));
+ std::optional<ObjectID> Val;
+ ASSERT_THAT_ERROR(cacheGet(UniDB->getKeyValueDB(), Key2Hash).moveInto(Val),
+ Succeeded());
+ EXPECT_FALSE(Val.has_value());
+ }
+}
diff --git a/llvm/unittests/CodeGen/AsmPrinterDwarfTest.cpp b/llvm/unittests/CodeGen/AsmPrinterDwarfTest.cpp
index af2d56d..d0991e6 100644
--- a/llvm/unittests/CodeGen/AsmPrinterDwarfTest.cpp
+++ b/llvm/unittests/CodeGen/AsmPrinterDwarfTest.cpp
@@ -383,7 +383,7 @@ class AsmPrinterHandlerTest : public AsmPrinterFixtureBase {
public:
TestHandler(AsmPrinterHandlerTest &Test) : Test(Test) {}
- ~TestHandler() override {}
+ ~TestHandler() override = default;
void setSymbolSize(const MCSymbol *Sym, uint64_t Size) override {}
void beginModule(Module *M) override { Test.BeginCount++; }
void endModule() override { Test.EndCount++; }
diff --git a/llvm/unittests/CodeGen/MFCommon.inc b/llvm/unittests/CodeGen/MFCommon.inc
index a86a68c..0180ba0 100644
--- a/llvm/unittests/CodeGen/MFCommon.inc
+++ b/llvm/unittests/CodeGen/MFCommon.inc
@@ -86,7 +86,7 @@ public:
: TargetSubtargetInfo(Triple(""), "", "", "", {}, {}, {}, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr),
FL(), TL(TM) {}
- ~BogusSubtarget() override {}
+ ~BogusSubtarget() override = default;
const TargetFrameLowering *getFrameLowering() const override { return &FL; }
@@ -117,7 +117,7 @@ public:
Reloc::Static, CodeModel::Small, CodeGenOptLevel::Default),
ST(*this) {}
- ~BogusTargetMachine() override {}
+ ~BogusTargetMachine() override = default;
const TargetSubtargetInfo *getSubtargetImpl(const Function &) const override {
return &ST;
diff --git a/llvm/unittests/CodeGen/MachineOperandTest.cpp b/llvm/unittests/CodeGen/MachineOperandTest.cpp
index 3f3f48f..0373c7a 100644
--- a/llvm/unittests/CodeGen/MachineOperandTest.cpp
+++ b/llvm/unittests/CodeGen/MachineOperandTest.cpp
@@ -424,4 +424,24 @@ TEST(MachineOperandTest, HashValue) {
ASSERT_TRUE(MO1.isIdenticalTo(MO2));
}
+TEST(MachineOperandTest, RegisterLiveOutHashValue) {
+ LLVMContext Ctx;
+ Module Mod("Module", Ctx);
+ auto MF = createMachineFunction(Ctx, Mod);
+ MachineBasicBlock *MBB = MF->CreateMachineBasicBlock();
+ MCInstrDesc MCID = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+ auto *MI1 = MF->CreateMachineInstr(MCID, DebugLoc());
+ auto *MI2 = MF->CreateMachineInstr(MCID, DebugLoc());
+ MBB->insert(MBB->begin(), MI1);
+ MBB->insert(MBB->begin(), MI2);
+ uint32_t Mask1 = 0;
+ uint32_t Mask2 = 0;
+ MI1->addOperand(*MF, MachineOperand::CreateRegLiveOut(&Mask1));
+ MI2->addOperand(*MF, MachineOperand::CreateRegLiveOut(&Mask2));
+ auto MO1 = MI1->getOperand(0);
+ auto MO2 = MI2->getOperand(0);
+ EXPECT_EQ(hash_value(MO1), hash_value(MO2));
+ EXPECT_TRUE(MO1.isIdenticalTo(MO2));
+}
+
} // end namespace
diff --git a/llvm/unittests/DebugInfo/CodeView/RandomAccessVisitorTest.cpp b/llvm/unittests/DebugInfo/CodeView/RandomAccessVisitorTest.cpp
index 5c96199..fab40b9 100644
--- a/llvm/unittests/DebugInfo/CodeView/RandomAccessVisitorTest.cpp
+++ b/llvm/unittests/DebugInfo/CodeView/RandomAccessVisitorTest.cpp
@@ -84,7 +84,7 @@ public:
class RandomAccessVisitorTest : public testing::Test {
public:
- RandomAccessVisitorTest() {}
+ RandomAccessVisitorTest() = default;
static void SetUpTestCase() {
GlobalState = std::make_unique<GlobalTestState>();
diff --git a/llvm/unittests/DebugInfo/CodeView/TypeIndexDiscoveryTest.cpp b/llvm/unittests/DebugInfo/CodeView/TypeIndexDiscoveryTest.cpp
index b1f19e9..62b7591 100644
--- a/llvm/unittests/DebugInfo/CodeView/TypeIndexDiscoveryTest.cpp
+++ b/llvm/unittests/DebugInfo/CodeView/TypeIndexDiscoveryTest.cpp
@@ -21,7 +21,7 @@ using namespace llvm::codeview;
class TypeIndexIteratorTest : public testing::Test {
public:
- TypeIndexIteratorTest() {}
+ TypeIndexIteratorTest() = default;
void SetUp() override {
Refs.clear();
diff --git a/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp
index 2fe5260..aa5b292 100644
--- a/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp
+++ b/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp
@@ -864,7 +864,7 @@ TEST_F(DebugLineBasicFixture, CallbackUsedForUnterminatedSequence) {
}
struct AdjustAddressFixtureBase : public CommonFixture {
- virtual ~AdjustAddressFixtureBase() {}
+ virtual ~AdjustAddressFixtureBase() = default;
// Create and update the prologue as specified by the subclass, then return
// the length of the table.
diff --git a/llvm/unittests/ExecutionEngine/JITLink/JITLinkTestUtils.h b/llvm/unittests/ExecutionEngine/JITLink/JITLinkTestUtils.h
index f03c82f..a2732e3 100644
--- a/llvm/unittests/ExecutionEngine/JITLink/JITLinkTestUtils.h
+++ b/llvm/unittests/ExecutionEngine/JITLink/JITLinkTestUtils.h
@@ -19,7 +19,7 @@ class MockJITLinkMemoryManager : public llvm::jitlink::JITLinkMemoryManager {
public:
class Alloc {
public:
- virtual ~Alloc() {}
+ virtual ~Alloc() = default;
};
class SimpleAlloc : public Alloc {
diff --git a/llvm/unittests/MC/SystemZ/SystemZMCDisassemblerTest.cpp b/llvm/unittests/MC/SystemZ/SystemZMCDisassemblerTest.cpp
index 87fad37..25c22d1 100644
--- a/llvm/unittests/MC/SystemZ/SystemZMCDisassemblerTest.cpp
+++ b/llvm/unittests/MC/SystemZ/SystemZMCDisassemblerTest.cpp
@@ -61,7 +61,7 @@ Context &getContext() {
class SystemZMCSymbolizerTest : public MCSymbolizer {
public:
SystemZMCSymbolizerTest(MCContext &MC) : MCSymbolizer(MC, nullptr) {}
- ~SystemZMCSymbolizerTest() override {}
+ ~SystemZMCSymbolizerTest() override = default;
bool tryAddingSymbolicOperand([[maybe_unused]] MCInst &Inst,
[[maybe_unused]] raw_ostream &CStream,
diff --git a/llvm/unittests/MC/X86/X86MCDisassemblerTest.cpp b/llvm/unittests/MC/X86/X86MCDisassemblerTest.cpp
index 286528f..6d44151 100644
--- a/llvm/unittests/MC/X86/X86MCDisassemblerTest.cpp
+++ b/llvm/unittests/MC/X86/X86MCDisassemblerTest.cpp
@@ -62,7 +62,7 @@ Context &getContext() {
class X86MCSymbolizerTest : public MCSymbolizer {
public:
X86MCSymbolizerTest(MCContext &MC) : MCSymbolizer(MC, nullptr) {}
- ~X86MCSymbolizerTest() override {}
+ ~X86MCSymbolizerTest() override = default;
struct OpInfo {
int64_t Value = 0;
diff --git a/llvm/unittests/MIR/MachineMetadata.cpp b/llvm/unittests/MIR/MachineMetadata.cpp
index 0f038d9..5875512 100644
--- a/llvm/unittests/MIR/MachineMetadata.cpp
+++ b/llvm/unittests/MIR/MachineMetadata.cpp
@@ -33,7 +33,7 @@ using namespace llvm;
class MachineMetadataTest : public testing::Test {
public:
- MachineMetadataTest() {}
+ MachineMetadataTest() = default;
protected:
LLVMContext Context;
diff --git a/llvm/unittests/MIR/MachineStableHashTest.cpp b/llvm/unittests/MIR/MachineStableHashTest.cpp
index ea0de1a..bedecb1 100644
--- a/llvm/unittests/MIR/MachineStableHashTest.cpp
+++ b/llvm/unittests/MIR/MachineStableHashTest.cpp
@@ -22,7 +22,7 @@ using namespace llvm;
class MachineStableHashTest : public testing::Test {
public:
- MachineStableHashTest() {}
+ MachineStableHashTest() = default;
protected:
LLVMContext Context;
diff --git a/llvm/unittests/Object/XCOFFObjectFileTest.cpp b/llvm/unittests/Object/XCOFFObjectFileTest.cpp
index f696cde..10217f6 100644
--- a/llvm/unittests/Object/XCOFFObjectFileTest.cpp
+++ b/llvm/unittests/Object/XCOFFObjectFileTest.cpp
@@ -18,10 +18,10 @@ using namespace llvm::XCOFF;
TEST(XCOFFObjectFileTest, XCOFFObjectType) {
// Create an arbitrary object of a non-XCOFF type and test that
// dyn_cast<XCOFFObjectFile> returns null for it.
- char Buf[sizeof(typename ELF64LE::Ehdr)] = {};
+ char Buf[sizeof(ELF64LE::Ehdr)] = {};
memcpy(Buf, "\177ELF", 4);
- auto *EHdr = reinterpret_cast<typename ELF64LE::Ehdr *>(Buf);
+ auto *EHdr = reinterpret_cast<ELF64LE::Ehdr *>(Buf);
EHdr->e_ident[llvm::ELF::EI_CLASS] = llvm::ELF::ELFCLASS64;
EHdr->e_ident[llvm::ELF::EI_DATA] = llvm::ELF::ELFDATA2LSB;
diff --git a/llvm/unittests/Support/raw_ostream_proxy_test.cpp b/llvm/unittests/Support/raw_ostream_proxy_test.cpp
index 864dda7..446e64a 100644
--- a/llvm/unittests/Support/raw_ostream_proxy_test.cpp
+++ b/llvm/unittests/Support/raw_ostream_proxy_test.cpp
@@ -40,8 +40,6 @@ public:
bool IsDisplayed = false;
};
-constexpr size_t BufferedNoPwriteSmallVectorStream::PreferredBufferSize;
-
TEST(raw_ostream_proxyTest, write) {
// Besides confirming that "write" works, this test confirms that the proxy
// takes on the buffer from the stream it's proxying, such that writes to the
diff --git a/llvm/unittests/Target/AArch64/AArch64InstPrinterTest.cpp b/llvm/unittests/Target/AArch64/AArch64InstPrinterTest.cpp
index 4dfc0bc..a835a34 100644
--- a/llvm/unittests/Target/AArch64/AArch64InstPrinterTest.cpp
+++ b/llvm/unittests/Target/AArch64/AArch64InstPrinterTest.cpp
@@ -36,10 +36,8 @@ static std::string AArch64InstPrinterTestPrintAlignedLabel(uint64_t value) {
MCAsmInfo MAI;
MCInstrInfo MII;
MCRegisterInfo MRI;
- MCSubtargetInfo STI(Triple(""), "", "", "", {},
- ArrayRef((SubtargetFeatureKV *)NULL, (size_t)0),
- ArrayRef((SubtargetSubTypeKV *)NULL, (size_t)0), NULL,
- NULL, NULL, NULL, NULL, NULL);
+ MCSubtargetInfo STI(Triple(""), "", "", "", {}, {}, {}, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr);
MCContext Ctx(Triple(""), &MAI, &MRI, &STI);
MCInst MI;
diff --git a/llvm/unittests/XRay/GraphTest.cpp b/llvm/unittests/XRay/GraphTest.cpp
index 37f07cc..0d46a3d 100644
--- a/llvm/unittests/XRay/GraphTest.cpp
+++ b/llvm/unittests/XRay/GraphTest.cpp
@@ -23,8 +23,8 @@ struct EAttr {
unsigned EA;
};
typedef Graph<VAttr, EAttr, unsigned> GraphT;
-typedef typename GraphT::VertexIdentifier VI;
-typedef typename GraphT::EdgeIdentifier EI;
+typedef GraphT::VertexIdentifier VI;
+typedef GraphT::EdgeIdentifier EI;
// Test Fixture
template <typename T> class GraphTest : public testing::Test {
@@ -56,8 +56,8 @@ private:
typedef ::testing::Types<GraphT, const GraphT> GraphTestTypes;
-using VVT = typename GraphT::VertexValueType;
-using EVT = typename GraphT::EdgeValueType;
+using VVT = GraphT::VertexValueType;
+using EVT = GraphT::EdgeValueType;
TYPED_TEST_SUITE(GraphTest, GraphTestTypes, );
diff --git a/llvm/unittests/tools/llvm-exegesis/AArch64/TargetTest.cpp b/llvm/unittests/tools/llvm-exegesis/AArch64/TargetTest.cpp
index 7a66117b..5bc489b 100644
--- a/llvm/unittests/tools/llvm-exegesis/AArch64/TargetTest.cpp
+++ b/llvm/unittests/tools/llvm-exegesis/AArch64/TargetTest.cpp
@@ -28,7 +28,7 @@ using testing::IsEmpty;
using testing::Not;
using testing::NotNull;
-constexpr const char kTriple[] = "aarch64-unknown-linux";
+constexpr char kTriple[] = "aarch64-unknown-linux";
class AArch64TargetTest : public ::testing::Test {
protected:
diff --git a/llvm/unittests/tools/llvm-exegesis/PowerPC/TargetTest.cpp b/llvm/unittests/tools/llvm-exegesis/PowerPC/TargetTest.cpp
index 3708f18..0e90654 100644
--- a/llvm/unittests/tools/llvm-exegesis/PowerPC/TargetTest.cpp
+++ b/llvm/unittests/tools/llvm-exegesis/PowerPC/TargetTest.cpp
@@ -20,16 +20,13 @@
namespace llvm{
namespace exegesis {
-
-void InitializePowerPCExegesisTarget();
-
namespace {
using testing::NotNull;
using testing::IsEmpty;
using testing::Not;
-constexpr const char kTriple[] = "powerpc64le-unknown-linux";
+constexpr char kTriple[] = "powerpc64le-unknown-linux";
class PowerPCTargetTest : public PPCTestBase {
protected:
diff --git a/llvm/unittests/tools/llvm-exegesis/RISCV/TargetTest.cpp b/llvm/unittests/tools/llvm-exegesis/RISCV/TargetTest.cpp
index c86a436..13a1e5a 100644
--- a/llvm/unittests/tools/llvm-exegesis/RISCV/TargetTest.cpp
+++ b/llvm/unittests/tools/llvm-exegesis/RISCV/TargetTest.cpp
@@ -20,9 +20,6 @@
namespace llvm {
namespace exegesis {
-
-void InitializeRISCVExegesisTarget();
-
namespace {
using testing::IsEmpty;
diff --git a/llvm/unittests/tools/llvm-exegesis/X86/SnippetFileTest.cpp b/llvm/unittests/tools/llvm-exegesis/X86/SnippetFileTest.cpp
index de883ab..755a748 100644
--- a/llvm/unittests/tools/llvm-exegesis/X86/SnippetFileTest.cpp
+++ b/llvm/unittests/tools/llvm-exegesis/X86/SnippetFileTest.cpp
@@ -23,9 +23,6 @@
namespace llvm {
namespace exegesis {
-
-void InitializeX86ExegesisTarget();
-
namespace {
using testing::ElementsAre;
diff --git a/llvm/unittests/tools/llvm-exegesis/X86/SnippetGeneratorTest.cpp b/llvm/unittests/tools/llvm-exegesis/X86/SnippetGeneratorTest.cpp
index 60c7262..5953f4e 100644
--- a/llvm/unittests/tools/llvm-exegesis/X86/SnippetGeneratorTest.cpp
+++ b/llvm/unittests/tools/llvm-exegesis/X86/SnippetGeneratorTest.cpp
@@ -20,9 +20,6 @@
namespace llvm {
namespace exegesis {
-
-void InitializeX86ExegesisTarget();
-
namespace {
using testing::AnyOf;
diff --git a/llvm/unittests/tools/llvm-exegesis/X86/SnippetRepetitorTest.cpp b/llvm/unittests/tools/llvm-exegesis/X86/SnippetRepetitorTest.cpp
index 41ee402..7a40901de 100644
--- a/llvm/unittests/tools/llvm-exegesis/X86/SnippetRepetitorTest.cpp
+++ b/llvm/unittests/tools/llvm-exegesis/X86/SnippetRepetitorTest.cpp
@@ -16,9 +16,6 @@
namespace llvm {
namespace exegesis {
-
-void InitializeX86ExegesisTarget();
-
namespace {
using testing::ElementsAre;
@@ -52,8 +49,8 @@ protected:
Fill(Sink);
}
- static constexpr const unsigned kMinInstructions = 3;
- static constexpr const unsigned kLoopBodySize = 5;
+ static constexpr unsigned kMinInstructions = 3;
+ static constexpr unsigned kLoopBodySize = 5;
std::unique_ptr<TargetMachine> TM;
std::unique_ptr<LLVMContext> Context;
diff --git a/llvm/unittests/tools/llvm-exegesis/X86/SubprocessMemoryTest.cpp b/llvm/unittests/tools/llvm-exegesis/X86/SubprocessMemoryTest.cpp
index a0cad28..08c18e4 100644
--- a/llvm/unittests/tools/llvm-exegesis/X86/SubprocessMemoryTest.cpp
+++ b/llvm/unittests/tools/llvm-exegesis/X86/SubprocessMemoryTest.cpp
@@ -29,7 +29,7 @@ namespace exegesis {
// This needs to be updated anytime a test is added or removed from the test
// suite.
-static constexpr const size_t TestCount = 4;
+static constexpr size_t TestCount = 4;
class SubprocessMemoryTest : public X86TestBase {
protected:
diff --git a/llvm/unittests/tools/llvm-exegesis/X86/TargetTest.cpp b/llvm/unittests/tools/llvm-exegesis/X86/TargetTest.cpp
index 846729c6..5a21a69 100644
--- a/llvm/unittests/tools/llvm-exegesis/X86/TargetTest.cpp
+++ b/llvm/unittests/tools/llvm-exegesis/X86/TargetTest.cpp
@@ -53,9 +53,6 @@ bool operator==(const MCInst &a, const MCInst &b) {
namespace llvm {
namespace exegesis {
-
-void InitializeX86ExegesisTarget();
-
namespace {
using testing::AllOf;
@@ -585,7 +582,7 @@ TEST_F(X86Core2TargetTest, SetRegToDf0) {
TEST_F(X86Core2Avx512TargetTest, FillMemoryOperands_ADD64rm) {
const Instruction &I = getInstr(X86::ADD64rm);
InstructionTemplate IT(&I);
- constexpr const int kOffset = 42;
+ constexpr int kOffset = 42;
State.getExegesisTarget().fillMemoryOperands(IT, X86::RDI, kOffset);
// Memory is operands 2-6.
EXPECT_THAT(IT.getValueFor(I.Operands[2]), IsReg(X86::RDI));
@@ -598,7 +595,7 @@ TEST_F(X86Core2Avx512TargetTest, FillMemoryOperands_ADD64rm) {
TEST_F(X86Core2Avx512TargetTest, FillMemoryOperands_VGATHERDPSZ128rm) {
const Instruction &I = getInstr(X86::VGATHERDPSZ128rm);
InstructionTemplate IT(&I);
- constexpr const int kOffset = 42;
+ constexpr int kOffset = 42;
State.getExegesisTarget().fillMemoryOperands(IT, X86::RDI, kOffset);
// Memory is operands 4-8.
EXPECT_THAT(IT.getValueFor(I.Operands[4]), IsReg(X86::RDI));
@@ -628,9 +625,9 @@ TEST_F(X86Core2TargetTest, GenerateLowerMunmapTest) {
}
#ifdef __arm__
-static constexpr const uintptr_t VAddressSpaceCeiling = 0xC0000000;
+static constexpr uintptr_t VAddressSpaceCeiling = 0xC0000000;
#else
-static constexpr const uintptr_t VAddressSpaceCeiling = 0x0000800000000000;
+static constexpr uintptr_t VAddressSpaceCeiling = 0x0000800000000000;
#endif
TEST_F(X86Core2TargetTest, GenerateUpperMunmapTest) {
diff --git a/llvm/unittests/tools/llvm-exegesis/X86/TestBase.h b/llvm/unittests/tools/llvm-exegesis/X86/TestBase.h
index 4122726..b4c84d1 100644
--- a/llvm/unittests/tools/llvm-exegesis/X86/TestBase.h
+++ b/llvm/unittests/tools/llvm-exegesis/X86/TestBase.h
@@ -22,7 +22,7 @@ namespace exegesis {
void InitializeX86ExegesisTarget();
-constexpr const char kTriple[] = "x86_64-unknown-linux";
+constexpr char kTriple[] = "x86_64-unknown-linux";
class X86TestBase : public ::testing::Test {
protected:
diff --git a/llvm/utils/FileCheck/FileCheck.cpp b/llvm/utils/FileCheck/FileCheck.cpp
index 305c28b..a5473f9 100644
--- a/llvm/utils/FileCheck/FileCheck.cpp
+++ b/llvm/utils/FileCheck/FileCheck.cpp
@@ -193,7 +193,7 @@ struct MarkerStyle {
std::string Note;
/// Does this marker indicate inclusion by -dump-input-filter=error?
bool FiltersAsError;
- MarkerStyle() {}
+ MarkerStyle() = default;
MarkerStyle(char Lead, raw_ostream::Colors Color,
const std::string &Note = "", bool FiltersAsError = false)
: Lead(Lead), Color(Color), Note(Note), FiltersAsError(FiltersAsError) {
diff --git a/llvm/utils/TableGen/Basic/ARMTargetDefEmitter.cpp b/llvm/utils/TableGen/Basic/ARMTargetDefEmitter.cpp
index 3f284ee..b63ce36 100644
--- a/llvm/utils/TableGen/Basic/ARMTargetDefEmitter.cpp
+++ b/llvm/utils/TableGen/Basic/ARMTargetDefEmitter.cpp
@@ -220,7 +220,7 @@ static void emitARMTargetDef(const RecordKeeper &RK, raw_ostream &OS) {
ProfileLower + "'");
// Name of the object in C++
- const std::string CppSpelling = ArchInfoName(Major, Minor, ProfileUpper);
+ std::string CppSpelling = ArchInfoName(Major, Minor, ProfileUpper);
OS << "inline constexpr ArchInfo " << CppSpelling << " = {\n";
CppSpellings.push_back(std::move(CppSpelling));
diff --git a/llvm/utils/TableGen/Common/CodeGenRegisters.cpp b/llvm/utils/TableGen/Common/CodeGenRegisters.cpp
index 8d0ec9a..2eb94b7e 100644
--- a/llvm/utils/TableGen/Common/CodeGenRegisters.cpp
+++ b/llvm/utils/TableGen/Common/CodeGenRegisters.cpp
@@ -1651,8 +1651,7 @@ template <> struct llvm::GraphTraits<SubRegIndexCompositionGraph> {
struct ChildIteratorType
: public iterator_adaptor_base<
ChildIteratorType, CompMapIt,
- typename std::iterator_traits<CompMapIt>::iterator_category,
- NodeRef> {
+ std::iterator_traits<CompMapIt>::iterator_category, NodeRef> {
ChildIteratorType(CompMapIt I)
: ChildIteratorType::iterator_adaptor_base(I) {}
diff --git a/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.h b/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.h
index fdcca1d..84dfca4 100644
--- a/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.h
+++ b/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.h
@@ -621,7 +621,7 @@ public:
DefinedInsnVariablesMap::const_iterator defined_insn_vars_end() const {
return InsnVariableIDs.end();
}
- iterator_range<typename DefinedInsnVariablesMap::const_iterator>
+ iterator_range<DefinedInsnVariablesMap::const_iterator>
defined_insn_vars() const {
return make_range(defined_insn_vars_begin(), defined_insn_vars_end());
}
@@ -632,8 +632,7 @@ public:
MutatableInsnSet::const_iterator mutatable_insns_end() const {
return MutatableInsns.end();
}
- iterator_range<typename MutatableInsnSet::const_iterator>
- mutatable_insns() const {
+ iterator_range<MutatableInsnSet::const_iterator> mutatable_insns() const {
return make_range(mutatable_insns_begin(), mutatable_insns_end());
}
void reserveInsnMatcherForMutation(InstructionMatcher *InsnMatcher) {
diff --git a/llvm/utils/TableGen/Common/InfoByHwMode.cpp b/llvm/utils/TableGen/Common/InfoByHwMode.cpp
index 4c8197d..2b3155c 100644
--- a/llvm/utils/TableGen/Common/InfoByHwMode.cpp
+++ b/llvm/utils/TableGen/Common/InfoByHwMode.cpp
@@ -174,7 +174,7 @@ bool RegSizeInfoByHwMode::hasStricterSpillThan(
}
void RegSizeInfoByHwMode::writeToStream(raw_ostream &OS) const {
- typedef typename decltype(Map)::value_type PairType;
+ typedef decltype(Map)::value_type PairType;
std::vector<const PairType *> Pairs;
for (const auto &P : Map)
Pairs.push_back(&P);
diff --git a/llvm/utils/TableGen/RegisterBankEmitter.cpp b/llvm/utils/TableGen/RegisterBankEmitter.cpp
index 61b0b66..60aa2d8 100644
--- a/llvm/utils/TableGen/RegisterBankEmitter.cpp
+++ b/llvm/utils/TableGen/RegisterBankEmitter.cpp
@@ -100,8 +100,7 @@ public:
return RCsWithLargestRegSize[HwMode];
}
- iterator_range<typename RegisterClassesTy::const_iterator>
- register_classes() const {
+ iterator_range<RegisterClassesTy::const_iterator> register_classes() const {
return RCs;
}
};
diff --git a/llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/bugprone/BUILD.gn b/llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/bugprone/BUILD.gn
index 0361233..2f84999 100644
--- a/llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/bugprone/BUILD.gn
+++ b/llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/bugprone/BUILD.gn
@@ -32,6 +32,7 @@ static_library("bugprone") {
"CopyConstructorInitCheck.cpp",
"CrtpConstructorAccessibilityCheck.cpp",
"DanglingHandleCheck.cpp",
+ "DefaultOperatorNewOnOveralignedTypeCheck.cpp",
"DerivedMethodShadowingBaseMethodCheck.cpp",
"DynamicStaticInitializersCheck.cpp",
"EasilySwappableParametersCheck.cpp",
@@ -69,6 +70,7 @@ static_library("bugprone") {
"ParentVirtualCallCheck.cpp",
"PointerArithmeticOnPolymorphicObjectCheck.cpp",
"PosixReturnCheck.cpp",
+ "RawMemoryCallOnNonTrivialTypeCheck.cpp",
"RedundantBranchConditionCheck.cpp",
"ReservedIdentifierCheck.cpp",
"ReturnConstRefFromParameterCheck.cpp",
diff --git a/llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/cert/BUILD.gn b/llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/cert/BUILD.gn
index b097e13..ec642b6 100644
--- a/llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/cert/BUILD.gn
+++ b/llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/cert/BUILD.gn
@@ -16,12 +16,10 @@ static_library("cert") {
]
sources = [
"CERTTidyModule.cpp",
- "DefaultOperatorNewAlignmentCheck.cpp",
"DontModifyStdNamespaceCheck.cpp",
"FloatLoopCounter.cpp",
"LimitedRandomnessCheck.cpp",
"MutatingCopyCheck.cpp",
- "NonTrivialTypesLibcMemoryCallsCheck.cpp",
"ProperlySeededRandomGeneratorCheck.cpp",
"ThrownExceptionTypeCheck.cpp",
]
diff --git a/llvm/utils/gn/secondary/libcxx/include/BUILD.gn b/llvm/utils/gn/secondary/libcxx/include/BUILD.gn
index c20d2aa..9e0b951 100644
--- a/llvm/utils/gn/secondary/libcxx/include/BUILD.gn
+++ b/llvm/utils/gn/secondary/libcxx/include/BUILD.gn
@@ -1524,6 +1524,7 @@ if (current_toolchain == default_toolchain) {
"__type_traits/is_valid_expansion.h",
"__type_traits/is_void.h",
"__type_traits/is_volatile.h",
+ "__type_traits/is_within_lifetime.h",
"__type_traits/lazy.h",
"__type_traits/make_32_64_or_128_bit.h",
"__type_traits/make_const_lvalue_ref.h",
diff --git a/llvm/utils/gn/secondary/lldb/tools/lldb-dap/tool/BUILD.gn b/llvm/utils/gn/secondary/lldb/tools/lldb-dap/tool/BUILD.gn
index 8b764843..1773fe3 100644
--- a/llvm/utils/gn/secondary/lldb/tools/lldb-dap/tool/BUILD.gn
+++ b/llvm/utils/gn/secondary/lldb/tools/lldb-dap/tool/BUILD.gn
@@ -5,7 +5,7 @@ import("//llvm/version.gni")
tablegen("Options") {
visibility = [ ":lldb-dap" ]
args = [ "-gen-opt-parser-defs" ]
- td_file = "../Options.td"
+ td_file = "Options.td"
}
if (host_os == "mac") {
diff --git a/llvm/utils/gn/secondary/llvm/lib/CAS/BUILD.gn b/llvm/utils/gn/secondary/llvm/lib/CAS/BUILD.gn
index 5590b27..1e0e918 100644
--- a/llvm/utils/gn/secondary/llvm/lib/CAS/BUILD.gn
+++ b/llvm/utils/gn/secondary/llvm/lib/CAS/BUILD.gn
@@ -4,14 +4,17 @@ static_library("CAS") {
"ActionCache.cpp",
"ActionCaches.cpp",
"BuiltinCAS.cpp",
+ "BuiltinUnifiedCASDatabases.cpp",
"DatabaseFile.cpp",
"InMemoryCAS.cpp",
"MappedFileRegionArena.cpp",
"ObjectStore.cpp",
+ "OnDiskCAS.cpp",
"OnDiskCommon.cpp",
"OnDiskDataAllocator.cpp",
"OnDiskGraphDB.cpp",
"OnDiskKeyValueDB.cpp",
"OnDiskTrieRawHashMap.cpp",
+ "UnifiedOnDiskCache.cpp",
]
}
diff --git a/llvm/utils/gn/secondary/llvm/lib/ExecutionEngine/Orc/TargetProcess/BUILD.gn b/llvm/utils/gn/secondary/llvm/lib/ExecutionEngine/Orc/TargetProcess/BUILD.gn
index c4ce990..937e81b 100644
--- a/llvm/utils/gn/secondary/llvm/lib/ExecutionEngine/Orc/TargetProcess/BUILD.gn
+++ b/llvm/utils/gn/secondary/llvm/lib/ExecutionEngine/Orc/TargetProcess/BUILD.gn
@@ -12,6 +12,8 @@ static_library("TargetProcess") {
"JITLoaderGDB.cpp",
"JITLoaderPerf.cpp",
"JITLoaderVTune.cpp",
+ "LibraryResolver.cpp",
+ "LibraryScanner.cpp",
"OrcRTBootstrap.cpp",
"RegisterEHFrames.cpp",
"SimpleExecutorDylibManager.cpp",
diff --git a/llvm/utils/gn/secondary/llvm/unittests/CAS/BUILD.gn b/llvm/utils/gn/secondary/llvm/unittests/CAS/BUILD.gn
index 2d9eb68..b10e0e6 100644
--- a/llvm/utils/gn/secondary/llvm/unittests/CAS/BUILD.gn
+++ b/llvm/utils/gn/secondary/llvm/unittests/CAS/BUILD.gn
@@ -9,8 +9,10 @@ unittest("CASTests") {
]
sources = [
"ActionCacheTest.cpp",
+ "BuiltinUnifiedCASDatabasesTest.cpp",
"CASTestConfig.cpp",
"ObjectStoreTest.cpp",
+ "UnifiedOnDiskCacheTest.cpp",
]
if (llvm_enable_ondisk_cas) {
diff --git a/llvm/utils/gn/secondary/llvm/unittests/ExecutionEngine/Orc/BUILD.gn b/llvm/utils/gn/secondary/llvm/unittests/ExecutionEngine/Orc/BUILD.gn
index dfe6d6d..111e4c9 100644
--- a/llvm/utils/gn/secondary/llvm/unittests/ExecutionEngine/Orc/BUILD.gn
+++ b/llvm/utils/gn/secondary/llvm/unittests/ExecutionEngine/Orc/BUILD.gn
@@ -24,6 +24,7 @@ unittest("OrcJITTests") {
"JITLinkRedirectionManagerTest.cpp",
"JITTargetMachineBuilderTest.cpp",
"LazyCallThroughAndReexportsTest.cpp",
+ "LibraryResolverTest.cpp",
"LookupAndRecordAddrsTest.cpp",
"MachOPlatformTest.cpp",
"MapperJITLinkMemoryManagerTest.cpp",
diff --git a/llvm/utils/profcheck-xfail.txt b/llvm/utils/profcheck-xfail.txt
index 380b162..661c881 100644
--- a/llvm/utils/profcheck-xfail.txt
+++ b/llvm/utils/profcheck-xfail.txt
@@ -917,7 +917,6 @@ Transforms/InstCombine/select_frexp.ll
Transforms/InstCombine/select.ll
Transforms/InstCombine/select-min-max.ll
Transforms/InstCombine/select-of-symmetric-selects.ll
-Transforms/InstCombine/select-safe-transforms.ll
Transforms/InstCombine/select-select.ll
Transforms/InstCombine/select-with-extreme-eq-cond.ll
Transforms/InstCombine/shift.ll
diff --git a/mlir/include/mlir/Dialect/GPU/IR/GPUDialect.h b/mlir/include/mlir/Dialect/GPU/IR/GPUDialect.h
index 7b53594..a9886d1 100644
--- a/mlir/include/mlir/Dialect/GPU/IR/GPUDialect.h
+++ b/mlir/include/mlir/Dialect/GPU/IR/GPUDialect.h
@@ -178,8 +178,8 @@ enum class SparseHandleKind { SpMat, DnTensor, SpGEMMOp };
class SparseDnTensorHandleType
: public Type::TypeBase<SparseDnTensorHandleType, Type, TypeStorage> {
public:
- using Base = typename Type::TypeBase<SparseDnTensorHandleType, Type,
- TypeStorage>::Base;
+ using Base =
+ Type::TypeBase<SparseDnTensorHandleType, Type, TypeStorage>::Base;
using Base::Base;
static constexpr StringLiteral name = "gpu.sparse.dntensor_handle";
@@ -188,8 +188,7 @@ public:
class SparseSpMatHandleType
: public Type::TypeBase<SparseSpMatHandleType, Type, TypeStorage> {
public:
- using Base =
- typename Type::TypeBase<SparseSpMatHandleType, Type, TypeStorage>::Base;
+ using Base = Type::TypeBase<SparseSpMatHandleType, Type, TypeStorage>::Base;
using Base::Base;
static constexpr StringLiteral name = "gpu.sparse.spmat_handle";
@@ -198,8 +197,8 @@ public:
class SparseSpGEMMOpHandleType
: public Type::TypeBase<SparseSpGEMMOpHandleType, Type, TypeStorage> {
public:
- using Base = typename Type::TypeBase<SparseSpGEMMOpHandleType, Type,
- TypeStorage>::Base;
+ using Base =
+ Type::TypeBase<SparseSpGEMMOpHandleType, Type, TypeStorage>::Base;
using Base::Base;
static constexpr StringLiteral name = "gpu.sparse.spgemmop_handle";
diff --git a/mlir/include/mlir/IR/BlockSupport.h b/mlir/include/mlir/IR/BlockSupport.h
index f9fbef2..a2e080e 100644
--- a/mlir/include/mlir/IR/BlockSupport.h
+++ b/mlir/include/mlir/IR/BlockSupport.h
@@ -206,12 +206,12 @@ namespace ilist_detail {
// operations to have trailing Regions without a circular include
// dependence.
template <>
-struct SpecificNodeAccess<
- typename compute_node_options<::mlir::Operation>::type> : NodeAccess {
+struct SpecificNodeAccess<compute_node_options<::mlir::Operation>::type>
+ : NodeAccess {
protected:
- using OptionsT = typename compute_node_options<mlir::Operation>::type;
- using pointer = typename OptionsT::pointer;
- using const_pointer = typename OptionsT::const_pointer;
+ using OptionsT = compute_node_options<mlir::Operation>::type;
+ using pointer = OptionsT::pointer;
+ using const_pointer = OptionsT::const_pointer;
using node_type = ilist_node_impl<OptionsT>;
static node_type *getNodePtr(pointer N);
diff --git a/mlir/include/mlir/Interfaces/TilingInterface.td b/mlir/include/mlir/Interfaces/TilingInterface.td
index 0c0fc88..e0516ab 100644
--- a/mlir/include/mlir/Interfaces/TilingInterface.td
+++ b/mlir/include/mlir/Interfaces/TilingInterface.td
@@ -57,8 +57,8 @@ def TilingInterface : OpInterface<"TilingInterface"> {
For an operation to be "tiled and fused" with its (already tiled) producer,
an operation has to implement the following additional methods (see
description below):
- - `getTiledImplementationFromOperandTile`
- - `getIterationDomainTileFromOperandTile`.
+ - `getTiledImplementationFromOperandTiles`
+ - `getIterationDomainTileFromOperandTiles`.
}];
let cppNamespace = "::mlir";
let methods = [
diff --git a/mlir/lib/AsmParser/Parser.cpp b/mlir/lib/AsmParser/Parser.cpp
index 82bdb84..74936e3 100644
--- a/mlir/lib/AsmParser/Parser.cpp
+++ b/mlir/lib/AsmParser/Parser.cpp
@@ -407,8 +407,8 @@ Parser::parseFloatFromIntegerLiteral(std::optional<APFloat> &result,
"hexadecimal float constant out of range for type");
}
- APInt truncatedValue(typeSizeInBits, intValue.getNumWords(),
- intValue.getRawData());
+ APInt truncatedValue(typeSizeInBits,
+ ArrayRef(intValue.getRawData(), intValue.getNumWords()));
result.emplace(semantics, truncatedValue);
return success();
}
diff --git a/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp b/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp
index ba57155..03ed4d5 100644
--- a/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp
+++ b/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp
@@ -240,8 +240,7 @@ struct CmpFOpLowering : public ConvertOpToLLVMPattern<arith::CmpFOp> {
struct SelectOpOneToNLowering : public ConvertOpToLLVMPattern<arith::SelectOp> {
using ConvertOpToLLVMPattern::ConvertOpToLLVMPattern;
- using Adaptor =
- typename ConvertOpToLLVMPattern<arith::SelectOp>::OneToNOpAdaptor;
+ using Adaptor = ConvertOpToLLVMPattern<arith::SelectOp>::OneToNOpAdaptor;
LogicalResult
matchAndRewrite(arith::SelectOp op, Adaptor adaptor,
diff --git a/mlir/lib/Conversion/ControlFlowToLLVM/ControlFlowToLLVM.cpp b/mlir/lib/Conversion/ControlFlowToLLVM/ControlFlowToLLVM.cpp
index 798d8b0..b75968e 100644
--- a/mlir/lib/Conversion/ControlFlowToLLVM/ControlFlowToLLVM.cpp
+++ b/mlir/lib/Conversion/ControlFlowToLLVM/ControlFlowToLLVM.cpp
@@ -137,8 +137,7 @@ static SmallVector<Value> flattenValues(ArrayRef<ValueRange> values) {
/// op to llvm.br.
struct BranchOpLowering : public ConvertOpToLLVMPattern<cf::BranchOp> {
using ConvertOpToLLVMPattern<cf::BranchOp>::ConvertOpToLLVMPattern;
- using Adaptor =
- typename ConvertOpToLLVMPattern<cf::BranchOp>::OneToNOpAdaptor;
+ using Adaptor = ConvertOpToLLVMPattern<cf::BranchOp>::OneToNOpAdaptor;
LogicalResult
matchAndRewrite(cf::BranchOp op, Adaptor adaptor,
@@ -163,8 +162,7 @@ struct BranchOpLowering : public ConvertOpToLLVMPattern<cf::BranchOp> {
/// branch op to llvm.cond_br.
struct CondBranchOpLowering : public ConvertOpToLLVMPattern<cf::CondBranchOp> {
using ConvertOpToLLVMPattern<cf::CondBranchOp>::ConvertOpToLLVMPattern;
- using Adaptor =
- typename ConvertOpToLLVMPattern<cf::CondBranchOp>::OneToNOpAdaptor;
+ using Adaptor = ConvertOpToLLVMPattern<cf::CondBranchOp>::OneToNOpAdaptor;
LogicalResult
matchAndRewrite(cf::CondBranchOp op, Adaptor adaptor,
@@ -204,7 +202,7 @@ struct SwitchOpLowering : public ConvertOpToLLVMPattern<cf::SwitchOp> {
using ConvertOpToLLVMPattern<cf::SwitchOp>::ConvertOpToLLVMPattern;
LogicalResult
- matchAndRewrite(cf::SwitchOp op, typename cf::SwitchOp::Adaptor adaptor,
+ matchAndRewrite(cf::SwitchOp op, cf::SwitchOp::Adaptor adaptor,
ConversionPatternRewriter &rewriter) const override {
// Get or convert default block.
FailureOr<Block *> convertedDefaultBlock = getConvertedBlock(
diff --git a/mlir/lib/Conversion/MathToROCDL/MathToROCDL.cpp b/mlir/lib/Conversion/MathToROCDL/MathToROCDL.cpp
index a2dfc12..a922338 100644
--- a/mlir/lib/Conversion/MathToROCDL/MathToROCDL.cpp
+++ b/mlir/lib/Conversion/MathToROCDL/MathToROCDL.cpp
@@ -68,7 +68,7 @@ struct ClampFOpConversion final
return LLVM::detail::handleMultidimensionalVectors(
op.getOperation(), adaptor.getOperands(), *getTypeConverter(),
[&](Type llvm1DVectorTy, ValueRange operands) -> Value {
- typename math::ClampFOp::Adaptor adaptor(operands);
+ math::ClampFOp::Adaptor adaptor(operands);
return ROCDL::FMed3Op::create(rewriter, op.getLoc(), llvm1DVectorTy,
adaptor.getValue(), adaptor.getMin(),
adaptor.getMax());
diff --git a/mlir/lib/Dialect/EmitC/IR/EmitC.cpp b/mlir/lib/Dialect/EmitC/IR/EmitC.cpp
index 0992ce14..d478220 100644
--- a/mlir/lib/Dialect/EmitC/IR/EmitC.cpp
+++ b/mlir/lib/Dialect/EmitC/IR/EmitC.cpp
@@ -584,6 +584,10 @@ void ForOp::print(OpAsmPrinter &p) {
LogicalResult ForOp::verifyRegions() {
// Check that the body defines as single block argument for the induction
// variable.
+ if (getBody()->getNumArguments() != 1)
+ return emitOpError("expected body to have a single block argument for the "
+ "induction variable");
+
if (getInductionVar().getType() != getLowerBound().getType())
return emitOpError(
"expected induction variable to be same type as bounds and step");
diff --git a/mlir/lib/Dialect/SCF/IR/SCF.cpp b/mlir/lib/Dialect/SCF/IR/SCF.cpp
index 2946b53..881e256 100644
--- a/mlir/lib/Dialect/SCF/IR/SCF.cpp
+++ b/mlir/lib/Dialect/SCF/IR/SCF.cpp
@@ -2565,6 +2565,39 @@ struct ConvertTrivialIfToSelect : public OpRewritePattern<IfOp> {
struct ConditionPropagation : public OpRewritePattern<IfOp> {
using OpRewritePattern<IfOp>::OpRewritePattern;
+ /// Kind of parent region in the ancestor cache.
+ enum class Parent { Then, Else, None };
+
+ /// Returns the kind of region ("then", "else", or "none") of the
+ /// IfOp that the given region is transitively nested in. Updates
+ /// the cache accordingly.
+ static Parent getParentType(Region *toCheck, IfOp op,
+ DenseMap<Region *, Parent> &cache,
+ Region *endRegion) {
+ SmallVector<Region *> seen;
+ while (toCheck != endRegion) {
+ auto found = cache.find(toCheck);
+ if (found != cache.end())
+ return found->second;
+ seen.push_back(toCheck);
+ if (&op.getThenRegion() == toCheck) {
+ for (Region *region : seen)
+ cache[region] = Parent::Then;
+ return Parent::Then;
+ }
+ if (&op.getElseRegion() == toCheck) {
+ for (Region *region : seen)
+ cache[region] = Parent::Else;
+ return Parent::Else;
+ }
+ toCheck = toCheck->getParentRegion();
+ }
+
+ for (Region *region : seen)
+ cache[region] = Parent::None;
+ return Parent::None;
+ }
+
LogicalResult matchAndRewrite(IfOp op,
PatternRewriter &rewriter) const override {
// Early exit if the condition is constant since replacing a constant
@@ -2580,9 +2613,12 @@ struct ConditionPropagation : public OpRewritePattern<IfOp> {
Value constantTrue = nullptr;
Value constantFalse = nullptr;
+ DenseMap<Region *, Parent> cache;
for (OpOperand &use :
llvm::make_early_inc_range(op.getCondition().getUses())) {
- if (op.getThenRegion().isAncestor(use.getOwner()->getParentRegion())) {
+ switch (getParentType(use.getOwner()->getParentRegion(), op, cache,
+ op.getCondition().getParentRegion())) {
+ case Parent::Then: {
changed = true;
if (!constantTrue)
@@ -2591,8 +2627,9 @@ struct ConditionPropagation : public OpRewritePattern<IfOp> {
rewriter.modifyOpInPlace(use.getOwner(),
[&]() { use.set(constantTrue); });
- } else if (op.getElseRegion().isAncestor(
- use.getOwner()->getParentRegion())) {
+ break;
+ }
+ case Parent::Else: {
changed = true;
if (!constantFalse)
@@ -2601,6 +2638,10 @@ struct ConditionPropagation : public OpRewritePattern<IfOp> {
rewriter.modifyOpInPlace(use.getOwner(),
[&]() { use.set(constantFalse); });
+ break;
+ }
+ case Parent::None:
+ break;
}
}
diff --git a/mlir/lib/Dialect/SparseTensor/Transforms/SparseTensorCodegen.cpp b/mlir/lib/Dialect/SparseTensor/Transforms/SparseTensorCodegen.cpp
index 7a26cd3..1fbcf5f 100644
--- a/mlir/lib/Dialect/SparseTensor/Transforms/SparseTensorCodegen.cpp
+++ b/mlir/lib/Dialect/SparseTensor/Transforms/SparseTensorCodegen.cpp
@@ -1050,7 +1050,7 @@ public:
/// Sparse codegen rule for position accesses.
class SparseToPositionsConverter : public OpConversionPattern<ToPositionsOp> {
public:
- using OpAdaptor = typename ToPositionsOp::Adaptor;
+ using OpAdaptor = ToPositionsOp::Adaptor;
using OpConversionPattern<ToPositionsOp>::OpConversionPattern;
LogicalResult
matchAndRewrite(ToPositionsOp op, OneToNOpAdaptor adaptor,
@@ -1073,7 +1073,7 @@ public:
class SparseToCoordinatesConverter
: public OpConversionPattern<ToCoordinatesOp> {
public:
- using OpAdaptor = typename ToCoordinatesOp::Adaptor;
+ using OpAdaptor = ToCoordinatesOp::Adaptor;
using OpConversionPattern<ToCoordinatesOp>::OpConversionPattern;
LogicalResult
matchAndRewrite(ToCoordinatesOp op, OneToNOpAdaptor adaptor,
@@ -1099,7 +1099,7 @@ public:
class SparseToCoordinatesBufferConverter
: public OpConversionPattern<ToCoordinatesBufferOp> {
public:
- using OpAdaptor = typename ToCoordinatesBufferOp::Adaptor;
+ using OpAdaptor = ToCoordinatesBufferOp::Adaptor;
using OpConversionPattern<ToCoordinatesBufferOp>::OpConversionPattern;
LogicalResult
matchAndRewrite(ToCoordinatesBufferOp op, OneToNOpAdaptor adaptor,
@@ -1121,7 +1121,7 @@ public:
/// Sparse codegen rule for value accesses.
class SparseToValuesConverter : public OpConversionPattern<ToValuesOp> {
public:
- using OpAdaptor = typename ToValuesOp::Adaptor;
+ using OpAdaptor = ToValuesOp::Adaptor;
using OpConversionPattern<ToValuesOp>::OpConversionPattern;
LogicalResult
matchAndRewrite(ToValuesOp op, OneToNOpAdaptor adaptor,
diff --git a/mlir/lib/IR/Operation.cpp b/mlir/lib/IR/Operation.cpp
index ce421f4..8212d6d 100644
--- a/mlir/lib/IR/Operation.cpp
+++ b/mlir/lib/IR/Operation.cpp
@@ -463,28 +463,26 @@ void Operation::updateOrderIfNecessary() {
//===----------------------------------------------------------------------===//
auto llvm::ilist_detail::SpecificNodeAccess<
- typename llvm::ilist_detail::compute_node_options<
- ::mlir::Operation>::type>::getNodePtr(pointer n) -> node_type * {
+ llvm::ilist_detail::compute_node_options<::mlir::Operation>::type>::
+ getNodePtr(pointer n) -> node_type * {
return NodeAccess::getNodePtr<OptionsT>(n);
}
auto llvm::ilist_detail::SpecificNodeAccess<
- typename llvm::ilist_detail::compute_node_options<
- ::mlir::Operation>::type>::getNodePtr(const_pointer n)
- -> const node_type * {
+ llvm::ilist_detail::compute_node_options<::mlir::Operation>::type>::
+ getNodePtr(const_pointer n) -> const node_type * {
return NodeAccess::getNodePtr<OptionsT>(n);
}
auto llvm::ilist_detail::SpecificNodeAccess<
- typename llvm::ilist_detail::compute_node_options<
- ::mlir::Operation>::type>::getValuePtr(node_type *n) -> pointer {
+ llvm::ilist_detail::compute_node_options<::mlir::Operation>::type>::
+ getValuePtr(node_type *n) -> pointer {
return NodeAccess::getValuePtr<OptionsT>(n);
}
auto llvm::ilist_detail::SpecificNodeAccess<
- typename llvm::ilist_detail::compute_node_options<
- ::mlir::Operation>::type>::getValuePtr(const node_type *n)
- -> const_pointer {
+ llvm::ilist_detail::compute_node_options<::mlir::Operation>::type>::
+ getValuePtr(const node_type *n) -> const_pointer {
return NodeAccess::getValuePtr<OptionsT>(n);
}
diff --git a/mlir/test/Dialect/EmitC/invalid_ops.mlir b/mlir/test/Dialect/EmitC/invalid_ops.mlir
index 5f594fb..f285196 100644
--- a/mlir/test/Dialect/EmitC/invalid_ops.mlir
+++ b/mlir/test/Dialect/EmitC/invalid_ops.mlir
@@ -876,3 +876,41 @@ func.func @test_do(%arg0 : !emitc.ptr<i32>) {
return
}
+
+// -----
+
+func.func @test_for_none_block_argument(%arg0: index) {
+ // expected-error@+1 {{expected body to have a single block argument for the induction variable}}
+ "emitc.for"(%arg0, %arg0, %arg0) (
+ {
+ emitc.yield
+ }
+ ) : (index, index, index) -> ()
+ return
+}
+
+// -----
+
+func.func @test_for_more_than_one_block_argument(%arg0: index) {
+ // expected-error@+1 {{expected body to have a single block argument for the induction variable}}
+ "emitc.for"(%arg0, %arg0, %arg0) (
+ {
+ ^bb0(%i0 : index, %i1 : index):
+ emitc.yield
+ }
+ ) : (index, index, index) -> ()
+ return
+}
+
+// -----
+
+func.func @test_for_unmatch_type(%arg0: index) {
+ // expected-error@+1 {{expected induction variable to be same type as bounds}}
+ "emitc.for"(%arg0, %arg0, %arg0) (
+ {
+ ^bb0(%i0 : f32):
+ emitc.yield
+ }
+ ) : (index, index, index) -> ()
+ return
+}
diff --git a/mlir/test/python/CMakeLists.txt b/mlir/test/python/CMakeLists.txt
index 2c12381..c81f75f 100644
--- a/mlir/test/python/CMakeLists.txt
+++ b/mlir/test/python/CMakeLists.txt
@@ -11,7 +11,7 @@ add_public_tablegen_target(MLIRPythonTestIncGen)
add_subdirectory(lib)
-set(MLIR_PYTHON_TEST_DEPENDS MLIRPythonModules mlir-runner)
+set(MLIR_PYTHON_TEST_DEPENDS MLIRPythonModules mlir-runner mlir_c_runner_utils mlir_runner_utils)
if(NOT MLIR_STANDALONE_BUILD)
list(APPEND MLIR_PYTHON_TEST_DEPENDS FileCheck count not)
endif()
diff --git a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
index f92a26f..4d9b1b2 100644
--- a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
+++ b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
@@ -2632,11 +2632,13 @@ void OpEmitter::genInlineCreateBody(
interleaveComma(nonBuilderStateArgsList, nonBuilderStateArgsOS);
nonBuilderStateArgs = ", " + nonBuilderStateArgs;
}
- cWithLoc->body() << llvm::formatv(inlineCreateBody, locParamName,
- nonBuilderStateArgs,
- opClass.getClassName());
- cImplicitLoc->body() << llvm::formatv(inlineCreateBodyImplicitLoc,
- nonBuilderStateArgs);
+ if (cWithLoc)
+ cWithLoc->body() << llvm::formatv(inlineCreateBody, locParamName,
+ nonBuilderStateArgs,
+ opClass.getClassName());
+ if (cImplicitLoc)
+ cImplicitLoc->body() << llvm::formatv(inlineCreateBodyImplicitLoc,
+ nonBuilderStateArgs);
}
void OpEmitter::genSeparateArgParamBuilder() {
diff --git a/openmp/runtime/src/z_Linux_asm.S b/openmp/runtime/src/z_Linux_asm.S
index 684c7e2..12fea67 100644
--- a/openmp/runtime/src/z_Linux_asm.S
+++ b/openmp/runtime/src/z_Linux_asm.S
@@ -1358,10 +1358,10 @@ __tid = 8
PROC __kmp_invoke_microtask
PACBTI_C
- stp x29, x30, [sp, #-16]!
# if OMPT_SUPPORT
stp x19, x20, [sp, #-16]!
# endif
+ stp x29, x30, [sp, #-16]!
mov x29, sp
orr w9, wzr, #1
@@ -1415,11 +1415,11 @@ KMP_LABEL(kmp_1):
blr x8
orr w0, wzr, #1
mov sp, x29
+ ldp x29, x30, [sp], #16
# if OMPT_SUPPORT
str xzr, [x19]
ldp x19, x20, [sp], #16
# endif
- ldp x29, x30, [sp], #16
PACBTI_RET
ret
diff --git a/polly/lib/Transform/ScheduleOptimizer.cpp b/polly/lib/Transform/ScheduleOptimizer.cpp
index 070700a..0888ebd 100644
--- a/polly/lib/Transform/ScheduleOptimizer.cpp
+++ b/polly/lib/Transform/ScheduleOptimizer.cpp
@@ -237,6 +237,7 @@ struct OptimizerAdditionalInfoTy {
bool Postopts;
bool Prevect;
bool &DepsChanged;
+ IslMaxOperationsGuard &MaxOpGuard;
};
class ScheduleTreeOptimizer final {
@@ -381,6 +382,8 @@ private:
isl::schedule_node
ScheduleTreeOptimizer::isolateFullPartialTiles(isl::schedule_node Node,
int VectorWidth) {
+ if (Node.is_null())
+ return {};
assert(isl_schedule_node_get_type(Node.get()) == isl_schedule_node_band);
Node = Node.child(0).child(0);
isl::union_map SchedRelUMap = Node.get_prefix_schedule_relation();
@@ -391,6 +394,8 @@ ScheduleTreeOptimizer::isolateFullPartialTiles(isl::schedule_node Node,
isl::union_set IsolateOption = getIsolateOptions(IsolateDomain, 1);
Node = Node.parent().parent();
isl::union_set Options = IsolateOption.unite(AtomicOption);
+ if (Node.is_null())
+ return {};
isl::schedule_node_band Result =
Node.as<isl::schedule_node_band>().set_ast_build_options(Options);
return Result;
@@ -411,9 +416,13 @@ struct InsertSimdMarkers final : ScheduleNodeRewriter<InsertSimdMarkers> {
isl::schedule_node ScheduleTreeOptimizer::prevectSchedBand(
isl::schedule_node Node, unsigned DimToVectorize, int VectorWidth) {
+ if (Node.is_null())
+ return {};
assert(isl_schedule_node_get_type(Node.get()) == isl_schedule_node_band);
auto Space = isl::manage(isl_schedule_node_band_get_space(Node.get()));
+ if (Space.is_null())
+ return {};
unsigned ScheduleDimensions = unsignedFromIslSize(Space.dim(isl::dim::set));
assert(DimToVectorize < ScheduleDimensions);
@@ -439,12 +448,15 @@ isl::schedule_node ScheduleTreeOptimizer::prevectSchedBand(
// Sink the inner loop into the smallest possible statements to make them
// represent a single vector instruction if possible.
Node = isl::manage(isl_schedule_node_band_sink(Node.release()));
+ if (Node.is_null())
+ return {};
// Add SIMD markers to those vector statements.
InsertSimdMarkers SimdMarkerInserter;
Node = SimdMarkerInserter.visit(Node);
- PrevectOpts++;
+ if (!Node.is_null())
+ PrevectOpts++;
return Node.parent();
}
@@ -535,6 +547,8 @@ ScheduleTreeOptimizer::applyTileBandOpt(isl::schedule_node Node) {
isl::schedule_node
ScheduleTreeOptimizer::applyPrevectBandOpt(isl::schedule_node Node) {
auto Space = isl::manage(isl_schedule_node_band_get_space(Node.get()));
+ if (Space.is_null())
+ return {};
int Dims = unsignedFromIslSize(Space.dim(isl::dim::set));
for (int i = Dims - 1; i >= 0; i--)
@@ -572,9 +586,14 @@ ScheduleTreeOptimizer::optimizeBand(__isl_take isl_schedule_node *NodeArg,
Node = applyTileBandOpt(Node);
if (OAI->Prevect) {
+ IslQuotaScope MaxScope = OAI->MaxOpGuard.enter();
+
// FIXME: Prevectorization requirements are different from those checked by
// isTileableBandNode.
Node = applyPrevectBandOpt(Node);
+
+ if (OAI->MaxOpGuard.hasQuotaExceeded() || Node.is_null())
+ return (isl::schedule_node()).release();
}
return Node.release();
@@ -771,6 +790,10 @@ static void runIslScheduleOptimizer(
return;
}
+ isl_ctx *Ctx = S.getIslCtx().get();
+ IslMaxOperationsGuard MaxOpGuard(Ctx, ScheduleComputeOut,
+ /*AutoEnter=*/false);
+
// Apply ISL's algorithm only if not overridden by the user. Note that
// post-rescheduling optimizations (tiling, pattern-based, prevectorization)
// rely on the coincidence/permutable annotations on schedule tree bands that
@@ -853,8 +876,6 @@ static void runIslScheduleOptimizer(
IslOuterCoincidence = 0;
}
- isl_ctx *Ctx = S.getIslCtx().get();
-
isl_options_set_schedule_outer_coincidence(Ctx, IslOuterCoincidence);
isl_options_set_schedule_maximize_band_depth(Ctx, IslMaximizeBands);
isl_options_set_schedule_max_constant_term(Ctx, MaxConstantTerm);
@@ -870,28 +891,20 @@ static void runIslScheduleOptimizer(
SC = SC.set_coincidence(Validity);
{
- IslMaxOperationsGuard MaxOpGuard(Ctx, ScheduleComputeOut);
+ IslQuotaScope MaxOpScope = MaxOpGuard.enter();
Schedule = SC.compute_schedule();
-
- if (MaxOpGuard.hasQuotaExceeded())
- POLLY_DEBUG(
- dbgs() << "Schedule optimizer calculation exceeds ISL quota\n");
}
isl_options_set_on_error(Ctx, OnErrorStatus);
- ScopsRescheduled++;
+ if (!Schedule.is_null())
+ ScopsRescheduled++;
POLLY_DEBUG(printSchedule(dbgs(), Schedule, "After rescheduling"));
}
walkScheduleTreeForStatistics(Schedule, 1);
- // In cases the scheduler is not able to optimize the code, we just do not
- // touch the schedule.
- if (Schedule.is_null())
- return;
-
- if (GreedyFusion) {
+ if (GreedyFusion && !Schedule.is_null()) {
isl::union_map Validity = D.getDependences(
Dependences::TYPE_RAW | Dependences::TYPE_WAR | Dependences::TYPE_WAW);
Schedule = applyGreedyFusion(Schedule, Validity);
@@ -905,14 +918,20 @@ static void runIslScheduleOptimizer(
/*PatternOpts=*/!HasUserTransformation && PMBasedOpts,
/*Postopts=*/!HasUserTransformation && EnablePostopts,
/*Prevect=*/PollyVectorizerChoice != VECTORIZER_NONE,
- DepsChanged};
- if (OAI.PatternOpts || OAI.Postopts || OAI.Prevect) {
+ DepsChanged,
+ MaxOpGuard};
+ if (!Schedule.is_null() && (OAI.PatternOpts || OAI.Postopts || OAI.Prevect)) {
Schedule = ScheduleTreeOptimizer::optimizeSchedule(Schedule, &OAI);
Schedule = hoistExtensionNodes(Schedule);
POLLY_DEBUG(printSchedule(dbgs(), Schedule, "After post-optimizations"));
walkScheduleTreeForStatistics(Schedule, 2);
}
+ if (MaxOpGuard.hasQuotaExceeded()) {
+ POLLY_DEBUG(dbgs() << "Schedule optimizer calculation exceeds ISL quota\n");
+ return;
+ }
+
// Skip profitability check if user transformation(s) have been applied.
if (!HasUserTransformation &&
!ScheduleTreeOptimizer::isProfitableSchedule(S, Schedule))
diff --git a/polly/lib/Transform/ScheduleTreeTransform.cpp b/polly/lib/Transform/ScheduleTreeTransform.cpp
index 3f36300..c95c558 100644
--- a/polly/lib/Transform/ScheduleTreeTransform.cpp
+++ b/polly/lib/Transform/ScheduleTreeTransform.cpp
@@ -972,6 +972,9 @@ BandAttr *polly::getBandAttr(isl::schedule_node MarkOrBand) {
}
isl::schedule polly::hoistExtensionNodes(isl::schedule Sched) {
+ if (Sched.is_null())
+ return {};
+
// If there is no extension node in the first place, return the original
// schedule tree.
if (!containsExtensionNode(Sched))
@@ -1126,6 +1129,8 @@ isl::set polly::getPartialTilePrefixes(isl::set ScheduleRange,
isl::union_set polly::getIsolateOptions(isl::set IsolateDomain,
unsigned OutDimsNum) {
+ if (IsolateDomain.is_null())
+ return {};
unsigned Dims = unsignedFromIslSize(IsolateDomain.tuple_dim());
assert(OutDimsNum <= Dims &&
"The isl::set IsolateDomain is used to describe the range of schedule "
diff --git a/polly/test/ScheduleOptimizer/prevectorization_islbound.ll b/polly/test/ScheduleOptimizer/prevectorization_islbound.ll
new file mode 100644
index 0000000..0bc3c2c
--- /dev/null
+++ b/polly/test/ScheduleOptimizer/prevectorization_islbound.ll
@@ -0,0 +1,37 @@
+; RUN: opt %loadNPMPolly -S -polly-vectorizer=stripmine -passes=polly-opt-isl -polly-debug -disable-output < %s 2>&1 | FileCheck %s
+; REQUIRES: asserts
+
+define void @ham(ptr %arg, ptr %arg1, i32 %arg2, i32 %arg3, ptr %arg4, i32 %arg5, i32 %arg6) {
+bb:
+ %getelementptr = getelementptr [7 x float], ptr null, i32 0, i32 %arg3
+ br label %bb7
+
+bb7: ; preds = %bb11, %bb
+ %phi = phi i32 [ 0, %bb ], [ %add16, %bb11 ]
+ br label %bb8
+
+bb8: ; preds = %bb8, %bb7
+ %phi9 = phi i32 [ 0, %bb7 ], [ %add, %bb8 ]
+ %getelementptr10 = getelementptr [7 x float], ptr null, i32 0, i32 %phi9
+ store float 0.000000e+00, ptr %getelementptr10, align 4
+ %add = add i32 %phi9, 1
+ %icmp = icmp eq i32 %phi9, 0
+ br i1 %icmp, label %bb8, label %bb11
+
+bb11: ; preds = %bb8
+ %load = load float, ptr %getelementptr, align 4
+ store float %load, ptr %arg4, align 4
+ %getelementptr12 = getelementptr [7 x float], ptr null, i32 0, i32 %arg5
+ %load13 = load float, ptr %getelementptr12, align 4
+ store float %load13, ptr %arg, align 4
+ %getelementptr14 = getelementptr [7 x float], ptr null, i32 0, i32 %arg6
+ %load15 = load float, ptr %getelementptr14, align 4
+ store float %load15, ptr %arg1, align 4
+ %add16 = add i32 %phi, 1
+ %icmp17 = icmp ne i32 %phi, %arg2
+ br i1 %icmp17, label %bb7, label %bb18
+
+bb18: ; preds = %bb11
+ ret void
+}
+; CHECK:Schedule optimizer calculation exceeds ISL quota
diff --git a/runtimes/cmake/Modules/HandleLibC.cmake b/runtimes/cmake/Modules/HandleLibC.cmake
index 01da5b2..f886951 100644
--- a/runtimes/cmake/Modules/HandleLibC.cmake
+++ b/runtimes/cmake/Modules/HandleLibC.cmake
@@ -30,7 +30,9 @@ elseif (RUNTIMES_USE_LIBC STREQUAL "llvm-libc")
check_cxx_compiler_flag(-nostdlibinc CXX_SUPPORTS_NOSTDLIBINC_FLAG)
if(CXX_SUPPORTS_NOSTDLIBINC_FLAG)
target_compile_options(runtimes-libc-headers INTERFACE "-nostdlibinc")
- target_compile_options(runtimes-libc-headers INTERFACE "-idirafter${LIBC_KERNEL_HEADERS}")
+ if(LIBC_KERNEL_HEADERS)
+ target_compile_options(runtimes-libc-headers INTERFACE "-idirafter${LIBC_KERNEL_HEADERS}")
+ endif()
endif()
add_library(runtimes-libc-static INTERFACE)
diff --git a/third-party/benchmark/include/benchmark/benchmark.h b/third-party/benchmark/include/benchmark/benchmark.h
index 08cfe29..c2debb2 100644
--- a/third-party/benchmark/include/benchmark/benchmark.h
+++ b/third-party/benchmark/include/benchmark/benchmark.h
@@ -250,6 +250,10 @@ BENCHMARK(BM_test)->Unit(benchmark::kMillisecond);
_Pragma("GCC diagnostic push") \
_Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
#define BENCHMARK_RESTORE_DEPRECATED_WARNING _Pragma("GCC diagnostic pop")
+#define BENCHMARK_DISABLE_PEDANTIC_WARNING \
+ _Pragma("GCC diagnostic push") \
+ _Pragma("GCC diagnostic ignored \"-Wpedantic\"")
+#define BENCHMARK_RESTORE_PEDANTIC_WARNING _Pragma("GCC diagnostic pop")
#elif defined(__NVCOMPILER)
#define BENCHMARK_BUILTIN_EXPECT(x, y) __builtin_expect(x, y)
#define BENCHMARK_DEPRECATED_MSG(msg) __attribute__((deprecated(msg)))
@@ -257,6 +261,8 @@ BENCHMARK(BM_test)->Unit(benchmark::kMillisecond);
_Pragma("diagnostic push") \
_Pragma("diag_suppress deprecated_entity_with_custom_message")
#define BENCHMARK_RESTORE_DEPRECATED_WARNING _Pragma("diagnostic pop")
+#define BENCHMARK_DISABLE_PEDANTIC_WARNING
+#define BENCHMARK_RESTORE_PEDANTIC_WARNING
#else
#define BENCHMARK_BUILTIN_EXPECT(x, y) x
#define BENCHMARK_DEPRECATED_MSG(msg)
@@ -265,6 +271,8 @@ BENCHMARK(BM_test)->Unit(benchmark::kMillisecond);
__LINE__) ") : warning note: " msg))
#define BENCHMARK_DISABLE_DEPRECATED_WARNING
#define BENCHMARK_RESTORE_DEPRECATED_WARNING
+#define BENCHMARK_DISABLE_PEDANTIC_WARNING
+#define BENCHMARK_RESTORE_PEDANTIC_WARNING
#endif
// clang-format on
@@ -1462,11 +1470,13 @@ class Fixture : public internal::Benchmark {
// Check that __COUNTER__ is defined and that __COUNTER__ increases by 1
// every time it is expanded. X + 1 == X + 0 is used in case X is defined to be
// empty. If X is empty the expression becomes (+1 == +0).
+BENCHMARK_DISABLE_PEDANTIC_WARNING
#if defined(__COUNTER__) && (__COUNTER__ + 1 == __COUNTER__ + 0)
#define BENCHMARK_PRIVATE_UNIQUE_ID __COUNTER__
#else
#define BENCHMARK_PRIVATE_UNIQUE_ID __LINE__
#endif
+BENCHMARK_RESTORE_PEDANTIC_WARNING
// Helpers for generating unique variable names
#ifdef BENCHMARK_HAS_CXX11
diff --git a/utils/bazel/llvm-project-overlay/lldb/BUILD.bazel b/utils/bazel/llvm-project-overlay/lldb/BUILD.bazel
index 7d62afc..7e5cc2e 100644
--- a/utils/bazel/llvm-project-overlay/lldb/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/lldb/BUILD.bazel
@@ -1051,7 +1051,7 @@ gentbl_cc_library(
strip_include_prefix = "tools/lldb-dap",
tbl_outs = {"tools/lldb-dap/Options.inc": ["-gen-opt-parser-defs"]},
tblgen = "//llvm:llvm-tblgen",
- td_file = "tools/lldb-dap/Options.td",
+ td_file = "tools/lldb-dap/tool/Options.td",
deps = ["//llvm:OptParserTdFiles"],
)