@@ -1224,6 +1224,13 @@ class llvm2alive_ : public llvm::InstVisitor<llvm2alive_, unique_ptr<Instr>> {
12241224 addNoundefAssumes (i, {a, b});
12251225 return make_unique<VaCopy>(*a, *b);
12261226 }
1227+ case llvm::Intrinsic::vscale: {
1228+ auto ty = llvm_type2alive (i.getType ());
1229+ if (!ty)
1230+ return error (i);
1231+ auto val = make_intconst (config::vscale_value, ty->bits ());
1232+ return make_unique<UnaryOp>(*ty, value_name (i), *val, UnaryOp::Copy);
1233+ }
12271234
12281235 // do nothing intrinsics
12291236 case llvm::Intrinsic::dbg_declare:
@@ -1335,8 +1342,17 @@ class llvm2alive_ : public llvm::InstVisitor<llvm2alive_, unique_ptr<Instr>> {
13351342 RetTy visitShuffleVectorInst (llvm::ShuffleVectorInst &i) {
13361343 PARSE_BINOP ();
13371344 vector<unsigned > mask;
1338- for (auto m : i.getShuffleMask ())
1339- mask.push_back (m);
1345+
1346+ unsigned replicate = 1 ;
1347+ if (i.getType ()->isScalableTy ()) {
1348+ replicate = config::vscale_value;
1349+ }
1350+
1351+ auto &&sm = i.getShuffleMask ();
1352+ for (unsigned j = 0 ; j < replicate; j++) {
1353+ mask.insert (mask.end (), sm.begin (), sm.end ());
1354+ }
1355+
13401356 return
13411357 make_unique<ShuffleVector>(*ty, value_name (i), *a, *b, std::move (mask));
13421358 }
0 commit comments