diff options
| author | Daniel Berlin <dberlin@dberlin.org> | 2017-05-08 17:37:33 +0000 | 
|---|---|---|
| committer | Daniel Berlin <dberlin@dberlin.org> | 2017-05-08 17:37:33 +0000 | 
| commit | 0f2af7f93b8fe43178eea5e42006021121401921 (patch) | |
| tree | 8c68d54ea86933d0c8dc190fea42b70fbe7a0469 /llvm | |
| parent | 74ffa5c62fd248c3009c615808da8737a45301ab (diff) | |
| download | bcm5719-llvm-0f2af7f93b8fe43178eea5e42006021121401921.tar.gz bcm5719-llvm-0f2af7f93b8fe43178eea5e42006021121401921.zip  | |
ConstantFold: Handle gep nonnull, undef as well
llvm-svn: 302447
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/IR/ConstantFold.cpp | 7 | ||||
| -rw-r--r-- | llvm/test/Transforms/Inline/inline-constexpr-addrspacecast-argument.ll | 2 | 
2 files changed, 5 insertions, 4 deletions
diff --git a/llvm/lib/IR/ConstantFold.cpp b/llvm/lib/IR/ConstantFold.cpp index c185933254c..a20f3f811c8 100644 --- a/llvm/lib/IR/ConstantFold.cpp +++ b/llvm/lib/IR/ConstantFold.cpp @@ -2041,9 +2041,6 @@ Constant *llvm::ConstantFoldGetElementPtr(Type *PointeeTy, Constant *C,                                            Optional<unsigned> InRangeIndex,                                            ArrayRef<Value *> Idxs) {    if (Idxs.empty()) return C; -  Constant *Idx0 = cast<Constant>(Idxs[0]); -  if ((Idxs.size() == 1 && Idx0->isNullValue())) -    return C;    if (isa<UndefValue>(C)) {      Type *GEPTy = GetElementPtrInst::getGEPReturnType( @@ -2051,6 +2048,10 @@ Constant *llvm::ConstantFoldGetElementPtr(Type *PointeeTy, Constant *C,      return UndefValue::get(GEPTy);    } +  Constant *Idx0 = cast<Constant>(Idxs[0]); +  if (Idxs.size() == 1 && (Idx0->isNullValue() || isa<UndefValue>(Idx0))) +    return C; +    if (C->isNullValue()) {      bool isNull = true;      for (unsigned i = 0, e = Idxs.size(); i != e; ++i) diff --git a/llvm/test/Transforms/Inline/inline-constexpr-addrspacecast-argument.ll b/llvm/test/Transforms/Inline/inline-constexpr-addrspacecast-argument.ll index 1f2b143c97e..b8d41abe1c3 100644 --- a/llvm/test/Transforms/Inline/inline-constexpr-addrspacecast-argument.ll +++ b/llvm/test/Transforms/Inline/inline-constexpr-addrspacecast-argument.ll @@ -6,7 +6,7 @@ target datalayout = "e-p3:32:32-p4:64:64-n32"  @lds = internal addrspace(3) global [64 x i64] zeroinitializer  ; CHECK-LABEL: @constexpr_addrspacecast_ptr_size_change( -; CHECK: load i64, i64 addrspace(4)* getelementptr (i64, i64 addrspace(4)* addrspacecast (i64 addrspace(3)* getelementptr inbounds ([64 x i64], [64 x i64] addrspace(3)* @lds, i32 0, i32 0) to i64 addrspace(4)*), i64 undef) +; CHECK: load i64, i64 addrspace(4)* addrspacecast (i64 addrspace(3)* getelementptr inbounds ([64 x i64], [64 x i64] addrspace(3)* @lds, i32 0, i32 0) to i64 addrspace(4)*)  ; CHECK-NEXT: br  define void @constexpr_addrspacecast_ptr_size_change() #0 {    %tmp0 = call i32 @foo(i64 addrspace(4)* addrspacecast (i64 addrspace(3)* getelementptr inbounds ([64 x i64], [64 x i64] addrspace(3)* @lds, i32 0, i32 0) to i64 addrspace(4)*)) #1  | 

