[llvm] e0fe978 - [TypePromotion] Avoid unnecessary trunc zext pairs
Sam Parker via llvm-commits
llvm-commits at lists.llvm.org
Tue May 24 07:35:31 PDT 2022
Author: Sam Parker
Date: 2022-05-24T15:34:36+01:00
New Revision: e0fe9785d35203d6b76670cb2b8c6449db4fa576
URL: https://github.com/llvm/llvm-project/commit/e0fe9785d35203d6b76670cb2b8c6449db4fa576
DIFF: https://github.com/llvm/llvm-project/commit/e0fe9785d35203d6b76670cb2b8c6449db4fa576.diff
LOG: [TypePromotion] Avoid unnecessary trunc zext pairs
Any zext 'sink' should already have an operand that is in the legal
value, so avoid using a trunc and just use the trunc operand instead.
Differential Revision: https://reviews.llvm.org/D118905
Added:
Modified:
llvm/lib/CodeGen/TypePromotion.cpp
llvm/test/Transforms/TypePromotion/ARM/casts.ll
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/TypePromotion.cpp b/llvm/lib/CodeGen/TypePromotion.cpp
index 8752a081623aa..c72088e853fe7 100644
--- a/llvm/lib/CodeGen/TypePromotion.cpp
+++ b/llvm/lib/CodeGen/TypePromotion.cpp
@@ -102,7 +102,6 @@ static cl::opt<bool> DisablePromotion("disable-type-promotion", cl::Hidden,
namespace {
class IRPromoter {
LLVMContext &Ctx;
- IntegerType *OrigTy = nullptr;
unsigned PromotedWidth = 0;
SetVector<Value *> &Visited;
SetVector<Value *> &Sources;
@@ -122,16 +121,13 @@ class IRPromoter {
void Cleanup();
public:
- IRPromoter(LLVMContext &C, IntegerType *Ty, unsigned Width,
+ IRPromoter(LLVMContext &C, unsigned Width,
SetVector<Value *> &visited, SetVector<Value *> &sources,
SetVector<Instruction *> &sinks,
SmallPtrSetImpl<Instruction *> &wrap)
- : Ctx(C), OrigTy(Ty), PromotedWidth(Width), Visited(visited),
+ : Ctx(C), PromotedWidth(Width), Visited(visited),
Sources(sources), Sinks(sinks), SafeWrap(wrap) {
ExtTy = IntegerType::get(Ctx, PromotedWidth);
- assert(OrigTy->getPrimitiveSizeInBits().getFixedSize() <
- ExtTy->getPrimitiveSizeInBits().getFixedSize() &&
- "Original type not smaller than extended type");
}
void Mutate();
@@ -244,7 +240,7 @@ bool TypePromotion::isSource(Value *V) {
bool TypePromotion::isSink(Value *V) {
// TODO The truncate also isn't actually necessary because we would already
// proved that the data value is kept within the range of the original data
- // type.
+ // type. We currently remove any truncs inserted for handling zext sinks.
// Sinks are:
// - points where the value in the register is being observed, such as an
@@ -591,11 +587,9 @@ void IRPromoter::Cleanup() {
continue;
}
- // Unless they produce a value that is narrower than ExtTy, we can
- // replace the result of the zext with the input of a newly inserted
- // trunc.
- if (NewInsts.count(Src) && isa<TruncInst>(Src) &&
- Src->getType() == OrigTy) {
+ // We've inserted a trunc for a zext sink, but we already know that the
+ // input is in range, negating the need for the trunc.
+ if (NewInsts.count(Src) && isa<TruncInst>(Src)) {
auto *Trunc = cast<TruncInst>(Src);
assert(Trunc->getOperand(0)->getType() == ExtTy &&
"expected inserted trunc to be operating on i32");
@@ -636,9 +630,8 @@ void IRPromoter::ConvertTruncs() {
}
void IRPromoter::Mutate() {
- LLVM_DEBUG(dbgs() << "IR Promotion: Promoting use-def chains from "
- << OrigTy->getBitWidth() << " to " << PromotedWidth
- << "-bits\n");
+ LLVM_DEBUG(dbgs() << "IR Promotion: Promoting use-def chains to "
+ << PromotedWidth << "-bits\n");
// Cache original types of the values that will likely need truncating
for (auto *I : Sinks) {
@@ -878,8 +871,8 @@ bool TypePromotion::TryToPromote(Value *V, unsigned PromotedWidth) {
if (ToPromote < 2 || (Blocks.size() == 1 && (NonFreeArgs > SafeWrap.size())))
return false;
- IRPromoter Promoter(*Ctx, cast<IntegerType>(OrigTy), PromotedWidth,
- CurrentVisited, Sources, Sinks, SafeWrap);
+ IRPromoter Promoter(*Ctx, PromotedWidth, CurrentVisited, Sources, Sinks,
+ SafeWrap);
Promoter.Mutate();
return true;
}
diff --git a/llvm/test/Transforms/TypePromotion/ARM/casts.ll b/llvm/test/Transforms/TypePromotion/ARM/casts.ll
index 4a68be49fb38f..34a519fa64d60 100644
--- a/llvm/test/Transforms/TypePromotion/ARM/casts.ll
+++ b/llvm/test/Transforms/TypePromotion/ARM/casts.ll
@@ -996,8 +996,8 @@ entry:
ret i1 %tobool
}
-define i32 @dont_replace_trunc_2(i16* %a, i8* %b) {
-; CHECK-LABEL: @dont_replace_trunc_2(
+define i32 @dont_return_inserted_trunc(i16* %a, i8* %b) {
+; CHECK-LABEL: @dont_return_inserted_trunc(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* [[A:%.*]], align 2
; CHECK-NEXT: [[TMP1:%.*]] = zext i16 [[TMP0]] to i32
@@ -1010,8 +1010,7 @@ define i32 @dont_replace_trunc_2(i16* %a, i8* %b) {
; CHECK-NEXT: [[TMP5:%.*]] = trunc i32 [[OR]] to i8
; CHECK-NEXT: store i8 [[TMP5]], i8* [[B]], align 1
; CHECK-NEXT: [[TMP6:%.*]] = trunc i32 [[OR]] to i8
-; CHECK-NEXT: [[CONV5:%.*]] = zext i8 [[TMP6]] to i32
-; CHECK-NEXT: ret i32 [[CONV5]]
+; CHECK-NEXT: ret i32 [[OR]]
;
entry:
%0 = load i16, i16* %a, align 2
@@ -1037,10 +1036,9 @@ define i32 @replace_trunk_with_mask(i16* %a) {
; CHECK-NEXT: [[TMP3:%.*]] = and i32 [[TMP2]], 255
; CHECK-NEXT: [[TMP4:%.*]] = udiv i32 [[TMP3]], 3
; CHECK-NEXT: [[TMP5:%.*]] = trunc i32 [[TMP4]] to i8
-; CHECK-NEXT: [[PHITMP:%.*]] = zext i8 [[TMP5]] to i32
; CHECK-NEXT: br label [[COND_END]]
; CHECK: cond.end:
-; CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[PHITMP]], [[COND_FALSE]] ], [ 0, [[ENTRY:%.*]] ]
+; CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[TMP4]], [[COND_FALSE]] ], [ 0, [[ENTRY:%.*]] ]
; CHECK-NEXT: ret i32 [[COND]]
;
entry:
More information about the llvm-commits
mailing list