[llvm] c03d3a8 - [InstCombine] Add tests for canonicalizing `(gep <not i8> p, (exact_ins X, C))`; NFC
Noah Goldstein via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 1 07:22:50 PDT 2024
Author: Noah Goldstein
Date: 2024-07-01T22:22:35+08:00
New Revision: c03d3a8560d0275bd585744d4fc14725148517a3
URL: https://github.com/llvm/llvm-project/commit/c03d3a8560d0275bd585744d4fc14725148517a3
DIFF: https://github.com/llvm/llvm-project/commit/c03d3a8560d0275bd585744d4fc14725148517a3.diff
LOG: [InstCombine] Add tests for canonicalizing `(gep <not i8> p, (exact_ins X, C))`; NFC
Added:
Modified:
llvm/test/Transforms/InstCombine/getelementptr.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/InstCombine/getelementptr.ll b/llvm/test/Transforms/InstCombine/getelementptr.ll
index f25abae60904c..73f3878c859c9 100644
--- a/llvm/test/Transforms/InstCombine/getelementptr.ll
+++ b/llvm/test/Transforms/InstCombine/getelementptr.ll
@@ -14,6 +14,7 @@ target datalayout = "e-p:64:64-p1:16:16-p2:32:32:32-p3:64:64:64-f16:32"
@Global_as1 = external addrspace(1) global [10 x i8]
declare void @use(ptr)
+declare void @use.i64(i64)
; Test noop elimination
define ptr @test1(ptr %I) {
@@ -592,8 +593,8 @@ define i32 @test21() {
}
- at A = global i32 1 ; <ptr> [#uses=1]
- at B = global i32 2 ; <ptr> [#uses=1]
+ at A = global i32 1 ; <ptr> [#uses=1]
+ at B = global i32 2 ; <ptr> [#uses=1]
define i1 @test22() {
; CHECK-LABEL: @test22(
@@ -612,8 +613,8 @@ define i1 @test23() {
; CHECK-LABEL: @test23(
; CHECK-NEXT: ret i1 false
;
- %A = getelementptr %X, ptr null, i64 0, i32 0, i64 0 ; <ptr> [#uses=1]
- %B = icmp ne ptr %A, null ; <i1> [#uses=1]
+ %A = getelementptr %X, ptr null, i64 0, i32 0, i64 0 ; <ptr> [#uses=1]
+ %B = icmp ne ptr %A, null ; <i1> [#uses=1]
ret i1 %B
}
@@ -1179,9 +1180,9 @@ define ptr @test45(ptr %c1, ptr %c2) {
;
%ptrtoint1 = ptrtoint ptr %c1 to i64
%ptrtoint2 = ptrtoint ptr %c2 to i64
- %sub = sub i64 %ptrtoint2, %ptrtoint1 ; C2 - C1
+ %sub = sub i64 %ptrtoint2, %ptrtoint1 ; C2 - C1
%shr = sdiv i64 %sub, 7
- %gep = getelementptr inbounds %struct.C, ptr %c1, i64 %shr ; C1 + (C2 - C1)
+ %gep = getelementptr inbounds %struct.C, ptr %c1, i64 %shr ; C1 + (C2 - C1)
ret ptr %gep
}
@@ -1370,8 +1371,8 @@ define ptr @D98588(ptr %c1, i64 %offset) {
%c2_next = getelementptr inbounds i64, ptr %c1, i64 %offset
%ptrtoint1 = ptrtoint ptr %c1 to i64
%ptrtoint2 = ptrtoint ptr %c2_next to i64
- %sub = sub i64 %ptrtoint2, %ptrtoint1 ; C2 - C1
- %gep = getelementptr inbounds i8, ptr %c1, i64 %sub ; C1 + (C2 - C1)
+ %sub = sub i64 %ptrtoint2, %ptrtoint1 ; C2 - C1
+ %gep = getelementptr inbounds i8, ptr %c1, i64 %sub ; C1 + (C2 - C1)
ret ptr %gep
}
@@ -1790,4 +1791,119 @@ define ptr @gep_sel_const_nuw(i1 %c) {
ret ptr %gep
}
+define ptr @gep_of_udiv(ptr %p, i64 %x) {
+; CHECK-LABEL: @gep_of_udiv(
+; CHECK-NEXT: [[IDX:%.*]] = udiv exact i64 [[X:%.*]], 12
+; CHECK-NEXT: [[R:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[IDX]]
+; CHECK-NEXT: ret ptr [[R]]
+;
+ %idx = udiv exact i64 %x, 12
+ %r = getelementptr i32, ptr %p, i64 %idx
+ ret ptr %r
+}
+
+define ptr @gep_of_udiv_fail_not_divisible(ptr %p, i64 %x) {
+; CHECK-LABEL: @gep_of_udiv_fail_not_divisible(
+; CHECK-NEXT: [[IDX:%.*]] = udiv exact i64 [[X:%.*]], 13
+; CHECK-NEXT: [[R:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[IDX]]
+; CHECK-NEXT: ret ptr [[R]]
+;
+ %idx = udiv exact i64 %x, 13
+ %r = getelementptr i32, ptr %p, i64 %idx
+ ret ptr %r
+}
+
+
+define ptr @gep_of_sdiv(ptr %p, i64 %x) {
+; CHECK-LABEL: @gep_of_sdiv(
+; CHECK-NEXT: [[IDX:%.*]] = sdiv exact i64 [[X:%.*]], -36
+; CHECK-NEXT: [[R:%.*]] = getelementptr nusw nuw i32, ptr [[P:%.*]], i64 [[IDX]]
+; CHECK-NEXT: ret ptr [[R]]
+;
+ %idx = sdiv exact i64 %x, -36
+ %r = getelementptr nusw nuw i32, ptr %p, i64 %idx
+ ret ptr %r
+}
+
+
+define ptr @gep_of_sdiv_fail_not_divisible(ptr %p, i64 %x) {
+; CHECK-LABEL: @gep_of_sdiv_fail_not_divisible(
+; CHECK-NEXT: [[IDX:%.*]] = sdiv exact i64 [[X:%.*]], -35
+; CHECK-NEXT: [[R:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[IDX]]
+; CHECK-NEXT: ret ptr [[R]]
+;
+ %idx = sdiv exact i64 %x, -35
+ %r = getelementptr i32, ptr %p, i64 %idx
+ ret ptr %r
+}
+
+define ptr @gep_of_sdiv_fail_ub(ptr %p, i64 %x) {
+; CHECK-LABEL: @gep_of_sdiv_fail_ub(
+; CHECK-NEXT: [[IDX:%.*]] = sdiv i64 [[X:%.*]], -4
+; CHECK-NEXT: [[R:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[IDX]]
+; CHECK-NEXT: ret ptr [[R]]
+;
+ %idx = sdiv i64 %x, -4
+ %r = getelementptr i32, ptr %p, i64 %idx
+ ret ptr %r
+}
+
+define ptr @gep_of_lshr(ptr %p, i64 %x) {
+; CHECK-LABEL: @gep_of_lshr(
+; CHECK-NEXT: [[IDX:%.*]] = lshr exact i64 [[X:%.*]], 3
+; CHECK-NEXT: [[R:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[IDX]]
+; CHECK-NEXT: ret ptr [[R]]
+;
+ %idx = lshr exact i64 %x, 3
+ %r = getelementptr i32, ptr %p, i64 %idx
+ ret ptr %r
+}
+
+define ptr @gep_of_ashr(ptr %p, i64 %x) {
+; CHECK-LABEL: @gep_of_ashr(
+; CHECK-NEXT: [[IDX:%.*]] = ashr exact i64 [[X:%.*]], 3
+; CHECK-NEXT: [[R:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 [[IDX]]
+; CHECK-NEXT: ret ptr [[R]]
+;
+ %idx = ashr exact i64 %x, 3
+ %r = getelementptr inbounds i32, ptr %p, i64 %idx
+ ret ptr %r
+}
+
+define ptr @gep_of_ashr_fail_multiuse(ptr %p, i64 %x) {
+; CHECK-LABEL: @gep_of_ashr_fail_multiuse(
+; CHECK-NEXT: [[IDX:%.*]] = ashr exact i64 [[X:%.*]], 3
+; CHECK-NEXT: call void @use.i64(i64 [[IDX]])
+; CHECK-NEXT: [[R:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 [[IDX]]
+; CHECK-NEXT: ret ptr [[R]]
+;
+ %idx = ashr exact i64 %x, 3
+ call void @use.i64(i64 %idx)
+ %r = getelementptr inbounds i32, ptr %p, i64 %idx
+ ret ptr %r
+}
+
+define ptr @gep_of_lshr_fail_missing_exact(ptr %p, i64 %x) {
+; CHECK-LABEL: @gep_of_lshr_fail_missing_exact(
+; CHECK-NEXT: [[IDX:%.*]] = lshr i64 [[X:%.*]], 3
+; CHECK-NEXT: [[R:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[IDX]]
+; CHECK-NEXT: ret ptr [[R]]
+;
+ %idx = lshr i64 %x, 3
+ %r = getelementptr i32, ptr %p, i64 %idx
+ ret ptr %r
+}
+
+define ptr @gep_of_ashr_fail_not_divisible(ptr %p, i64 %x) {
+; CHECK-LABEL: @gep_of_ashr_fail_not_divisible(
+; CHECK-NEXT: [[IDX:%.*]] = ashr exact i64 [[X:%.*]], 1
+; CHECK-NEXT: [[R:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[IDX]]
+; CHECK-NEXT: ret ptr [[R]]
+;
+ %idx = ashr exact i64 %x, 1
+ %r = getelementptr i32, ptr %p, i64 %idx
+ ret ptr %r
+}
+
+
!0 = !{!"branch_weights", i32 2, i32 10}
More information about the llvm-commits
mailing list