summary refs log tree commit diff
path: root/compiler/rustc_codegen_gcc/src/common.rs
diff options
context:
space:
mode:
authorNikita Popov <npopov@redhat.com>2023-03-16 14:56:02 +0100
committerNikita Popov <npopov@redhat.com>2023-03-16 15:07:04 +0100
commit30331828cb9e694b59c9325dce7c1f25dac3e80e (patch)
treed55723b741ac33fd7468442329d29ddc019f3c9c /compiler/rustc_codegen_gcc/src/common.rs
parentcd6c574af3886c41f34086d90df42c3da0144693 (diff)
downloadrust-30331828cb9e694b59c9325dce7c1f25dac3e80e.tar.gz
rust-30331828cb9e694b59c9325dce7c1f25dac3e80e.zip
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.
Diffstat (limited to 'compiler/rustc_codegen_gcc/src/common.rs')
-rw-r--r--compiler/rustc_codegen_gcc/src/common.rs5
1 files changed, 5 insertions, 0 deletions
diff --git a/compiler/rustc_codegen_gcc/src/common.rs b/compiler/rustc_codegen_gcc/src/common.rs
index 76fc7bd222e..ac04b61a306 100644
--- a/compiler/rustc_codegen_gcc/src/common.rs
+++ b/compiler/rustc_codegen_gcc/src/common.rs
@@ -73,6 +73,11 @@ impl<'gcc, 'tcx> ConstMethods<'tcx> for CodegenCx<'gcc, 'tcx> {
         }
     }
 
+    fn const_poison(&self, typ: Type<'gcc>) -> RValue<'gcc> {
+        // No distinction between undef and poison.
+        self.const_undef(typ)
+    }
+
     fn const_int(&self, typ: Type<'gcc>, int: i64) -> RValue<'gcc> {
         self.gcc_int(typ, int)
     }