[llvm] r343486 - [InstCombine] Handle vector compares in foldGEPIcmp(), take 2
Jesper Antonsson via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 1 07:59:26 PDT 2018
Author: jesperantonsson
Date: Mon Oct 1 07:59:25 2018
New Revision: 343486
URL: http://llvm.org/viewvc/llvm-project?rev=343486&view=rev
Log:
[InstCombine] Handle vector compares in foldGEPIcmp(), take 2
Summary:
This is a continuation of the fix for PR34627 "InstCombine assertion at vector gep/icmp folding". (I just realized bugpoint had fuzzed the original test for me, so I had fixed another trigger of the same assert in adjacent code in InstCombine.)
This patch avoids optimizing an icmp (to look only at the base pointers) when the resulting icmp would have a different type.
The patch adds a testcase and also cleans up and shrinks the pre-existing test for the adjacent assert trigger.
Reviewers: lebedev.ri, majnemer, spatel
Reviewed By: lebedev.ri
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D52494
Modified:
llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
llvm/trunk/test/Transforms/InstCombine/pr38984.ll
Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=343486&r1=343485&r2=343486&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Mon Oct 1 07:59:25 2018
@@ -909,7 +909,8 @@ Instruction *InstCombiner::foldGEPICmp(G
}
// If all indices are the same, just compare the base pointers.
- if (IndicesTheSame)
+ Type *BaseType = GEPLHS->getOperand(0)->getType();
+ if (IndicesTheSame && CmpInst::makeCmpResultType(BaseType) == I.getType())
return new ICmpInst(Cond, GEPLHS->getOperand(0), GEPRHS->getOperand(0));
// If we're comparing GEPs with two base pointers that only differ in type
Modified: llvm/trunk/test/Transforms/InstCombine/pr38984.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/pr38984.ll?rev=343486&r1=343485&r2=343486&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/pr38984.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/pr38984.ll Mon Oct 1 07:59:25 2018
@@ -2,24 +2,40 @@
; RUN: opt < %s -instcombine -S | FileCheck %s
target datalayout = "p:16:16"
- at offsets = external dso_local global [4 x i16], align 1
+ at a = external global [21 x i16], align 1
+ at offsets = external global [4 x i16], align 1
-define void @PR38984() {
-; CHECK-LABEL: @PR38984(
+; The "same gep" optimization should work with vector icmp.
+define <4 x i1> @PR38984_1() {
+; CHECK-LABEL: @PR38984_1(
; CHECK-NEXT: entry:
-; CHECK-NEXT: ret void
+; CHECK-NEXT: ret <4 x i1> <i1 true, i1 true, i1 true, i1 true>
;
entry:
%0 = load i16, i16* getelementptr ([4 x i16], [4 x i16]* @offsets, i16 0, i16 undef), align 1
%1 = insertelement <4 x i16> undef, i16 %0, i32 3
- %2 = sub <4 x i16> zeroinitializer, %1
- %3 = sext <4 x i16> %2 to <4 x i32>
- %4 = getelementptr inbounds i64, i64* null, <4 x i32> %3
- %5 = ptrtoint <4 x i64*> %4 to <4 x i32>
- %6 = getelementptr inbounds i64, i64* null, <4 x i16> %2
- %7 = ptrtoint <4 x i64*> %6 to <4 x i32>
- %8 = icmp eq <4 x i32> %5, %7
- %9 = select <4 x i1> %8, <4 x i16> zeroinitializer, <4 x i16> <i16 1, i16 1, i16 1, i16 1>
- %10 = sext <4 x i16> %9 to <4 x i32>
- ret void
+ %2 = getelementptr i32, i32* null, <4 x i16> %1
+ %3 = getelementptr i32, i32* null, <4 x i16> %1
+ %4 = icmp eq <4 x i32*> %2, %3
+ ret <4 x i1> %4
+}
+
+; The "compare base pointers" optimization should not kick in for vector icmp.
+define <4 x i1> @PR38984_2() {
+; CHECK-LABEL: @PR38984_2(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* getelementptr ([4 x i16], [4 x i16]* @offsets, i16 0, i16 undef), align 2
+; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x i16> undef, i16 [[TMP0]], i32 3
+; CHECK-NEXT: [[TMP2:%.*]] = getelementptr i16, i16* getelementptr inbounds ([21 x i16], [21 x i16]* @a, i16 1, i16 0), <4 x i16> [[TMP1]]
+; CHECK-NEXT: [[TMP3:%.*]] = getelementptr i16, i16* null, <4 x i16> [[TMP1]]
+; CHECK-NEXT: [[TMP4:%.*]] = icmp eq <4 x i16*> [[TMP2]], [[TMP3]]
+; CHECK-NEXT: ret <4 x i1> [[TMP4]]
+;
+entry:
+ %0 = load i16, i16* getelementptr ([4 x i16], [4 x i16]* @offsets, i16 0, i16 undef)
+ %1 = insertelement <4 x i16> undef, i16 %0, i32 3
+ %2 = getelementptr i16, i16* getelementptr ([21 x i16], [21 x i16]* @a, i64 1, i32 0), <4 x i16> %1
+ %3 = getelementptr i16, i16* null, <4 x i16> %1
+ %4 = icmp eq <4 x i16*> %2, %3
+ ret <4 x i1> %4
}
More information about the llvm-commits
mailing list