[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