llvm-project/llvm/utils
Daniel Sanders 078572b6b1 [globalisel][tablegen] Do not merge memoperands from instructions that weren't in the match.
Summary:
Fix a bug discovered in an out-of-tree target where memoperands from
pseudo-instructions that weren't part of the match were being merged into the
result instructions as part of GIR_MergeMemOperands.

This bug was caused by a change to the handling of State.MIs between rules when
the state machine tables were fused into a single table. Previously, each rule
would reset State.MIs using State.MIs.resize(1) but this is no longer done, as a
result stale data is occasionally left in some elements of State.MIs. Most
opcodes aren't affected by this but GIR_MergeMemOperands merges all memoperands
from the intructions recorded in State.MIs into the result instruction.

Suppose for example, we processed but rejected the following pattern:
  (signextend (load x))
at this point, State.MIs contains the signextend and the load. Now suppose we
process and accept this pattern:
  (add x, y)
at this point, State.MIs contains the add as well as the (now irrelevant) load.
When GIR_MergeMemOperands is processed, the memoperands from that irrelevant
load will be merged into the result instruction even though it was not part of
the match.

Bringing back the State.MIs.resize(1) would fix the problem but it would limit
our ability to optimize the table in the future. Instead, this patch fixes the
problem by explicitly stating which instructions should be merged into the result.

There's no direct test case in this commit because a test case would be very brittle.
However, at the time of writing this should fix the failures in
http://green.lab.llvm.org/green/job/Compiler_Verifiers_GlobalISEL/ as well as a
failure in test/CodeGen/ARM/GlobalISel/arm-isel.ll when expensive checks are enabled.

Reviewers: ab, t.p.northover, qcolombet, rovka, aditya_nandakumar

Subscribers: fhahn, kristof.beyls, igorb, llvm-commits

Differential Revision: https://reviews.llvm.org/D36094

llvm-svn: 309804
2017-08-02 11:03:36 +00:00
..
FileCheck [FileCheck] Don't scan past the closing CHECK-DAG for CHECK-NOT inside CHECK-DAG 2017-06-07 12:06:45 +00:00
KillTheDoctor KillTheDoctor.cpp: Appease cases on case-senstitive host, like mingw on linux. 2016-12-23 01:39:26 +00:00
LLVMVisualizers Improve natvis for llvm::SmallString so that it correctly displays only the valid portion of the string 2016-12-21 01:05:29 +00:00
Misc
PerfectShuffle
TableGen [globalisel][tablegen] Do not merge memoperands from instructions that weren't in the match. 2017-08-02 11:03:36 +00:00
Target/ARM
bugpoint
count
crosstool
docker [docker] Fix unmatched quote problem in here-document on older versions of bash 2017-07-31 15:18:57 +00:00
emacs
fpcmp
gdb-scripts Make the Twine pretty-printer work with GDB 7.11 2017-06-04 03:27:12 +00:00
git
git-svn Revert r305598, "utils: Add a git-r utility for mapping svn revisions to git revisions in the monorepo." 2017-06-19 20:43:09 +00:00
jedit
kate
lint
lit [lit] Avoid copying llvm/utils/lit/tests/Inputs with lit site configs 2017-07-31 18:45:44 +00:00
llvm-build
llvm-lit [utils] Add libc++ and libc++abi config to llvm-lit 2017-01-17 07:10:55 +00:00
not Remove unused header, NFC. 2016-12-01 19:38:48 +00:00
release test-release.sh: Fix phase2 and phase3 binary comparision 2017-07-24 19:28:30 +00:00
sanitizers Fix UBSan bots by blacklisting bits/stl_tree.h. 2017-01-13 17:30:10 +00:00
testgen
textmate
unittest Note addition of NetBSD support in googletest 2017-05-06 02:45:42 +00:00
valgrind
vim [AArch64] Extend CallingConv::X86_64_Win64 to AArch64 as well 2017-07-17 20:05:19 +00:00
vscode Adding VSCode syntax colorizer to utils (generated from textmate colorizer). 2017-05-09 17:13:37 +00:00
yaml-bench Timer: Track name and description. 2016-11-18 19:43:18 +00:00
DSAclean.py
DSAextract.py
GenLibDeps.pl
GetRepositoryPath
GetSourceVersion
LLVMBuild.txt
UpdateCMakeLists.pl
abtest.py AsmPrinter: mark the beginning and the end of a function in verbose mode 2017-05-23 21:22:16 +00:00
bisect
bisect-skip-count Fix bug in bisect-skip-count not using passed-in arguments 2017-03-04 03:23:41 +00:00
check-each-file
clang-parse-diagnostics-file
codegen-diff
countloc.sh
create_ladder_graph.py
extract_symbols.py Handle non-inlined clang::Type::getAs specializations in extract_symbols.py 2016-11-14 17:07:09 +00:00
findmisopt
findoptdiff
findsym.pl
getsrcs.sh
lldbDataFormatters.py
llvm-compilers-check
llvm-native-gxx
llvm.grm
llvmdo
llvmgrep
makellvm
prepare-code-coverage-artifact.py [utils] coverage: Add help text about the --restrict flag (NFC) 2017-02-09 19:37:18 +00:00
schedcover.py
shuffle_fuzz.py
sort_includes.py
test_debuginfo.pl
update_llc_test_checks.py Fix update_llc_test_checks.py ARM parsing 2017-07-28 23:58:24 +00:00
update_test_checks.py [utils] remove ability to generate llc check lines from update_test_checks.py 2017-06-12 17:44:30 +00:00
wciia.py