@@ -430,6 +430,82 @@ define <8 x i16> @freeze_abds(<8 x i16> %a, <8 x i16> %b) {
430430 ret <8 x i16 > %r
431431}
432432
433+ ; TODO: Unnecessary final and
434+ define <8 x i16 > @freeze_uhadd (<8 x i16 > %a0 , <8 x i16 > %a1 ) {
435+ ; CHECK-LABEL: freeze_uhadd:
436+ ; CHECK: // %bb.0:
437+ ; CHECK-NEXT: movi v2.8h, #15
438+ ; CHECK-NEXT: and v0.16b, v0.16b, v2.16b
439+ ; CHECK-NEXT: and v1.16b, v1.16b, v2.16b
440+ ; CHECK-NEXT: movi v2.8h, #31
441+ ; CHECK-NEXT: uhadd v0.8h, v0.8h, v1.8h
442+ ; CHECK-NEXT: and v0.16b, v0.16b, v2.16b
443+ ; CHECK-NEXT: ret
444+ %m0 = and <8 x i16 > %a0 , splat (i16 15 )
445+ %m1 = and <8 x i16 > %a1 , splat (i16 15 )
446+ %avg = call <8 x i16 > @llvm.aarch64.neon.uhadd.v8i16 (<8 x i16 > %m0 , <8 x i16 > %m1 )
447+ %frozen = freeze <8 x i16 > %avg
448+ %masked = and <8 x i16 > %frozen , splat (i16 31 )
449+ ret <8 x i16 > %masked
450+ }
451+
452+ ; TODO: Unnecessary final and
453+ define <8 x i16 > @freeze_urhadd (<8 x i16 > %a0 , <8 x i16 > %a1 ) {
454+ ; CHECK-LABEL: freeze_urhadd:
455+ ; CHECK: // %bb.0:
456+ ; CHECK-NEXT: movi v2.8h, #15
457+ ; CHECK-NEXT: and v0.16b, v0.16b, v2.16b
458+ ; CHECK-NEXT: and v1.16b, v1.16b, v2.16b
459+ ; CHECK-NEXT: movi v2.8h, #31
460+ ; CHECK-NEXT: urhadd v0.8h, v0.8h, v1.8h
461+ ; CHECK-NEXT: and v0.16b, v0.16b, v2.16b
462+ ; CHECK-NEXT: ret
463+ %m0 = and <8 x i16 > %a0 , splat (i16 15 )
464+ %m1 = and <8 x i16 > %a1 , splat (i16 15 )
465+ %avg = call <8 x i16 > @llvm.aarch64.neon.urhadd.v8i16 (<8 x i16 > %m0 , <8 x i16 > %m1 )
466+ %frozen = freeze <8 x i16 > %avg
467+ %masked = and <8 x i16 > %frozen , splat (i16 31 )
468+ ret <8 x i16 > %masked
469+ }
470+
471+ ; TODO: Unnecessary sext_inreg
472+ define <8 x i16 > @freeze_shadd (<8 x i8 > %a0 , <8 x i16 > %a1 ) {
473+ ; CHECK-LABEL: freeze_shadd:
474+ ; CHECK: // %bb.0:
475+ ; CHECK-NEXT: sshll v0.8h, v0.8b, #0
476+ ; CHECK-NEXT: sshr v1.8h, v1.8h, #8
477+ ; CHECK-NEXT: shadd v0.8h, v0.8h, v1.8h
478+ ; CHECK-NEXT: shl v0.8h, v0.8h, #8
479+ ; CHECK-NEXT: sshr v0.8h, v0.8h, #8
480+ ; CHECK-NEXT: ret
481+ %x0 = sext <8 x i8 > %a0 to <8 x i16 >
482+ %x1 = ashr <8 x i16 > %a1 , splat (i16 8 )
483+ %avg = call <8 x i16 > @llvm.aarch64.neon.shadd.v8i16 (<8 x i16 > %x0 , <8 x i16 > %x1 )
484+ %frozen = freeze <8 x i16 > %avg
485+ %trunc = trunc <8 x i16 > %frozen to <8 x i8 >
486+ %sext = sext <8 x i8 > %trunc to <8 x i16 >
487+ ret <8 x i16 > %sext
488+ }
489+
490+ ; TODO: Unnecessary sext_inreg
491+ define <8 x i16 > @freeze_srhadd (<8 x i8 > %a0 , <8 x i16 > %a1 ) {
492+ ; CHECK-LABEL: freeze_srhadd:
493+ ; CHECK: // %bb.0:
494+ ; CHECK-NEXT: sshll v0.8h, v0.8b, #0
495+ ; CHECK-NEXT: sshr v1.8h, v1.8h, #8
496+ ; CHECK-NEXT: srhadd v0.8h, v0.8h, v1.8h
497+ ; CHECK-NEXT: shl v0.8h, v0.8h, #8
498+ ; CHECK-NEXT: sshr v0.8h, v0.8h, #8
499+ ; CHECK-NEXT: ret
500+ %x0 = sext <8 x i8 > %a0 to <8 x i16 >
501+ %x1 = ashr <8 x i16 > %a1 , splat (i16 8 )
502+ %avg = call <8 x i16 > @llvm.aarch64.neon.srhadd.v8i16 (<8 x i16 > %x0 , <8 x i16 > %x1 )
503+ %frozen = freeze <8 x i16 > %avg
504+ %trunc = trunc <8 x i16 > %frozen to <8 x i8 >
505+ %sext = sext <8 x i8 > %trunc to <8 x i16 >
506+ ret <8 x i16 > %sext
507+ }
508+
433509define i32 @freeze_scmp (i32 %a0 ) nounwind {
434510; CHECK-LABEL: freeze_scmp:
435511; CHECK: // %bb.0:
0 commit comments