-
Notifications
You must be signed in to change notification settings - Fork 12.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[LLVM][IR] Add support for vector ConstantInt/FP to ConstandFolding:FoldBitCast. #117163
[LLVM][IR] Add support for vector ConstantInt/FP to ConstandFolding:FoldBitCast. #117163
Conversation
@llvm/pr-subscribers-llvm-analysis @llvm/pr-subscribers-llvm-transforms Author: Paul Walker (paulwalker-arm) ChangesFull diff: https://github.com/llvm/llvm-project/pull/117163.diff 2 Files Affected:
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index 1971c28fc4c4de..f66078e0aa545d 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -151,8 +151,14 @@ Constant *FoldBitCast(Constant *C, Type *DestTy, const DataLayout &DL) {
return FoldBitCast(ConstantVector::get(Ops), DestTy, DL);
}
+ // Some of what follows may extend to cover scalable vectors but the current
+ // implementation is fixed length specific.
+ if (!isa<FixedVectorType>(C->getType()))
+ return ConstantExpr::getBitCast(C, DestTy);
+
// If this is a bitcast from constant vector -> vector, fold it.
- if (!isa<ConstantDataVector>(C) && !isa<ConstantVector>(C))
+ if (!isa<ConstantDataVector>(C) && !isa<ConstantVector>(C) &&
+ !isa<ConstantInt>(C) && !isa<ConstantFP>(C))
return ConstantExpr::getBitCast(C, DestTy);
// If the element types match, IR can fold it.
diff --git a/llvm/test/Transforms/InstCombine/cast.ll b/llvm/test/Transforms/InstCombine/cast.ll
index ca748a9483e9b2..0f957e22ad17bc 100644
--- a/llvm/test/Transforms/InstCombine/cast.ll
+++ b/llvm/test/Transforms/InstCombine/cast.ll
@@ -2,6 +2,8 @@
; Tests to make sure elimination of casts is working correctly
; RUN: opt < %s -passes=instcombine -S -data-layout="E-p:64:64:64-p1:32:32:32-p2:64:64:64-p3:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128-n8:16:32:64" | FileCheck %s --check-prefixes=ALL,BE
; RUN: opt < %s -passes=instcombine -S -data-layout="e-p:64:64:64-p1:32:32:32-p2:64:64:64-p3:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128-n8:16:32:64" | FileCheck %s --check-prefixes=ALL,LE
+; RUN: opt < %s -passes=instcombine -S -data-layout="E-p:64:64:64-p1:32:32:32-p2:64:64:64-p3:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128-n8:16:32:64" -use-constant-fp-for-fixed-length-splat -use-constant-int-for-fixed-length-splat | FileCheck %s --check-prefixes=ALL,BE
+; RUN: opt < %s -passes=instcombine -S -data-layout="e-p:64:64:64-p1:32:32:32-p2:64:64:64-p3:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128-n8:16:32:64" -use-constant-fp-for-fixed-length-splat -use-constant-int-for-fixed-length-splat | FileCheck %s --check-prefixes=ALL,LE
declare void @use_i32(i32)
declare void @use_v2i32(<2 x i32>)
|
// If this is a bitcast from constant vector -> vector, fold it. | ||
if (!isa<ConstantDataVector>(C) && !isa<ConstantVector>(C)) | ||
if (!isa<ConstantDataVector>(C) && !isa<ConstantVector>(C) && | ||
!isa<ConstantInt>(C) && !isa<ConstantFP>(C)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Refers to line 206: Do we need to add ConstantInt and ConstantFP checks here too?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I was going to say no because it should be safe to not perform anymore transformations. However, if I'm reading it correctly I think that block of code is just broken upstream?
For the case where constant folding does not happen it is effectively returning ConstantExpr::getBitCast(C, SrcAsIntTy)
and by this point we already know SrcAsIntTy != DestVTy
?
Rather then return the correct result I believe we do not hit this issue because the input has been restricted to constants that we know can be constant folded and so I've replace the broken code with an assert, which is in keeping with the other code in this area that requires constant folding to work.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
No description provided.