From 3654f1baa66f524c89e40ab24e18e594e56363e9 Mon Sep 17 00:00:00 2001 From: Paul Walker Date: Tue, 10 Dec 2024 15:42:05 +0000 Subject: [PATCH] [LLVM][IR] Add support for vector ConstantInt/FP to ConstandFolding:FoldBitCast. (#117163) --- llvm/lib/Analysis/ConstantFolding.cpp | 15 ++++++++++----- llvm/test/Transforms/InstCombine/cast.ll | 2 ++ .../InstSimplify/bitcast-vector-fold.ll | 8 ++++++++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp index 836fa94f9c1e1c..3d5022e5502e28 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(C->getType())) + return ConstantExpr::getBitCast(C, DestTy); + // If this is a bitcast from constant vector -> vector, fold it. - if (!isa(C) && !isa(C)) + if (!isa(C) && !isa(C) && + !isa(C) && !isa(C)) return ConstantExpr::getBitCast(C, DestTy); // If the element types match, IR can fold it. @@ -194,10 +200,9 @@ Constant *FoldBitCast(Constant *C, Type *DestTy, const DataLayout &DL) { IntegerType::get(C->getContext(), FPWidth), NumSrcElt); // Ask IR to do the conversion now that #elts line up. C = ConstantExpr::getBitCast(C, SrcIVTy); - // If IR wasn't able to fold it, bail out. - if (!isa(C) && // FIXME: Remove ConstantVector. - !isa(C)) - return C; + assert((isa(C) || // FIXME: Remove ConstantVector. + isa(C) || isa(C)) && + "Constant folding cannot fail for plain fp->int bitcast!"); } // Now we know that the input and output vectors are both integer vectors 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>) diff --git a/llvm/test/Transforms/InstSimplify/bitcast-vector-fold.ll b/llvm/test/Transforms/InstSimplify/bitcast-vector-fold.ll index a3ad5f01391422..d2656e291547cf 100644 --- a/llvm/test/Transforms/InstSimplify/bitcast-vector-fold.ll +++ b/llvm/test/Transforms/InstSimplify/bitcast-vector-fold.ll @@ -284,3 +284,11 @@ define <1 x i32> @bitcast_constexpr_scalar_fp_to_vector_int() { %res = bitcast float 1.0 to <1 x i32> ret <1 x i32> %res } + +define <2 x i64> @bitcast_constexpr_4f32_2i64_1111() { +; CHECK-LABEL: @bitcast_constexpr_4f32_2i64_1111( +; CHECK-NEXT: ret <2 x i64> splat (i64 4575657222473777152) +; + %res = bitcast <4 x float> splat (float 1.0) to <2 x i64> + ret <2 x i64> %res +}