Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / Transforms / InstCombine / load-gep-overalign.ll
blobeb35133e7aa3d8590f73e11a7d55d95b64a26188
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)
68   ret void