mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-19 23:23:38 -04:00
[InstSimplify][ConstantFolding] Teach constant folding how to handle icmp null, (inttoptr x) as well as it handles icmp (inttoptr x), null
Summary: The constant folding code currently assumes that the constant expression will always be on the left and the simple null will be on the right. But that's not true at least on the path from InstSimplify. This patch adds support to ConstantFolding to detect the reversed case. Reviewers: spatel, dberlin, majnemer, davide, joey Reviewed By: joey Subscribers: joey, llvm-commits Differential Revision: https://reviews.llvm.org/D33801 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@304559 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1170,7 +1170,9 @@ Constant *llvm::ConstantFoldCompareInstOperands(unsigned Predicate,
|
||||
const DataLayout &DL,
|
||||
const TargetLibraryInfo *TLI) {
|
||||
// fold: icmp (inttoptr x), null -> icmp x, 0
|
||||
// fold: icmp null, (inttoptr x) -> icmp 0, x
|
||||
// fold: icmp (ptrtoint x), 0 -> icmp x, null
|
||||
// fold: icmp 0, (ptrtoint x) -> icmp null, x
|
||||
// fold: icmp (inttoptr x), (inttoptr y) -> icmp trunc/zext x, trunc/zext y
|
||||
// fold: icmp (ptrtoint x), (ptrtoint y) -> icmp x, y
|
||||
//
|
||||
@@ -1240,6 +1242,11 @@ Constant *llvm::ConstantFoldCompareInstOperands(unsigned Predicate,
|
||||
Predicate == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
|
||||
return ConstantFoldBinaryOpOperands(OpC, LHS, RHS, DL);
|
||||
}
|
||||
} else if (isa<ConstantExpr>(Ops1)) {
|
||||
// If RHS is a constant expression, but the left side isn't, swap the
|
||||
// operands and try again.
|
||||
Predicate = ICmpInst::getSwappedPredicate((ICmpInst::Predicate)Predicate);
|
||||
return ConstantFoldCompareInstOperands(Predicate, Ops1, Ops0, DL, TLI);
|
||||
}
|
||||
|
||||
return ConstantExpr::getCompare(Predicate, Ops0, Ops1);
|
||||
|
||||
@@ -1289,7 +1289,7 @@ define i1 @constant_fold_inttoptr_null() {
|
||||
|
||||
define i1 @constant_fold_null_inttoptr() {
|
||||
; CHECK-LABEL: @constant_fold_null_inttoptr(
|
||||
; CHECK-NEXT: ret i1 icmp eq (i32* inttoptr (i64 32 to i32*), i32* null)
|
||||
; CHECK-NEXT: ret i1 false
|
||||
;
|
||||
%x = icmp eq i32* null, inttoptr (i64 32 to i32*)
|
||||
ret i1 %x
|
||||
|
||||
Reference in New Issue
Block a user