@@ -89,6 +89,53 @@ define ptr addrspace(7) @simple_inbounds_gep(ptr addrspace(7) %ptr, i32 %off) {
8989 ret ptr addrspace (7 ) %ret
9090}
9191
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+
92139define ptr addrspace (7 ) @zero_gep (ptr addrspace (7 ) %ptr ) {
93140; CHECK-LABEL: define { ptr addrspace(8), i32 } @zero_gep
94141; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]]) #[[ATTR0]] {
0 commit comments