diff options
author | Nuno Lopes <nunoplopes@sapo.pt> | 2012-07-27 18:03:57 +0000 |
---|---|---|
committer | Nuno Lopes <nunoplopes@sapo.pt> | 2012-07-27 18:03:57 +0000 |
commit | 20c7eb3549b5feb007d555e6fbf013b4963e747f (patch) | |
tree | bc48ef3d5932fe21dc47794b07047aebb88fe250 /llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp | |
parent | 5c01090c49a23ace459caacd929743ced1be9177 (diff) | |
download | bcm5719-llvm-20c7eb3549b5feb007d555e6fbf013b4963e747f.tar.gz bcm5719-llvm-20c7eb3549b5feb007d555e6fbf013b4963e747f.zip |
fix infinite loop in instcombine in the presence of a (malformed) self-referencing select inst.
This can happen as long as the instruction is not reachable. Instcombine does generate these unreachable malformed selects when doing RAUW
llvm-svn: 160874
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp index bdd97a862b7..291e80019e8 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp @@ -881,12 +881,16 @@ Instruction *InstCombiner::visitSelectInst(SelectInst &SI) { if (SelectInst *TrueSI = dyn_cast<SelectInst>(TrueVal)) { if (TrueSI->getCondition() == CondVal) { + if (SI.getTrueValue() == TrueSI->getTrueValue()) + return 0; SI.setOperand(1, TrueSI->getTrueValue()); return &SI; } } if (SelectInst *FalseSI = dyn_cast<SelectInst>(FalseVal)) { if (FalseSI->getCondition() == CondVal) { + if (SI.getFalseValue() == FalseSI->getFalseValue()) + return 0; SI.setOperand(2, FalseSI->getFalseValue()); return &SI; } |