Use poison instead of undef
In cases where it is legal, we should prefer poison values over undef values. This replaces undef with poison for aggregate construction and for uninhabited types. There are more places where we can likely use poison, but I wanted to stay conservative to start with. In particular the aggregate case is important for newer LLVM versions, which are not able to handle an undef base value during early optimization due to poison-propagation concerns.
This commit is contained in:
parent
cd6c574af3
commit
30331828cb
9 changed files with 17 additions and 6 deletions
|
@ -60,7 +60,7 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
|
|||
) -> OperandRef<'tcx, V> {
|
||||
assert!(layout.is_zst());
|
||||
OperandRef {
|
||||
val: OperandValue::Immediate(bx.const_undef(bx.immediate_backend_type(layout))),
|
||||
val: OperandValue::Immediate(bx.const_poison(bx.immediate_backend_type(layout))),
|
||||
layout,
|
||||
}
|
||||
}
|
||||
|
@ -145,7 +145,7 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
|
|||
let llty = bx.cx().backend_type(self.layout);
|
||||
debug!("Operand::immediate_or_packed_pair: packing {:?} into {:?}", self, llty);
|
||||
// Reconstruct the immediate aggregate.
|
||||
let mut llpair = bx.cx().const_undef(llty);
|
||||
let mut llpair = bx.cx().const_poison(llty);
|
||||
let imm_a = bx.from_immediate(a);
|
||||
let imm_b = bx.from_immediate(b);
|
||||
llpair = bx.insert_value(llpair, imm_a, 0);
|
||||
|
|
|
@ -214,7 +214,7 @@ impl<'a, 'tcx, V: CodegenObject> PlaceRef<'tcx, V> {
|
|||
let cast_to_size = cast_to_layout.layout.size();
|
||||
let cast_to = bx.cx().immediate_backend_type(cast_to_layout);
|
||||
if self.layout.abi.is_uninhabited() {
|
||||
return bx.cx().const_undef(cast_to);
|
||||
return bx.cx().const_poison(cast_to);
|
||||
}
|
||||
let (tag_scalar, tag_encoding, tag_field) = match self.layout.variants {
|
||||
Variants::Single { index } => {
|
||||
|
|
|
@ -295,7 +295,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
assert!(bx.cx().is_backend_immediate(cast));
|
||||
let ll_t_out = bx.cx().immediate_backend_type(cast);
|
||||
if operand.layout.abi.is_uninhabited() {
|
||||
let val = OperandValue::Immediate(bx.cx().const_undef(ll_t_out));
|
||||
let val = OperandValue::Immediate(bx.cx().const_poison(ll_t_out));
|
||||
return OperandRef { val, layout: cast };
|
||||
}
|
||||
let r_t_in =
|
||||
|
|
|
@ -8,6 +8,7 @@ pub trait ConstMethods<'tcx>: BackendTypes {
|
|||
// Constant constructors
|
||||
fn const_null(&self, t: Self::Type) -> Self::Value;
|
||||
fn const_undef(&self, t: Self::Type) -> Self::Value;
|
||||
fn const_poison(&self, t: Self::Type) -> Self::Value;
|
||||
fn const_int(&self, t: Self::Type, i: i64) -> Self::Value;
|
||||
fn const_uint(&self, t: Self::Type, i: u64) -> Self::Value;
|
||||
fn const_uint_big(&self, t: Self::Type, u: u128) -> Self::Value;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue