Skip to content

Commit 5c692fd

Browse files
committed
Changed pattern matching
1 parent e360e21 commit 5c692fd

File tree

2 files changed

+34
-21
lines changed

2 files changed

+34
-21
lines changed

llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2618,8 +2618,8 @@ Instruction *InstCombinerImpl::visitSub(BinaryOperator &I) {
26182618
// Optimize pointer differences into the same array into a size. Consider:
26192619
// &A[10] - &A[0]: we should compile this to "10".
26202620
Value *LHSOp, *RHSOp;
2621-
if (match(Op0, m_ZExtOrSelf(m_PtrToInt(m_Value(LHSOp)))) &&
2622-
match(Op1, m_ZExtOrSelf(m_PtrToInt(m_Value(RHSOp)))))
2621+
if (match(Op0, m_PtrToInt(m_Value(LHSOp))) &&
2622+
match(Op1, m_PtrToInt(m_Value(RHSOp))))
26232623
if (Value *Res = OptimizePointerDifference(LHSOp, RHSOp, I.getType(),
26242624
I.hasNoUnsignedWrap()))
26252625
return replaceInstUsesWith(I, Res);
@@ -2631,6 +2631,18 @@ Instruction *InstCombinerImpl::visitSub(BinaryOperator &I) {
26312631
/* IsNUW */ false))
26322632
return replaceInstUsesWith(I, Res);
26332633

2634+
if (match(Op0, m_ZExt(m_PtrToInt(m_Value(LHSOp)))) &&
2635+
match(Op1, m_PtrToInt(m_Value(RHSOp))) && isa<GlobalValue>(RHSOp)) {
2636+
Value *Offset;
2637+
if (match(LHSOp, m_GEP(m_Specific(RHSOp), m_Value(Offset)))) {
2638+
auto *GEP = cast<GEPOperator>(LHSOp);
2639+
if (GEP->isInBounds()) {
2640+
Value *Res = Builder.CreateZExt(EmitGEPOffset(GEP), I.getType());
2641+
return replaceInstUsesWith(I, Res);
2642+
}
2643+
}
2644+
}
2645+
26342646
// Canonicalize a shifty way to code absolute value to the common pattern.
26352647
// There are 2 potential commuted variants.
26362648
// We're relying on the fact that we only do this transform when the shift has

llvm/test/Transforms/InstCombine/sub-gep.ll

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
22
; RUN: opt -S -passes=instcombine < %s | FileCheck %s
33

4-
target datalayout = "e-p:64:64:64-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
4+
target datalayout = "e-p:64:64:64-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-p2:32:32"
55

