[llvm] 7c83f8c - [InstCombine] Check GEP source type in select of gep fold

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 14 02:46:53 PST 2022


Author: Nikita Popov
Date: 2022-02-14T11:46:45+01:00
New Revision: 7c83f8c45da745c085b2fd12083a3b4c3b3cc4c9

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

LOG: [InstCombine] Check GEP source type in select of gep fold

This is no longer implicitly checked through the pointer type
with opaque pointers.

Added: 
    

Modified: 
    llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
    llvm/test/Transforms/InstCombine/opaque-ptr.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index 65e60498ff954..578e1a9210181 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -370,6 +370,7 @@ Instruction *InstCombinerImpl::foldSelectOpOp(SelectInst &SI, Instruction *TI,
   // one-use constraint, but that needs be examined carefully since it may not
   // reduce the total number of instructions.
   if (TI->getNumOperands() != 2 || FI->getNumOperands() != 2 ||
+      !TI->isSameOperationAs(FI) ||
       (!isa<BinaryOperator>(TI) && !isa<GetElementPtrInst>(TI)) ||
       !TI->hasOneUse() || !FI->hasOneUse())
     return nullptr;

diff  --git a/llvm/test/Transforms/InstCombine/opaque-ptr.ll b/llvm/test/Transforms/InstCombine/opaque-ptr.ll
index 89167949f32f1..87326008386d1 100644
--- a/llvm/test/Transforms/InstCombine/opaque-ptr.ll
+++ b/llvm/test/Transforms/InstCombine/opaque-ptr.ll
@@ -457,3 +457,28 @@ join:
   %gep = getelementptr i32, ptr %phi, i64 1
   ret ptr %gep
 }
+
+define ptr @select_of_gep(i1 %c, ptr %p) {
+; CHECK-LABEL: @select_of_gep(
+; CHECK-NEXT:    [[S_V:%.*]] = select i1 [[C:%.*]], i64 1, i64 2
+; CHECK-NEXT:    [[S:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[S_V]]
+; CHECK-NEXT:    ret ptr [[S]]
+;
+  %gep1 = getelementptr i32, ptr %p, i64 1
+  %gep2 = getelementptr i32, ptr %p, i64 2
+  %s = select i1 %c, ptr %gep1, ptr %gep2
+  ret ptr %s
+}
+
+define ptr @select_of_gep_
diff erent_type(i1 %c, ptr %p) {
+; CHECK-LABEL: @select_of_gep_
diff erent_type(
+; CHECK-NEXT:    [[GEP1:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 1
+; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr i64, ptr [[P]], i64 2
+; CHECK-NEXT:    [[S:%.*]] = select i1 [[C:%.*]], ptr [[GEP1]], ptr [[GEP2]]
+; CHECK-NEXT:    ret ptr [[S]]
+;
+  %gep1 = getelementptr i32, ptr %p, i64 1
+  %gep2 = getelementptr i64, ptr %p, i64 2
+  %s = select i1 %c, ptr %gep1, ptr %gep2
+  ret ptr %s
+}


        


More information about the llvm-commits mailing list