[llvm] b988d69 - [infer-address-spaces] Handle complex non-pointer constexpr arguments.

Artem Belevich via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 19 12:16:13 PDT 2021


Author: Artem Belevich
Date: 2021-07-19T12:15:52-07:00
New Revision: b988d69ea2864a1bdf9789f930ecf7f41d109653

URL: https://github.com/llvm/llvm-project/commit/b988d69ea2864a1bdf9789f930ecf7f41d109653
DIFF: https://github.com/llvm/llvm-project/commit/b988d69ea2864a1bdf9789f930ecf7f41d109653.diff

LOG: [infer-address-spaces] Handle complex non-pointer constexpr arguments.

Fixes https://bugs.llvm.org/show_bug.cgi?id=51099

Differential Revision: https://reviews.llvm.org/D106098

Added: 
    

Modified: 
    llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
    llvm/test/Transforms/InferAddressSpaces/NVPTX/clone_constexpr.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp b/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
index 63b8425f2d015..f7d631f5e7851 100644
--- a/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
+++ b/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
@@ -635,8 +635,10 @@ static Value *cloneConstantExprWithNewAddressSpace(
     ConstantExpr *CE, unsigned NewAddrSpace,
     const ValueToValueMapTy &ValueWithNewAddrSpace, const DataLayout *DL,
     const TargetTransformInfo *TTI) {
-  Type *TargetType = PointerType::getWithSamePointeeType(
-      cast<PointerType>(CE->getType()), NewAddrSpace);
+  Type *TargetType = CE->getType()->isPointerTy()
+                         ? PointerType::getWithSamePointeeType(
+                               cast<PointerType>(CE->getType()), NewAddrSpace)
+                         : CE->getType();
 
   if (CE->getOpcode() == Instruction::AddrSpaceCast) {
     // Because CE is flat, the source address space must be specific.

diff  --git a/llvm/test/Transforms/InferAddressSpaces/NVPTX/clone_constexpr.ll b/llvm/test/Transforms/InferAddressSpaces/NVPTX/clone_constexpr.ll
index 53dff196d32e9..07593f19a4399 100644
--- a/llvm/test/Transforms/InferAddressSpaces/NVPTX/clone_constexpr.ll
+++ b/llvm/test/Transforms/InferAddressSpaces/NVPTX/clone_constexpr.ll
@@ -31,6 +31,51 @@ declare void @f1(i32*, i32) local_unnamed_addr #0
 declare void @f2(i64*, i64) local_unnamed_addr #0
 declare i32 @llvm.nvvm.read.ptx.sreg.tid.x() #1
 
+; Make sure we can clone GEP which uses complex constant expressions as indices.
+; https://bugs.llvm.org/show_bug.cgi?id=51099
+ at g2 = internal addrspace(3) global [128 x i8] undef, align 1
+
+; CHECK-LABEL: @complex_ce(
+; CHECK: %0 = load float, float addrspace(3)* bitcast
+; CHECK-SAME:   i8 addrspace(3)* getelementptr (i8,
+; CHECK-SAME:     i8 addrspace(3)* getelementptr inbounds ([128 x i8], [128 x i8] addrspace(3)* @g2, i64 0, i64 0),
+; CHECK-SAME:     i64 sub (
+; CHECK-SAME        i64 ptrtoint (
+; CHECK-SAME          i8 addrspace(3)* getelementptr inbounds ([128 x i8], [128 x i8] addrspace(3)* @g2, i64 0, i64 123) to i64),
+; CHECK-SAME:       i64 ptrtoint (
+; CHECK-SAME:         i8 addrspace(3)* getelementptr inbounds ([128 x i8], [128 x i8] addrspace(3)* @g2, i64 2, i64 0) to i64)))
+; CHECK-SAME:   to float addrspace(3)*)
+; Function Attrs: norecurse nounwind
+define float @complex_ce(i8* nocapture readnone %a, i8* nocapture readnone %b, i8* nocapture readnone %c) local_unnamed_addr #0 {
+entry:
+  %0 = load float, float* bitcast (
+       i8* getelementptr (
+         i8, i8* getelementptr inbounds (
+           [128 x i8],
+           [128 x i8]* addrspacecast ([128 x i8] addrspace(3)* @g2 to [128 x i8]*),
+           i64 0,
+           i64 0),
+         i64 sub (
+           i64 ptrtoint (
+             i8* getelementptr inbounds (
+               [128 x i8],
+               [128 x i8]* addrspacecast ([128 x i8] addrspace(3)* @g2 to [128 x i8]*),
+               i64 0,
+               i64 123)
+             to i64),
+           i64 ptrtoint (
+             i8* getelementptr inbounds (
+               [128 x i8],
+               [128 x i8]* addrspacecast ([128 x i8] addrspace(3)* @g2 to [128 x i8]*),
+               i64 2,
+               i64 0)
+             to i64)))
+        to float*), align 4
+  ret float %0
+}
+
+
+
 attributes #0 = { convergent nounwind }
 attributes #1 = { nounwind readnone }
 attributes #2 = { nounwind }


        


More information about the llvm-commits mailing list