mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
[InstCombine] use m_APInt to allow icmp eq (srem X, C1), C2 folds for splat constant vectors
llvm-svn: 277638
This commit is contained in:
parent
e244b0eafa
commit
b18bd3fefa
@ -2218,10 +2218,9 @@ Instruction *InstCombiner::foldICmpEqualityWithConstant(ICmpInst &ICI) {
|
||||
switch (BO->getOpcode()) {
|
||||
case Instruction::SRem:
|
||||
// If we have a signed (X % (2^c)) == 0, turn it into an unsigned one.
|
||||
// FIXME: Vectors are excluded by ConstantInt.
|
||||
if (*RHSV == 0 && isa<ConstantInt>(BOp1) && BO->hasOneUse()) {
|
||||
const APInt &V = cast<ConstantInt>(BOp1)->getValue();
|
||||
if (V.sgt(1) && V.isPowerOf2()) {
|
||||
if (*RHSV == 0 && BO->hasOneUse()) {
|
||||
const APInt *BOC;
|
||||
if (match(BOp1, m_APInt(BOC)) && BOC->sgt(1) && BOC->isPowerOf2()) {
|
||||
Value *NewRem = Builder->CreateURem(BOp0, BOp1, BO->getName());
|
||||
return new ICmpInst(ICI.getPredicate(), NewRem,
|
||||
Constant::getNullValue(BO->getType()));
|
||||
|
@ -53,12 +53,10 @@ define i1 @test3a(i32 %A) {
|
||||
ret i1 %C
|
||||
}
|
||||
|
||||
; FIXME: Vectors should fold the same way.
|
||||
|
||||
define <2 x i1> @test3a_vec(<2 x i32> %A) {
|
||||
; CHECK-LABEL: @test3a_vec(
|
||||
; CHECK-NEXT: [[B:%.*]] = srem <2 x i32> %A, <i32 8, i32 8>
|
||||
; CHECK-NEXT: [[C:%.*]] = icmp ne <2 x i32> [[B]], zeroinitializer
|
||||
; CHECK-NEXT: [[B1:%.*]] = and <2 x i32> %A, <i32 7, i32 7>
|
||||
; CHECK-NEXT: [[C:%.*]] = icmp ne <2 x i32> [[B1]], zeroinitializer
|
||||
; CHECK-NEXT: ret <2 x i1> [[C]]
|
||||
;
|
||||
%B = srem <2 x i32> %A, <i32 -8, i32 -8>
|
||||
|
Loading…
x
Reference in New Issue
Block a user