diff options
author | Sergey Kachkov <sergey.kachkov@syntacore.com> | 2023-02-02 13:21:48 +0300 |
---|---|---|
committer | Sergey Kachkov <sergey.kachkov@syntacore.com> | 2023-02-07 12:43:19 +0300 |
commit | 203cc665cf01015736677bbe794161aad155a8df (patch) | |
tree | 54f5f3f1c309043e1f19c096ebba9e2d58535af8 /llvm | |
parent | 2c8362b2a220b5854bdcfab13c8f6d87b9c78cb0 (diff) | |
download | llvm-203cc665cf01015736677bbe794161aad155a8df.zip llvm-203cc665cf01015736677bbe794161aad155a8df.tar.gz llvm-203cc665cf01015736677bbe794161aad155a8df.tar.bz2 |
[PHITransAddr] Simplify casts in PHITransAddr
Try to simplify cast in similar way as for GEP and ADD with
constant (e.g. sext/zext + trunc).
Differential Revision: https://reviews.llvm.org/D143167
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Analysis/PHITransAddr.cpp | 10 | ||||
-rw-r--r-- | llvm/test/Transforms/GVN/PRE/phi-translate-2.ll | 11 |
2 files changed, 13 insertions, 8 deletions
diff --git a/llvm/lib/Analysis/PHITransAddr.cpp b/llvm/lib/Analysis/PHITransAddr.cpp index 3da9277..5700fd6 100644 --- a/llvm/lib/Analysis/PHITransAddr.cpp +++ b/llvm/lib/Analysis/PHITransAddr.cpp @@ -177,10 +177,12 @@ Value *PHITransAddr::translateSubExpr(Value *V, BasicBlock *CurBB, // Find an available version of this cast. - // Constants are trivial to find. - if (Constant *C = dyn_cast<Constant>(PHIIn)) - return addAsInput( - ConstantExpr::getCast(Cast->getOpcode(), C, Cast->getType())); + // Try to simplify cast first. + if (Value *V = simplifyCastInst(Cast->getOpcode(), PHIIn, Cast->getType(), + {DL, TLI, DT, AC})) { + RemoveInstInputs(PHIIn, InstInputs); + return addAsInput(V); + } // Otherwise we have to see if a casted version of the incoming pointer // is available. If so, we can use it, otherwise we have to fail. diff --git a/llvm/test/Transforms/GVN/PRE/phi-translate-2.ll b/llvm/test/Transforms/GVN/PRE/phi-translate-2.ll index d968716..46fde7a 100644 --- a/llvm/test/Transforms/GVN/PRE/phi-translate-2.ll +++ b/llvm/test/Transforms/GVN/PRE/phi-translate-2.ll @@ -306,18 +306,21 @@ while.end: define i32 @test7(ptr noalias %ptr1, ptr noalias %ptr2, i32 %i, i1 %cond) { ; CHECK-LABEL: @test7( ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] +; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_THEN:%.*]], label [[ENTRY_IF_END_CRIT_EDGE:%.*]] +; CHECK: entry.if.end_crit_edge: +; CHECK-NEXT: [[RES_PRE:%.*]] = load i32, ptr [[PTR1:%.*]], align 4 +; CHECK-NEXT: br label [[IF_END:%.*]] ; CHECK: if.then: -; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[PTR1:%.*]], i32 [[I:%.*]] +; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[PTR1]], i32 [[I:%.*]] ; CHECK-NEXT: [[TMP:%.*]] = load i32, ptr [[ARRAYIDX]], align 4 ; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR2:%.*]], align 4 ; CHECK-NEXT: [[IDX_EXT:%.*]] = sext i32 [[I]] to i64 ; CHECK-NEXT: br label [[IF_END]] ; CHECK: if.end: -; CHECK-NEXT: [[IDX:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IDX_EXT]], [[IF_THEN]] ] +; CHECK-NEXT: [[RES:%.*]] = phi i32 [ [[RES_PRE]], [[ENTRY_IF_END_CRIT_EDGE]] ], [ [[TMP]], [[IF_THEN]] ] +; CHECK-NEXT: [[IDX:%.*]] = phi i64 [ 0, [[ENTRY_IF_END_CRIT_EDGE]] ], [ [[IDX_EXT]], [[IF_THEN]] ] ; CHECK-NEXT: [[IDX_TRUNC:%.*]] = trunc i64 [[IDX]] to i32 ; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i32, ptr [[PTR1]], i32 [[IDX_TRUNC]] -; CHECK-NEXT: [[RES:%.*]] = load i32, ptr [[ARRAYIDX2]], align 4 ; CHECK-NEXT: ret i32 [[RES]] ; entry: |