InstrEmitter::EmitSubregNode() optimize extract_subreg in this case:
authorEvan Cheng <evan.cheng@apple.com>
Wed, 11 Jul 2012 18:55:07 +0000 (18:55 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Wed, 11 Jul 2012 18:55:07 +0000 (18:55 +0000)
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

lib/CodeGen/SelectionDAG/InstrEmitter.cpp

index 578b51d9f866e2533d2545a686471e3ddd72c571..936c1269a8c72b09ec03060fb39a920de4c84900 100644 (file)
@@ -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