diff --git a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp --- a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp @@ -275,6 +275,27 @@ } return Cost; } + case Intrinsic::bitreverse: { + static const CostTblEntry BitreverseTbl[] = { + {Intrinsic::bitreverse, MVT::i8, 2}, + {Intrinsic::bitreverse, MVT::i16, 2}, + {Intrinsic::bitreverse, MVT::i32, 1}, + {Intrinsic::bitreverse, MVT::i64, 1}, + {Intrinsic::bitreverse, MVT::v8i8, 1}, + {Intrinsic::bitreverse, MVT::v16i8, 1}, + {Intrinsic::bitreverse, MVT::v4i16, 2}, + {Intrinsic::bitreverse, MVT::v8i16, 2}, + {Intrinsic::bitreverse, MVT::v2i32, 2}, + {Intrinsic::bitreverse, MVT::v4i32, 2}, + {Intrinsic::bitreverse, MVT::v1i64, 2}, + {Intrinsic::bitreverse, MVT::v2i64, 2}, + }; + const auto *Entry = + CostTableLookup(BitreverseTbl, ICA.getID(), + (TLI->getTypeLegalizationCost(DL, RetTy)).second); + if (TLI->getValueType(DL, RetTy, true) != MVT::Other) + return (TLI->getTypeLegalizationCost(DL, RetTy)).first * Entry->Cost; + } default: break; } diff --git a/llvm/test/Analysis/CostModel/AArch64/bitreverse-cost-model.ll b/llvm/test/Analysis/CostModel/AArch64/bitreverse-cost-model.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Analysis/CostModel/AArch64/bitreverse-cost-model.ll @@ -0,0 +1,134 @@ +; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py +; RUN: opt -cost-model -analyze -cost-kind=code-size -mtriple=aarch64-none-eabi < %s | FileCheck %s --check-prefix=SIZE + +declare i8 @llvm.bitreverse.i8(i8) readnone + +define i8 @cost8(i8 %a) { +; SIZE-LABEL: 'cost8' +; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %b = call i8 @llvm.bitreverse.i8(i8 %a) +; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret i8 %b +; + %b = call i8 @llvm.bitreverse.i8(i8 %a) + ret i8 %b +} + +declare i16 @llvm.bitreverse.i16(i16) readnone + +define i16 @cost16(i16 %a) { +; SIZE-LABEL: 'cost16' +; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %b = call i16 @llvm.bitreverse.i16(i16 %a) +; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret i16 %b +; + %b = call i16 @llvm.bitreverse.i16(i16 %a) + ret i16 %b +} + +declare i32 @llvm.bitreverse.i32(i32) readnone + +define i32 @cost32(i32 %a) { +; SIZE-LABEL: 'cost32' +; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %b = call i32 @llvm.bitreverse.i32(i32 %a) +; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret i32 %b +; + %b = call i32 @llvm.bitreverse.i32(i32 %a) + ret i32 %b +} + +declare i64 @llvm.bitreverse.i64(i64) readnone + +define i64 @cost64(i64 %a) { +; SIZE-LABEL: 'cost64' +; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %b = call i64 @llvm.bitreverse.i64(i64 %a) +; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret i64 %b +; + %b = call i64 @llvm.bitreverse.i64(i64 %a) + ret i64 %b +} + +declare <8 x i8> @llvm.bitreverse.v8i8(<8 x i8>) readnone + +define <8 x i8> @cost8x8(<8 x i8> %a) { +; SIZE-LABEL: 'cost8x8' +; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %b = call <8 x i8> @llvm.bitreverse.v8i8(<8 x i8> %a) +; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret <8 x i8> %b +; + %b = call <8 x i8> @llvm.bitreverse.v8i8(<8 x i8> %a) + ret <8 x i8> %b +} + +declare <16 x i8> @llvm.bitreverse.v16i8(<16 x i8>) readnone + +define <16 x i8> @cost16x8(<16 x i8> %a) { +; SIZE-LABEL: 'cost16x8' +; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %b = call <16 x i8> @llvm.bitreverse.v16i8(<16 x i8> %a) +; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret <16 x i8> %b +; + %b = call <16 x i8> @llvm.bitreverse.v16i8(<16 x i8> %a) + ret <16 x i8> %b +} + +declare <4 x i16> @llvm.bitreverse.v4i16(<4 x i16>) readnone + +define <4 x i16> @cost4x16(<4 x i16> %a) { +; SIZE-LABEL: 'cost4x16' +; SIZE-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %b = call <4 x i16> @llvm.bitreverse.v4i16(<4 x i16> %a) +; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret <4 x i16> %b +; + %b = call <4 x i16> @llvm.bitreverse.v4i16(<4 x i16> %a) + ret <4 x i16> %b +} + +declare <8 x i16> @llvm.bitreverse.v8i16(<8 x i16>) readnone + +define <8 x i16> @cost8x16(<8 x i16> %a) { +; SIZE-LABEL: 'cost8x16' +; SIZE-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %b = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %a) +; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret <8 x i16> %b +; + %b = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %a) + ret <8 x i16> %b +} + +declare <2 x i32> @llvm.bitreverse.v2i32(<2 x i32>) readnone + +define <2 x i32> @cost2x32(<2 x i32> %a) { +; SIZE-LABEL: 'cost2x32' +; SIZE-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %b = call <2 x i32> @llvm.bitreverse.v2i32(<2 x i32> %a) +; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret <2 x i32> %b +; + %b = call <2 x i32> @llvm.bitreverse.v2i32(<2 x i32> %a) + ret <2 x i32> %b +} + +declare <4 x i32> @llvm.bitreverse.v4i32(<4 x i32>) readnone + +define <4 x i32> @cost4x32(<4 x i32> %a) { +; SIZE-LABEL: 'cost4x32' +; SIZE-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %b = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> %a) +; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret <4 x i32> %b +; + %b = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> %a) + ret <4 x i32> %b +} + +declare <1 x i64> @llvm.bitreverse.v1i64(<1 x i64>) readnone + +define <1 x i64> @cost1x64(<1 x i64> %a) { +; SIZE-LABEL: 'cost1x64' +; SIZE-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %b = call <1 x i64> @llvm.bitreverse.v1i64(<1 x i64> %a) +; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret <1 x i64> %b +; + %b = call <1 x i64> @llvm.bitreverse.v1i64(<1 x i64> %a) + ret <1 x i64> %b +} + +declare <2 x i64> @llvm.bitreverse.v2i64(<2 x i64>) readnone + +define <2 x i64> @cost2x64(<2 x i64> %a) { +; SIZE-LABEL: 'cost2x64' +; SIZE-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %b = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> %a) +; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret <2 x i64> %b +; + %b = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> %a) + ret <2 x i64> %b +} diff --git a/llvm/test/Analysis/CostModel/AArch64/bitreverse.ll b/llvm/test/Analysis/CostModel/AArch64/bitreverse.ll --- a/llvm/test/Analysis/CostModel/AArch64/bitreverse.ll +++ b/llvm/test/Analysis/CostModel/AArch64/bitreverse.ll @@ -94,7 +94,7 @@ define <8 x i16> @var_bitreverse_v8i16(<8 x i16> %a) { ; CHECK-LABEL: 'var_bitreverse_v8i16' -; CHECK-NEXT: Cost Model: Found an estimated cost of 50 for instruction: %bitreverse = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %a) +; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %bitreverse = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %a) ; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret <8 x i16> %bitreverse ; %bitreverse = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %a) @@ -103,7 +103,7 @@ define <16 x i16> @var_bitreverse_v16i16(<16 x i16> %a) { ; CHECK-LABEL: 'var_bitreverse_v16i16' -; CHECK-NEXT: Cost Model: Found an estimated cost of 100 for instruction: %bitreverse = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> %a) +; CHECK-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %bitreverse = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> %a) ; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret <16 x i16> %bitreverse ; %bitreverse = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> %a) @@ -121,7 +121,7 @@ define <32 x i8> @var_bitreverse_v32i8(<32 x i8> %a) { ; CHECK-LABEL: 'var_bitreverse_v32i8' -; CHECK-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %bitreverse = call <32 x i8> @llvm.bitreverse.v32i8(<32 x i8> %a) +; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %bitreverse = call <32 x i8> @llvm.bitreverse.v32i8(<32 x i8> %a) ; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret <32 x i8> %bitreverse ; %bitreverse = call <32 x i8> @llvm.bitreverse.v32i8(<32 x i8> %a)