1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -passes=instcombine -S %s | FileCheck %s --check-prefix=NATURAL
3 ; RUN: opt --data-layout="i16:32" -passes=instcombine -S %s | FileCheck %s --check-prefix=OVERALIGNED
5 ; The data layouts are little endian, so @foo is 0x0123456789ABCDEF in memory.
6 @foo = constant <4 x i16> <i16 u0x2301, i16 u0x6745, i16 u0xAB89, i16 u0xEFCD>, align 8
8 declare void @report(i64 %index, i8 %val)
10 define void @test_vector_load_i8() {
11 ; Access and report each individual byte in @foo.
12 ; OVERALIGNED and NATURAL should have the same result, because the layout of vectors ignores
13 ; element type alignment, and thus the representation of @foo is the same in both cases.
14 ; NATURAL-LABEL: @test_vector_load_i8(
15 ; NATURAL-NEXT: call void @report(i64 0, i8 1)
16 ; NATURAL-NEXT: call void @report(i64 1, i8 35)
17 ; NATURAL-NEXT: call void @report(i64 2, i8 69)
18 ; NATURAL-NEXT: call void @report(i64 3, i8 103)
19 ; NATURAL-NEXT: call void @report(i64 4, i8 -119)
20 ; NATURAL-NEXT: call void @report(i64 5, i8 -85)
21 ; NATURAL-NEXT: call void @report(i64 6, i8 -51)
22 ; NATURAL-NEXT: call void @report(i64 7, i8 -17)
23 ; NATURAL-NEXT: ret void
25 ; OVERALIGNED-LABEL: @test_vector_load_i8(
26 ; OVERALIGNED-NEXT: call void @report(i64 0, i8 1)
27 ; OVERALIGNED-NEXT: call void @report(i64 1, i8 35)
28 ; OVERALIGNED-NEXT: call void @report(i64 2, i8 69)
29 ; OVERALIGNED-NEXT: call void @report(i64 3, i8 103)
30 ; OVERALIGNED-NEXT: call void @report(i64 4, i8 -119)
31 ; OVERALIGNED-NEXT: call void @report(i64 5, i8 -85)
32 ; OVERALIGNED-NEXT: call void @report(i64 6, i8 -51)
33 ; OVERALIGNED-NEXT: call void @report(i64 7, i8 -17)
34 ; OVERALIGNED-NEXT: ret void
36 %ptr0 = getelementptr i8, ptr @foo, i64 0
37 %res0 = load i8, ptr %ptr0, align 1
38 call void @report(i64 0, i8 %res0)
40 %ptr1 = getelementptr i8, ptr @foo, i64 1
41 %res1 = load i8, ptr %ptr1, align 1
42 call void @report(i64 1, i8 %res1)
44 %ptr2 = getelementptr i8, ptr @foo, i64 2
45 %res2 = load i8, ptr %ptr2, align 1
46 call void @report(i64 2, i8 %res2)
48 %ptr3 = getelementptr i8, ptr @foo, i64 3
49 %res3 = load i8, ptr %ptr3, align 1
50 call void @report(i64 3, i8 %res3)
52 %ptr4 = getelementptr i8, ptr @foo, i64 4
53 %res4 = load i8, ptr %ptr4, align 1
54 call void @report(i64 4, i8 %res4)
56 %ptr5 = getelementptr i8, ptr @foo, i64 5
57 %res5 = load i8, ptr %ptr5, align 1
58 call void @report(i64 5, i8 %res5)
60 %ptr6 = getelementptr i8, ptr @foo, i64 6
61 %res6 = load i8, ptr %ptr6, align 1
62 call void @report(i64 6, i8 %res6)
64 %ptr7 = getelementptr i8, ptr @foo, i64 7
65 %res7 = load i8, ptr %ptr7, align 1
66 call void @report(i64 7, i8 %res7)