xref: /llvm-project/llvm/test/Transforms/SLPVectorizer/X86/load-bitcast-vec.ll (revision 580210a0c938531ef9fd79f9ffedb93eeb2e66c2)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=slp-vectorizer -S -mtriple=x86_64-- -mattr=+avx  | FileCheck %s
3; RUN: opt < %s -passes=slp-vectorizer -S -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s
4
5define float @matching_scalar(ptr dereferenceable(16) %p) {
6; CHECK-LABEL: @matching_scalar(
7; CHECK-NEXT:    [[R:%.*]] = load float, ptr [[P:%.*]], align 16
8; CHECK-NEXT:    ret float [[R]]
9;
10  %r = load float, ptr %p, align 16
11  ret float %r
12}
13
14define i32 @nonmatching_scalar(ptr dereferenceable(16) %p) {
15; CHECK-LABEL: @nonmatching_scalar(
16; CHECK-NEXT:    [[R:%.*]] = load i32, ptr [[P:%.*]], align 16
17; CHECK-NEXT:    ret i32 [[R]]
18;
19  %r = load i32, ptr %p, align 16
20  ret i32 %r
21}
22
23define i64 @larger_scalar(ptr dereferenceable(16) %p) {
24; CHECK-LABEL: @larger_scalar(
25; CHECK-NEXT:    [[R:%.*]] = load i64, ptr [[P:%.*]], align 16
26; CHECK-NEXT:    ret i64 [[R]]
27;
28  %r = load i64, ptr %p, align 16
29  ret i64 %r
30}
31
32define i8 @smaller_scalar(ptr dereferenceable(16) %p) {
33; CHECK-LABEL: @smaller_scalar(
34; CHECK-NEXT:    [[R:%.*]] = load i8, ptr [[P:%.*]], align 16
35; CHECK-NEXT:    ret i8 [[R]]
36;
37  %r = load i8, ptr %p, align 16
38  ret i8 %r
39}
40
41define i8 @smaller_scalar_256bit_vec(ptr dereferenceable(32) %p) {
42; CHECK-LABEL: @smaller_scalar_256bit_vec(
43; CHECK-NEXT:    [[R:%.*]] = load i8, ptr [[P:%.*]], align 32
44; CHECK-NEXT:    ret i8 [[R]]
45;
46  %r = load i8, ptr %p, align 32
47  ret i8 %r
48}
49
50define i8 @smaller_scalar_less_aligned(ptr dereferenceable(16) %p) {
51; CHECK-LABEL: @smaller_scalar_less_aligned(
52; CHECK-NEXT:    [[R:%.*]] = load i8, ptr [[P:%.*]], align 4
53; CHECK-NEXT:    ret i8 [[R]]
54;
55  %r = load i8, ptr %p, align 4
56  ret i8 %r
57}
58
59define float @matching_scalar_small_deref(ptr dereferenceable(15) %p) {
60; CHECK-LABEL: @matching_scalar_small_deref(
61; CHECK-NEXT:    [[R:%.*]] = load float, ptr [[P:%.*]], align 16
62; CHECK-NEXT:    ret float [[R]]
63;
64  %r = load float, ptr %p, align 16
65  ret float %r
66}
67
68define float @matching_scalar_volatile(ptr dereferenceable(16) %p) {
69; CHECK-LABEL: @matching_scalar_volatile(
70; CHECK-NEXT:    [[R:%.*]] = load volatile float, ptr [[P:%.*]], align 16
71; CHECK-NEXT:    ret float [[R]]
72;
73  %r = load volatile float, ptr %p, align 16
74  ret float %r
75}
76
77define float @nonvector(ptr dereferenceable(16) %p) {
78; CHECK-LABEL: @nonvector(
79; CHECK-NEXT:    [[R:%.*]] = load float, ptr [[P:%.*]], align 16
80; CHECK-NEXT:    ret float [[R]]
81;
82  %r = load float, ptr %p, align 16
83  ret float %r
84}
85