From 52bd24c823e1e4c97b3a7fd6815b5c208675c064 Mon Sep 17 00:00:00 2001 From: Jameson Nash Date: Mon, 15 Aug 2022 15:09:46 -0400 Subject: [PATCH] [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 --- llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 3 +- .../Transforms/SimplifyCFG/nonintegral.ll | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 llvm/test/Transforms/SimplifyCFG/nonintegral.ll diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 197b0d75d091..76f09c0bb14d 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -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(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 index 000000000000..7880c6a5e630 --- /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 +}