Files
clang-p2996/llvm/test/Bitcode/vscale-round-trip.ll
David Sherwood 2a48b6993a [IR] In ConstantFoldShuffleVectorInstruction use zeroinitializer for splats of 0
When creating a splat of 0 for scalable vectors we tend to create them
with using a combination of shufflevector and insertelement, i.e.

shufflevector (<vscale x 4 x i32> insertelement (<vscale x 4 x i32> poison, i32 0, i32 0),
               <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer)

However, for the case of a zero splat we can actually just replace the
above with zeroinitializer instead. This makes the IR a lot simpler and
easier to read. I have changed ConstantFoldShuffleVectorInstruction to
use zeroinitializer when creating a splat of integer 0 or FP +0.0 values.

Differential Revision: https://reviews.llvm.org/D113394
2021-11-10 09:42:58 +00:00

50 lines
1.8 KiB
LLVM

; RUN: llvm-as < %s | llvm-dis | FileCheck %s
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
target triple = "aarch64"
@important_val = extern_weak dso_local global i32, align 4
; CHECK-LABEL: define <vscale x 4 x i32> @const_shufflevector(
; CHECK: <vscale x 4 x i32> zeroinitializer
define <vscale x 4 x i32> @const_shufflevector() {
ret <vscale x 4 x i32> shufflevector (<vscale x 4 x i32> zeroinitializer,
<vscale x 4 x i32> undef,
<vscale x 4 x i32> zeroinitializer)
}
; CHECK-LABEL: define <vscale x 4 x i32> @const_shufflevector_ex()
; CHECK: <vscale x 4 x i32> zeroinitializer
define <vscale x 4 x i32> @const_shufflevector_ex() {
ret <vscale x 4 x i32> shufflevector (<vscale x 2 x i32> zeroinitializer,
<vscale x 2 x i32> undef,
<vscale x 4 x i32> zeroinitializer)
}
; CHECK-LABEL: define <vscale x 4 x i32> @non_const_shufflevector(
; CHECK: %res = shufflevector <vscale x 4 x i32>
define <vscale x 4 x i32> @non_const_shufflevector(<vscale x 4 x i32> %lhs,
<vscale x 4 x i32> %rhs) {
%res = shufflevector <vscale x 4 x i32> %lhs,
<vscale x 4 x i32> %rhs,
<vscale x 4 x i32> zeroinitializer
ret <vscale x 4 x i32> %res
}
; CHECK-LABEL: define <vscale x 4 x i32> @const_select()
; CHECK: <vscale x 4 x i32> select (<vscale x 4 x i1>
define <vscale x 4 x i32> @const_select() {
ret <vscale x 4 x i32> select
(<vscale x 4 x i1> insertelement
(<vscale x 4 x i1> undef,
i1 icmp ne (i32* @important_val, i32* null),
i32 0),
<vscale x 4 x i32> zeroinitializer,
<vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 1, i32 0))
}