[llvm] d8e9071 - [ConstraintElimination] Skip pointer casts.

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 2 13:25:56 PST 2021


Author: Florian Hahn
Date: 2021-02-02T21:25:29Z
New Revision: d8e90716dfd186943359c7ade83cc2d1d247f140

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

LOG: [ConstraintElimination] Skip pointer casts.

We should be able to look through pointer casts that do not impact the
value.

Added: 
    

Modified: 
    llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
    llvm/test/Transforms/ConstraintElimination/pointercast.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
index e5b171fdad8a..a127f0b391d7 100644
--- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
@@ -139,8 +139,8 @@ getConstraint(CmpInst::Predicate Pred, Value *Op0, Value *Op1,
   if (Pred != CmpInst::ICMP_ULE && Pred != CmpInst::ICMP_ULT)
     return {};
 
-  auto ADec = decompose(Op0);
-  auto BDec = decompose(Op1);
+  auto ADec = decompose(Op0->stripPointerCasts());
+  auto BDec = decompose(Op1->stripPointerCasts());
   // Skip if decomposing either of the values failed.
   if (ADec.empty() || BDec.empty())
     return {};

diff  --git a/llvm/test/Transforms/ConstraintElimination/pointercast.ll b/llvm/test/Transforms/ConstraintElimination/pointercast.ll
index f96ff189a22f..83e245663cda 100644
--- a/llvm/test/Transforms/ConstraintElimination/pointercast.ll
+++ b/llvm/test/Transforms/ConstraintElimination/pointercast.ll
@@ -2,6 +2,7 @@
 ; RUN: opt -constraint-elimination -S %s | FileCheck %s
 
 define i1 @bitcast_and_cmp(i32* readonly %src, i32* readnone %min, i32* readnone %max) {
+;
 ; CHECK-LABEL: @bitcast_and_cmp(
 ; CHECK-NEXT:  check.0.min:
 ; CHECK-NEXT:    [[SRC_C:%.*]] = bitcast i32* [[SRC:%.*]] to i8*
@@ -18,19 +19,19 @@ define i1 @bitcast_and_cmp(i32* readonly %src, i32* readnone %min, i32* readnone
 ; CHECK:       checks:
 ; CHECK-NEXT:    [[C_3_MIN:%.*]] = icmp ult i32* [[GEP_3]], [[MIN]]
 ; CHECK-NEXT:    [[C_3_MAX:%.*]] = icmp ult i32* [[GEP_3]], [[MAX]]
-; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[C_3_MIN]], [[C_3_MAX]]
+; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 false, [[C_3_MAX]]
 ; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 1
 ; CHECK-NEXT:    [[C_1_MIN:%.*]] = icmp ult i32* [[GEP_1]], [[MIN]]
 ; CHECK-NEXT:    [[C_1_MAX:%.*]] = icmp ult i32* [[GEP_1]], [[MAX]]
-; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[C_1_MIN]], [[C_1_MAX]]
+; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 false, true
 ; CHECK-NEXT:    [[GEP_2:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 2
 ; CHECK-NEXT:    [[C_2_MIN:%.*]] = icmp ult i32* [[GEP_2]], [[MIN]]
 ; CHECK-NEXT:    [[C_2_MAX:%.*]] = icmp ult i32* [[GEP_2]], [[MAX]]
-; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[C_2_MIN]], [[C_2_MAX]]
+; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 false, true
 ; CHECK-NEXT:    [[GEP_4:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 4
-; CHECK-NEXT:    [[C_4_MIN:%.*]] = icmp ult i32* [[GEP_2]], [[MIN]]
-; CHECK-NEXT:    [[C_4_MAX:%.*]] = icmp ult i32* [[GEP_2]], [[MAX]]
-; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 [[C_4_MIN]], [[C_4_MAX]]
+; CHECK-NEXT:    [[C_4_MIN:%.*]] = icmp ult i32* [[GEP_4]], [[MIN]]
+; CHECK-NEXT:    [[C_4_MAX:%.*]] = icmp ult i32* [[GEP_4]], [[MAX]]
+; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 false, [[C_4_MAX]]
 ; CHECK-NEXT:    [[RES_5:%.*]] = xor i1 [[RES_1]], [[RES_2]]
 ; CHECK-NEXT:    [[RES_6:%.*]] = xor i1 [[RES_5]], [[RES_3]]
 ; CHECK-NEXT:    [[RES_7:%.*]] = xor i1 [[RES_6]], [[RES_4]]
@@ -68,8 +69,8 @@ checks:
   %res.3 = xor i1 %c.2.min, %c.2.max
 
   %gep.4 = getelementptr inbounds i32, i32* %src, i64 4
-  %c.4.min = icmp ult i32* %gep.2, %min
-  %c.4.max = icmp ult i32* %gep.2, %max
+  %c.4.min = icmp ult i32* %gep.4, %min
+  %c.4.max = icmp ult i32* %gep.4, %max
   %res.4 = xor i1 %c.4.min, %c.4.max
 
   %res.5 = xor i1 %res.1, %res.2


        


More information about the llvm-commits mailing list