mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
Teach isDereferenceablePointer() to look through bitcast constant expressions.
This fixes a LICM regression due to the new load+store pair canonicalization. Differential Revision: http://reviews.llvm.org/D7411 llvm-svn: 228284
This commit is contained in:
parent
e2e6d72938
commit
8ed19d08b2
@ -504,6 +504,20 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
class BitCastOperator
|
||||
: public ConcreteOperator<Operator, Instruction::BitCast> {
|
||||
friend class BitCastInst;
|
||||
friend class ConstantExpr;
|
||||
|
||||
public:
|
||||
Type *getSrcTy() const {
|
||||
return getOperand(0)->getType();
|
||||
}
|
||||
|
||||
Type *getDestTy() const {
|
||||
return getType();
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
|
@ -496,7 +496,7 @@ static bool isDereferenceablePointer(const Value *V, const DataLayout *DL,
|
||||
// is at least as large as for the resulting pointer type, then
|
||||
// we can look through the bitcast.
|
||||
if (DL)
|
||||
if (const BitCastInst* BC = dyn_cast<BitCastInst>(V)) {
|
||||
if (const BitCastOperator *BC = dyn_cast<BitCastOperator>(V)) {
|
||||
Type *STy = BC->getSrcTy()->getPointerElementType(),
|
||||
*DTy = BC->getDestTy()->getPointerElementType();
|
||||
if (STy->isSized() && DTy->isSized() &&
|
||||
|
46
test/Transforms/LICM/constexpr.ll
Normal file
46
test/Transforms/LICM/constexpr.ll
Normal file
@ -0,0 +1,46 @@
|
||||
; RUN: opt < %s -S -basicaa -licm | FileCheck %s
|
||||
; This fixes PR22460
|
||||
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-pc-windows-msvc"
|
||||
|
||||
@in = internal unnamed_addr global i32* null, align 8
|
||||
@out = internal unnamed_addr global i32* null, align 8
|
||||
|
||||
; CHECK-LABEL: @bar
|
||||
; CHECK: entry:
|
||||
; CHECK: load i64* bitcast (i32** @in to i64*)
|
||||
; CHECK: do.body:
|
||||
; CHECK-NOT: load
|
||||
|
||||
define i64 @bar(i32 %N) {
|
||||
entry:
|
||||
br label %do.body
|
||||
|
||||
do.body: ; preds = %l2, %entry
|
||||
%i.0 = phi i32 [ 0, %entry ], [ %inc, %l2 ]
|
||||
%total = phi i64 [ 0, %entry ], [ %next, %l2 ]
|
||||
%c = icmp eq i32 %N, 6
|
||||
br i1 %c, label %l1, label %do.body.l2_crit_edge
|
||||
|
||||
do.body.l2_crit_edge: ; preds = %do.body
|
||||
%inval.pre = load i32** @in, align 8
|
||||
br label %l2
|
||||
|
||||
l1: ; preds = %do.body
|
||||
%v1 = load i64* bitcast (i32** @in to i64*), align 8
|
||||
store i64 %v1, i64* bitcast (i32** @out to i64*), align 8
|
||||
%0 = inttoptr i64 %v1 to i32*
|
||||
br label %l2
|
||||
|
||||
l2: ; preds = %do.body.l2_crit_edge, %l1
|
||||
%inval = phi i32* [ %inval.pre, %do.body.l2_crit_edge ], [ %0, %l1 ]
|
||||
%int = ptrtoint i32* %inval to i64
|
||||
%next = add i64 %total, %int
|
||||
%inc = add nsw i32 %i.0, 1
|
||||
%cmp = icmp slt i32 %inc, %N
|
||||
br i1 %cmp, label %do.body, label %do.end
|
||||
|
||||
do.end: ; preds = %l2
|
||||
ret i64 %total
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user