mirror of
https://github.com/RPCS3/llvm.git
synced 2025-03-04 08:37:45 +00:00
[InstCombine] don't assert that division-by-constant has been folded (PR30281)
This is effectively a revert of: https://reviews.llvm.org/rL280115 And this should fix https://llvm.org/bugs/show_bug.cgi?id=30281: git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280677 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6704841232
commit
47e6904fe1
@ -1976,13 +1976,12 @@ Instruction *InstCombiner::foldICmpDivConstant(ICmpInst &Cmp,
|
|||||||
if (!Cmp.isEquality() && DivIsSigned != Cmp.isSigned())
|
if (!Cmp.isEquality() && DivIsSigned != Cmp.isSigned())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
// These constant divides should already be folded in InstSimplify.
|
// The ProdOV computation fails on divide by 0 and divide by -1. Cases with
|
||||||
assert(*C2 != 0 && "The ProdOV computation fails on divide by zero.");
|
// INT_MIN will also fail if the divisor is 1. Although folds of all these
|
||||||
assert(*C2 != 1 && "Funny cases with INT_MIN will fail.");
|
// division-by-constant cases should be present, we can not assert that they
|
||||||
|
// have happened before we reach this icmp instruction.
|
||||||
// This constant divide should already be folded in InstCombine.
|
if (*C2 == 0 || *C2 == 1 || (DivIsSigned && C2->isAllOnesValue()))
|
||||||
assert(!(DivIsSigned && C2->isAllOnesValue()) &&
|
return nullptr;
|
||||||
"The overflow computation will fail.");
|
|
||||||
|
|
||||||
// TODO: We could do all of the computations below using APInt.
|
// TODO: We could do all of the computations below using APInt.
|
||||||
Constant *CmpRHS = cast<Constant>(Cmp.getOperand(1));
|
Constant *CmpRHS = cast<Constant>(Cmp.getOperand(1));
|
||||||
|
93
test/Transforms/InstCombine/icmp-div-constant.ll
Normal file
93
test/Transforms/InstCombine/icmp-div-constant.ll
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||||
|
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||||
|
|
||||||
|
; PR30281 - https://llvm.org/bugs/show_bug.cgi?id=30281
|
||||||
|
|
||||||
|
; All of these tests contain foldable division-by-constant instructions, but we
|
||||||
|
; can't assert that those folds have occurred before we process the later icmp.
|
||||||
|
|
||||||
|
define i32 @icmp_div(i16 %a, i16 %c) {
|
||||||
|
; CHECK-LABEL: @icmp_div(
|
||||||
|
; CHECK-NEXT: entry:
|
||||||
|
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i16 %a, 0
|
||||||
|
; CHECK-NEXT: br i1 [[TOBOOL]], label %then, label %exit
|
||||||
|
; CHECK: then:
|
||||||
|
; CHECK-NEXT: [[NOT_CMP:%.*]] = icmp eq i16 %c, 0
|
||||||
|
; CHECK-NEXT: [[PHITMP1:%.*]] = sext i1 [[NOT_CMP]] to i32
|
||||||
|
; CHECK-NEXT: br label %exit
|
||||||
|
; CHECK: exit:
|
||||||
|
; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ -1, %entry ], [ [[PHI:%.*]]tmp1, %then ]
|
||||||
|
; CHECK-NEXT: ret i32 [[PHI]]
|
||||||
|
;
|
||||||
|
entry:
|
||||||
|
%tobool = icmp eq i16 %a, 0
|
||||||
|
br i1 %tobool, label %then, label %exit
|
||||||
|
|
||||||
|
then:
|
||||||
|
%div = sdiv i16 %c, -1
|
||||||
|
%cmp = icmp ne i16 %div, 0
|
||||||
|
br label %exit
|
||||||
|
|
||||||
|
exit:
|
||||||
|
%phi = phi i1 [ false, %entry ], [ %cmp, %then ]
|
||||||
|
%zext = zext i1 %phi to i32
|
||||||
|
%add = add nsw i32 %zext, -1
|
||||||
|
ret i32 %add
|
||||||
|
}
|
||||||
|
|
||||||
|
define i32 @icmp_div2(i16 %a, i16 %c) {
|
||||||
|
; CHECK-LABEL: @icmp_div2(
|
||||||
|
; CHECK-NEXT: entry:
|
||||||
|
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i16 %a, 0
|
||||||
|
; CHECK-NEXT: br i1 [[TOBOOL]], label %then, label %exit
|
||||||
|
; CHECK: then:
|
||||||
|
; CHECK-NEXT: br label %exit
|
||||||
|
; CHECK: exit:
|
||||||
|
; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ -1, %entry ], [ 0, %then ]
|
||||||
|
; CHECK-NEXT: ret i32 [[PHI]]
|
||||||
|
;
|
||||||
|
entry:
|
||||||
|
%tobool = icmp eq i16 %a, 0
|
||||||
|
br i1 %tobool, label %then, label %exit
|
||||||
|
|
||||||
|
then:
|
||||||
|
%div = sdiv i16 %c, 0
|
||||||
|
%cmp = icmp ne i16 %div, 0
|
||||||
|
br label %exit
|
||||||
|
|
||||||
|
exit:
|
||||||
|
%phi = phi i1 [ false, %entry ], [ %cmp, %then ]
|
||||||
|
%zext = zext i1 %phi to i32
|
||||||
|
%add = add nsw i32 %zext, -1
|
||||||
|
ret i32 %add
|
||||||
|
}
|
||||||
|
|
||||||
|
define i32 @icmp_div3(i16 %a, i16 %c) {
|
||||||
|
; CHECK-LABEL: @icmp_div3(
|
||||||
|
; CHECK-NEXT: entry:
|
||||||
|
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i16 %a, 0
|
||||||
|
; CHECK-NEXT: br i1 [[TOBOOL]], label %then, label %exit
|
||||||
|
; CHECK: then:
|
||||||
|
; CHECK-NEXT: [[NOT_CMP:%.*]] = icmp eq i16 %c, 0
|
||||||
|
; CHECK-NEXT: [[PHITMP1:%.*]] = sext i1 [[NOT_CMP]] to i32
|
||||||
|
; CHECK-NEXT: br label %exit
|
||||||
|
; CHECK: exit:
|
||||||
|
; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ -1, %entry ], [ [[PHI:%.*]]tmp1, %then ]
|
||||||
|
; CHECK-NEXT: ret i32 [[PHI]]
|
||||||
|
;
|
||||||
|
entry:
|
||||||
|
%tobool = icmp eq i16 %a, 0
|
||||||
|
br i1 %tobool, label %then, label %exit
|
||||||
|
|
||||||
|
then:
|
||||||
|
%div = sdiv i16 %c, 1
|
||||||
|
%cmp = icmp ne i16 %div, 0
|
||||||
|
br label %exit
|
||||||
|
|
||||||
|
exit:
|
||||||
|
%phi = phi i1 [ false, %entry ], [ %cmp, %then ]
|
||||||
|
%zext = zext i1 %phi to i32
|
||||||
|
%add = add nsw i32 %zext, -1
|
||||||
|
ret i32 %add
|
||||||
|
}
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user