diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -473,7 +473,8 @@ static ConstantInt *GetConstantInt(Value *V, const DataLayout &DL) { // Normal constant int. ConstantInt *CI = dyn_cast(V); - if (CI || !isa(V) || !V->getType()->isPointerTy()) + if (CI || !isa(V) || !V->getType()->isPointerTy() || + DL.isNonIntegralPointerType(V->getType())) return CI; // This is some kind of pointer constant. Turn it into a pointer-sized diff --git a/llvm/test/Transforms/SimplifyCFG/nonintegral.ll b/llvm/test/Transforms/SimplifyCFG/nonintegral.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/SimplifyCFG/nonintegral.ll @@ -0,0 +1,28 @@ +; RUN: opt -passes=simplifycfg -S < %s | FileCheck %s + +target datalayout = "ni:1" + +define void @test_01(i64 addrspace(1)* align 8 %ptr) { +; CHECK-LABEL: @test_01( +; CHECK-NOT: ptrtoint +; CHECK-NEXT: icmp eq i64 addrspace(1)* %ptr, null +; CHECK-NOT: ptrtoint + %cond1 = icmp eq i64 addrspace(1)* %ptr, null + %cond2 = icmp eq i64 addrspace(1)* %ptr, null + br i1 %cond1, label %true1, label %false1 + +true1: + br i1 %cond2, label %true2, label %false2 + +false1: + store i64 1, i64 addrspace(1)* %ptr, align 8 + br label %true1 + +true2: + store i64 2, i64 addrspace(1)* %ptr, align 8 + ret void + +false2: + store i64 3, i64 addrspace(1)* %ptr, align 8 + ret void +}