Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(557)

Side by Side Diff: test/Transforms/NaCl/expand-getelementptr.ll

Issue 1151093004: Changes from 3.7 merge to files not in upstream (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-llvm.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 ; RUN: opt < %s -expand-getelementptr -S | FileCheck %s 1 ; RUN: opt < %s -expand-getelementptr -S | FileCheck %s
2 2
3 target datalayout = "p:32:32:32" 3 target datalayout = "p:32:32:32"
4 4
5 %MyStruct = type { i8, i32, i8 } 5 %MyStruct = type { i8, i32, i8 }
6 %MyArray = type { [100 x i64] } 6 %MyArray = type { [100 x i64] }
7 %MyArrayOneByte = type { [100 x i8] } 7 %MyArrayOneByte = type { [100 x i8] }
8 8
9 9
10 ; Test indexing struct field 10 ; Test indexing struct field
11 define i8* @test_struct_field(%MyStruct* %ptr) { 11 define i8* @test_struct_field(%MyStruct* %ptr) {
12 %addr = getelementptr %MyStruct* %ptr, i32 0, i32 2 12 %addr = getelementptr %MyStruct, %MyStruct* %ptr, i32 0, i32 2
13 ret i8* %addr 13 ret i8* %addr
14 } 14 }
15 ; CHECK: @test_struct_field 15 ; CHECK: @test_struct_field
16 ; CHECK-NEXT: %gep_int = ptrtoint %MyStruct* %ptr to i32 16 ; CHECK-NEXT: %gep_int = ptrtoint %MyStruct* %ptr to i32
17 ; CHECK-NEXT: %gep = add i32 %gep_int, 8 17 ; CHECK-NEXT: %gep = add i32 %gep_int, 8
18 ; CHECK-NEXT: %addr = inttoptr i32 %gep to i8* 18 ; CHECK-NEXT: %addr = inttoptr i32 %gep to i8*
19 ; CHECK-NEXT: ret i8* %addr 19 ; CHECK-NEXT: ret i8* %addr
20 20
21 21
22 ; Test non-constant index into an array 22 ; Test non-constant index into an array
23 define i64* @test_array_index(%MyArray* %ptr, i32 %index) { 23 define i64* @test_array_index(%MyArray* %ptr, i32 %index) {
24 %addr = getelementptr %MyArray* %ptr, i32 0, i32 0, i32 %index 24 %addr = getelementptr %MyArray, %MyArray* %ptr, i32 0, i32 0, i32 %index
25 ret i64* %addr 25 ret i64* %addr
26 } 26 }
27 ; CHECK: @test_array_index 27 ; CHECK: @test_array_index
28 ; CHECK-NEXT: %gep_int = ptrtoint %MyArray* %ptr to i32 28 ; CHECK-NEXT: %gep_int = ptrtoint %MyArray* %ptr to i32
29 ; CHECK-NEXT: %gep_array = mul i32 %index, 8 29 ; CHECK-NEXT: %gep_array = mul i32 %index, 8
30 ; CHECK-NEXT: %gep = add i32 %gep_int, %gep_array 30 ; CHECK-NEXT: %gep = add i32 %gep_int, %gep_array
31 ; CHECK-NEXT: %addr = inttoptr i32 %gep to i64* 31 ; CHECK-NEXT: %addr = inttoptr i32 %gep to i64*
32 ; CHECK-NEXT: ret i64* %addr 32 ; CHECK-NEXT: ret i64* %addr
33 33
34 34
35 ; Test constant index into an array (as a pointer) 35 ; Test constant index into an array (as a pointer)
36 define %MyStruct* @test_ptr_add(%MyStruct* %ptr) { 36 define %MyStruct* @test_ptr_add(%MyStruct* %ptr) {
37 %addr = getelementptr %MyStruct* %ptr, i32 2 37 %addr = getelementptr %MyStruct, %MyStruct* %ptr, i32 2
38 ret %MyStruct* %addr 38 ret %MyStruct* %addr
39 } 39 }
40 ; CHECK: @test_ptr_add 40 ; CHECK: @test_ptr_add
41 ; CHECK-NEXT: %gep_int = ptrtoint %MyStruct* %ptr to i32 41 ; CHECK-NEXT: %gep_int = ptrtoint %MyStruct* %ptr to i32
42 ; CHECK-NEXT: %gep = add i32 %gep_int, 24 42 ; CHECK-NEXT: %gep = add i32 %gep_int, 24
43 ; CHECK-NEXT: %addr = inttoptr i32 %gep to %MyStruct* 43 ; CHECK-NEXT: %addr = inttoptr i32 %gep to %MyStruct*
44 ; CHECK-NEXT: ret %MyStruct* %addr 44 ; CHECK-NEXT: ret %MyStruct* %addr
45 45
46 46
47 ; Test that additions and multiplications are combined properly 47 ; Test that additions and multiplications are combined properly
48 define i64* @test_add_and_index(%MyArray* %ptr, i32 %index) { 48 define i64* @test_add_and_index(%MyArray* %ptr, i32 %index) {
49 %addr = getelementptr %MyArray* %ptr, i32 1, i32 0, i32 %index 49 %addr = getelementptr %MyArray, %MyArray* %ptr, i32 1, i32 0, i32 %index
50 ret i64* %addr 50 ret i64* %addr
51 } 51 }
52 ; CHECK: @test_add_and_index 52 ; CHECK: @test_add_and_index
53 ; CHECK-NEXT: %gep_int = ptrtoint %MyArray* %ptr to i32 53 ; CHECK-NEXT: %gep_int = ptrtoint %MyArray* %ptr to i32
54 ; CHECK-NEXT: %gep = add i32 %gep_int, 800 54 ; CHECK-NEXT: %gep = add i32 %gep_int, 800
55 ; CHECK-NEXT: %gep_array = mul i32 %index, 8 55 ; CHECK-NEXT: %gep_array = mul i32 %index, 8
56 ; CHECK-NEXT: %gep1 = add i32 %gep, %gep_array 56 ; CHECK-NEXT: %gep1 = add i32 %gep, %gep_array
57 ; CHECK-NEXT: %addr = inttoptr i32 %gep1 to i64* 57 ; CHECK-NEXT: %addr = inttoptr i32 %gep1 to i64*
58 ; CHECK-NEXT: ret i64* %addr 58 ; CHECK-NEXT: ret i64* %addr
59 59
60 60
61 ; Test that we don't multiply by 1 unnecessarily 61 ; Test that we don't multiply by 1 unnecessarily
62 define i8* @test_add_and_index_one_byte(%MyArrayOneByte* %ptr, i32 %index) { 62 define i8* @test_add_and_index_one_byte(%MyArrayOneByte* %ptr, i32 %index) {
63 %addr = getelementptr %MyArrayOneByte* %ptr, i32 1, i32 0, i32 %index 63 %addr = getelementptr %MyArrayOneByte, %MyArrayOneByte* %ptr, i32 1, i32 0, i3 2 %index
64 ret i8* %addr 64 ret i8* %addr
65 } 65 }
66 ; CHECK: @test_add_and_index 66 ; CHECK: @test_add_and_index
67 ; CHECK-NEXT: %gep_int = ptrtoint %MyArrayOneByte* %ptr to i32 67 ; CHECK-NEXT: %gep_int = ptrtoint %MyArrayOneByte* %ptr to i32
68 ; CHECK-NEXT: %gep = add i32 %gep_int, 100 68 ; CHECK-NEXT: %gep = add i32 %gep_int, 100
69 ; CHECK-NEXT: %gep1 = add i32 %gep, %index 69 ; CHECK-NEXT: %gep1 = add i32 %gep, %index
70 ; CHECK-NEXT: %addr = inttoptr i32 %gep1 to i8* 70 ; CHECK-NEXT: %addr = inttoptr i32 %gep1 to i8*
71 ; CHECK-NEXT: ret i8* %addr 71 ; CHECK-NEXT: ret i8* %addr
72 72
73 73
74 ; Test >32-bit array index 74 ; Test >32-bit array index
75 define i64* @test_array_index64(%MyArray* %ptr, i64 %index) { 75 define i64* @test_array_index64(%MyArray* %ptr, i64 %index) {
76 %addr = getelementptr %MyArray* %ptr, i32 0, i32 0, i64 %index 76 %addr = getelementptr %MyArray, %MyArray* %ptr, i32 0, i32 0, i64 %index
77 ret i64* %addr 77 ret i64* %addr
78 } 78 }
79 ; CHECK: @test_array_index64 79 ; CHECK: @test_array_index64
80 ; CHECK-NEXT: %gep_int = ptrtoint %MyArray* %ptr to i32 80 ; CHECK-NEXT: %gep_int = ptrtoint %MyArray* %ptr to i32
81 ; CHECK-NEXT: %gep_trunc = trunc i64 %index to i32 81 ; CHECK-NEXT: %gep_trunc = trunc i64 %index to i32
82 ; CHECK-NEXT: %gep_array = mul i32 %gep_trunc, 8 82 ; CHECK-NEXT: %gep_array = mul i32 %gep_trunc, 8
83 ; CHECK-NEXT: %gep = add i32 %gep_int, %gep_array 83 ; CHECK-NEXT: %gep = add i32 %gep_int, %gep_array
84 ; CHECK-NEXT: %addr = inttoptr i32 %gep to i64* 84 ; CHECK-NEXT: %addr = inttoptr i32 %gep to i64*
85 ; CHECK-NEXT: ret i64* %addr 85 ; CHECK-NEXT: ret i64* %addr
86 86
87 87
88 ; Test <32-bit array index 88 ; Test <32-bit array index
89 define i64* @test_array_index16(%MyArray* %ptr, i16 %index) { 89 define i64* @test_array_index16(%MyArray* %ptr, i16 %index) {
90 %addr = getelementptr %MyArray* %ptr, i32 0, i32 0, i16 %index 90 %addr = getelementptr %MyArray, %MyArray* %ptr, i32 0, i32 0, i16 %index
91 ret i64* %addr 91 ret i64* %addr
92 } 92 }
93 ; CHECK: @test_array_index16 93 ; CHECK: @test_array_index16
94 ; CHECK-NEXT: %gep_int = ptrtoint %MyArray* %ptr to i32 94 ; CHECK-NEXT: %gep_int = ptrtoint %MyArray* %ptr to i32
95 ; CHECK-NEXT: %gep_sext = sext i16 %index to i32 95 ; CHECK-NEXT: %gep_sext = sext i16 %index to i32
96 ; CHECK-NEXT: %gep_array = mul i32 %gep_sext, 8 96 ; CHECK-NEXT: %gep_array = mul i32 %gep_sext, 8
97 ; CHECK-NEXT: %gep = add i32 %gep_int, %gep_array 97 ; CHECK-NEXT: %gep = add i32 %gep_int, %gep_array
98 ; CHECK-NEXT: %addr = inttoptr i32 %gep to i64* 98 ; CHECK-NEXT: %addr = inttoptr i32 %gep to i64*
99 ; CHECK-NEXT: ret i64* %addr 99 ; CHECK-NEXT: ret i64* %addr
100 100
101 101
102 ; Test >32-bit constant array index 102 ; Test >32-bit constant array index
103 define i64* @test_array_index64_const(%MyArray* %ptr) { 103 define i64* @test_array_index64_const(%MyArray* %ptr) {
104 %addr = getelementptr %MyArray* %ptr, i32 0, i32 0, i64 100 104 %addr = getelementptr %MyArray, %MyArray* %ptr, i32 0, i32 0, i64 100
105 ret i64* %addr 105 ret i64* %addr
106 } 106 }
107 ; CHECK: @test_array_index64_const 107 ; CHECK: @test_array_index64_const
108 ; CHECK-NEXT: %gep_int = ptrtoint %MyArray* %ptr to i32 108 ; CHECK-NEXT: %gep_int = ptrtoint %MyArray* %ptr to i32
109 ; CHECK-NEXT: %gep = add i32 %gep_int, 800 109 ; CHECK-NEXT: %gep = add i32 %gep_int, 800
110 ; CHECK-NEXT: %addr = inttoptr i32 %gep to i64* 110 ; CHECK-NEXT: %addr = inttoptr i32 %gep to i64*
111 ; CHECK-NEXT: ret i64* %addr 111 ; CHECK-NEXT: ret i64* %addr
112 112
113 113
114 ; Test <32-bit constant array index -- test sign extension 114 ; Test <32-bit constant array index -- test sign extension
115 define i64* @test_array_index16_const(%MyArray* %ptr) { 115 define i64* @test_array_index16_const(%MyArray* %ptr) {
116 %addr = getelementptr %MyArray* %ptr, i32 0, i32 0, i16 -100 116 %addr = getelementptr %MyArray, %MyArray* %ptr, i32 0, i32 0, i16 -100
117 ret i64* %addr 117 ret i64* %addr
118 } 118 }
119 ; CHECK: @test_array_index16_const 119 ; CHECK: @test_array_index16_const
120 ; CHECK-NEXT: %gep_int = ptrtoint %MyArray* %ptr to i32 120 ; CHECK-NEXT: %gep_int = ptrtoint %MyArray* %ptr to i32
121 ; CHECK-NEXT: %gep = add i32 %gep_int, -800 121 ; CHECK-NEXT: %gep = add i32 %gep_int, -800
122 ; CHECK-NEXT: %addr = inttoptr i32 %gep to i64* 122 ; CHECK-NEXT: %addr = inttoptr i32 %gep to i64*
123 ; CHECK-NEXT: ret i64* %addr 123 ; CHECK-NEXT: ret i64* %addr
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698