@@ -89,6 +89,53 @@ define ptr addrspace(7) @simple_inbounds_gep(ptr addrspace(7) %ptr, i32 %off) {
89
89
ret ptr addrspace (7 ) %ret
90
90
}
91
91
92
+ define ptr addrspace (7 ) @simple_nuw_gep (ptr addrspace (7 ) %ptr , i32 %off ) {
93
+ ; CHECK-LABEL: define { ptr addrspace(8), i32 } @simple_nuw_gep
94
+ ; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]], i32 [[OFF:%.*]]) #[[ATTR0]] {
95
+ ; CHECK-NEXT: [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 0
96
+ ; CHECK-NEXT: [[PTR_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 1
97
+ ; CHECK-NEXT: [[RET_IDX:%.*]] = mul nuw i32 [[OFF]], 4
98
+ ; CHECK-NEXT: [[RET:%.*]] = add nuw i32 [[PTR_OFF]], [[RET_IDX]]
99
+ ; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[PTR_RSRC]], 0
100
+ ; CHECK-NEXT: [[TMP2:%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP1]], i32 [[RET]], 1
101
+ ; CHECK-NEXT: ret { ptr addrspace(8), i32 } [[TMP2]]
102
+ ;
103
+ %ret = getelementptr nuw i32 , ptr addrspace (7 ) %ptr , i32 %off
104
+ ret ptr addrspace (7 ) %ret
105
+ }
106
+
107
+ define ptr addrspace (7 ) @simple_nusw_gep (ptr addrspace (7 ) %ptr , i32 %off ) {
108
+ ; CHECK-LABEL: define { ptr addrspace(8), i32 } @simple_nusw_gep
109
+ ; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]], i32 [[OFF:%.*]]) #[[ATTR0]] {
110
+ ; CHECK-NEXT: [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 0
111
+ ; CHECK-NEXT: [[PTR_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 1
112
+ ; CHECK-NEXT: [[RET_IDX:%.*]] = mul nsw i32 [[OFF]], 4
113
+ ; CHECK-NEXT: [[RET:%.*]] = add i32 [[PTR_OFF]], [[RET_IDX]]
114
+ ; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[PTR_RSRC]], 0
115
+ ; CHECK-NEXT: [[TMP2:%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP1]], i32 [[RET]], 1
116
+ ; CHECK-NEXT: ret { ptr addrspace(8), i32 } [[TMP2]]
117
+ ;
118
+ %ret = getelementptr nusw i32 , ptr addrspace (7 ) %ptr , i32 %off
119
+ ret ptr addrspace (7 ) %ret
120
+ }
121
+
122
+ define ptr addrspace (7 ) @nusw_gep_pair (ptr addrspace (7 ) %ptr , i32 %off ) {
123
+ ; CHECK-LABEL: define { ptr addrspace(8), i32 } @nusw_gep_pair
124
+ ; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]], i32 [[OFF:%.*]]) #[[ATTR0]] {
125
+ ; CHECK-NEXT: [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 0
126
+ ; CHECK-NEXT: [[PTR_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 1
127
+ ; CHECK-NEXT: [[P1_IDX:%.*]] = mul nsw i32 [[OFF]], 4
128
+ ; CHECK-NEXT: [[P1:%.*]] = add i32 [[PTR_OFF]], [[P1_IDX]]
129
+ ; CHECK-NEXT: [[RET:%.*]] = add nuw i32 [[P1]], 16
130
+ ; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[PTR_RSRC]], 0
131
+ ; CHECK-NEXT: [[TMP2:%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP1]], i32 [[RET]], 1
132
+ ; CHECK-NEXT: ret { ptr addrspace(8), i32 } [[TMP2]]
133
+ ;
134
+ %p1 = getelementptr nusw i32 , ptr addrspace (7 ) %ptr , i32 %off
135
+ %ret = getelementptr nusw i32 , ptr addrspace (7 ) %p1 , i32 4
136
+ ret ptr addrspace (7 ) %ret
137
+ }
138
+
92
139
define ptr addrspace (7 ) @zero_gep (ptr addrspace (7 ) %ptr ) {
93
140
; CHECK-LABEL: define { ptr addrspace(8), i32 } @zero_gep
94
141
; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]]) #[[ATTR0]] {
0 commit comments