[llvm] 96d3be8 - [InferAddressSpaces] Check if AS are the same in isNoopPtrIntCastPair
Bing1 Yu via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 27 20:11:07 PDT 2022
Author: Wenju He
Date: 2022-04-28T11:10:55+08:00
New Revision: 96d3be84438e02c2d352ba1751aaa972f9dc3a89
URL: https://github.com/llvm/llvm-project/commit/96d3be84438e02c2d352ba1751aaa972f9dc3a89
DIFF: https://github.com/llvm/llvm-project/commit/96d3be84438e02c2d352ba1751aaa972f9dc3a89.diff
LOG: [InferAddressSpaces] Check if AS are the same in isNoopPtrIntCastPair
isNoopAddrSpaceCast is expecting SrcAS is different from DestAS.
If the two AS are the same, consider ptrtoint/inttoptr as noop cast.
Reviewed By: arsenm
Differential Revision: https://reviews.llvm.org/D123573
Added:
llvm/test/Transforms/InferAddressSpaces/X86/noop-ptrint-pair.ll
Modified:
llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp b/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
index 04dbfc5e9783..1659532d8a5e 100644
--- a/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
+++ b/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
@@ -279,15 +279,15 @@ static bool isNoopPtrIntCastPair(const Operator *I2P, const DataLayout &DL,
// arithmetic may also be undefined after invalid pointer reinterpret cast.
// However, as we confirm through the target hooks that it's a no-op
// addrspacecast, it doesn't matter since the bits should be the same.
+ unsigned P2IOp0AS = P2I->getOperand(0)->getType()->getPointerAddressSpace();
+ unsigned I2PAS = I2P->getType()->getPointerAddressSpace();
return CastInst::isNoopCast(Instruction::CastOps(I2P->getOpcode()),
I2P->getOperand(0)->getType(), I2P->getType(),
DL) &&
CastInst::isNoopCast(Instruction::CastOps(P2I->getOpcode()),
P2I->getOperand(0)->getType(), P2I->getType(),
DL) &&
- TTI->isNoopAddrSpaceCast(
- P2I->getOperand(0)->getType()->getPointerAddressSpace(),
- I2P->getType()->getPointerAddressSpace());
+ (P2IOp0AS == I2PAS || TTI->isNoopAddrSpaceCast(P2IOp0AS, I2PAS));
}
// Returns true if V is an address expression.
diff --git a/llvm/test/Transforms/InferAddressSpaces/X86/noop-ptrint-pair.ll b/llvm/test/Transforms/InferAddressSpaces/X86/noop-ptrint-pair.ll
new file mode 100644
index 000000000000..541264db0508
--- /dev/null
+++ b/llvm/test/Transforms/InferAddressSpaces/X86/noop-ptrint-pair.ll
@@ -0,0 +1,16 @@
+; RUN: opt -mtriple=x86_64-unknown-unknown -S -o - -infer-address-spaces -assume-default-is-flat-addrspace %s | FileCheck %s
+
+; Check that assert in X86TargetMachine::isNoopAddrSpaceCast is not triggered.
+
+target datalayout = "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-ni:7"
+
+; CHECK-LABEL: @noop_ptrint_pair(
+; CHECK: addrspacecast i32 addrspace(1)* %x to i32 addrspace(4)*
+; CHECK-NEXT: ptrtoint i32 addrspace(4)* %{{.*}} to i64
+; CHECK-NEXT: inttoptr i64 %{{.*}} to i32 addrspace(4)*
+define void @noop_ptrint_pair(i32 addrspace(1)* %x) {
+ %1 = addrspacecast i32 addrspace(1)* %x to i32 addrspace(4)*
+ %2 = ptrtoint i32 addrspace(4)* %1 to i64
+ %3 = inttoptr i64 %2 to i32 addrspace(4)*
+ ret void
+}
More information about the llvm-commits
mailing list