Recommit [UnreachableBlockElim] Use COPY if PHI input is undef
This time invoking llc with "-march=x86-64" in the testcase, so we don't assume
the default target is x86.
Summary:
If we have
%vreg0<def> = PHI %vreg2<undef>, <BB#0>, %vreg3, <BB#2>; GR32:%vreg0,%vreg2,%vreg3
%vreg3<def,tied1> = ADD32ri8 %vreg0<kill,tied0>, 1, %EFLAGS<imp-def>; GR32:%vreg3,%vreg0
then we can't just change %vreg0 into %vreg3, since %vreg2 is actually
undef. We would have to also copy the undef flag to be able to change the
register.
Instead we deal with this case like other cases where we can't just
replace the register: we insert a COPY. The code creating the COPY already
copied all flags from the PHI input, so the undef flag will be transferred
as it should.
Reviewers: kparzysz
Reviewed By: kparzysz
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D38235
llvm-svn: 314882
2017-10-04 15:42:45 +08:00
|
|
|
# RUN: llc -march=x86-64 %s -o - -run-pass=processimpdefs -run-pass=unreachable-mbb-elimination | FileCheck %s
|
|
|
|
---
|
|
|
|
name: f
|
|
|
|
tracksRegLiveness: true
|
|
|
|
registers:
|
|
|
|
- { id: 0, class: gr32, preferred-register: '' }
|
|
|
|
- { id: 1, class: gr32, preferred-register: '' }
|
|
|
|
- { id: 2, class: gr32, preferred-register: '' }
|
|
|
|
body: |
|
|
|
|
bb.0:
|
|
|
|
%0 = IMPLICIT_DEF
|
|
|
|
JMP_1 %bb.1
|
|
|
|
|
|
|
|
bb.1:
|
|
|
|
%1 = PHI %0, %bb.0, %2, %bb.2
|
2018-02-01 06:04:26 +08:00
|
|
|
%2 = ADD32ri8 killed %1, 1, implicit-def $eflags
|
Recommit [UnreachableBlockElim] Use COPY if PHI input is undef
This time invoking llc with "-march=x86-64" in the testcase, so we don't assume
the default target is x86.
Summary:
If we have
%vreg0<def> = PHI %vreg2<undef>, <BB#0>, %vreg3, <BB#2>; GR32:%vreg0,%vreg2,%vreg3
%vreg3<def,tied1> = ADD32ri8 %vreg0<kill,tied0>, 1, %EFLAGS<imp-def>; GR32:%vreg3,%vreg0
then we can't just change %vreg0 into %vreg3, since %vreg2 is actually
undef. We would have to also copy the undef flag to be able to change the
register.
Instead we deal with this case like other cases where we can't just
replace the register: we insert a COPY. The code creating the COPY already
copied all flags from the PHI input, so the undef flag will be transferred
as it should.
Reviewers: kparzysz
Reviewed By: kparzysz
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D38235
llvm-svn: 314882
2017-10-04 15:42:45 +08:00
|
|
|
JMP_1 %bb.3
|
|
|
|
|
|
|
|
bb.2:
|
|
|
|
JMP_1 %bb.1
|
|
|
|
|
|
|
|
bb.3:
|
|
|
|
...
|
|
|
|
|
|
|
|
# bb2 above is dead and should be removed and the PHI should be replaced with a
|
|
|
|
# COPY from an undef value since the bb0 value in the PHI is undef.
|
|
|
|
|
|
|
|
# CHECK: bb.0:
|
|
|
|
# CHECK: successors: %bb.1
|
|
|
|
# CHECK: JMP_1 %bb.1
|
|
|
|
|
|
|
|
# CHECK: bb.1:
|
|
|
|
# CHECK: successors: %bb.2
|
2017-10-25 02:04:54 +08:00
|
|
|
# CHECK: [[TMP1:%[0-9]+]]:gr32 = COPY undef %{{[0-9]+}}
|
|
|
|
# CHECK: %{{[0-9]+}}:gr32 = ADD32ri8 killed [[TMP1]], 1
|
Recommit [UnreachableBlockElim] Use COPY if PHI input is undef
This time invoking llc with "-march=x86-64" in the testcase, so we don't assume
the default target is x86.
Summary:
If we have
%vreg0<def> = PHI %vreg2<undef>, <BB#0>, %vreg3, <BB#2>; GR32:%vreg0,%vreg2,%vreg3
%vreg3<def,tied1> = ADD32ri8 %vreg0<kill,tied0>, 1, %EFLAGS<imp-def>; GR32:%vreg3,%vreg0
then we can't just change %vreg0 into %vreg3, since %vreg2 is actually
undef. We would have to also copy the undef flag to be able to change the
register.
Instead we deal with this case like other cases where we can't just
replace the register: we insert a COPY. The code creating the COPY already
copied all flags from the PHI input, so the undef flag will be transferred
as it should.
Reviewers: kparzysz
Reviewed By: kparzysz
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D38235
llvm-svn: 314882
2017-10-04 15:42:45 +08:00
|
|
|
# CHECK: JMP_1 %bb.2
|
|
|
|
|
|
|
|
# CHECK: bb.2:
|