Follow up to d0858bffa11, add missing REQUIRES x86
[llvm-project.git] / llvm / test / Transforms / AggressiveInstCombine / vector-or-load.ll
blobf7d48ce1e099c84adcad671f8943adcd72ecde01
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=aggressive-instcombine -S | FileCheck %s
4 ; Use the same idoim as X86/or-load.ll @loadCombine_2consecutive to represent a
5 ; sequence of operations that can be replaced by a single double-width load when
6 ; using scalar types but whose logic does not apply to fixed length vectors.
7 define <8 x i16> @or-load-fixed-length-vector(ptr %p1) {
8 ; CHECK-LABEL: @or-load-fixed-length-vector(
9 ; CHECK-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P1:%.*]], i32 1
10 ; CHECK-NEXT:    [[L1:%.*]] = load <8 x i8>, ptr [[P1]], align 1
11 ; CHECK-NEXT:    [[L2:%.*]] = load <8 x i8>, ptr [[P2]], align 1
12 ; CHECK-NEXT:    [[E1:%.*]] = zext <8 x i8> [[L1]] to <8 x i16>
13 ; CHECK-NEXT:    [[E2:%.*]] = zext <8 x i8> [[L2]] to <8 x i16>
14 ; CHECK-NEXT:    [[S2:%.*]] = shl <8 x i16> [[E2]], <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
15 ; CHECK-NEXT:    [[OR:%.*]] = or <8 x i16> [[E1]], [[S2]]
16 ; CHECK-NEXT:    ret <8 x i16> [[OR]]
18   %p2 = getelementptr i8, ptr %p1, i32 1
19   %l1 = load <8 x i8>, ptr %p1, align 1
20   %l2 = load <8 x i8>, ptr %p2, align 1
21   %e1 = zext <8 x i8> %l1 to <8 x i16>
22   %e2 = zext <8 x i8> %l2 to <8 x i16>
23   %s2 = shl <8 x i16> %e2, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
24   %or = or <8 x i16> %e1, %s2
25   ret <8 x i16> %or
28 ; Use the same idoim as X86/or-load.ll @loadCombine_2consecutive to represent a
29 ; sequence of operations that can be replaced by a single double-width load when
30 ; using scalar types but whose logic does not apply to scalable length vectors.
31 define <vscale x 8 x i16> @or-load-scalable-vector(ptr %p1) {
32 ; CHECK-LABEL: @or-load-scalable-vector(
33 ; CHECK-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P1:%.*]], i32 1
34 ; CHECK-NEXT:    [[L1:%.*]] = load <vscale x 8 x i8>, ptr [[P1]], align 1
35 ; CHECK-NEXT:    [[L2:%.*]] = load <vscale x 8 x i8>, ptr [[P2]], align 1
36 ; CHECK-NEXT:    [[E1:%.*]] = zext <vscale x 8 x i8> [[L1]] to <vscale x 8 x i16>
37 ; CHECK-NEXT:    [[E2:%.*]] = zext <vscale x 8 x i8> [[L2]] to <vscale x 8 x i16>
38 ; CHECK-NEXT:    [[S2:%.*]] = shl <vscale x 8 x i16> [[E2]], shufflevector (<vscale x 8 x i16> insertelement (<vscale x 8 x i16> poison, i16 8, i32 0), <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer)
39 ; CHECK-NEXT:    [[OR:%.*]] = or <vscale x 8 x i16> [[E1]], [[S2]]
40 ; CHECK-NEXT:    ret <vscale x 8 x i16> [[OR]]
42   %p2 = getelementptr i8, ptr %p1, i32 1
43   %l1 = load <vscale x 8 x i8>, ptr %p1, align 1
44   %l2 = load <vscale x 8 x i8>, ptr %p2, align 1
45   %e1 = zext <vscale x 8 x i8> %l1 to <vscale x 8 x i16>
46   %e2 = zext <vscale x 8 x i8> %l2 to <vscale x 8 x i16>
47   %s2 = shl <vscale x 8 x i16> %e2, shufflevector (<vscale x 8 x i16> insertelement (<vscale x 8 x i16> poison, i16 8, i32 0), <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer)
48   %or = or <vscale x 8 x i16> %e1, %s2
49   ret <vscale x 8 x i16> %or