[PATCH] D61760: [InferAddressSpaces] Enhance the handling of cosntexpr.

Michael Liao via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu May 9 14:29:51 PDT 2019


hliao created this revision.
hliao added a reviewer: arsenm.
Herald added subscribers: llvm-commits, hiraditya, nhaehnle, wdng, jvesely, jholewinski.
Herald added a project: LLVM.

- Constant expressions may not be added in strict postorder as the forward instruction scan order. Thus, for a constant express (CE0), if its operand (CE1) is used in an previous instruction, they are not in postorder. However, different from `cloneInstructionWithNewAddressSpace`, `cloneConstantExprWithNewAddressSpace` doesn't bookkeep uninferred instructions for later resolving. That results in failure of inferring constant address.
- This patch adds the support to infer constant expression operand recursively, since there won't be loop, if that operand is another constant expression.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D61760

Files:
  llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
  llvm/test/Transforms/InferAddressSpaces/AMDGPU/infer-getelementptr.ll
  llvm/test/Transforms/InferAddressSpaces/NVPTX/clone_constexpr.ll


Index: llvm/test/Transforms/InferAddressSpaces/NVPTX/clone_constexpr.ll
===================================================================
--- llvm/test/Transforms/InferAddressSpaces/NVPTX/clone_constexpr.ll
+++ llvm/test/Transforms/InferAddressSpaces/NVPTX/clone_constexpr.ll
@@ -11,7 +11,7 @@
 ; CHECK:  %idxprom.i = zext i32 %x0 to i64
 ; CHECK:  %arrayidx.i = getelementptr %struct.S, %struct.S* addrspacecast (%struct.S addrspace(3)* @g1 to %struct.S*), i64 0, i32 0, i64 %idxprom.i
 ; CHECK:  tail call void @f1(i32* %arrayidx.i, i32 undef) #0
-; CHECK:  %x1 = load i32, i32* getelementptr (%struct.S, %struct.S* addrspacecast (%struct.S addrspace(3)* @g1 to %struct.S*), i64 0, i32 0, i64 0), align 4
+; CHECK:  %x1 = load i32, i32 addrspace(3)* getelementptr inbounds (%struct.S, %struct.S addrspace(3)* @g1, i64 0, i32 0, i64 0), align 4
 ; CHECK:  %L.sroa.0.0.insert.ext.i = zext i32 %x1 to i64
 ; CHECK:  tail call void @f2(i64* null, i64 %L.sroa.0.0.insert.ext.i) #0
 ; CHECK:  ret void
Index: llvm/test/Transforms/InferAddressSpaces/AMDGPU/infer-getelementptr.ll
===================================================================
--- llvm/test/Transforms/InferAddressSpaces/AMDGPU/infer-getelementptr.ll
+++ llvm/test/Transforms/InferAddressSpaces/AMDGPU/infer-getelementptr.ll
@@ -71,3 +71,15 @@
 
   ret void
 }
+
+; CHECK-LABEL: @unorder_constexpr_gep_bitcast(
+; CHECK-NEXT: %x0 = load i32, i32 addrspace(3)* bitcast ([648 x double] addrspace(3)* @lds to i32 addrspace(3)*), align 4
+; CHECK-NEXT: %x1 = load i32, i32 addrspace(3)* getelementptr (i32, i32 addrspace(3)* bitcast ([648 x double] addrspace(3)* @lds to i32 addrspace(3)*), i32 1), align 4
+define void @unorder_constexpr_gep_bitcast() {
+  %x0 = load i32, i32* bitcast ([648 x double]* addrspacecast ([648 x double] addrspace(3)* @lds to [648 x double]*) to i32*), align 4
+  %x1 = load i32, i32* getelementptr (i32, i32* bitcast ([648 x double]* addrspacecast ([648 x double] addrspace(3)* @lds to [648 x double]*) to i32*), i32 1), align 4
+  call void @use(i32 %x0, i32 %x1)
+  ret void
+}
+
+declare void @use(i32, i32)
Index: llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
+++ llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
@@ -553,10 +553,17 @@
     if (Value *NewOperand = ValueWithNewAddrSpace.lookup(Operand)) {
       IsNew = true;
       NewOperands.push_back(cast<Constant>(NewOperand));
-    } else {
-      // Otherwise, reuses the old operand.
-      NewOperands.push_back(Operand);
+      continue;
     }
+    if (auto CExpr = dyn_cast<ConstantExpr>(Operand))
+      if (Value *NewOperand = cloneConstantExprWithNewAddressSpace(
+              CExpr, NewAddrSpace, ValueWithNewAddrSpace)) {
+        IsNew = true;
+        NewOperands.push_back(cast<Constant>(NewOperand));
+        continue;
+      }
+    // Otherwise, reuses the old operand.
+    NewOperands.push_back(Operand);
   }
 
   // If !IsNew, we will replace the Value with itself. However, replaced values


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D61760.198910.patch
Type: text/x-patch
Size: 3097 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190509/25c63ffa/attachment.bin>


More information about the llvm-commits mailing list