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
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