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