66
define i64 @test_inbounds(ptr %base, i64 %idx) {
77
; CHECK-LABEL: @test_inbounds(
@@ -271,7 +271,7 @@ define i64 @test25(ptr %P, i64 %A){
271271
}
272272

273273
define i64 @zext_ptrtoint_sub_ptrtoint(ptr %p, i32 %offset) {
274-
; CHECK-LABLE: @zext_ptrtoint_sub_ptrtoint(
274+
; CHECK-LABEL: @zext_ptrtoint_sub_ptrtoint(
275275
; CHECK-NEXT: %1 = sext i32 %offset to i64
276276
; CHECK-NEXT: %A = getelementptr bfloat, ptr @Arr, i64 %1
277277
; CHECK-NEXT: %2 = ptrtoint ptr %A to i64
@@ -286,7 +286,7 @@ define i64 @zext_ptrtoint_sub_ptrtoint(ptr %p, i32 %offset) {
286286
}
287287

288288
define i64 @ptrtoint_sub_zext_ptrtoint(ptr %p, i32 %offset) {
289-
; CHECK-LABLE: @ptrtoint_sub_zext_ptrtoint(
289+
; CHECK-LABEL: @ptrtoint_sub_zext_ptrtoint(
290290
; CHECK-NEXT: %1 = sext i32 %offset to i64
291291
; CHECK-NEXT: %A = getelementptr bfloat, ptr @Arr, i64 %1
292292
; CHECK-NEXT: %2 = ptrtoint ptr %A to i64
@@ -315,29 +315,30 @@ define i16 @test25_as1(ptr addrspace(1) %P, i64 %A) {
315315
ret i16 %G
316316
}
317317

318-
define i64 @zext_ptrtoint_sub_ptrtoint_as1(ptr addrspace(1) %p, i32 %offset) {
319-
; CHECK-LABLE: @zext_ptrtoint_sub_ptrtoint_as1(
320-
; CHECK-NEXT: %1 = trunc i32 %offset to i16
321-
; CHECK-NEXT: %A.idx = shl i16 %1, 1
322-
; CHECK-NEXT: %D = sext i16 %A.idx to i64
318+
@Arr_as2 = external addrspace(2) global [42 x i16]
319+
define i64 @zext_ptrtoint_sub_ptrtoint_as2(ptr addrspace(1) %p, i32 %offset) {
320+
; CHECK-LABEL: @zext_ptrtoint_sub_ptrtoint_as2(
321+
; CHECK-NEXT: %A.idx = shl nsw i32 %offset, 1
322+
; CHECK-NEXT: %D = zext i32 %A.idx to i64
323323
; CHECK-NEXT: ret i64 %D
324-
%A = getelementptr bfloat, ptr addrspace(1) @Arr_as1, i32 %offset
325-
%B = ptrtoint ptr addrspace(1) %A to i32
324+
%A = getelementptr inbounds bfloat, ptr addrspace(2) @Arr_as2, i32 %offset
325+
%B = ptrtoint ptr addrspace(2) %A to i32
326326
%C = zext i32 %B to i64
327-
%D = sub i64 %C, ptrtoint (ptr addrspace(1) @Arr_as1 to i64)
327+
%D = sub i64 %C, ptrtoint (ptr addrspace(2) @Arr_as2 to i64)
328328
ret i64 %D
329329
}
330330

331-
define i64 @ptrtoint_sub_zext_ptrtoint_as1(ptr addrspace(1) %p, i32 %offset) {
332-
; CHECK-LABLE: @ptrtoint_sub_zext_ptrtoint_as1(
333-
; CHECK-NEXT: %1 = trunc i32 %offset to i16
334-
; CHECK-NEXT: %A.idx.neg = mul i16 %1, -2
335-
; CHECK-NEXT: %D = sext i16 %A.idx.neg to i64
331+
define i64 @ptrtoint_sub_zext_ptrtoint_as2(ptr addrspace(2) %p, i32 %offset) {
332+
; CHECK-LABEL: @ptrtoint_sub_zext_ptrtoint_as2(
333+
; CHECK-NEXT: %A = getelementptr inbounds bfloat, ptr addrspace(2) @Arr_as2, i32 %offset
334+
; CHECK-NEXT: %B = ptrtoint ptr addrspace(2) %A to i32
335+
; CHECK-NEXT: %C = zext i32 %B to i64
336+
; CHECK-NEXT: %D = sub nsw i64 ptrtoint (ptr addrspace(2) @Arr_as2 to i64), %C
336337
; CHECK-NEXT: ret i64 %D
337-
%A = getelementptr bfloat, ptr addrspace(1) @Arr_as1, i32 %offset
338-
%B = ptrtoint ptr addrspace(1) %A to i32
338+
%A = getelementptr inbounds bfloat, ptr addrspace(2) @Arr_as2, i32 %offset
339+
%B = ptrtoint ptr addrspace(2) %A to i32
339340
%C = zext i32 %B to i64
340-
%D = sub i64 ptrtoint (ptr addrspace(1) @Arr_as1 to i64), %C
341+
%D = sub i64 ptrtoint (ptr addrspace(2) @Arr_as2 to i64), %C
341342
ret i64 %D
342343
}
343344

0 commit comments

Comments
 (0)