[llvm] [InstCombine] Fold chained GEP with constant base into single GEP (PR #170439)
Jianjian Guan via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 11 01:58:13 PST 2025
================
@@ -0,0 +1,176 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -S -passes=instcombine | FileCheck %s
+
+define ptr @src_origin(i32 %arg0, ptr %arg1) {
+; CHECK-LABEL: @src_origin(
+; CHECK-NEXT: [[V1:%.*]] = icmp sgt i32 [[ARG0:%.*]], 3
+; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[V1]], i64 63252, i64 29452
+; CHECK-NEXT: [[V3:%.*]] = getelementptr i8, ptr [[ARG1:%.*]], i64 [[TMP1]]
+; CHECK-NEXT: ret ptr [[V3]]
+;
+ %v0 = getelementptr i8, ptr %arg1, i64 8148
+ %v1 = icmp sgt i32 %arg0, 3
+ %v2 = select i1 %v1, i64 55104, i64 21304
+ %v3 = getelementptr i8, ptr %v0, i64 %v2
+ ret ptr %v3
+}
+
+define ptr @src_nuw(i32 %arg0, ptr %arg1) {
+; CHECK-LABEL: @src_nuw(
+; CHECK-NEXT: [[V1:%.*]] = icmp sgt i32 [[ARG0:%.*]], 3
+; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[V1]], i64 63252, i64 29452
+; CHECK-NEXT: [[V3:%.*]] = getelementptr nuw i8, ptr [[ARG1:%.*]], i64 [[TMP1]]
+; CHECK-NEXT: ret ptr [[V3]]
+;
+ %v0 = getelementptr nuw i8, ptr %arg1, i64 8148
+ %v1 = icmp sgt i32 %arg0, 3
+ %v2 = select i1 %v1, i64 55104, i64 21304
+ %v3 = getelementptr nuw i8, ptr %v0, i64 %v2
+ ret ptr %v3
+}
+
+define ptr @src_inbounds_nuw(i32 %arg0, ptr %arg1) {
+; CHECK-LABEL: @src_inbounds_nuw(
+; CHECK-NEXT: [[V1:%.*]] = icmp sgt i32 [[ARG0:%.*]], 3
+; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[V1]], i64 63252, i64 29452
+; CHECK-NEXT: [[V3:%.*]] = getelementptr nuw i8, ptr [[ARG1:%.*]], i64 [[TMP1]]
+; CHECK-NEXT: ret ptr [[V3]]
+;
+ %v0 = getelementptr inbounds nuw i8, ptr %arg1, i64 8148
+ %v1 = icmp sgt i32 %arg0, 3
+ %v2 = select i1 %v1, i64 55104, i64 21304
+ %v3 = getelementptr nuw i8, ptr %v0, i64 %v2
+ ret ptr %v3
+}
+
+define ptr @src_swap(i32 %arg0, ptr %arg1) {
+; CHECK-LABEL: @src_swap(
+; CHECK-NEXT: [[V1:%.*]] = icmp sgt i32 [[ARG0:%.*]], 3
+; CHECK-NEXT: [[V2:%.*]] = select i1 [[V1]], i64 63252, i64 29452
+; CHECK-NEXT: [[V0:%.*]] = getelementptr i8, ptr [[ARG1:%.*]], i64 [[V2]]
+; CHECK-NEXT: ret ptr [[V0]]
+;
+ %v1 = icmp sgt i32 %arg0, 3
+ %v2 = select i1 %v1, i64 55104, i64 21304
+ %v0 = getelementptr i8, ptr %arg1, i64 %v2
+ %v3 = getelementptr i8, ptr %v0, i64 8148
+ ret ptr %v3
+}
+
+define <2 x ptr> @src_splat(i32 %arg0, <2 x ptr> %arg1) {
+; CHECK-LABEL: @src_splat(
+; CHECK-NEXT: [[V1:%.*]] = icmp sgt i32 [[ARG0:%.*]], 3
+; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[V1]], i64 63252, i64 29452
+; CHECK-NEXT: [[V3:%.*]] = getelementptr i8, <2 x ptr> [[ARG1:%.*]], i64 [[TMP1]]
+; CHECK-NEXT: ret <2 x ptr> [[V3]]
+;
+ %v0 = getelementptr i8, <2 x ptr> %arg1, <2 x i64> splat (i64 8148)
+ %v1 = icmp sgt i32 %arg0, 3
+ %v2 = select i1 %v1, <2 x i64> splat (i64 55104), <2 x i64> splat (i64 21304)
+ %v3 = getelementptr i8, <2 x ptr> %v0, <2 x i64> %v2
+ ret <2 x ptr> %v3
+}
----------------
jacquesguan wrote:
Addressed.
https://github.com/llvm/llvm-project/pull/170439
More information about the llvm-commits
mailing list