[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:
Jameson Nash 2022-08-15 15:09:46 -04:00 committed by Valentin Churavy
parent 31fbdab376
commit 3a8d7fe201
2 changed files with 30 additions and 1 deletions

View File

@ -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

View File

@ -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
}