diff options
author | Evan Cheng <evan.cheng@apple.com> | 2012-07-11 18:55:07 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2012-07-11 18:55:07 +0000 |
commit | 875913439ca8f073852ec8315d3b32b875184582 (patch) | |
tree | b2ddc67407de1e67809d2275f0aaf962966648b1 /lib/CodeGen/SelectionDAG | |
parent | 597f2950d8dc263f2264501200e390a92ebfb356 (diff) | |
download | external_llvm-875913439ca8f073852ec8315d3b32b875184582.zip external_llvm-875913439ca8f073852ec8315d3b32b875184582.tar.gz external_llvm-875913439ca8f073852ec8315d3b32b875184582.tar.bz2 |
InstrEmitter::EmitSubregNode() optimize extract_subreg in this case:
r1025 = s/zext r1024, 4
r1026 = extract_subreg r1025, 4
to a copy:
r1026 = copy r1024
This is correct. However it uses TII->isCoalescableExtInstr() which can return
true for instructions which essentially does a sext_in_reg so this can end up
with an illegal copy where the source and destination register classes do not
match. Add a check to avoid it. Sorry, no test case possible at this time.
rdar://11849816
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160059 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG')
-rw-r--r-- | lib/CodeGen/SelectionDAG/InstrEmitter.cpp | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/lib/CodeGen/SelectionDAG/InstrEmitter.cpp b/lib/CodeGen/SelectionDAG/InstrEmitter.cpp index 578b51d..936c126 100644 --- a/lib/CodeGen/SelectionDAG/InstrEmitter.cpp +++ b/lib/CodeGen/SelectionDAG/InstrEmitter.cpp @@ -479,7 +479,8 @@ void InstrEmitter::EmitSubregNode(SDNode *Node, unsigned SrcReg, DstReg, DefSubIdx; if (DefMI && TII->isCoalescableExtInstr(*DefMI, SrcReg, DstReg, DefSubIdx) && - SubIdx == DefSubIdx) { + SubIdx == DefSubIdx && + TRC == MRI->getRegClass(SrcReg)) { // Optimize these: // r1025 = s/zext r1024, 4 // r1026 = extract_subreg r1025, 4 |