junparser created this revision. junparser added reviewers: joechrisellis, c-rhodes, efriedma, aeubanks, bsmith. Herald added subscribers: psnobl, kristof.beyls, tschuett. junparser requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
This change fixes the crash that PRValue cannot be handled by EmitLValue. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D105097 Files: clang/lib/CodeGen/CGExprScalar.cpp clang/test/CodeGen/attr-arm-sve-vector-bits-codegen.c Index: clang/test/CodeGen/attr-arm-sve-vector-bits-codegen.c =================================================================== --- clang/test/CodeGen/attr-arm-sve-vector-bits-codegen.c +++ clang/test/CodeGen/attr-arm-sve-vector-bits-codegen.c @@ -103,3 +103,46 @@ parr = &arr[0]; return *parr; } + +// CHECK-LABEL: @test_cast( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[RETVAL:%.*]] = alloca <16 x i32>, align 16 +// CHECK-NEXT: [[PRED_ADDR:%.*]] = alloca <vscale x 16 x i1>, align 2 +// CHECK-NEXT: [[VEC_ADDR:%.*]] = alloca <vscale x 4 x i32>, align 16 +// CHECK-NEXT: [[XX:%.*]] = alloca <16 x i32>, align 16 +// CHECK-NEXT: [[YY:%.*]] = alloca <16 x i32>, align 16 +// CHECK-NEXT: [[PG:%.*]] = alloca <vscale x 16 x i1>, align 2 +// CHECK-NEXT: [[SAVED_PRVALUE:%.*]] = alloca <16 x i32>, align 64 +// CHECK-NEXT: store <vscale x 16 x i1> [[PRED:%.*]], <vscale x 16 x i1>* [[PRED_ADDR]], align 2 +// CHECK-NEXT: store <vscale x 4 x i32> [[VEC:%.*]], <vscale x 4 x i32>* [[VEC_ADDR]], align 16 +// CHECK-NEXT: store <16 x i32> <i32 1, i32 2, i32 3, i32 4, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>, <16 x i32>* [[XX]], align 16 +// CHECK-NEXT: store <16 x i32> <i32 2, i32 5, i32 4, i32 6, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>, <16 x i32>* [[YY]], align 16 +// CHECK-NEXT: [[TMP0:%.*]] = load <vscale x 16 x i1>, <vscale x 16 x i1>* [[PRED_ADDR]], align 2 +// CHECK-NEXT: [[TMP1:%.*]] = load <8 x i8>, <8 x i8>* @global_pred, align 2 +// CHECK-NEXT: [[TMP2:%.*]] = load <vscale x 16 x i1>, <vscale x 16 x i1>* bitcast (<8 x i8>* @global_pred to <vscale x 16 x i1>*), align 2 +// CHECK-NEXT: [[TMP3:%.*]] = load <16 x i32>, <16 x i32>* [[XX]], align 16 +// CHECK-NEXT: [[TMP4:%.*]] = load <16 x i32>, <16 x i32>* [[YY]], align 16 +// CHECK-NEXT: [[ADD:%.*]] = add <16 x i32> [[TMP3]], [[TMP4]] +// CHECK-NEXT: store <16 x i32> [[ADD]], <16 x i32>* [[SAVED_PRVALUE]], align 64 +// CHECK-NEXT: [[TMP5:%.*]] = bitcast <16 x i32>* [[SAVED_PRVALUE]] to <vscale x 16 x i1>* +// CHECK-NEXT: [[TMP6:%.*]] = load <vscale x 16 x i1>, <vscale x 16 x i1>* [[TMP5]], align 64 +// CHECK-NEXT: [[TMP7:%.*]] = call <vscale x 16 x i1> @llvm.aarch64.sve.and.z.nxv16i1(<vscale x 16 x i1> [[TMP0]], <vscale x 16 x i1> [[TMP2]], <vscale x 16 x i1> [[TMP6]]) +// CHECK-NEXT: store <vscale x 16 x i1> [[TMP7]], <vscale x 16 x i1>* [[PG]], align 2 +// CHECK-NEXT: [[TMP8:%.*]] = load <vscale x 16 x i1>, <vscale x 16 x i1>* [[PG]], align 2 +// CHECK-NEXT: [[TMP9:%.*]] = load <16 x i32>, <16 x i32>* @global_vec, align 16 +// CHECK-NEXT: [[CASTSCALABLESVE:%.*]] = call <vscale x 4 x i32> @llvm.experimental.vector.insert.nxv4i32.v16i32(<vscale x 4 x i32> undef, <16 x i32> [[TMP9]], i64 0) +// CHECK-NEXT: [[TMP10:%.*]] = load <vscale x 4 x i32>, <vscale x 4 x i32>* [[VEC_ADDR]], align 16 +// CHECK-NEXT: [[TMP11:%.*]] = call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> [[TMP8]]) +// CHECK-NEXT: [[TMP12:%.*]] = call <vscale x 4 x i32> @llvm.aarch64.sve.add.nxv4i32(<vscale x 4 x i1> [[TMP11]], <vscale x 4 x i32> [[CASTSCALABLESVE]], <vscale x 4 x i32> [[TMP10]]) +// CHECK-NEXT: [[CASTFIXEDSVE:%.*]] = call <16 x i32> @llvm.experimental.vector.extract.v16i32.nxv4i32(<vscale x 4 x i32> [[TMP12]], i64 0) +// CHECK-NEXT: store <16 x i32> [[CASTFIXEDSVE]], <16 x i32>* [[RETVAL]], align 16 +// CHECK-NEXT: [[TMP13:%.*]] = load <16 x i32>, <16 x i32>* [[RETVAL]], align 16 +// CHECK-NEXT: [[CASTSCALABLESVE1:%.*]] = call <vscale x 4 x i32> @llvm.experimental.vector.insert.nxv4i32.v16i32(<vscale x 4 x i32> undef, <16 x i32> [[TMP13]], i64 0) +// CHECK-NEXT: ret <vscale x 4 x i32> [[CASTSCALABLESVE1]] +// +fixed_int32_t test_cast(svbool_t pred, svint32_t vec) { + fixed_int32_t xx = {1, 2, 3, 4}; + fixed_int32_t yy = {2, 5, 4, 6}; + svbool_t pg = svand_z(pred, global_pred, xx + yy); + return svadd_m(pg, global_vec, vec); +} Index: clang/lib/CodeGen/CGExprScalar.cpp =================================================================== --- clang/lib/CodeGen/CGExprScalar.cpp +++ clang/lib/CodeGen/CGExprScalar.cpp @@ -2111,7 +2111,13 @@ return EmitLoadOfLValue(DestLV, CE->getExprLoc()); } - Address Addr = EmitLValue(E).getAddress(CGF); + Address Addr = Address::invalid(); + if (E->isPRValue() && !isa<CastExpr>(E)) { + Addr = CGF.CreateDefaultAlignTempAlloca(SrcTy, "saved-prvalue"); + LValue LV = CGF.MakeAddrLValue(Addr, E->getType()); + CGF.EmitStoreOfScalar(Src, LV); + } else + Addr = EmitLValue(E).getAddress(CGF); Addr = Builder.CreateElementBitCast(Addr, CGF.ConvertTypeForMem(DestTy)); LValue DestLV = CGF.MakeAddrLValue(Addr, DestTy); DestLV.setTBAAInfo(TBAAAccessInfo::getMayAliasInfo());
Index: clang/test/CodeGen/attr-arm-sve-vector-bits-codegen.c =================================================================== --- clang/test/CodeGen/attr-arm-sve-vector-bits-codegen.c +++ clang/test/CodeGen/attr-arm-sve-vector-bits-codegen.c @@ -103,3 +103,46 @@ parr = &arr[0]; return *parr; } + +// CHECK-LABEL: @test_cast( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[RETVAL:%.*]] = alloca <16 x i32>, align 16 +// CHECK-NEXT: [[PRED_ADDR:%.*]] = alloca <vscale x 16 x i1>, align 2 +// CHECK-NEXT: [[VEC_ADDR:%.*]] = alloca <vscale x 4 x i32>, align 16 +// CHECK-NEXT: [[XX:%.*]] = alloca <16 x i32>, align 16 +// CHECK-NEXT: [[YY:%.*]] = alloca <16 x i32>, align 16 +// CHECK-NEXT: [[PG:%.*]] = alloca <vscale x 16 x i1>, align 2 +// CHECK-NEXT: [[SAVED_PRVALUE:%.*]] = alloca <16 x i32>, align 64 +// CHECK-NEXT: store <vscale x 16 x i1> [[PRED:%.*]], <vscale x 16 x i1>* [[PRED_ADDR]], align 2 +// CHECK-NEXT: store <vscale x 4 x i32> [[VEC:%.*]], <vscale x 4 x i32>* [[VEC_ADDR]], align 16 +// CHECK-NEXT: store <16 x i32> <i32 1, i32 2, i32 3, i32 4, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>, <16 x i32>* [[XX]], align 16 +// CHECK-NEXT: store <16 x i32> <i32 2, i32 5, i32 4, i32 6, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>, <16 x i32>* [[YY]], align 16 +// CHECK-NEXT: [[TMP0:%.*]] = load <vscale x 16 x i1>, <vscale x 16 x i1>* [[PRED_ADDR]], align 2 +// CHECK-NEXT: [[TMP1:%.*]] = load <8 x i8>, <8 x i8>* @global_pred, align 2 +// CHECK-NEXT: [[TMP2:%.*]] = load <vscale x 16 x i1>, <vscale x 16 x i1>* bitcast (<8 x i8>* @global_pred to <vscale x 16 x i1>*), align 2 +// CHECK-NEXT: [[TMP3:%.*]] = load <16 x i32>, <16 x i32>* [[XX]], align 16 +// CHECK-NEXT: [[TMP4:%.*]] = load <16 x i32>, <16 x i32>* [[YY]], align 16 +// CHECK-NEXT: [[ADD:%.*]] = add <16 x i32> [[TMP3]], [[TMP4]] +// CHECK-NEXT: store <16 x i32> [[ADD]], <16 x i32>* [[SAVED_PRVALUE]], align 64 +// CHECK-NEXT: [[TMP5:%.*]] = bitcast <16 x i32>* [[SAVED_PRVALUE]] to <vscale x 16 x i1>* +// CHECK-NEXT: [[TMP6:%.*]] = load <vscale x 16 x i1>, <vscale x 16 x i1>* [[TMP5]], align 64 +// CHECK-NEXT: [[TMP7:%.*]] = call <vscale x 16 x i1> @llvm.aarch64.sve.and.z.nxv16i1(<vscale x 16 x i1> [[TMP0]], <vscale x 16 x i1> [[TMP2]], <vscale x 16 x i1> [[TMP6]]) +// CHECK-NEXT: store <vscale x 16 x i1> [[TMP7]], <vscale x 16 x i1>* [[PG]], align 2 +// CHECK-NEXT: [[TMP8:%.*]] = load <vscale x 16 x i1>, <vscale x 16 x i1>* [[PG]], align 2 +// CHECK-NEXT: [[TMP9:%.*]] = load <16 x i32>, <16 x i32>* @global_vec, align 16 +// CHECK-NEXT: [[CASTSCALABLESVE:%.*]] = call <vscale x 4 x i32> @llvm.experimental.vector.insert.nxv4i32.v16i32(<vscale x 4 x i32> undef, <16 x i32> [[TMP9]], i64 0) +// CHECK-NEXT: [[TMP10:%.*]] = load <vscale x 4 x i32>, <vscale x 4 x i32>* [[VEC_ADDR]], align 16 +// CHECK-NEXT: [[TMP11:%.*]] = call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> [[TMP8]]) +// CHECK-NEXT: [[TMP12:%.*]] = call <vscale x 4 x i32> @llvm.aarch64.sve.add.nxv4i32(<vscale x 4 x i1> [[TMP11]], <vscale x 4 x i32> [[CASTSCALABLESVE]], <vscale x 4 x i32> [[TMP10]]) +// CHECK-NEXT: [[CASTFIXEDSVE:%.*]] = call <16 x i32> @llvm.experimental.vector.extract.v16i32.nxv4i32(<vscale x 4 x i32> [[TMP12]], i64 0) +// CHECK-NEXT: store <16 x i32> [[CASTFIXEDSVE]], <16 x i32>* [[RETVAL]], align 16 +// CHECK-NEXT: [[TMP13:%.*]] = load <16 x i32>, <16 x i32>* [[RETVAL]], align 16 +// CHECK-NEXT: [[CASTSCALABLESVE1:%.*]] = call <vscale x 4 x i32> @llvm.experimental.vector.insert.nxv4i32.v16i32(<vscale x 4 x i32> undef, <16 x i32> [[TMP13]], i64 0) +// CHECK-NEXT: ret <vscale x 4 x i32> [[CASTSCALABLESVE1]] +// +fixed_int32_t test_cast(svbool_t pred, svint32_t vec) { + fixed_int32_t xx = {1, 2, 3, 4}; + fixed_int32_t yy = {2, 5, 4, 6}; + svbool_t pg = svand_z(pred, global_pred, xx + yy); + return svadd_m(pg, global_vec, vec); +} Index: clang/lib/CodeGen/CGExprScalar.cpp =================================================================== --- clang/lib/CodeGen/CGExprScalar.cpp +++ clang/lib/CodeGen/CGExprScalar.cpp @@ -2111,7 +2111,13 @@ return EmitLoadOfLValue(DestLV, CE->getExprLoc()); } - Address Addr = EmitLValue(E).getAddress(CGF); + Address Addr = Address::invalid(); + if (E->isPRValue() && !isa<CastExpr>(E)) { + Addr = CGF.CreateDefaultAlignTempAlloca(SrcTy, "saved-prvalue"); + LValue LV = CGF.MakeAddrLValue(Addr, E->getType()); + CGF.EmitStoreOfScalar(Src, LV); + } else + Addr = EmitLValue(E).getAddress(CGF); Addr = Builder.CreateElementBitCast(Addr, CGF.ConvertTypeForMem(DestTy)); LValue DestLV = CGF.MakeAddrLValue(Addr, DestTy); DestLV.setTBAAInfo(TBAAAccessInfo::getMayAliasInfo());
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits