[PATCH] D85647: [InstCombine] eliminate a pointer cast around insertelement

Sanjay Patel via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 10 06:32:48 PDT 2020


spatel created this revision.
spatel added reviewers: lebedev.ri, efriedma, nikic, aqjune.
Herald added subscribers: hiraditya, mcrosier.
Herald added a project: LLVM.
spatel requested review of this revision.

I'm not sure if this solves PR46839 completely, but reducing the casting should help:
https://bugs.llvm.org/show_bug.cgi?id=46839

I have not dealt much with pointer casts, so if anyone sees any corner-cases to test/avoid, please comment. Alive2 does not appear to support these ops.


https://reviews.llvm.org/D85647

Files:
  llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
  llvm/test/Transforms/InstCombine/cast_ptr.ll


Index: llvm/test/Transforms/InstCombine/cast_ptr.ll
===================================================================
--- llvm/test/Transforms/InstCombine/cast_ptr.ll
+++ llvm/test/Transforms/InstCombine/cast_ptr.ll
@@ -164,9 +164,8 @@
 
 define <2 x i32> @insertelt(<2 x i32> %x, i32* %p, i133 %index) {
 ; CHECK-LABEL: @insertelt(
-; CHECK-NEXT:    [[V:%.*]] = inttoptr <2 x i32> [[X:%.*]] to <2 x i32*>
-; CHECK-NEXT:    [[I:%.*]] = insertelement <2 x i32*> [[V]], i32* [[P:%.*]], i133 [[INDEX:%.*]]
-; CHECK-NEXT:    [[R:%.*]] = ptrtoint <2 x i32*> [[I]] to <2 x i32>
+; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint i32* [[P:%.*]] to i32
+; CHECK-NEXT:    [[R:%.*]] = insertelement <2 x i32> [[X:%.*]], i32 [[TMP1]], i133 [[INDEX:%.*]]
 ; CHECK-NEXT:    ret <2 x i32> [[R]]
 ;
   %v = inttoptr <2 x i32> %x to <2 x i32*>
@@ -178,9 +177,8 @@
 define <2 x i32> @insertelt_intptr_trunc(<2 x i64> %x, i32* %p) {
 ; CHECK-LABEL: @insertelt_intptr_trunc(
 ; CHECK-NEXT:    [[TMP1:%.*]] = trunc <2 x i64> [[X:%.*]] to <2 x i32>
-; CHECK-NEXT:    [[V:%.*]] = inttoptr <2 x i32> [[TMP1]] to <2 x i32*>
-; CHECK-NEXT:    [[I:%.*]] = insertelement <2 x i32*> [[V]], i32* [[P:%.*]], i32 0
-; CHECK-NEXT:    [[R:%.*]] = ptrtoint <2 x i32*> [[I]] to <2 x i32>
+; CHECK-NEXT:    [[TMP2:%.*]] = ptrtoint i32* [[P:%.*]] to i32
+; CHECK-NEXT:    [[R:%.*]] = insertelement <2 x i32> [[TMP1]], i32 [[TMP2]], i32 0
 ; CHECK-NEXT:    ret <2 x i32> [[R]]
 ;
   %v = inttoptr <2 x i64> %x to <2 x i32*>
@@ -192,9 +190,8 @@
 define <2 x i32> @insertelt_intptr_zext(<2 x i8> %x, i32* %p) {
 ; CHECK-LABEL: @insertelt_intptr_zext(
 ; CHECK-NEXT:    [[TMP1:%.*]] = zext <2 x i8> [[X:%.*]] to <2 x i32>
-; CHECK-NEXT:    [[V:%.*]] = inttoptr <2 x i32> [[TMP1]] to <2 x i32*>
-; CHECK-NEXT:    [[I:%.*]] = insertelement <2 x i32*> [[V]], i32* [[P:%.*]], i32 1
-; CHECK-NEXT:    [[R:%.*]] = ptrtoint <2 x i32*> [[I]] to <2 x i32>
+; CHECK-NEXT:    [[TMP2:%.*]] = ptrtoint i32* [[P:%.*]] to i32
+; CHECK-NEXT:    [[R:%.*]] = insertelement <2 x i32> [[TMP1]], i32 [[TMP2]], i32 1
 ; CHECK-NEXT:    ret <2 x i32> [[R]]
 ;
   %v = inttoptr <2 x i8> %x to <2 x i32*>
@@ -206,10 +203,9 @@
 define <2 x i64> @insertelt_intptr_zext_zext(<2 x i8> %x, i32* %p) {
 ; CHECK-LABEL: @insertelt_intptr_zext_zext(
 ; CHECK-NEXT:    [[TMP1:%.*]] = zext <2 x i8> [[X:%.*]] to <2 x i32>
-; CHECK-NEXT:    [[V:%.*]] = inttoptr <2 x i32> [[TMP1]] to <2 x i32*>
-; CHECK-NEXT:    [[I:%.*]] = insertelement <2 x i32*> [[V]], i32* [[P:%.*]], i32 0
-; CHECK-NEXT:    [[TMP2:%.*]] = ptrtoint <2 x i32*> [[I]] to <2 x i32>
-; CHECK-NEXT:    [[R:%.*]] = zext <2 x i32> [[TMP2]] to <2 x i64>
+; CHECK-NEXT:    [[TMP2:%.*]] = ptrtoint i32* [[P:%.*]] to i32
+; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <2 x i32> [[TMP1]], i32 [[TMP2]], i32 0
+; CHECK-NEXT:    [[R:%.*]] = zext <2 x i32> [[TMP3]] to <2 x i64>
 ; CHECK-NEXT:    ret <2 x i64> [[R]]
 ;
   %v = inttoptr <2 x i8> %x to <2 x i32*>
@@ -224,8 +220,8 @@
 ; CHECK-LABEL: @insertelt_extra_use1(
 ; CHECK-NEXT:    [[V:%.*]] = inttoptr <2 x i32> [[X:%.*]] to <2 x i32*>
 ; CHECK-NEXT:    call void @use(<2 x i32*> [[V]])
-; CHECK-NEXT:    [[I:%.*]] = insertelement <2 x i32*> [[V]], i32* [[P:%.*]], i32 0
-; CHECK-NEXT:    [[R:%.*]] = ptrtoint <2 x i32*> [[I]] to <2 x i32>
+; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint i32* [[P:%.*]] to i32
+; CHECK-NEXT:    [[R:%.*]] = insertelement <2 x i32> [[X]], i32 [[TMP1]], i32 0
 ; CHECK-NEXT:    ret <2 x i32> [[R]]
 ;
   %v = inttoptr <2 x i32> %x to <2 x i32*>
Index: llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
===================================================================
--- llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
@@ -1947,6 +1947,16 @@
     return CastInst::CreateIntegerCast(P, Ty, /*isSigned=*/false);
   }
 
+  Value *Vec, *Scalar, *Index;
+  if (match(SrcOp, m_OneUse(m_InsertElt(m_IntToPtr(m_Value(Vec)),
+                                        m_Value(Scalar), m_Value(Index)))) &&
+      Vec->getType() == Ty) {
+    // Convert the scalar to int followed by insert to eliminate one cast:
+    // p2i (ins (i2p Vec), Scalar, Index --> ins Vec, (p2i Scalar), Index
+    Value *NewCast = Builder.CreatePtrToInt(Scalar, Ty->getScalarType());
+    return InsertElementInst::Create(Vec, NewCast, Index);
+  }
+
   return commonPointerCastTransforms(CI);
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D85647.284339.patch
Type: text/x-patch
Size: 4390 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200810/467f590e/attachment.bin>


More information about the llvm-commits mailing list