Skip to content

Commit

Permalink
[TypePromotion] Add truncate in ConvertTruncs when the original trunc…
Browse files Browse the repository at this point in the history
…ate type is not extend type

If the src type is not extend type, after convert the truncate to and we need to truncate the and also to make sure the all user is legal.

The old fix D137613 doesn't work when the truncate convert to and have the other users. So this time I try to add the truncate after and to avoid all these potential issues.

Fix: llvm#59554

Reviewed By: samparker

Differential Revision: https://reviews.llvm.org/D140869

(cherry picked from commit a0b470c)
  • Loading branch information
bcl5980 authored and tstellar committed Jan 10, 2023
1 parent 74d3ba1 commit 67fd0d2
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 26 deletions.
8 changes: 2 additions & 6 deletions llvm/lib/CodeGen/TypePromotion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -570,7 +570,6 @@ void IRPromoter::Cleanup() {
LLVM_DEBUG(dbgs() << "IR Promotion: Cleanup..\n");
// Some zexts will now have become redundant, along with their trunc
// operands, so remove them.
// Some zexts need to be replaced with truncate if src bitwidth is larger.
for (auto *V : Visited) {
if (!isa<ZExtInst>(V))
continue;
Expand All @@ -585,11 +584,6 @@ void IRPromoter::Cleanup() {
<< "\n");
ReplaceAllUsersOfWith(ZExt, Src);
continue;
} else if (ZExt->getSrcTy()->getScalarSizeInBits() > PromotedWidth) {
IRBuilder<> Builder{ZExt};
Value *Trunc = Builder.CreateTrunc(Src, ZExt->getDestTy());
ReplaceAllUsersOfWith(ZExt, Trunc);
continue;
}

// We've inserted a trunc for a zext sink, but we already know that the
Expand Down Expand Up @@ -626,6 +620,8 @@ void IRPromoter::ConvertTruncs() {
ConstantInt *Mask =
ConstantInt::get(SrcTy, APInt::getMaxValue(NumBits).getZExtValue());
Value *Masked = Builder.CreateAnd(Trunc->getOperand(0), Mask);
if (SrcTy != ExtTy)
Masked = Builder.CreateTrunc(Masked, ExtTy);

if (auto *I = dyn_cast<Instruction>(Masked))
NewInsts.insert(I);
Expand Down
20 changes: 0 additions & 20 deletions llvm/test/Transforms/TypePromotion/AArch64/pr58843.ll

This file was deleted.

36 changes: 36 additions & 0 deletions llvm/test/Transforms/TypePromotion/AArch64/trunc-zext-chain.ll
Original file line number Diff line number Diff line change
Expand Up @@ -177,3 +177,39 @@ latch: ; preds = %bb14, %bb9
exit:
ret i64 %var30
}

; Check the case don't crash due to zext source type bitwidth
; larger than dest type bitwidth.
define i1 @pr58843(i8 %arg) {
; CHECK-LABEL: @pr58843(
; CHECK-NEXT: [[EXT1:%.*]] = zext i8 [[ARG:%.*]] to i64
; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[EXT1]], 7
; CHECK-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i32
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[TMP2]], 0
; CHECK-NEXT: ret i1 [[CMP]]
;
%ext1 = zext i8 %arg to i64
%trunc = trunc i64 %ext1 to i3
%ext2 = zext i3 %trunc to i8
%cmp = icmp ne i8 %ext2, 0
ret i1 %cmp
}

; Check the case don't crash due to xor two op have different
; types
define i1 @pr59554(i8 %arg) {
; CHECK-LABEL: @pr59554(
; CHECK-NEXT: [[ARG_EXT:%.*]] = zext i8 [[ARG:%.*]] to i64
; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[ARG_EXT]], 7
; CHECK-NEXT: [[TMP2:%.*]] = trunc i64 [[TMP1]] to i32
; CHECK-NEXT: [[SWITCH_TABLEIDX:%.*]] = xor i32 [[TMP2]], 1
; CHECK-NEXT: [[SWITCH_LOBIT:%.*]] = icmp ne i32 [[TMP2]], 0
; CHECK-NEXT: ret i1 [[SWITCH_LOBIT]]
;
%arg.ext = zext i8 %arg to i64
%trunc = trunc i64 %arg.ext to i3
%switch.tableidx = xor i3 %trunc, 1
%switch.maskindex = zext i3 %trunc to i8
%switch.lobit = icmp ne i8 %switch.maskindex, 0
ret i1 %switch.lobit
}

0 comments on commit 67fd0d2

Please sign in to comment.