[SystemZ] Use BRCT and BRCTG to eliminate add-&-compare sequences
authorRichard Sandiford <rsandifo@linux.vnet.ibm.com>
Mon, 5 Aug 2013 11:23:46 +0000 (11:23 +0000)
committerRichard Sandiford <rsandifo@linux.vnet.ibm.com>
Mon, 5 Aug 2013 11:23:46 +0000 (11:23 +0000)
commit93795574785de252703591e7fcc8f052c762f25e
treede693d743c5334444b688797de354cdc279bbdbe
parentf8e16c6f5a3a0d2cc6f7ae6dae0a8f55a89cfb2f
[SystemZ] Use BRCT and BRCTG to eliminate add-&-compare sequences

This patch just uses a peephole test for "add; compare; branch" sequences
within a single block.  The IR optimizers already convert loops to
decrement-and-branch-on-nonzero form in some cases, so even this
simplistic test triggers many times during a clang bootstrap and
projects/test-suite run.  It looks like there are still cases where we
need to more strongly prefer branches on nonzero though.  E.g. I saw a
case where a loop that started out with a check for 0 ended up with a
check for -1.  I'll try to look at that sometime.

I ended up adding the Reference class because MachineInstr::readsRegister()
doesn't check for subregisters (by design, as far as I could tell).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@187723 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/SystemZ/SystemZElimCompare.cpp
lib/Target/SystemZ/SystemZInstrInfo.cpp
lib/Target/SystemZ/SystemZInstrInfo.h
lib/Target/SystemZ/SystemZLongBranch.cpp
lib/Target/SystemZ/SystemZTargetMachine.cpp
test/CodeGen/SystemZ/Large/branch-range-07.py [new file with mode: 0644]
test/CodeGen/SystemZ/Large/branch-range-08.py [new file with mode: 0644]
test/CodeGen/SystemZ/loop-01.ll