diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2017-01-06 22:58:02 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2017-01-06 22:58:02 +0000 |
| commit | 63da0c238bfb90a1d04e94ab92fe122cff72dc0d (patch) | |
| tree | 45b6da4dc472e767b957fbf7ff83bfb935939ca5 /llvm/lib/Analysis | |
| parent | e5945871cfb954d80cbeb9c99a26f02b41decae6 (diff) | |
| download | bcm5719-llvm-63da0c238bfb90a1d04e94ab92fe122cff72dc0d.tar.gz bcm5719-llvm-63da0c238bfb90a1d04e94ab92fe122cff72dc0d.zip | |
[InstSimplify] Optimize away udivs in the presence of range metadata
We know that udiv %V, C can be optimized away to 0 if %V is ult C.
llvm-svn: 291296
Diffstat (limited to 'llvm/lib/Analysis')
| -rw-r--r-- | llvm/lib/Analysis/InstructionSimplify.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 7ae7c4ef939..8da2f0981d0 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -1106,6 +1106,16 @@ static Value *SimplifyUDivInst(Value *Op0, Value *Op1, const Query &Q, if (Value *V = SimplifyDiv(Instruction::UDiv, Op0, Op1, Q, MaxRecurse)) return V; + // udiv %V, C -> 0 if %V < C + if (MaxRecurse) { + if (Constant *C = dyn_cast_or_null<Constant>(SimplifyICmpInst( + ICmpInst::ICMP_ULT, Op0, Op1, Q, MaxRecurse - 1))) { + if (C->isAllOnesValue()) { + return Constant::getNullValue(Op0->getType()); + } + } + } + return nullptr; } |

