diff options
author | Daniel Sanders <daniel_l_sanders@apple.com> | 2018-10-04 21:44:32 +0000 |
---|---|---|
committer | Daniel Sanders <daniel_l_sanders@apple.com> | 2018-10-04 21:44:32 +0000 |
commit | ab358bfd0994b6c2b57e37be26869a611dc8fdd5 (patch) | |
tree | 64f450fe2b8464602294cd16756be3b9ba87628a /llvm/lib/CodeGen | |
parent | bf378b808ae19fa709bb5babf5bcfd65a6688cb6 (diff) | |
download | bcm5719-llvm-ab358bfd0994b6c2b57e37be26869a611dc8fdd5.tar.gz bcm5719-llvm-ab358bfd0994b6c2b57e37be26869a611dc8fdd5.zip |
[globalisel][combine] Fix a rare crash when encountering an instruction whose op0 isn't a reg
The simplest instance of this is an intrinsic with no results which will have the
intrinsic ID as operand 0.
Also fix some benign incorrectness when op0 is a reg but isn't a def that was
guarded against by checking for the extension opcodes.
llvm-svn: 343821
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp index 06f0ea54373..fe68c04080b 100644 --- a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp @@ -60,12 +60,8 @@ PreferredTuple ChoosePreferredUse(PreferredTuple &CurrentUse, unsigned OpcodeForCandidate, MachineInstr *MIForCandidate) { if (!CurrentUse.Ty.isValid()) { - if (CurrentUse.ExtendOpcode == OpcodeForCandidate) - return {TyForCandidate, OpcodeForCandidate, MIForCandidate}; - if (CurrentUse.ExtendOpcode == TargetOpcode::G_ANYEXT && - (OpcodeForCandidate == TargetOpcode::G_SEXT || - OpcodeForCandidate == TargetOpcode::G_ZEXT || - OpcodeForCandidate == TargetOpcode::G_ANYEXT)) + if (CurrentUse.ExtendOpcode == OpcodeForCandidate || + CurrentUse.ExtendOpcode == TargetOpcode::G_ANYEXT) return {TyForCandidate, OpcodeForCandidate, MIForCandidate}; return CurrentUse; } @@ -171,10 +167,12 @@ bool CombinerHelper::tryCombineExtendingLoads(MachineInstr &MI) { PreferredTuple Preferred = {LLT(), PreferredOpcode, nullptr}; for (auto &UseMI : MRI.use_instructions(LoadValue.getReg())) { if (UseMI.getOpcode() == TargetOpcode::G_SEXT || - UseMI.getOpcode() == TargetOpcode::G_ZEXT || !Preferred.Ty.isValid()) + UseMI.getOpcode() == TargetOpcode::G_ZEXT || + UseMI.getOpcode() == TargetOpcode::G_ANYEXT) { Preferred = ChoosePreferredUse(Preferred, MRI.getType(UseMI.getOperand(0).getReg()), UseMI.getOpcode(), &UseMI); + } } // There were no extends |