[GlobalISel] Replace all combined G_EXTRACT uses.

Iterating on the use-list we're modifying doesn't work: after the first
iteration, the use-list iterator will point to a MachineOperand
referencing the new register.  This caused us to skip the other uses to
replace.

Instead, use MRI.replaceRegWith(), which accounts for this behavior.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@296551 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Ahmed Bougacha 2017-03-01 00:43:39 +00:00
parent 12246fec03
commit 7fdaba3e0f
2 changed files with 23 additions and 4 deletions

View File

@ -94,10 +94,7 @@ bool Legalizer::combineExtracts(MachineInstr &MI, MachineRegisterInfo &MRI,
"unexpected physical register in G_SEQUENCE");
// Finally we can replace the uses.
for (auto &Use : MRI.use_operands(ExtractReg)) {
Changed = true;
Use.setReg(OrigReg);
}
MRI.replaceRegWith(ExtractReg, OrigReg);
}
if (AllDefsReplaced) {

View File

@ -8,6 +8,7 @@
define void @test_combines_3() { ret void }
define void @test_combines_4() { ret void }
define void @test_combines_5() { ret void }
define void @test_combines_6() { ret void }
...
---
@ -107,3 +108,24 @@ body: |
%4:_(s32) = G_EXTRACT %2, 32
%5:_(s32) = G_ADD %3, %4
...
---
name: test_combines_6
body: |
bb.0:
liveins: %w0
; CHECK-LABEL: name: test_combines_6
; CHECK: %0(s32) = COPY %w0
%0:_(s32) = COPY %w0
; Check that we replace all the uses of a G_EXTRACT.
; CHECK-NOT: G_SEQUENCE
; CHECK-NOT: G_EXTRACT
; CHECK: %3(s32) = G_MUL %0, %0
; CHECK: %4(s32) = G_ADD %0, %3
%1:_(s32) = G_SEQUENCE %0, 0
%2:_(s32) = G_EXTRACT %1, 0
%3:_(s32) = G_MUL %2, %2
%4:_(s32) = G_ADD %2, %3
...