forked from OSchip/llvm-project
[SimplifyCFG] teach simplifycfg not to introduce ptrtoint for NI pointers
SimplifyCFG expects to be able to cast both sides to an int, if either side can be case to an int, but this is not desirable or legal, in general, per D104547. Spotted in https://github.com/JuliaLang/julia/issues/45702 Reviewed By: nikic Differential Revision: https://reviews.llvm.org/D128670
This commit is contained in:
parent
31fbdab376
commit
3a8d7fe201
|
@ -473,7 +473,8 @@ static bool dominatesMergePoint(Value *V, BasicBlock *BB,
|
|||
static ConstantInt *GetConstantInt(Value *V, const DataLayout &DL) {
|
||||
// Normal constant int.
|
||||
ConstantInt *CI = dyn_cast<ConstantInt>(V);
|
||||
if (CI || !isa<Constant>(V) || !V->getType()->isPointerTy())
|
||||
if (CI || !isa<Constant>(V) || !V->getType()->isPointerTy() ||
|
||||
DL.isNonIntegralPointerType(V->getType()))
|
||||
return CI;
|
||||
|
||||
// This is some kind of pointer constant. Turn it into a pointer-sized
|
||||
|
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue