From: David Green Date: Tue, 27 Sep 2022 16:08:17 +0000 (+0100) Subject: [AArch64] Remove incorrect zero element insert-bitcast patterns X-Git-Tag: upstream/17.0.6~32389 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=401481daac909131762a68f177ba612b507c6e85;p=platform%2Fupstream%2Fllvm.git [AArch64] Remove incorrect zero element insert-bitcast patterns These two patterns are not working as intended, as shown in D134022. They need to insert the value into the new register, not override it. --- diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/llvm/lib/Target/AArch64/AArch64InstrInfo.td index 1c24afa..7695080 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td @@ -5888,12 +5888,8 @@ defm : Neon_INS_elt_pattern; // vector_insert(bitcast(f32 src), n, lane) -> INSvi32lane(src, lane, INSERT_SUBREG(-, n), 0) def : Pat<(v4i32 (vector_insert v4i32:$src, (i32 (bitconvert (f32 FPR32:$Sn))), imm:$Immd)), (INSvi32lane V128:$src, imm:$Immd, (INSERT_SUBREG (IMPLICIT_DEF), FPR32:$Sn, ssub), 0)>; -def : Pat<(v4i32 (vector_insert v4i32:$src, (i32 (bitconvert (f32 FPR32:$Sn))), 0)), - (INSERT_SUBREG v4i32:$src, FPR32:$Sn, ssub)>; def : Pat<(v2i64 (vector_insert v2i64:$src, (i64 (bitconvert (f64 FPR64:$Sn))), imm:$Immd)), (INSvi64lane V128:$src, imm:$Immd, (INSERT_SUBREG (IMPLICIT_DEF), FPR64:$Sn, dsub), 0)>; -def : Pat<(v2i64 (vector_insert v2i64:$src, (i64 (bitconvert (f64 FPR64:$Sn))), 0)), - (INSERT_SUBREG v2i64:$src, FPR64:$Sn, dsub)>; // bitcast of an extract // f32 bitcast(vector_extract(v4i32 src, lane)) -> EXTRACT_SUBREG(INSvi32lane(-, 0, src, lane)) diff --git a/llvm/test/CodeGen/AArch64/neon-insextbitcast.ll b/llvm/test/CodeGen/AArch64/neon-insextbitcast.ll index 318881c..2896137 100644 --- a/llvm/test/CodeGen/AArch64/neon-insextbitcast.ll +++ b/llvm/test/CodeGen/AArch64/neon-insextbitcast.ll @@ -16,7 +16,8 @@ entry: define <4 x i32> @test_vins_v4i32_0(<4 x i32> %a, float %b) { ; CHECK-LABEL: test_vins_v4i32_0: ; CHECK: // %bb.0: // %entry -; CHECK-NEXT: fmov s0, s1 +; CHECK-NEXT: // kill: def $s1 killed $s1 def $q1 +; CHECK-NEXT: mov v0.s[0], v1.s[0] ; CHECK-NEXT: ret entry: %c = bitcast float %b to i32 @@ -42,7 +43,8 @@ define <2 x i32> @test_vins_v2i32_0(<2 x i32> %a, float %b) { ; CHECK-LABEL: test_vins_v2i32_0: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 -; CHECK-NEXT: fmov s0, s1 +; CHECK-NEXT: // kill: def $s1 killed $s1 def $q1 +; CHECK-NEXT: mov v0.s[0], v1.s[0] ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 ; CHECK-NEXT: ret entry: @@ -66,7 +68,8 @@ entry: define <2 x i64> @test_vins_v2i64_0(<2 x i64> %a, double %b) { ; CHECK-LABEL: test_vins_v2i64_0: ; CHECK: // %bb.0: // %entry -; CHECK-NEXT: fmov d0, d1 +; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1 +; CHECK-NEXT: mov v0.d[0], v1.d[0] ; CHECK-NEXT: ret entry: %c = bitcast double %b to i64