mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
2ccd678696
This allows FoldConstantArithmetic to handle SPLAT_VECTOR in addition to BUILD_VECTOR. This allows it to support scalable vectors. I'm also allowing fixed length SPLAT_VECTOR which is used by some targets, but I'm not familiar enough to write tests for those targets. I had to block this function from running on CONCAT_VECTORS to avoid calling getNode for a CONCAT_VECTORS of 2 scalars. This can happen because the 2 operand getNode calls this function for any opcode. Previously we were protected because CONCAT_VECTORs of BUILD_VECTOR is folded to a larger BUILD_VECTOR before that call. But it's not always possible to fold a CONCAT_VECTORS of SPLAT_VECTORs, and we don't even try. This fixes PR49781 where DAG combine thought constant folding should be possible, but FoldConstantArithmetic couldn't do it. Reviewed By: david-arm Differential Revision: https://reviews.llvm.org/D99682
14 lines
578 B
LLVM
14 lines
578 B
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc < %s -mtriple=aarch64 -mattr=+sve | FileCheck %s
|
|
|
|
define <vscale x 2 x i64> @foo(<vscale x 2 x i64> %a) {
|
|
; CHECK-LABEL: foo:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: sub z0.d, z0.d, #2 // =0x2
|
|
; CHECK-NEXT: ret
|
|
%idx = shufflevector <vscale x 2 x i64> insertelement (<vscale x 2 x i64> undef, i64 1, i32 0), <vscale x 2 x i64> zeroinitializer, <vscale x 2 x i32> zeroinitializer
|
|
%b = sub <vscale x 2 x i64> %a, %idx
|
|
%c = sub <vscale x 2 x i64> %b, %idx
|
|
ret <vscale x 2 x i64> %c
|
|
}
|