From dadca81f86eb9b7528b03c7bee8dbe159b1a5c3a Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Fri, 3 Jan 2025 21:00:38 +0800 Subject: [PATCH 1/2] [InstCombine] Add pre-commit tests. NFC. --- .../test/Transforms/InstCombine/opaque-ptr.ll | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/llvm/test/Transforms/InstCombine/opaque-ptr.ll b/llvm/test/Transforms/InstCombine/opaque-ptr.ll index bac51c82f36dd..4572626dcc0b4 100644 --- a/llvm/test/Transforms/InstCombine/opaque-ptr.ll +++ b/llvm/test/Transforms/InstCombine/opaque-ptr.ll @@ -654,6 +654,64 @@ join: ret ptr %gep } +define ptr @gep_of_phi_of_gep_flags1(i1 %c, ptr %p) { +; CHECK-LABEL: @gep_of_phi_of_gep_flags1( +; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]] +; CHECK: if: +; CHECK-NEXT: br label [[JOIN:%.*]] +; CHECK: else: +; CHECK-NEXT: br label [[JOIN]] +; CHECK: join: +; CHECK-NEXT: [[TMP1:%.*]] = phi i64 [ 4, [[IF]] ], [ 8, [[ELSE]] ] +; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw i8, ptr [[P:%.*]], i64 [[TMP1]] +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[TMP2]], i64 4 +; CHECK-NEXT: ret ptr [[GEP]] +; + br i1 %c, label %if, label %else + +if: + %gep1 = getelementptr inbounds i32, ptr %p, i64 1 + br label %join + +else: + %gep2 = getelementptr i32, ptr %p, i64 2 + br label %join + +join: + %phi = phi ptr [ %gep1, %if ], [ %gep2, %else ] + %gep = getelementptr i32, ptr %phi, i64 1 + ret ptr %gep +} + +define ptr @gep_of_phi_of_gep_flags2(i1 %c, ptr %p) { +; CHECK-LABEL: @gep_of_phi_of_gep_flags2( +; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]] +; CHECK: if: +; CHECK-NEXT: br label [[JOIN:%.*]] +; CHECK: else: +; CHECK-NEXT: br label [[JOIN]] +; CHECK: join: +; CHECK-NEXT: [[TMP1:%.*]] = phi i64 [ 4, [[IF]] ], [ 8, [[ELSE]] ] +; CHECK-NEXT: [[TMP2:%.*]] = getelementptr nuw i8, ptr [[P:%.*]], i64 [[TMP1]] +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[TMP2]], i64 4 +; CHECK-NEXT: ret ptr [[GEP]] +; + br i1 %c, label %if, label %else + +if: + %gep1 = getelementptr nuw i32, ptr %p, i64 1 + br label %join + +else: + %gep2 = getelementptr nuw i32, ptr %p, i64 2 + br label %join + +join: + %phi = phi ptr [ %gep1, %if ], [ %gep2, %else ] + %gep = getelementptr i32, ptr %phi, i64 1 + ret ptr %gep +} + define ptr @gep_of_phi_of_gep_different_type(i1 %c, ptr %p) { ; CHECK-LABEL: @gep_of_phi_of_gep_different_type( ; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]] From ef57e7723ce19bb7e9f451254e369cb90be7e9a1 Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Fri, 3 Jan 2025 21:37:59 +0800 Subject: [PATCH 2/2] [InstCombine] Fix GEPNoWrapFlags propagation in `foldGEPOfPhi` --- llvm/lib/Transforms/InstCombine/InstructionCombining.cpp | 5 +++++ llvm/test/Transforms/InstCombine/opaque-ptr.ll | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp index 934156f04f7fd..f63de1f0d410e 100644 --- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -2782,6 +2782,7 @@ static Instruction *foldGEPOfPhi(GetElementPtrInst &GEP, PHINode *PN, // loop iteration). if (Op1 == &GEP) return nullptr; + GEPNoWrapFlags NW = Op1->getNoWrapFlags(); int DI = -1; @@ -2838,6 +2839,8 @@ static Instruction *foldGEPOfPhi(GetElementPtrInst &GEP, PHINode *PN, } } } + + NW &= Op2->getNoWrapFlags(); } // If not all GEPs are identical we'll have to create a new PHI node. @@ -2847,6 +2850,8 @@ static Instruction *foldGEPOfPhi(GetElementPtrInst &GEP, PHINode *PN, return nullptr; auto *NewGEP = cast(Op1->clone()); + NewGEP->setNoWrapFlags(NW); + if (DI == -1) { // All the GEPs feeding the PHI are identical. Clone one down into our // BB so that it can be merged with the current GEP. diff --git a/llvm/test/Transforms/InstCombine/opaque-ptr.ll b/llvm/test/Transforms/InstCombine/opaque-ptr.ll index 4572626dcc0b4..b05274658e812 100644 --- a/llvm/test/Transforms/InstCombine/opaque-ptr.ll +++ b/llvm/test/Transforms/InstCombine/opaque-ptr.ll @@ -663,7 +663,7 @@ define ptr @gep_of_phi_of_gep_flags1(i1 %c, ptr %p) { ; CHECK-NEXT: br label [[JOIN]] ; CHECK: join: ; CHECK-NEXT: [[TMP1:%.*]] = phi i64 [ 4, [[IF]] ], [ 8, [[ELSE]] ] -; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw i8, ptr [[P:%.*]], i64 [[TMP1]] +; CHECK-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[TMP1]] ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[TMP2]], i64 4 ; CHECK-NEXT: ret ptr [[GEP]] ;