From 72781f58efddecee19feb07fec4e6104ef4c4812 Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Tue, 25 Feb 2025 18:44:46 +0800 Subject: [PATCH 1/3] [InstCombine] Add pre-commit tests. NFC. --- llvm/test/Transforms/InstCombine/load.ll | 32 ++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/llvm/test/Transforms/InstCombine/load.ll b/llvm/test/Transforms/InstCombine/load.ll index a5ad1e0c21526..ce6f64d658fe9 100644 --- a/llvm/test/Transforms/InstCombine/load.ll +++ b/llvm/test/Transforms/InstCombine/load.ll @@ -451,3 +451,35 @@ define i32 @load_select_with_null_gep(i1 %cond, ptr %p, i64 %off) { %res = load i32, ptr %gep, align 4 ret i32 %res } + +define i16 @load_select_with_null_gep2(i1 %cond, ptr %p, i64 %x) { +; CHECK-LABEL: @load_select_with_null_gep2( +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], ptr [[P:%.*]], ptr null +; CHECK-NEXT: [[INVARIANT_GEP:%.*]] = getelementptr i8, ptr [[SEL]], i64 -2 +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i16, ptr [[INVARIANT_GEP]], i64 [[X:%.*]] +; CHECK-NEXT: [[RES:%.*]] = load i16, ptr [[GEP]], align 2 +; CHECK-NEXT: ret i16 [[RES]] +; + %sel = select i1 %cond, ptr %p, ptr null + %invariant.gep = getelementptr i8, ptr %sel, i64 -2 + %gep = getelementptr i16, ptr %invariant.gep, i64 %x + %res = load i16, ptr %gep, align 2 + ret i16 %res +} + +define i16 @load_select_with_null_ge3(i1 %cond, ptr %p, i64 %x, i64 %y) { +; CHECK-LABEL: @load_select_with_null_ge3( +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], ptr [[P:%.*]], ptr null +; CHECK-NEXT: [[INVARIANT_GEP:%.*]] = getelementptr i8, ptr [[SEL]], i64 -2 +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i16, ptr [[INVARIANT_GEP]], i64 [[X:%.*]] +; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i16, ptr [[GEP]], i64 [[Y:%.*]] +; CHECK-NEXT: [[RES:%.*]] = load i16, ptr [[GEP2]], align 2 +; CHECK-NEXT: ret i16 [[RES]] +; + %sel = select i1 %cond, ptr %p, ptr null + %invariant.gep = getelementptr i8, ptr %sel, i64 -2 + %gep = getelementptr i16, ptr %invariant.gep, i64 %x + %gep2 = getelementptr i16, ptr %gep, i64 %y + %res = load i16, ptr %gep2, align 2 + ret i16 %res +} From 3853aee61626b0eda06671b4cbbc4cdd1344440c Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Tue, 25 Feb 2025 18:59:14 +0800 Subject: [PATCH 2/3] [InstCombine] Increase recursion limit to 3 in `simplifyNonNullOperand` --- .../Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp | 3 ++- llvm/test/Transforms/InstCombine/load.ll | 6 ++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp b/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp index 622884ea1eb46..221511e9aba0b 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp @@ -996,7 +996,8 @@ Value *InstCombinerImpl::simplifyNonNullOperand(Value *V, if (!V->hasOneUse()) return nullptr; - if (Depth == 1) + constexpr unsigned RecursionLimit = 3; + if (Depth == RecursionLimit) return nullptr; if (auto *GEP = dyn_cast(V)) { diff --git a/llvm/test/Transforms/InstCombine/load.ll b/llvm/test/Transforms/InstCombine/load.ll index ce6f64d658fe9..99185a4e6f043 100644 --- a/llvm/test/Transforms/InstCombine/load.ll +++ b/llvm/test/Transforms/InstCombine/load.ll @@ -454,8 +454,7 @@ define i32 @load_select_with_null_gep(i1 %cond, ptr %p, i64 %off) { define i16 @load_select_with_null_gep2(i1 %cond, ptr %p, i64 %x) { ; CHECK-LABEL: @load_select_with_null_gep2( -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], ptr [[P:%.*]], ptr null -; CHECK-NEXT: [[INVARIANT_GEP:%.*]] = getelementptr i8, ptr [[SEL]], i64 -2 +; CHECK-NEXT: [[INVARIANT_GEP:%.*]] = getelementptr i8, ptr [[SEL:%.*]], i64 -2 ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i16, ptr [[INVARIANT_GEP]], i64 [[X:%.*]] ; CHECK-NEXT: [[RES:%.*]] = load i16, ptr [[GEP]], align 2 ; CHECK-NEXT: ret i16 [[RES]] @@ -469,8 +468,7 @@ define i16 @load_select_with_null_gep2(i1 %cond, ptr %p, i64 %x) { define i16 @load_select_with_null_ge3(i1 %cond, ptr %p, i64 %x, i64 %y) { ; CHECK-LABEL: @load_select_with_null_ge3( -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], ptr [[P:%.*]], ptr null -; CHECK-NEXT: [[INVARIANT_GEP:%.*]] = getelementptr i8, ptr [[SEL]], i64 -2 +; CHECK-NEXT: [[INVARIANT_GEP:%.*]] = getelementptr i8, ptr [[SEL:%.*]], i64 -2 ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i16, ptr [[INVARIANT_GEP]], i64 [[X:%.*]] ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i16, ptr [[GEP]], i64 [[Y:%.*]] ; CHECK-NEXT: [[RES:%.*]] = load i16, ptr [[GEP2]], align 2 From 6b8a09c366b047d672aa95eabfd60a53a78f5829 Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Tue, 25 Feb 2025 21:24:47 +0800 Subject: [PATCH 3/3] Fix a typo. --- llvm/test/Transforms/InstCombine/load.ll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llvm/test/Transforms/InstCombine/load.ll b/llvm/test/Transforms/InstCombine/load.ll index 99185a4e6f043..d10aabff6709a 100644 --- a/llvm/test/Transforms/InstCombine/load.ll +++ b/llvm/test/Transforms/InstCombine/load.ll @@ -466,8 +466,8 @@ define i16 @load_select_with_null_gep2(i1 %cond, ptr %p, i64 %x) { ret i16 %res } -define i16 @load_select_with_null_ge3(i1 %cond, ptr %p, i64 %x, i64 %y) { -; CHECK-LABEL: @load_select_with_null_ge3( +define i16 @load_select_with_null_gep3(i1 %cond, ptr %p, i64 %x, i64 %y) { +; CHECK-LABEL: @load_select_with_null_gep3( ; CHECK-NEXT: [[INVARIANT_GEP:%.*]] = getelementptr i8, ptr [[SEL:%.*]], i64 -2 ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i16, ptr [[INVARIANT_GEP]], i64 [[X:%.*]] ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i16, ptr [[GEP]], i64 [[Y:%.*]]