[PATCH] D143016: [InstCombine] Promote expression tree with @llvm.vscale when zero-extending result.
Sander de Smalen via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 31 14:27:08 PST 2023
sdesmalen updated this revision to Diff 493733.
sdesmalen marked 3 inline comments as done.
sdesmalen added a comment.
- Fixed issue where Res was conditionally set but still used.
- Made test agnostic of target.
- Patch now only shows the diff for the test.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D143016/new/
https://reviews.llvm.org/D143016
Files:
llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
llvm/test/Transforms/InstCombine/vscale.ll
Index: llvm/test/Transforms/InstCombine/vscale.ll
===================================================================
--- llvm/test/Transforms/InstCombine/vscale.ll
+++ llvm/test/Transforms/InstCombine/vscale.ll
@@ -4,8 +4,8 @@
define i64 @free_zext_vscale_i32_to_i64() #0 {
; CHECK-LABEL: @free_zext_vscale_i32_to_i64(
-; CHECK-NEXT: [[EXT:%.*]] = call i64 @llvm.vscale.i64()
-; CHECK-NEXT: ret i64 [[EXT]]
+; CHECK-NEXT: [[VSCALE:%.*]] = call i64 @llvm.vscale.i64()
+; CHECK-NEXT: ret i64 [[VSCALE]]
;
%vscale = call i32 @llvm.vscale.i32()
%ext = zext i32 %vscale to i64
@@ -14,10 +14,9 @@
define i64 @free_zext_vscale_shl_i32_to_i64() #0 {
; CHECK-LABEL: @free_zext_vscale_shl_i32_to_i64(
-; CHECK-NEXT: [[VSCALE:%.*]] = call i32 @llvm.vscale.i32()
-; CHECK-NEXT: [[SHL:%.*]] = shl nuw nsw i32 [[VSCALE]], 3
-; CHECK-NEXT: [[EXT:%.*]] = zext i32 [[SHL]] to i64
-; CHECK-NEXT: ret i64 [[EXT]]
+; CHECK-NEXT: [[VSCALE:%.*]] = call i64 @llvm.vscale.i64()
+; CHECK-NEXT: [[SHL:%.*]] = shl nuw nsw i64 [[VSCALE]], 3
+; CHECK-NEXT: ret i64 [[SHL]]
;
%vscale = call i32 @llvm.vscale.i32()
%shl = shl i32 %vscale, 3
Index: llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
===================================================================
--- llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
@@ -252,6 +252,16 @@
Res = CastInst::Create(
static_cast<Instruction::CastOps>(Opc), I->getOperand(0), Ty);
break;
+ case Instruction::Call: {
+ const IntrinsicInst *II = dyn_cast<IntrinsicInst>(I);
+ if (II && II->getIntrinsicID() == Intrinsic::vscale) {
+ Function *Fn =
+ Intrinsic::getDeclaration(I->getModule(), Intrinsic::vscale, {Ty});
+ Res = CallInst::Create(Fn->getFunctionType(), Fn);
+ break;
+ }
+ LLVM_FALLTHROUGH;
+ }
default:
// TODO: Can handle more cases here.
llvm_unreachable("Unreachable!");
@@ -1217,6 +1227,13 @@
return false;
return true;
}
+ case Instruction::Call:
+ // llvm.vscale() can always be executed in larger type, because the
+ // value is automatically zero-extended.
+ if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(I))
+ if (II->getIntrinsicID() == Intrinsic::vscale)
+ return true;
+ return false;
default:
// TODO: Can handle more cases here.
return false;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D143016.493733.patch
Type: text/x-patch
Size: 2435 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230131/514e5bb0/attachment.bin>
More information about the llvm-commits
mailing list