about summary refs log tree commit diff
path: root/compiler/rustc_codegen_ssa
diff options
context:
space:
mode:
authorOli Scherer <git-spam-no-reply9815368754983@oli-obk.de>2023-06-16 16:02:11 +0000
committerOli Scherer <git-spam-no-reply9815368754983@oli-obk.de>2023-06-26 09:34:52 +0000
commit168de14ac9f3ec0b0f6fa7f5328336e6ce97d60b (patch)
tree146f7150a15749e8e900352c835db9953d22380d /compiler/rustc_codegen_ssa
parent06c58cb96667c2e8b9eb197b1cc24a9367924d42 (diff)
downloadrust-168de14ac9f3ec0b0f6fa7f5328336e6ce97d60b.tar.gz
rust-168de14ac9f3ec0b0f6fa7f5328336e6ce97d60b.zip
Make simd_shuffle_indices use valtrees
Diffstat (limited to 'compiler/rustc_codegen_ssa')
-rw-r--r--compiler/rustc_codegen_ssa/src/mir/block.rs11
-rw-r--r--compiler/rustc_codegen_ssa/src/mir/constant.rs23
2 files changed, 21 insertions, 13 deletions
diff --git a/compiler/rustc_codegen_ssa/src/mir/block.rs b/compiler/rustc_codegen_ssa/src/mir/block.rs
index 0cec560ba45..d53bffb3e03 100644
--- a/compiler/rustc_codegen_ssa/src/mir/block.rs
+++ b/compiler/rustc_codegen_ssa/src/mir/block.rs
@@ -863,7 +863,16 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
                         // promotes any complex rvalues to constants.
                         if i == 2 && intrinsic.as_str().starts_with("simd_shuffle") {
                             if let mir::Operand::Constant(constant) = arg {
-                                let c = self.eval_mir_constant(constant);
+                                let ct = self.monomorphize(constant.literal);
+                                let uv = match ct {
+                                    mir::ConstantKind::Unevaluated(uv, _) => uv.shrink(),
+                                    other => span_bug!(constant.span, "{other:#?}"),
+                                };
+                                let c = self.cx.tcx().const_eval_resolve_for_typeck(
+                                    ty::ParamEnv::reveal_all(),
+                                    uv,
+                                    Some(constant.span),
+                                );
                                 let (llval, ty) = self.simd_shuffle_indices(
                                     &bx,
                                     constant.span,
diff --git a/compiler/rustc_codegen_ssa/src/mir/constant.rs b/compiler/rustc_codegen_ssa/src/mir/constant.rs
index 14fe84a146d..a2ee9c54b16 100644
--- a/compiler/rustc_codegen_ssa/src/mir/constant.rs
+++ b/compiler/rustc_codegen_ssa/src/mir/constant.rs
@@ -65,16 +65,15 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
         bx: &Bx,
         span: Span,
         ty: Ty<'tcx>,
-        constant: Result<ConstValue<'tcx>, ErrorHandled>,
+        constant: Result<Option<ty::ValTree<'tcx>>, ErrorHandled>,
     ) -> (Bx::Value, Ty<'tcx>) {
-        constant
+        let val = constant
+            .ok()
+            .flatten()
             .map(|val| {
                 let field_ty = ty.builtin_index().unwrap();
-                let c = mir::ConstantKind::from_value(val, ty);
-                let values: Vec<_> = bx
-                    .tcx()
-                    .destructure_mir_constant(ty::ParamEnv::reveal_all(), c)
-                    .fields
+                let values: Vec<_> = val
+                    .unwrap_branch()
                     .iter()
                     .map(|field| {
                         if let Some(prim) = field.try_to_scalar() {
@@ -88,15 +87,15 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
                         }
                     })
                     .collect();
-                let llval = bx.const_struct(&values, false);
-                (llval, c.ty())
+                bx.const_struct(&values, false)
             })
-            .unwrap_or_else(|_| {
+            .unwrap_or_else(|| {
                 bx.tcx().sess.emit_err(errors::ShuffleIndicesEvaluation { span });
                 // We've errored, so we don't have to produce working code.
                 let ty = self.monomorphize(ty);
                 let llty = bx.backend_type(bx.layout_of(ty));
-                (bx.const_undef(llty), ty)
-            })
+                bx.const_undef(llty)
+            });
+        (val, ty)
     }
 }