Skip to content

Commit 57a0a9a

Browse files
committed
[InstCombine] Add more inbounds tests for indexed compare fold (NFC)
Don't only test the case where all GEPs are missing inbounds, also test inbounds only being present on some of them. The fold should not be performed in either case.
1 parent 553f885 commit 57a0a9a

File tree

1 file changed

+63
-5
lines changed

1 file changed

+63
-5
lines changed

llvm/test/Transforms/InstCombine/indexed-gep-compares.ll

Lines changed: 63 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,15 @@ bb2:
6464
}
6565

6666
; Perform the transformation only if we know that the GEPs used are inbounds.
67-
define ptr@test3(ptr %A, i32 %Offset) {
68-
; CHECK-LABEL: @test3(
67+
define ptr @test3_no_inbounds1(ptr %A, i32 %Offset) {
68+
; CHECK-LABEL: @test3_no_inbounds1(
6969
; CHECK-NEXT: entry:
7070
; CHECK-NEXT: [[TMP:%.*]] = getelementptr i32, ptr [[A:%.*]], i32 [[OFFSET:%.*]]
7171
; CHECK-NEXT: br label [[BB:%.*]]
7272
; CHECK: bb:
7373
; CHECK-NEXT: [[RHS:%.*]] = phi ptr [ [[RHS_NEXT:%.*]], [[BB]] ], [ [[TMP]], [[ENTRY:%.*]] ]
74-
; CHECK-NEXT: [[LHS:%.*]] = getelementptr i32, ptr [[A]], i32 100
75-
; CHECK-NEXT: [[RHS_NEXT]] = getelementptr i32, ptr [[RHS]], i32 1
74+
; CHECK-NEXT: [[LHS:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 100
75+
; CHECK-NEXT: [[RHS_NEXT]] = getelementptr inbounds i32, ptr [[RHS]], i32 1
7676
; CHECK-NEXT: [[COND:%.*]] = icmp ult ptr [[LHS]], [[RHS]]
7777
; CHECK-NEXT: br i1 [[COND]], label [[BB2:%.*]], label [[BB]]
7878
; CHECK: bb2:
@@ -84,7 +84,36 @@ entry:
8484

8585
bb:
8686
%RHS = phi ptr [ %RHS.next, %bb ], [ %tmp, %entry ]
87-
%LHS = getelementptr i32, ptr %A, i32 100
87+
%LHS = getelementptr inbounds i32, ptr %A, i32 100
88+
%RHS.next = getelementptr inbounds i32, ptr %RHS, i64 1
89+
%cond = icmp ult ptr %LHS, %RHS
90+
br i1 %cond, label %bb2, label %bb
91+
92+
bb2:
93+
ret ptr %RHS
94+
}
95+
96+
define ptr @test3_no_inbounds2(ptr %A, i32 %Offset) {
97+
; CHECK-LABEL: @test3_no_inbounds2(
98+
; CHECK-NEXT: entry:
99+
; CHECK-NEXT: [[TMP:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[OFFSET:%.*]]
100+
; CHECK-NEXT: br label [[BB:%.*]]
101+
; CHECK: bb:
102+
; CHECK-NEXT: [[RHS:%.*]] = phi ptr [ [[RHS_NEXT:%.*]], [[BB]] ], [ [[TMP]], [[ENTRY:%.*]] ]
103+
; CHECK-NEXT: [[LHS:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 100
104+
; CHECK-NEXT: [[RHS_NEXT]] = getelementptr i32, ptr [[RHS]], i32 1
105+
; CHECK-NEXT: [[COND:%.*]] = icmp ult ptr [[LHS]], [[RHS]]
106+
; CHECK-NEXT: br i1 [[COND]], label [[BB2:%.*]], label [[BB]]
107+
; CHECK: bb2:
108+
; CHECK-NEXT: ret ptr [[RHS]]
109+
;
110+
entry:
111+
%tmp = getelementptr inbounds i32, ptr %A, i32 %Offset
112+
br label %bb
113+
114+
bb:
115+
%RHS = phi ptr [ %RHS.next, %bb ], [ %tmp, %entry ]
116+
%LHS = getelementptr inbounds i32, ptr %A, i32 100
88117
%RHS.next = getelementptr i32, ptr %RHS, i64 1
89118
%cond = icmp ult ptr %LHS, %RHS
90119
br i1 %cond, label %bb2, label %bb
@@ -93,6 +122,35 @@ bb2:
93122
ret ptr %RHS
94123
}
95124

125+
define ptr @test3_no_inbounds3(ptr %A, i32 %Offset) {
126+
; CHECK-LABEL: @test3_no_inbounds3(
127+
; CHECK-NEXT: entry:
128+
; CHECK-NEXT: [[TMP:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[OFFSET:%.*]]
129+
; CHECK-NEXT: br label [[BB:%.*]]
130+
; CHECK: bb:
131+
; CHECK-NEXT: [[RHS:%.*]] = phi ptr [ [[RHS_NEXT:%.*]], [[BB]] ], [ [[TMP]], [[ENTRY:%.*]] ]
132+
; CHECK-NEXT: [[LHS:%.*]] = getelementptr i32, ptr [[A]], i32 100
133+
; CHECK-NEXT: [[RHS_NEXT]] = getelementptr inbounds i32, ptr [[RHS]], i32 1
134+
; CHECK-NEXT: [[COND:%.*]] = icmp ult ptr [[LHS]], [[RHS]]
135+
; CHECK-NEXT: br i1 [[COND]], label [[BB2:%.*]], label [[BB]]
136+
; CHECK: bb2:
137+
; CHECK-NEXT: ret ptr [[RHS]]
138+
;
139+
entry:
140+
%tmp = getelementptr inbounds i32, ptr %A, i32 %Offset
141+
br label %bb
142+
143+
bb:
144+
%RHS = phi ptr [ %RHS.next, %bb ], [ %tmp, %entry ]
145+
%LHS = getelementptr i32, ptr %A, i32 100
146+
%RHS.next = getelementptr inbounds i32, ptr %RHS, i64 1
147+
%cond = icmp ult ptr %LHS, %RHS
148+
br i1 %cond, label %bb2, label %bb
149+
150+
bb2:
151+
ret ptr %RHS
152+
}
153+
96154
; An inttoptr that requires an extension or truncation will be opaque when determining
97155
; the base pointer. In this case we can still perform the transformation by considering
98156
; A.ptr as being the base pointer.

0 commit comments

Comments
 (0)