252 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 32; RUN: opt -S -passes=separate-const-offset-from-gep < %s | FileCheck %s3 4define void @illegal_addr_mode(ptr %in.ptr, i64 %in.idx0, i64 %in.idx1) {5; CHECK-LABEL: define void @illegal_addr_mode(6; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX0:%.*]], i64 [[IN_IDX1:%.*]]) {7; CHECK-NEXT: entry:8; CHECK-NEXT: [[BASE:%.*]] = getelementptr i64, ptr [[IN_PTR]], i64 [[IN_IDX0]]9; CHECK-NEXT: [[IDX0:%.*]] = getelementptr i64, ptr [[BASE]], i64 [[IN_IDX1]]10; CHECK-NEXT: [[CONST1:%.*]] = getelementptr i64, ptr [[BASE]], i64 25611; CHECK-NEXT: [[IDX1:%.*]] = getelementptr i64, ptr [[CONST1]], i64 [[IN_IDX1]]12; CHECK-NEXT: [[CONST2:%.*]] = getelementptr i64, ptr [[BASE]], i64 51213; CHECK-NEXT: [[IDX2:%.*]] = getelementptr i64, ptr [[CONST2]], i64 [[IN_IDX1]]14; CHECK-NEXT: [[CONST3:%.*]] = getelementptr i64, ptr [[BASE]], i64 76815; CHECK-NEXT: [[IDX3:%.*]] = getelementptr i64, ptr [[CONST3]], i64 [[IN_IDX1]]16; CHECK-NEXT: [[CMP0:%.*]] = icmp eq i64 [[IN_IDX0]], 017; CHECK-NEXT: br i1 [[CMP0]], label [[BB_1:%.*]], label [[END:%.*]]18; CHECK: bb.1:19; CHECK-NEXT: [[VAL0:%.*]] = load <8 x i64>, ptr [[IDX0]], align 1620; CHECK-NEXT: [[VAL1:%.*]] = load <8 x i64>, ptr [[IDX1]], align 1621; CHECK-NEXT: [[VAL2:%.*]] = load <8 x i64>, ptr [[IDX2]], align 1622; CHECK-NEXT: [[VAL3:%.*]] = load <8 x i64>, ptr [[IDX3]], align 1623; CHECK-NEXT: call void asm sideeffect "24; CHECK-NEXT: call void asm sideeffect "25; CHECK-NEXT: call void asm sideeffect "26; CHECK-NEXT: call void asm sideeffect "27; CHECK-NEXT: br label [[END]]28; CHECK: end:29; CHECK-NEXT: call void asm sideeffect "30; CHECK-NEXT: call void asm sideeffect "31; CHECK-NEXT: call void asm sideeffect "32; CHECK-NEXT: call void asm sideeffect "33; CHECK-NEXT: ret void34;35entry:36 %base = getelementptr i64, ptr %in.ptr, i64 %in.idx037 %idx0 = getelementptr i64, ptr %base, i64 %in.idx138 %const1 = getelementptr i64, ptr %base, i64 25639 %idx1 = getelementptr i64, ptr %const1, i64 %in.idx140 %const2 = getelementptr i64, ptr %base, i64 51241 %idx2 = getelementptr i64, ptr %const2, i64 %in.idx142 %const3 = getelementptr i64, ptr %base, i64 76843 %idx3 = getelementptr i64, ptr %const3, i64 %in.idx144 %cmp0 = icmp eq i64 %in.idx0, 045 br i1 %cmp0, label %bb.1, label %end46 47bb.1:48 %val0 = load <8 x i64>, ptr %idx0, align 1649 %val1 = load <8 x i64>, ptr %idx1, align 1650 %val2 = load <8 x i64>, ptr %idx2, align 1651 %val3 = load <8 x i64>, ptr %idx3, align 1652 call void asm sideeffect "; use $0", "v"(<8 x i64> %val0)53 call void asm sideeffect "; use $0", "v"(<8 x i64> %val1)54 call void asm sideeffect "; use $0", "v"(<8 x i64> %val2)55 call void asm sideeffect "; use $0", "v"(<8 x i64> %val3)56 br label %end57 58end:59 call void asm sideeffect "; use $0", "v"(ptr %idx0)60 call void asm sideeffect "; use $0", "v"(ptr %idx1)61 call void asm sideeffect "; use $0", "v"(ptr %idx2)62 call void asm sideeffect "; use $0", "v"(ptr %idx3)63 ret void64}65 66 67define void @multi_index_reorder(ptr %in.ptr, i64 %in.idx0, i64 %in.idx1) {68; CHECK-LABEL: define void @multi_index_reorder(69; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX0:%.*]], i64 [[IN_IDX1:%.*]]) {70; CHECK-NEXT: entry:71; CHECK-NEXT: [[IDX0:%.*]] = getelementptr [8192 x i64], ptr [[IN_PTR]], i64 0, i64 [[IN_IDX1]]72; CHECK-NEXT: [[CONST1:%.*]] = getelementptr [8192 x i64], ptr [[IN_PTR]], i64 0, i64 25673; CHECK-NEXT: [[IDX1:%.*]] = getelementptr i64, ptr [[CONST1]], i64 [[IN_IDX1]]74; CHECK-NEXT: [[CONST2:%.*]] = getelementptr [8192 x i64], ptr [[IN_PTR]], i64 0, i64 51275; CHECK-NEXT: [[IDX2:%.*]] = getelementptr i64, ptr [[CONST2]], i64 [[IN_IDX1]]76; CHECK-NEXT: [[CONST3:%.*]] = getelementptr [8192 x i64], ptr [[IN_PTR]], i64 0, i64 76877; CHECK-NEXT: [[IDX3:%.*]] = getelementptr i64, ptr [[CONST3]], i64 [[IN_IDX1]]78; CHECK-NEXT: [[CMP0:%.*]] = icmp eq i64 [[IN_IDX0]], 079; CHECK-NEXT: br i1 [[CMP0]], label [[BB_1:%.*]], label [[END:%.*]]80; CHECK: bb.1:81; CHECK-NEXT: [[VAL0:%.*]] = load <8 x i64>, ptr [[IDX0]], align 1682; CHECK-NEXT: [[VAL1:%.*]] = load <8 x i64>, ptr [[IDX1]], align 1683; CHECK-NEXT: [[VAL2:%.*]] = load <8 x i64>, ptr [[IDX2]], align 1684; CHECK-NEXT: [[VAL3:%.*]] = load <8 x i64>, ptr [[IDX3]], align 1685; CHECK-NEXT: call void asm sideeffect "86; CHECK-NEXT: call void asm sideeffect "87; CHECK-NEXT: call void asm sideeffect "88; CHECK-NEXT: call void asm sideeffect "89; CHECK-NEXT: br label [[END]]90; CHECK: end:91; CHECK-NEXT: call void asm sideeffect "92; CHECK-NEXT: call void asm sideeffect "93; CHECK-NEXT: call void asm sideeffect "94; CHECK-NEXT: call void asm sideeffect "95; CHECK-NEXT: ret void96;97entry:98 %idx0 = getelementptr [8192 x i64], ptr %in.ptr, i64 0, i64 %in.idx199 %const1 = getelementptr [8192 x i64], ptr %in.ptr, i64 0, i64 256100 %idx1 = getelementptr i64, ptr %const1, i64 %in.idx1101 %const2 = getelementptr [8192 x i64], ptr %in.ptr, i64 0, i64 512102 %idx2 = getelementptr i64, ptr %const2, i64 %in.idx1103 %const3 = getelementptr [8192 x i64], ptr %in.ptr, i64 0, i64 768104 %idx3 = getelementptr i64, ptr %const3, i64 %in.idx1105 %cmp0 = icmp eq i64 %in.idx0, 0106 br i1 %cmp0, label %bb.1, label %end107 108bb.1:109 %val0 = load <8 x i64>, ptr %idx0, align 16110 %val1 = load <8 x i64>, ptr %idx1, align 16111 %val2 = load <8 x i64>, ptr %idx2, align 16112 %val3 = load <8 x i64>, ptr %idx3, align 16113 call void asm sideeffect "; use $0", "v"(<8 x i64> %val0)114 call void asm sideeffect "; use $0", "v"(<8 x i64> %val1)115 call void asm sideeffect "; use $0", "v"(<8 x i64> %val2)116 call void asm sideeffect "; use $0", "v"(<8 x i64> %val3)117 br label %end118 119end:120 call void asm sideeffect "; use $0", "v"(ptr %idx0)121 call void asm sideeffect "; use $0", "v"(ptr %idx1)122 call void asm sideeffect "; use $0", "v"(ptr %idx2)123 call void asm sideeffect "; use $0", "v"(ptr %idx3)124 ret void125}126 127 128define void @different_type_reorder(ptr %in.ptr, i64 %in.idx0, i64 %in.idx1) {129; CHECK-LABEL: define void @different_type_reorder(130; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX0:%.*]], i64 [[IN_IDX1:%.*]]) {131; CHECK-NEXT: entry:132; CHECK-NEXT: [[BASE:%.*]] = getelementptr i64, ptr [[IN_PTR]], i64 [[IN_IDX0]]133; CHECK-NEXT: [[IDX0:%.*]] = getelementptr i64, ptr [[BASE]], i64 [[IN_IDX1]]134; CHECK-NEXT: [[CONST1:%.*]] = getelementptr i8, ptr [[BASE]], i64 256135; CHECK-NEXT: [[IDX1:%.*]] = getelementptr i64, ptr [[CONST1]], i64 [[IN_IDX1]]136; CHECK-NEXT: [[CONST2:%.*]] = getelementptr i8, ptr [[BASE]], i64 512137; CHECK-NEXT: [[IDX2:%.*]] = getelementptr i64, ptr [[CONST2]], i64 [[IN_IDX1]]138; CHECK-NEXT: [[CONST3:%.*]] = getelementptr i8, ptr [[BASE]], i64 768139; CHECK-NEXT: [[IDX3:%.*]] = getelementptr i64, ptr [[CONST3]], i64 [[IN_IDX1]]140; CHECK-NEXT: [[CMP0:%.*]] = icmp eq i64 [[IN_IDX0]], 0141; CHECK-NEXT: br i1 [[CMP0]], label [[BB_1:%.*]], label [[END:%.*]]142; CHECK: bb.1:143; CHECK-NEXT: [[VAL0:%.*]] = load <8 x i64>, ptr [[IDX0]], align 16144; CHECK-NEXT: [[VAL1:%.*]] = load <8 x i64>, ptr [[IDX1]], align 16145; CHECK-NEXT: [[VAL2:%.*]] = load <8 x i64>, ptr [[IDX2]], align 16146; CHECK-NEXT: [[VAL3:%.*]] = load <8 x i64>, ptr [[IDX3]], align 16147; CHECK-NEXT: call void asm sideeffect "148; CHECK-NEXT: call void asm sideeffect "149; CHECK-NEXT: call void asm sideeffect "150; CHECK-NEXT: call void asm sideeffect "151; CHECK-NEXT: br label [[END]]152; CHECK: end:153; CHECK-NEXT: call void asm sideeffect "154; CHECK-NEXT: call void asm sideeffect "155; CHECK-NEXT: call void asm sideeffect "156; CHECK-NEXT: call void asm sideeffect "157; CHECK-NEXT: ret void158;159entry:160 %base = getelementptr i64, ptr %in.ptr, i64 %in.idx0161 %idx0 = getelementptr i64, ptr %base, i64 %in.idx1162 %const1 = getelementptr i8, ptr %base, i64 256163 %idx1 = getelementptr i64, ptr %const1, i64 %in.idx1164 %const2 = getelementptr i8, ptr %base, i64 512165 %idx2 = getelementptr i64, ptr %const2, i64 %in.idx1166 %const3 = getelementptr i8, ptr %base, i64 768167 %idx3 = getelementptr i64, ptr %const3, i64 %in.idx1168 %cmp0 = icmp eq i64 %in.idx0, 0169 br i1 %cmp0, label %bb.1, label %end170 171bb.1:172 %val0 = load <8 x i64>, ptr %idx0, align 16173 %val1 = load <8 x i64>, ptr %idx1, align 16174 %val2 = load <8 x i64>, ptr %idx2, align 16175 %val3 = load <8 x i64>, ptr %idx3, align 16176 call void asm sideeffect "; use $0", "v"(<8 x i64> %val0)177 call void asm sideeffect "; use $0", "v"(<8 x i64> %val1)178 call void asm sideeffect "; use $0", "v"(<8 x i64> %val2)179 call void asm sideeffect "; use $0", "v"(<8 x i64> %val3)180 br label %end181 182end:183 call void asm sideeffect "; use $0", "v"(ptr %idx0)184 call void asm sideeffect "; use $0", "v"(ptr %idx1)185 call void asm sideeffect "; use $0", "v"(ptr %idx2)186 call void asm sideeffect "; use $0", "v"(ptr %idx3)187 ret void188}189 190 191define void @different_type_reorder2(ptr %in.ptr, i64 %in.idx0, i64 %in.idx1) {192; CHECK-LABEL: define void @different_type_reorder2(193; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX0:%.*]], i64 [[IN_IDX1:%.*]]) {194; CHECK-NEXT: entry:195; CHECK-NEXT: [[BASE:%.*]] = getelementptr i8, ptr [[IN_PTR]], i64 [[IN_IDX0]]196; CHECK-NEXT: [[IDX0:%.*]] = getelementptr i8, ptr [[BASE]], i64 [[IN_IDX1]]197; CHECK-NEXT: [[CONST1:%.*]] = getelementptr i64, ptr [[BASE]], i64 256198; CHECK-NEXT: [[IDX1:%.*]] = getelementptr i8, ptr [[CONST1]], i64 [[IN_IDX1]]199; CHECK-NEXT: [[CONST2:%.*]] = getelementptr i64, ptr [[BASE]], i64 512200; CHECK-NEXT: [[IDX2:%.*]] = getelementptr i8, ptr [[CONST2]], i64 [[IN_IDX1]]201; CHECK-NEXT: [[CONST3:%.*]] = getelementptr i64, ptr [[BASE]], i64 768202; CHECK-NEXT: [[IDX3:%.*]] = getelementptr i8, ptr [[CONST3]], i64 [[IN_IDX1]]203; CHECK-NEXT: [[CMP0:%.*]] = icmp eq i64 [[IN_IDX0]], 0204; CHECK-NEXT: br i1 [[CMP0]], label [[BB_1:%.*]], label [[END:%.*]]205; CHECK: bb.1:206; CHECK-NEXT: [[VAL0:%.*]] = load <8 x i64>, ptr [[IDX0]], align 16207; CHECK-NEXT: [[VAL1:%.*]] = load <8 x i64>, ptr [[IDX1]], align 16208; CHECK-NEXT: [[VAL2:%.*]] = load <8 x i64>, ptr [[IDX2]], align 16209; CHECK-NEXT: [[VAL3:%.*]] = load <8 x i64>, ptr [[IDX3]], align 16210; CHECK-NEXT: call void asm sideeffect "211; CHECK-NEXT: call void asm sideeffect "212; CHECK-NEXT: call void asm sideeffect "213; CHECK-NEXT: call void asm sideeffect "214; CHECK-NEXT: br label [[END]]215; CHECK: end:216; CHECK-NEXT: call void asm sideeffect "217; CHECK-NEXT: call void asm sideeffect "218; CHECK-NEXT: call void asm sideeffect "219; CHECK-NEXT: call void asm sideeffect "220; CHECK-NEXT: ret void221;222entry:223 %base = getelementptr i8, ptr %in.ptr, i64 %in.idx0224 %idx0 = getelementptr i8, ptr %base, i64 %in.idx1225 %const1 = getelementptr i64, ptr %base, i64 256226 %idx1 = getelementptr i8, ptr %const1, i64 %in.idx1227 %const2 = getelementptr i64, ptr %base, i64 512228 %idx2 = getelementptr i8, ptr %const2, i64 %in.idx1229 %const3 = getelementptr i64, ptr %base, i64 768230 %idx3 = getelementptr i8, ptr %const3, i64 %in.idx1231 %cmp0 = icmp eq i64 %in.idx0, 0232 br i1 %cmp0, label %bb.1, label %end233 234bb.1:235 %val0 = load <8 x i64>, ptr %idx0, align 16236 %val1 = load <8 x i64>, ptr %idx1, align 16237 %val2 = load <8 x i64>, ptr %idx2, align 16238 %val3 = load <8 x i64>, ptr %idx3, align 16239 call void asm sideeffect "; use $0", "v"(<8 x i64> %val0)240 call void asm sideeffect "; use $0", "v"(<8 x i64> %val1)241 call void asm sideeffect "; use $0", "v"(<8 x i64> %val2)242 call void asm sideeffect "; use $0", "v"(<8 x i64> %val3)243 br label %end244 245end:246 call void asm sideeffect "; use $0", "v"(ptr %idx0)247 call void asm sideeffect "; use $0", "v"(ptr %idx1)248 call void asm sideeffect "; use $0", "v"(ptr %idx2)249 call void asm sideeffect "; use $0", "v"(ptr %idx3)250 ret void251}252