aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/IR/Constants.cpp
diff options
context:
space:
mode:
authorNikita Popov <npopov@redhat.com>2023-09-29 14:00:23 +0200
committerNikita Popov <npopov@redhat.com>2023-10-02 12:40:20 +0200
commit3b25407d977d9ed3dbcaccd4f8850b65e95d70fd (patch)
tree8b4d04fb81e7d290608310d28e7dc1791c113a01 /llvm/lib/IR/Constants.cpp
parent2214026e957397cc6385f778b28d570485a31856 (diff)
downloadllvm-3b25407d977d9ed3dbcaccd4f8850b65e95d70fd.zip
llvm-3b25407d977d9ed3dbcaccd4f8850b65e95d70fd.tar.gz
llvm-3b25407d977d9ed3dbcaccd4f8850b65e95d70fd.tar.bz2
[IR] Mark zext/sext constant expressions as undesirable
Introduce isDesirableCastOp() which determines whether IR builder and constant folding should produce constant expressions for a given cast type. This mirrors what we do for binary operators. Mark zext/sext as undesirable, which prevents most creations of such constant expressions. This is still somewhat incomplete and there are a few more places that can create zext/sext expressions. This is part of the work for https://discourse.llvm.org/t/rfc-remove-most-constant-expressions/63179. The reason for the odd result in the constantexpr-fneg.c test is that initially the "a[]" global is created with an [0 x i32] type, at which point the icmp expression cannot be folded. Later it is replaced with an [1 x i32] global and the icmp gets folded away. But at that point we no longer fold the zext.
Diffstat (limited to 'llvm/lib/IR/Constants.cpp')
-rw-r--r--llvm/lib/IR/Constants.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/llvm/lib/IR/Constants.cpp b/llvm/lib/IR/Constants.cpp
index 6589bd3..ba18da9 100644
--- a/llvm/lib/IR/Constants.cpp
+++ b/llvm/lib/IR/Constants.cpp
@@ -2331,6 +2331,28 @@ bool ConstantExpr::isSupportedBinOp(unsigned Opcode) {
}
}
+bool ConstantExpr::isDesirableCastOp(unsigned Opcode) {
+ switch (Opcode) {
+ case Instruction::ZExt:
+ case Instruction::SExt:
+ return false;
+ case Instruction::Trunc:
+ case Instruction::FPTrunc:
+ case Instruction::FPExt:
+ case Instruction::UIToFP:
+ case Instruction::SIToFP:
+ case Instruction::FPToUI:
+ case Instruction::FPToSI:
+ case Instruction::PtrToInt:
+ case Instruction::IntToPtr:
+ case Instruction::BitCast:
+ case Instruction::AddrSpaceCast:
+ return true;
+ default:
+ llvm_unreachable("Argument must be cast opcode");
+ }
+}
+
Constant *ConstantExpr::getSizeOf(Type* Ty) {
// sizeof is implemented as: (i64) gep (Ty*)null, 1
// Note that a non-inbounds gep is used, as null isn't within any object.