diff options
author | Hal Finkel <hfinkel@anl.gov> | 2015-09-06 04:17:30 +0000 |
---|---|---|
committer | Hal Finkel <hfinkel@anl.gov> | 2015-09-06 04:17:30 +0000 |
commit | ccf9259c00ad60457c07b658a4167204ee53da12 (patch) | |
tree | a1cba0ec72cdce02a669505dd89a191637bbe59a /llvm/lib/Target/PowerPC/PPCInstrInfo.cpp | |
parent | 1c8fbd24f372f910d77bd3bdfcc38b9953f52be1 (diff) | |
download | bcm5719-llvm-ccf9259c00ad60457c07b658a4167204ee53da12.tar.gz bcm5719-llvm-ccf9259c00ad60457c07b658a4167204ee53da12.zip |
[PowerPC] Don't commute trivial rlwimi instructions
To commute a trivial rlwimi instructions (meaning one with a full mask and zero
shift), we'd need to ability to form an all-zero mask (instead of an all-one
mask) using rlwimi. We can't represent this, however, and we'll miscompile code
if we try.
The code quality problem that this highlights (that SDAG simplification can
lead to us generating an ISD::OR node with a constant zero LHS) will be fixed
as a follow-up.
Fixes PR24719.
llvm-svn: 246937
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCInstrInfo.cpp')
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCInstrInfo.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp b/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp index 79c399b71ae..70e223d78ad 100644 --- a/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp +++ b/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp @@ -571,6 +571,11 @@ PPCInstrInfo::commuteInstruction(MachineInstr *MI, bool NewMI) const { unsigned MB = MI->getOperand(4).getImm(); unsigned ME = MI->getOperand(5).getImm(); + // We can't commute a trivial mask (there is no way to represent an all-zero + // mask). + if (MB == 0 && ME == 31) + return nullptr; + if (NewMI) { // Create a new instruction. unsigned Reg0 = ChangeReg0 ? Reg2 : MI->getOperand(0).getReg(); |