Skip to content

Commit e8734e4

Browse files
author
Thorsten Schütt
authored
[GlobalIsel] Improve poison analysis (#93731)
1 parent d5ff21d commit e8734e4

File tree

2 files changed

+345
-5
lines changed

2 files changed

+345
-5
lines changed

llvm/lib/CodeGen/GlobalISel/Utils.cpp

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1799,7 +1799,6 @@ static bool canCreateUndefOrPoison(Register Reg, const MachineRegisterInfo &MRI,
17991799

18001800
// Check whether opcode is a poison/undef-generating operation.
18011801
switch (RegDef->getOpcode()) {
1802-
case TargetOpcode::G_FREEZE:
18031802
case TargetOpcode::G_BUILD_VECTOR:
18041803
case TargetOpcode::G_CONSTANT_FOLD_BARRIER:
18051804
return false;
@@ -1841,6 +1840,50 @@ static bool canCreateUndefOrPoison(Register Reg, const MachineRegisterInfo &MRI,
18411840
case TargetOpcode::G_USHLSAT:
18421841
return includesPoison(Kind) &&
18431842
!shiftAmountKnownInRange(RegDef->getOperand(2).getReg(), MRI);
1843+
case TargetOpcode::G_INSERT_VECTOR_ELT: {
1844+
GInsertVectorElement *Insert = cast<GInsertVectorElement>(RegDef);
1845+
if (includesPoison(Kind)) {
1846+
std::optional<ValueAndVReg> Index =
1847+
getIConstantVRegValWithLookThrough(Insert->getIndexReg(), MRI);
1848+
if (!Index)
1849+
return true;
1850+
LLT VecTy = MRI.getType(Insert->getVectorReg());
1851+
return Index->Value.uge(VecTy.getElementCount().getKnownMinValue());
1852+
}
1853+
return false;
1854+
}
1855+
case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
1856+
GExtractVectorElement *Extract = cast<GExtractVectorElement>(RegDef);
1857+
if (includesPoison(Kind)) {
1858+
std::optional<ValueAndVReg> Index =
1859+
getIConstantVRegValWithLookThrough(Extract->getIndexReg(), MRI);
1860+
if (!Index)
1861+
return true;
1862+
LLT VecTy = MRI.getType(Extract->getVectorReg());
1863+
return Index->Value.uge(VecTy.getElementCount().getKnownMinValue());
1864+
}
1865+
return false;
1866+
}
1867+
case TargetOpcode::G_SHUFFLE_VECTOR: {
1868+
GShuffleVector *Shuffle = cast<GShuffleVector>(RegDef);
1869+
ArrayRef<int> Mask = Shuffle->getMask();
1870+
return includesPoison(Kind) && is_contained(Mask, -1);
1871+
}
1872+
case TargetOpcode::G_FNEG:
1873+
case TargetOpcode::G_PHI:
1874+
case TargetOpcode::G_SELECT:
1875+
case TargetOpcode::G_UREM:
1876+
case TargetOpcode::G_SREM:
1877+
case TargetOpcode::G_FREEZE:
1878+
case TargetOpcode::G_ICMP:
1879+
case TargetOpcode::G_FCMP:
1880+
case TargetOpcode::G_FADD:
1881+
case TargetOpcode::G_FSUB:
1882+
case TargetOpcode::G_FMUL:
1883+
case TargetOpcode::G_FDIV:
1884+
case TargetOpcode::G_FREM:
1885+
case TargetOpcode::G_PTR_ADD:
1886+
return false;
18441887
default:
18451888
return !isa<GCastOp>(RegDef) && !isa<GBinOp>(RegDef);
18461889
}
@@ -1872,6 +1915,15 @@ static bool isGuaranteedNotToBeUndefOrPoison(Register Reg,
18721915
return false;
18731916
return true;
18741917
}
1918+
case TargetOpcode::G_PHI: {
1919+
GPhi *Phi = cast<GPhi>(RegDef);
1920+
unsigned NumIncoming = Phi->getNumIncomingValues();
1921+
for (unsigned I = 0; I < NumIncoming; ++I)
1922+
if (!::isGuaranteedNotToBeUndefOrPoison(Phi->getIncomingValue(I), MRI,
1923+
Depth + 1, Kind))
1924+
return false;
1925+
return true;
1926+
}
18751927
default: {
18761928
auto MOCheck = [&](const MachineOperand &MO) {
18771929
if (!MO.isReg())

llvm/test/CodeGen/AArch64/GlobalISel/combine-freeze.mir

Lines changed: 292 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -655,8 +655,7 @@ body: |
655655
; CHECK-NEXT: %c:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
656656
; CHECK-NEXT: %d:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
657657
; CHECK-NEXT: %cmp:_(s1) = G_ICMP intpred(eq), %c(s64), %d
658-
; CHECK-NEXT: [[FREEZE:%[0-9]+]]:_(s1) = G_FREEZE %cmp
659-
; CHECK-NEXT: %ext:_(s64) = G_ZEXT [[FREEZE]](s1)
658+
; CHECK-NEXT: %ext:_(s64) = G_ZEXT %cmp(s1)
660659
; CHECK-NEXT: $x0 = COPY %ext(s64)
661660
; CHECK-NEXT: RET_ReallyLR implicit $x0
662661
%0:_(s64) = COPY $x0
@@ -682,8 +681,7 @@ body: |
682681
; CHECK-NEXT: %c:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
683682
; CHECK-NEXT: %d:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
684683
; CHECK-NEXT: %cmp:_(s1) = G_FCMP floatpred(oeq), %c(s64), %d
685-
; CHECK-NEXT: [[FREEZE:%[0-9]+]]:_(s1) = G_FREEZE %cmp
686-
; CHECK-NEXT: %ext:_(s64) = G_ZEXT [[FREEZE]](s1)
684+
; CHECK-NEXT: %ext:_(s64) = G_ZEXT %cmp(s1)
687685
; CHECK-NEXT: $x0 = COPY %ext(s64)
688686
; CHECK-NEXT: RET_ReallyLR implicit $x0
689687
%0:_(s64) = COPY $x0
@@ -1152,3 +1150,293 @@ body: |
11521150
%2:_(s64) = G_FREEZE %1
11531151
$x0 = COPY %2(s64)
11541152
RET_ReallyLR implicit $x0
1153+
...
1154+
---
1155+
name: freeze_fneg_fold_barrier
1156+
body: |
1157+
bb.1:
1158+
liveins: $w0
1159+
1160+
; CHECK-LABEL: name: freeze_fneg_fold_barrier
1161+
; CHECK: liveins: $w0
1162+
; CHECK-NEXT: {{ $}}
1163+
; CHECK-NEXT: %cst:_(s64) = G_FCONSTANT double 0.000000e+00
1164+
; CHECK-NEXT: %c:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1165+
; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s64) = G_FNEG %c
1166+
; CHECK-NEXT: $x0 = COPY [[FNEG]](s64)
1167+
; CHECK-NEXT: RET_ReallyLR implicit $x0
1168+
%0:_(s64) = COPY $x0
1169+
%cst:_(s64) = G_FCONSTANT double 0.0
1170+
%c:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1171+
%d:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1172+
%1:_(s64) = G_FNEG %c
1173+
%2:_(s64) = G_FREEZE %1
1174+
$x0 = COPY %2(s64)
1175+
RET_ReallyLR implicit $x0
1176+
...
1177+
---
1178+
name: freeze_frem_fold_barrier
1179+
body: |
1180+
bb.1:
1181+
liveins: $w0
1182+
1183+
; CHECK-LABEL: name: freeze_frem_fold_barrier
1184+
; CHECK: liveins: $w0
1185+
; CHECK-NEXT: {{ $}}
1186+
; CHECK-NEXT: %cst:_(s64) = G_FCONSTANT double 0.000000e+00
1187+
; CHECK-NEXT: %c:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1188+
; CHECK-NEXT: %d:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1189+
; CHECK-NEXT: [[FREM:%[0-9]+]]:_(s64) = G_FREM %c, %d
1190+
; CHECK-NEXT: $x0 = COPY [[FREM]](s64)
1191+
; CHECK-NEXT: RET_ReallyLR implicit $x0
1192+
%0:_(s64) = COPY $x0
1193+
%cst:_(s64) = G_FCONSTANT double 0.0
1194+
%c:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1195+
%d:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1196+
%1:_(s64) = G_FREM %c, %d
1197+
%2:_(s64) = G_FREEZE %1
1198+
$x0 = COPY %2(s64)
1199+
RET_ReallyLR implicit $x0
1200+
...
1201+
---
1202+
name: freeze_fdiv_fold_barrier
1203+
body: |
1204+
bb.1:
1205+
liveins: $w0
1206+
1207+
; CHECK-LABEL: name: freeze_fdiv_fold_barrier
1208+
; CHECK: liveins: $w0
1209+
; CHECK-NEXT: {{ $}}
1210+
; CHECK-NEXT: %cst:_(s64) = G_FCONSTANT double 0.000000e+00
1211+
; CHECK-NEXT: %c:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1212+
; CHECK-NEXT: %d:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1213+
; CHECK-NEXT: [[FDIV:%[0-9]+]]:_(s64) = G_FDIV %c, %d
1214+
; CHECK-NEXT: $x0 = COPY [[FDIV]](s64)
1215+
; CHECK-NEXT: RET_ReallyLR implicit $x0
1216+
%0:_(s64) = COPY $x0
1217+
%cst:_(s64) = G_FCONSTANT double 0.0
1218+
%c:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1219+
%d:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1220+
%1:_(s64) = G_FDIV %c, %d
1221+
%2:_(s64) = G_FREEZE %1
1222+
$x0 = COPY %2(s64)
1223+
RET_ReallyLR implicit $x0
1224+
...
1225+
---
1226+
name: freeze_fmul_fold_barrier
1227+
body: |
1228+
bb.1:
1229+
liveins: $w0
1230+
1231+
; CHECK-LABEL: name: freeze_fmul_fold_barrier
1232+
; CHECK: liveins: $w0
1233+
; CHECK-NEXT: {{ $}}
1234+
; CHECK-NEXT: %cst:_(s64) = G_FCONSTANT double 0.000000e+00
1235+
; CHECK-NEXT: %c:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1236+
; CHECK-NEXT: %d:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1237+
; CHECK-NEXT: [[FMUL:%[0-9]+]]:_(s64) = G_FMUL %c, %d
1238+
; CHECK-NEXT: $x0 = COPY [[FMUL]](s64)
1239+
; CHECK-NEXT: RET_ReallyLR implicit $x0
1240+
%0:_(s64) = COPY $x0
1241+
%cst:_(s64) = G_FCONSTANT double 0.0
1242+
%c:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1243+
%d:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1244+
%1:_(s64) = G_FMUL %c, %d
1245+
%2:_(s64) = G_FREEZE %1
1246+
$x0 = COPY %2(s64)
1247+
RET_ReallyLR implicit $x0
1248+
...
1249+
---
1250+
name: freeze_fsub_fold_barrier
1251+
body: |
1252+
bb.1:
1253+
liveins: $w0
1254+
1255+
; CHECK-LABEL: name: freeze_fsub_fold_barrier
1256+
; CHECK: liveins: $w0
1257+
; CHECK-NEXT: {{ $}}
1258+
; CHECK-NEXT: %cst:_(s64) = G_FCONSTANT double 0.000000e+00
1259+
; CHECK-NEXT: %c:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1260+
; CHECK-NEXT: %d:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1261+
; CHECK-NEXT: [[FSUB:%[0-9]+]]:_(s64) = G_FSUB %c, %d
1262+
; CHECK-NEXT: $x0 = COPY [[FSUB]](s64)
1263+
; CHECK-NEXT: RET_ReallyLR implicit $x0
1264+
%0:_(s64) = COPY $x0
1265+
%cst:_(s64) = G_FCONSTANT double 0.0
1266+
%c:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1267+
%d:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1268+
%1:_(s64) = G_FSUB %c, %d
1269+
%2:_(s64) = G_FREEZE %1
1270+
$x0 = COPY %2(s64)
1271+
RET_ReallyLR implicit $x0
1272+
...
1273+
---
1274+
name: freeze_fadd_fold_barrier
1275+
body: |
1276+
bb.1:
1277+
liveins: $w0
1278+
1279+
; CHECK-LABEL: name: freeze_fadd_fold_barrier
1280+
; CHECK: liveins: $w0
1281+
; CHECK-NEXT: {{ $}}
1282+
; CHECK-NEXT: %cst:_(s64) = G_FCONSTANT double 0.000000e+00
1283+
; CHECK-NEXT: %c:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1284+
; CHECK-NEXT: %d:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1285+
; CHECK-NEXT: [[FADD:%[0-9]+]]:_(s64) = G_FADD %c, %d
1286+
; CHECK-NEXT: $x0 = COPY [[FADD]](s64)
1287+
; CHECK-NEXT: RET_ReallyLR implicit $x0
1288+
%0:_(s64) = COPY $x0
1289+
%cst:_(s64) = G_FCONSTANT double 0.0
1290+
%c:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1291+
%d:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1292+
%1:_(s64) = G_FADD %c, %d
1293+
%2:_(s64) = G_FREEZE %1
1294+
$x0 = COPY %2(s64)
1295+
RET_ReallyLR implicit $x0
1296+
...
1297+
---
1298+
name: freeze_urem_fold_barrier
1299+
body: |
1300+
bb.1:
1301+
liveins: $w0
1302+
1303+
; CHECK-LABEL: name: freeze_urem_fold_barrier
1304+
; CHECK: liveins: $w0
1305+
; CHECK-NEXT: {{ $}}
1306+
; CHECK-NEXT: %cst:_(s64) = G_CONSTANT i64 9
1307+
; CHECK-NEXT: %c:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1308+
; CHECK-NEXT: %d:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1309+
; CHECK-NEXT: [[UREM:%[0-9]+]]:_(s64) = G_UREM %c, %d
1310+
; CHECK-NEXT: $x0 = COPY [[UREM]](s64)
1311+
; CHECK-NEXT: RET_ReallyLR implicit $x0
1312+
%0:_(s64) = COPY $x0
1313+
%cst:_(s64) = G_CONSTANT i64 9
1314+
%c:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1315+
%d:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1316+
%1:_(s64) = G_UREM %c, %d
1317+
%2:_(s64) = G_FREEZE %1
1318+
$x0 = COPY %2(s64)
1319+
RET_ReallyLR implicit $x0
1320+
...
1321+
---
1322+
name: freeze_srem_fold_barrier
1323+
body: |
1324+
bb.1:
1325+
liveins: $w0
1326+
1327+
; CHECK-LABEL: name: freeze_srem_fold_barrier
1328+
; CHECK: liveins: $w0
1329+
; CHECK-NEXT: {{ $}}
1330+
; CHECK-NEXT: %cst:_(s64) = G_CONSTANT i64 9
1331+
; CHECK-NEXT: %c:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1332+
; CHECK-NEXT: %d:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1333+
; CHECK-NEXT: [[SREM:%[0-9]+]]:_(s64) = G_SREM %c, %d
1334+
; CHECK-NEXT: $x0 = COPY [[SREM]](s64)
1335+
; CHECK-NEXT: RET_ReallyLR implicit $x0
1336+
%0:_(s64) = COPY $x0
1337+
%cst:_(s64) = G_CONSTANT i64 9
1338+
%c:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1339+
%d:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1340+
%1:_(s64) = G_SREM %c, %d
1341+
%2:_(s64) = G_FREEZE %1
1342+
$x0 = COPY %2(s64)
1343+
RET_ReallyLR implicit $x0
1344+
...
1345+
---
1346+
name: freeze_ptradd_fold_barrier
1347+
body: |
1348+
bb.1:
1349+
liveins: $w0
1350+
1351+
; CHECK-LABEL: name: freeze_ptradd_fold_barrier
1352+
; CHECK: liveins: $w0
1353+
; CHECK-NEXT: {{ $}}
1354+
; CHECK-NEXT: %p:_(p0) = COPY $x0
1355+
; CHECK-NEXT: %cst:_(s64) = G_CONSTANT i64 9
1356+
; CHECK-NEXT: [[FREEZE:%[0-9]+]]:_(p0) = G_FREEZE %p
1357+
; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[FREEZE]], %cst(s64)
1358+
; CHECK-NEXT: $x0 = COPY [[PTR_ADD]](p0)
1359+
; CHECK-NEXT: RET_ReallyLR implicit $x0
1360+
%0:_(s64) = COPY $x0
1361+
%p:_(p0) = COPY $x0
1362+
%cst:_(s64) = G_CONSTANT i64 9
1363+
%c:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1364+
%d:_(s64) = G_CONSTANT_FOLD_BARRIER %cst
1365+
%1:_(p0) = G_PTR_ADD %p, %cst
1366+
%2:_(p0) = G_FREEZE %1
1367+
$x0 = COPY %2(p0)
1368+
RET_ReallyLR implicit $x0
1369+
...
1370+
---
1371+
# select (false, x, y) -> y
1372+
name: freeze_select_fold_barrier
1373+
body: |
1374+
bb.1:
1375+
liveins: $x0, $x1
1376+
; CHECK-LABEL: name: freeze_select_fold_barrier
1377+
; CHECK: liveins: $x0, $x1
1378+
; CHECK-NEXT: {{ $}}
1379+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x1
1380+
; CHECK-NEXT: [[FREEZE:%[0-9]+]]:_(s64) = G_FREEZE [[COPY]]
1381+
; CHECK-NEXT: $x0 = COPY [[FREEZE]](s64)
1382+
%0:_(s64) = COPY $x0
1383+
%1:_(s64) = COPY $x1
1384+
%2:_(s1) = G_CONSTANT i1 false
1385+
%3:_(s64) = G_SELECT %2, %0, %1
1386+
%4:_(s64) = G_FREEZE %3
1387+
$x0 = COPY %4(s64)
1388+
...
1389+
---
1390+
name: freeze_extract_and_shuffle_vector_fold_barrier
1391+
body: |
1392+
bb.1:
1393+
liveins: $x0, $x1
1394+
; CHECK-LABEL: name: freeze_extract_and_shuffle_vector_fold_barrier
1395+
; CHECK: liveins: $x0, $x1
1396+
; CHECK-NEXT: {{ $}}
1397+
; CHECK-NEXT: %arg1:_(<4 x s32>) = COPY $q0
1398+
; CHECK-NEXT: %arg2:_(<4 x s32>) = COPY $q1
1399+
; CHECK-NEXT: %idx:_(s64) = G_CONSTANT i64 0
1400+
; CHECK-NEXT: %sv:_(<4 x s32>) = G_SHUFFLE_VECTOR %arg1(<4 x s32>), %arg2, shufflemask(3, 0, 0, 0)
1401+
; CHECK-NEXT: %freeze_sv:_(<4 x s32>) = G_FREEZE %sv
1402+
; CHECK-NEXT: %extract:_(s32) = G_EXTRACT_VECTOR_ELT %freeze_sv(<4 x s32>), %idx(s64)
1403+
; CHECK-NEXT: $w0 = COPY %extract(s32)
1404+
; CHECK-NEXT: RET_ReallyLR implicit $x0
1405+
%arg1:_(<4 x s32>) = COPY $q0
1406+
%arg2:_(<4 x s32>) = COPY $q1
1407+
%idx:_(s64) = G_CONSTANT i64 0
1408+
%sv:_(<4 x s32>) = G_SHUFFLE_VECTOR %arg1(<4 x s32>), %arg2(<4 x s32>), shufflemask(3, 0, 0, 0)
1409+
%freeze_sv:_(<4 x s32>) = G_FREEZE %sv
1410+
%extract:_(s32) = G_EXTRACT_VECTOR_ELT %freeze_sv(<4 x s32>), %idx(s64)
1411+
%freeze:_(s32) = G_FREEZE %extract
1412+
$w0 = COPY %extract(s32)
1413+
RET_ReallyLR implicit $x0
1414+
...
1415+
---
1416+
name: freeze_insert_and_shuffle_vector_fold_barrier
1417+
body: |
1418+
bb.1:
1419+
liveins: $x0, $x1
1420+
; CHECK-LABEL: name: freeze_insert_and_shuffle_vector_fold_barrier
1421+
; CHECK: liveins: $x0, $x1
1422+
; CHECK-NEXT: {{ $}}
1423+
; CHECK-NEXT: %elt:_(s32) = COPY $w0
1424+
; CHECK-NEXT: %arg1:_(<4 x s32>) = COPY $q0
1425+
; CHECK-NEXT: %arg2:_(<4 x s32>) = COPY $q1
1426+
; CHECK-NEXT: %idx:_(s64) = G_CONSTANT i64 0
1427+
; CHECK-NEXT: %sv:_(<4 x s32>) = G_SHUFFLE_VECTOR %arg1(<4 x s32>), %arg2, shufflemask(3, 0, 0, 0)
1428+
; CHECK-NEXT: %freeze_sv:_(<4 x s32>) = G_FREEZE %sv
1429+
; CHECK-NEXT: [[FREEZE:%[0-9]+]]:_(s32) = G_FREEZE %elt
1430+
; CHECK-NEXT: %extract:_(<4 x s32>) = G_INSERT_VECTOR_ELT %freeze_sv, [[FREEZE]](s32), %idx(s64)
1431+
; CHECK-NEXT: $q0 = COPY %extract(<4 x s32>)
1432+
; CHECK-NEXT: RET_ReallyLR implicit $x0
1433+
%elt:_(s32) = COPY $w0
1434+
%arg1:_(<4 x s32>) = COPY $q0
1435+
%arg2:_(<4 x s32>) = COPY $q1
1436+
%idx:_(s64) = G_CONSTANT i64 0
1437+
%sv:_(<4 x s32>) = G_SHUFFLE_VECTOR %arg1(<4 x s32>), %arg2(<4 x s32>), shufflemask(3, 0, 0, 0)
1438+
%freeze_sv:_(<4 x s32>) = G_FREEZE %sv
1439+
%extract:_(<4 x s32>) = G_INSERT_VECTOR_ELT %freeze_sv(<4 x s32>), %elt(s32), %idx(s64)
1440+
%freeze:_(<4 x s32>) = G_FREEZE %extract
1441+
$q0 = COPY %freeze(<4 x s32>)
1442+
RET_ReallyLR implicit $x0

0 commit comments

Comments
 (0)