[llvm] r344791 - [Hexagon] Remove support for V4
Krzysztof Parzyszek via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 19 10:31:12 PDT 2018
Author: kparzysz
Date: Fri Oct 19 10:31:11 2018
New Revision: 344791
URL: http://llvm.org/viewvc/llvm-project?rev=344791&view=rev
Log:
[Hexagon] Remove support for V4
Added:
llvm/trunk/lib/Target/Hexagon/HexagonInstrFormatsV5.td
llvm/trunk/lib/Target/Hexagon/HexagonScheduleV5.td
Removed:
llvm/trunk/lib/Target/Hexagon/HexagonInstrFormatsV4.td
llvm/trunk/lib/Target/Hexagon/HexagonIntrinsicsV3.td
llvm/trunk/lib/Target/Hexagon/HexagonIntrinsicsV4.td
llvm/trunk/lib/Target/Hexagon/HexagonScheduleV4.td
Modified:
llvm/trunk/lib/Target/Hexagon/CMakeLists.txt
llvm/trunk/lib/Target/Hexagon/Hexagon.td
llvm/trunk/lib/Target/Hexagon/HexagonCopyToCombine.cpp
llvm/trunk/lib/Target/Hexagon/HexagonDepArch.h
llvm/trunk/lib/Target/Hexagon/HexagonDepArch.td
llvm/trunk/lib/Target/Hexagon/HexagonDepInstrInfo.td
llvm/trunk/lib/Target/Hexagon/HexagonISelLowering.cpp
llvm/trunk/lib/Target/Hexagon/HexagonInstrFormats.td
llvm/trunk/lib/Target/Hexagon/HexagonIntrinsics.td
llvm/trunk/lib/Target/Hexagon/HexagonIntrinsicsV5.td
llvm/trunk/lib/Target/Hexagon/HexagonPatterns.td
llvm/trunk/lib/Target/Hexagon/HexagonRegisterInfo.cpp
llvm/trunk/lib/Target/Hexagon/HexagonSchedule.td
llvm/trunk/lib/Target/Hexagon/HexagonSubtarget.cpp
llvm/trunk/lib/Target/Hexagon/HexagonSubtarget.h
llvm/trunk/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp
llvm/trunk/lib/Target/Hexagon/HexagonVLIWPacketizer.h
llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonMCDuplexInfo.cpp
llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp
llvm/trunk/test/CodeGen/Hexagon/cfi-late.ll
llvm/trunk/test/CodeGen/Hexagon/double.ll
llvm/trunk/test/CodeGen/Hexagon/float.ll
llvm/trunk/test/CodeGen/Hexagon/floatconvert-ieee-rnd-near.ll
llvm/trunk/test/CodeGen/Hexagon/gp-plus-offset-load.ll
llvm/trunk/test/CodeGen/Hexagon/gp-plus-offset-store.ll
llvm/trunk/test/CodeGen/Hexagon/gp-rel.ll
llvm/trunk/test/CodeGen/Hexagon/hwloop-cleanup.ll
llvm/trunk/test/CodeGen/Hexagon/hwloop-const.ll
llvm/trunk/test/CodeGen/Hexagon/hwloop-dbg.ll
llvm/trunk/test/CodeGen/Hexagon/hwloop-le.ll
llvm/trunk/test/CodeGen/Hexagon/hwloop-ne.ll
llvm/trunk/test/CodeGen/Hexagon/i16_VarArg.ll
llvm/trunk/test/CodeGen/Hexagon/i1_VarArg.ll
llvm/trunk/test/CodeGen/Hexagon/i8_VarArg.ll
llvm/trunk/test/CodeGen/Hexagon/macint.ll
llvm/trunk/test/CodeGen/Hexagon/misaligned-access.ll
llvm/trunk/test/CodeGen/Hexagon/mpy.ll
llvm/trunk/test/CodeGen/Hexagon/newvaluejump.ll
llvm/trunk/test/CodeGen/Hexagon/packetize_cond_inst.ll
llvm/trunk/test/CodeGen/Hexagon/postinc-load.ll
llvm/trunk/test/CodeGen/Hexagon/postinc-store.ll
llvm/trunk/test/CodeGen/Hexagon/pred-gp.ll
llvm/trunk/test/CodeGen/Hexagon/pred-instrs.ll
llvm/trunk/test/CodeGen/Hexagon/predicate-copy.ll
llvm/trunk/test/CodeGen/Hexagon/remove_lsr.ll
llvm/trunk/test/CodeGen/Hexagon/simpletailcall.ll
llvm/trunk/test/CodeGen/Hexagon/union-1.ll
llvm/trunk/test/CodeGen/Hexagon/vaddh.ll
llvm/trunk/test/CodeGen/Hexagon/validate-offset.ll
llvm/trunk/test/MC/Hexagon/elf-flags.s
Modified: llvm/trunk/lib/Target/Hexagon/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/CMakeLists.txt?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/CMakeLists.txt (original)
+++ llvm/trunk/lib/Target/Hexagon/CMakeLists.txt Fri Oct 19 10:31:11 2018
@@ -73,4 +73,3 @@ add_subdirectory(AsmParser)
add_subdirectory(Disassembler)
add_subdirectory(MCTargetDesc)
add_subdirectory(TargetInfo)
-
Modified: llvm/trunk/lib/Target/Hexagon/Hexagon.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/Hexagon.td?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/Hexagon.td (original)
+++ llvm/trunk/lib/Target/Hexagon/Hexagon.td Fri Oct 19 10:31:11 2018
@@ -323,31 +323,27 @@ class Proc<string Name, SchedMachineMode
: ProcessorModel<Name, Model, Features>;
def : Proc<"generic", HexagonModelV60,
- [ArchV4, ArchV5, ArchV55, ArchV60,
+ [ArchV5, ArchV55, ArchV60,
FeatureDuplex, FeatureMemops, FeatureNVJ, FeatureNVS,
FeaturePackets, FeatureSmallData]>;
-def : Proc<"hexagonv4", HexagonModelV4,
- [ArchV4,
- FeatureDuplex, FeatureMemops, FeatureNVJ, FeatureNVS,
- FeaturePackets, FeatureSmallData]>;
-def : Proc<"hexagonv5", HexagonModelV4,
- [ArchV4, ArchV5,
+def : Proc<"hexagonv5", HexagonModelV5,
+ [ArchV5,
FeatureDuplex, FeatureMemops, FeatureNVJ, FeatureNVS,
FeaturePackets, FeatureSmallData]>;
def : Proc<"hexagonv55", HexagonModelV55,
- [ArchV4, ArchV5, ArchV55,
+ [ArchV5, ArchV55,
FeatureDuplex, FeatureMemops, FeatureNVJ, FeatureNVS,
FeaturePackets, FeatureSmallData]>;
def : Proc<"hexagonv60", HexagonModelV60,
- [ArchV4, ArchV5, ArchV55, ArchV60,
+ [ArchV5, ArchV55, ArchV60,
FeatureDuplex, FeatureMemops, FeatureNVJ, FeatureNVS,
FeaturePackets, FeatureSmallData]>;
def : Proc<"hexagonv62", HexagonModelV62,
- [ArchV4, ArchV5, ArchV55, ArchV60, ArchV62,
+ [ArchV5, ArchV55, ArchV60, ArchV62,
FeatureDuplex, FeatureMemops, FeatureNVJ, FeatureNVS,
FeaturePackets, FeatureSmallData]>;
def : Proc<"hexagonv65", HexagonModelV65,
- [ArchV4, ArchV5, ArchV55, ArchV60, ArchV62, ArchV65,
+ [ArchV5, ArchV55, ArchV60, ArchV62, ArchV65,
FeatureDuplex, FeatureMemNoShuf, FeatureMemops, FeatureNVJ,
FeatureNVS, FeaturePackets, FeatureSmallData]>;
Modified: llvm/trunk/lib/Target/Hexagon/HexagonCopyToCombine.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonCopyToCombine.cpp?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonCopyToCombine.cpp (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonCopyToCombine.cpp Fri Oct 19 10:31:11 2018
@@ -555,8 +555,7 @@ MachineInstr *HexagonCopyToCombine::find
if ((!IsI1LowReg && !IsI2LowReg) || !isEvenReg(FirstRegIndex))
continue;
- // Check that the two instructions are combinable. V4 allows more
- // instructions to be merged into a combine.
+ // Check that the two instructions are combinable.
// The order matters because in a A2_tfrsi we might can encode a int8 as
// the hi reg operand but only a uint6 as the low reg operand.
if ((IsI2LowReg && !areCombinableOperations(TRI, I1, *I2, AllowC64)) ||
Modified: llvm/trunk/lib/Target/Hexagon/HexagonDepArch.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonDepArch.h?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonDepArch.h (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonDepArch.h Fri Oct 19 10:31:11 2018
@@ -15,7 +15,7 @@
#define HEXAGON_DEP_ARCH_H
namespace llvm {
namespace Hexagon {
-enum class ArchEnum { V4,V5,V55,V60,V62,V65 };
+enum class ArchEnum { NoArch,Generic,V5,V55,V60,V62,V65 };
} // namespace Hexagon
} // namespace llvm;
#endif // HEXAGON_DEP_ARCH_H
Modified: llvm/trunk/lib/Target/Hexagon/HexagonDepArch.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonDepArch.td?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonDepArch.td (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonDepArch.td Fri Oct 19 10:31:11 2018
@@ -18,7 +18,4 @@ def ArchV60: SubtargetFeature<"v60", "He
def HasV60 : Predicate<"HST->hasV60Ops()">, AssemblerPredicate<"ArchV60">;
def ArchV55: SubtargetFeature<"v55", "HexagonArchVersion", "Hexagon::ArchEnum::V55", "Enable Hexagon V55 architecture">;
def HasV55 : Predicate<"HST->hasV55Ops()">, AssemblerPredicate<"ArchV55">;
-def ArchV4: SubtargetFeature<"v4", "HexagonArchVersion", "Hexagon::ArchEnum::V4", "Enable Hexagon V4 architecture">;
-def HasV4 : Predicate<"HST->hasV4Ops()">, AssemblerPredicate<"ArchV4">;
def ArchV5: SubtargetFeature<"v5", "HexagonArchVersion", "Hexagon::ArchEnum::V5", "Enable Hexagon V5 architecture">;
-def HasV5 : Predicate<"HST->hasV5Ops()">, AssemblerPredicate<"ArchV5">;
Modified: llvm/trunk/lib/Target/Hexagon/HexagonDepInstrInfo.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonDepInstrInfo.td?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonDepInstrInfo.td (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonDepInstrInfo.td Fri Oct 19 10:31:11 2018
@@ -991,7 +991,7 @@ def A2_roundsat : HInst<
(outs IntRegs:$Rd32),
(ins DoubleRegs:$Rss32),
"$Rd32 = round($Rss32):sat",
-tc_c2f7d806, TypeS_2op>, Enc_90cd8b, Requires<[HasV5]> {
+tc_c2f7d806, TypeS_2op>, Enc_90cd8b {
let Inst{13-5} = 0b000000001;
let Inst{31-21} = 0b10001000110;
let hasNewValue = 1;
@@ -3314,7 +3314,7 @@ def A5_vaddhubs : HInst<
(outs IntRegs:$Rd32),
(ins DoubleRegs:$Rss32, DoubleRegs:$Rtt32),
"$Rd32 = vaddhub($Rss32,$Rtt32):sat",
-tc_2b6f77c6, TypeS_3op>, Enc_d2216a, Requires<[HasV5]> {
+tc_2b6f77c6, TypeS_3op>, Enc_d2216a {
let Inst{7-5} = 0b001;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11000001010;
@@ -4059,7 +4059,7 @@ def F2_conv_d2df : HInst<
(outs DoubleRegs:$Rdd32),
(ins DoubleRegs:$Rss32),
"$Rdd32 = convert_d2df($Rss32)",
-tc_f3eaa14b, TypeS_2op>, Enc_b9c5fb, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_b9c5fb {
let Inst{13-5} = 0b000000011;
let Inst{31-21} = 0b10000000111;
let isFP = 1;
@@ -4069,7 +4069,7 @@ def F2_conv_d2sf : HInst<
(outs IntRegs:$Rd32),
(ins DoubleRegs:$Rss32),
"$Rd32 = convert_d2sf($Rss32)",
-tc_f3eaa14b, TypeS_2op>, Enc_90cd8b, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_90cd8b {
let Inst{13-5} = 0b000000001;
let Inst{31-21} = 0b10001000010;
let hasNewValue = 1;
@@ -4081,7 +4081,7 @@ def F2_conv_df2d : HInst<
(outs DoubleRegs:$Rdd32),
(ins DoubleRegs:$Rss32),
"$Rdd32 = convert_df2d($Rss32)",
-tc_f3eaa14b, TypeS_2op>, Enc_b9c5fb, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_b9c5fb {
let Inst{13-5} = 0b000000000;
let Inst{31-21} = 0b10000000111;
let isFP = 1;
@@ -4091,7 +4091,7 @@ def F2_conv_df2d_chop : HInst<
(outs DoubleRegs:$Rdd32),
(ins DoubleRegs:$Rss32),
"$Rdd32 = convert_df2d($Rss32):chop",
-tc_f3eaa14b, TypeS_2op>, Enc_b9c5fb, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_b9c5fb {
let Inst{13-5} = 0b000000110;
let Inst{31-21} = 0b10000000111;
let isFP = 1;
@@ -4101,7 +4101,7 @@ def F2_conv_df2sf : HInst<
(outs IntRegs:$Rd32),
(ins DoubleRegs:$Rss32),
"$Rd32 = convert_df2sf($Rss32)",
-tc_f3eaa14b, TypeS_2op>, Enc_90cd8b, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_90cd8b {
let Inst{13-5} = 0b000000001;
let Inst{31-21} = 0b10001000000;
let hasNewValue = 1;
@@ -4113,7 +4113,7 @@ def F2_conv_df2ud : HInst<
(outs DoubleRegs:$Rdd32),
(ins DoubleRegs:$Rss32),
"$Rdd32 = convert_df2ud($Rss32)",
-tc_f3eaa14b, TypeS_2op>, Enc_b9c5fb, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_b9c5fb {
let Inst{13-5} = 0b000000001;
let Inst{31-21} = 0b10000000111;
let isFP = 1;
@@ -4123,7 +4123,7 @@ def F2_conv_df2ud_chop : HInst<
(outs DoubleRegs:$Rdd32),
(ins DoubleRegs:$Rss32),
"$Rdd32 = convert_df2ud($Rss32):chop",
-tc_f3eaa14b, TypeS_2op>, Enc_b9c5fb, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_b9c5fb {
let Inst{13-5} = 0b000000111;
let Inst{31-21} = 0b10000000111;
let isFP = 1;
@@ -4133,7 +4133,7 @@ def F2_conv_df2uw : HInst<
(outs IntRegs:$Rd32),
(ins DoubleRegs:$Rss32),
"$Rd32 = convert_df2uw($Rss32)",
-tc_f3eaa14b, TypeS_2op>, Enc_90cd8b, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_90cd8b {
let Inst{13-5} = 0b000000001;
let Inst{31-21} = 0b10001000011;
let hasNewValue = 1;
@@ -4145,7 +4145,7 @@ def F2_conv_df2uw_chop : HInst<
(outs IntRegs:$Rd32),
(ins DoubleRegs:$Rss32),
"$Rd32 = convert_df2uw($Rss32):chop",
-tc_f3eaa14b, TypeS_2op>, Enc_90cd8b, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_90cd8b {
let Inst{13-5} = 0b000000001;
let Inst{31-21} = 0b10001000101;
let hasNewValue = 1;
@@ -4157,7 +4157,7 @@ def F2_conv_df2w : HInst<
(outs IntRegs:$Rd32),
(ins DoubleRegs:$Rss32),
"$Rd32 = convert_df2w($Rss32)",
-tc_f3eaa14b, TypeS_2op>, Enc_90cd8b, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_90cd8b {
let Inst{13-5} = 0b000000001;
let Inst{31-21} = 0b10001000100;
let hasNewValue = 1;
@@ -4169,7 +4169,7 @@ def F2_conv_df2w_chop : HInst<
(outs IntRegs:$Rd32),
(ins DoubleRegs:$Rss32),
"$Rd32 = convert_df2w($Rss32):chop",
-tc_f3eaa14b, TypeS_2op>, Enc_90cd8b, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_90cd8b {
let Inst{13-5} = 0b000000001;
let Inst{31-21} = 0b10001000111;
let hasNewValue = 1;
@@ -4181,7 +4181,7 @@ def F2_conv_sf2d : HInst<
(outs DoubleRegs:$Rdd32),
(ins IntRegs:$Rs32),
"$Rdd32 = convert_sf2d($Rs32)",
-tc_f3eaa14b, TypeS_2op>, Enc_3a3d62, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_3a3d62 {
let Inst{13-5} = 0b000000100;
let Inst{31-21} = 0b10000100100;
let isFP = 1;
@@ -4191,7 +4191,7 @@ def F2_conv_sf2d_chop : HInst<
(outs DoubleRegs:$Rdd32),
(ins IntRegs:$Rs32),
"$Rdd32 = convert_sf2d($Rs32):chop",
-tc_f3eaa14b, TypeS_2op>, Enc_3a3d62, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_3a3d62 {
let Inst{13-5} = 0b000000110;
let Inst{31-21} = 0b10000100100;
let isFP = 1;
@@ -4201,7 +4201,7 @@ def F2_conv_sf2df : HInst<
(outs DoubleRegs:$Rdd32),
(ins IntRegs:$Rs32),
"$Rdd32 = convert_sf2df($Rs32)",
-tc_f3eaa14b, TypeS_2op>, Enc_3a3d62, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_3a3d62 {
let Inst{13-5} = 0b000000000;
let Inst{31-21} = 0b10000100100;
let isFP = 1;
@@ -4211,7 +4211,7 @@ def F2_conv_sf2ud : HInst<
(outs DoubleRegs:$Rdd32),
(ins IntRegs:$Rs32),
"$Rdd32 = convert_sf2ud($Rs32)",
-tc_f3eaa14b, TypeS_2op>, Enc_3a3d62, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_3a3d62 {
let Inst{13-5} = 0b000000011;
let Inst{31-21} = 0b10000100100;
let isFP = 1;
@@ -4221,7 +4221,7 @@ def F2_conv_sf2ud_chop : HInst<
(outs DoubleRegs:$Rdd32),
(ins IntRegs:$Rs32),
"$Rdd32 = convert_sf2ud($Rs32):chop",
-tc_f3eaa14b, TypeS_2op>, Enc_3a3d62, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_3a3d62 {
let Inst{13-5} = 0b000000101;
let Inst{31-21} = 0b10000100100;
let isFP = 1;
@@ -4231,7 +4231,7 @@ def F2_conv_sf2uw : HInst<
(outs IntRegs:$Rd32),
(ins IntRegs:$Rs32),
"$Rd32 = convert_sf2uw($Rs32)",
-tc_f3eaa14b, TypeS_2op>, Enc_5e2823, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_5e2823 {
let Inst{13-5} = 0b000000000;
let Inst{31-21} = 0b10001011011;
let hasNewValue = 1;
@@ -4243,7 +4243,7 @@ def F2_conv_sf2uw_chop : HInst<
(outs IntRegs:$Rd32),
(ins IntRegs:$Rs32),
"$Rd32 = convert_sf2uw($Rs32):chop",
-tc_f3eaa14b, TypeS_2op>, Enc_5e2823, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_5e2823 {
let Inst{13-5} = 0b000000001;
let Inst{31-21} = 0b10001011011;
let hasNewValue = 1;
@@ -4255,7 +4255,7 @@ def F2_conv_sf2w : HInst<
(outs IntRegs:$Rd32),
(ins IntRegs:$Rs32),
"$Rd32 = convert_sf2w($Rs32)",
-tc_f3eaa14b, TypeS_2op>, Enc_5e2823, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_5e2823 {
let Inst{13-5} = 0b000000000;
let Inst{31-21} = 0b10001011100;
let hasNewValue = 1;
@@ -4267,7 +4267,7 @@ def F2_conv_sf2w_chop : HInst<
(outs IntRegs:$Rd32),
(ins IntRegs:$Rs32),
"$Rd32 = convert_sf2w($Rs32):chop",
-tc_f3eaa14b, TypeS_2op>, Enc_5e2823, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_5e2823 {
let Inst{13-5} = 0b000000001;
let Inst{31-21} = 0b10001011100;
let hasNewValue = 1;
@@ -4279,7 +4279,7 @@ def F2_conv_ud2df : HInst<
(outs DoubleRegs:$Rdd32),
(ins DoubleRegs:$Rss32),
"$Rdd32 = convert_ud2df($Rss32)",
-tc_f3eaa14b, TypeS_2op>, Enc_b9c5fb, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_b9c5fb {
let Inst{13-5} = 0b000000010;
let Inst{31-21} = 0b10000000111;
let isFP = 1;
@@ -4289,7 +4289,7 @@ def F2_conv_ud2sf : HInst<
(outs IntRegs:$Rd32),
(ins DoubleRegs:$Rss32),
"$Rd32 = convert_ud2sf($Rss32)",
-tc_f3eaa14b, TypeS_2op>, Enc_90cd8b, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_90cd8b {
let Inst{13-5} = 0b000000001;
let Inst{31-21} = 0b10001000001;
let hasNewValue = 1;
@@ -4301,7 +4301,7 @@ def F2_conv_uw2df : HInst<
(outs DoubleRegs:$Rdd32),
(ins IntRegs:$Rs32),
"$Rdd32 = convert_uw2df($Rs32)",
-tc_f3eaa14b, TypeS_2op>, Enc_3a3d62, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_3a3d62 {
let Inst{13-5} = 0b000000001;
let Inst{31-21} = 0b10000100100;
let isFP = 1;
@@ -4311,7 +4311,7 @@ def F2_conv_uw2sf : HInst<
(outs IntRegs:$Rd32),
(ins IntRegs:$Rs32),
"$Rd32 = convert_uw2sf($Rs32)",
-tc_f3eaa14b, TypeS_2op>, Enc_5e2823, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_5e2823 {
let Inst{13-5} = 0b000000000;
let Inst{31-21} = 0b10001011001;
let hasNewValue = 1;
@@ -4323,7 +4323,7 @@ def F2_conv_w2df : HInst<
(outs DoubleRegs:$Rdd32),
(ins IntRegs:$Rs32),
"$Rdd32 = convert_w2df($Rs32)",
-tc_f3eaa14b, TypeS_2op>, Enc_3a3d62, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_3a3d62 {
let Inst{13-5} = 0b000000010;
let Inst{31-21} = 0b10000100100;
let isFP = 1;
@@ -4333,7 +4333,7 @@ def F2_conv_w2sf : HInst<
(outs IntRegs:$Rd32),
(ins IntRegs:$Rs32),
"$Rd32 = convert_w2sf($Rs32)",
-tc_f3eaa14b, TypeS_2op>, Enc_5e2823, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_5e2823 {
let Inst{13-5} = 0b000000000;
let Inst{31-21} = 0b10001011010;
let hasNewValue = 1;
@@ -4345,7 +4345,7 @@ def F2_dfclass : HInst<
(outs PredRegs:$Pd4),
(ins DoubleRegs:$Rss32, u5_0Imm:$Ii),
"$Pd4 = dfclass($Rss32,#$Ii)",
-tc_7a830544, TypeALU64>, Enc_1f19b5, Requires<[HasV5]> {
+tc_7a830544, TypeALU64>, Enc_1f19b5 {
let Inst{4-2} = 0b100;
let Inst{13-10} = 0b0000;
let Inst{31-21} = 0b11011100100;
@@ -4356,7 +4356,7 @@ def F2_dfcmpeq : HInst<
(outs PredRegs:$Pd4),
(ins DoubleRegs:$Rss32, DoubleRegs:$Rtt32),
"$Pd4 = dfcmp.eq($Rss32,$Rtt32)",
-tc_1e856f58, TypeALU64>, Enc_fcf7a7, Requires<[HasV5]> {
+tc_1e856f58, TypeALU64>, Enc_fcf7a7 {
let Inst{7-2} = 0b000000;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11010010111;
@@ -4368,7 +4368,7 @@ def F2_dfcmpge : HInst<
(outs PredRegs:$Pd4),
(ins DoubleRegs:$Rss32, DoubleRegs:$Rtt32),
"$Pd4 = dfcmp.ge($Rss32,$Rtt32)",
-tc_1e856f58, TypeALU64>, Enc_fcf7a7, Requires<[HasV5]> {
+tc_1e856f58, TypeALU64>, Enc_fcf7a7 {
let Inst{7-2} = 0b010000;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11010010111;
@@ -4380,7 +4380,7 @@ def F2_dfcmpgt : HInst<
(outs PredRegs:$Pd4),
(ins DoubleRegs:$Rss32, DoubleRegs:$Rtt32),
"$Pd4 = dfcmp.gt($Rss32,$Rtt32)",
-tc_1e856f58, TypeALU64>, Enc_fcf7a7, Requires<[HasV5]> {
+tc_1e856f58, TypeALU64>, Enc_fcf7a7 {
let Inst{7-2} = 0b001000;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11010010111;
@@ -4392,7 +4392,7 @@ def F2_dfcmpuo : HInst<
(outs PredRegs:$Pd4),
(ins DoubleRegs:$Rss32, DoubleRegs:$Rtt32),
"$Pd4 = dfcmp.uo($Rss32,$Rtt32)",
-tc_1e856f58, TypeALU64>, Enc_fcf7a7, Requires<[HasV5]> {
+tc_1e856f58, TypeALU64>, Enc_fcf7a7 {
let Inst{7-2} = 0b011000;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11010010111;
@@ -4404,7 +4404,7 @@ def F2_dfimm_n : HInst<
(outs DoubleRegs:$Rdd32),
(ins u10_0Imm:$Ii),
"$Rdd32 = dfmake(#$Ii):neg",
-tc_234a11a5, TypeALU64>, Enc_e6c957, Requires<[HasV5]> {
+tc_234a11a5, TypeALU64>, Enc_e6c957 {
let Inst{20-16} = 0b00000;
let Inst{31-22} = 0b1101100101;
let prefersSlot3 = 1;
@@ -4413,7 +4413,7 @@ def F2_dfimm_p : HInst<
(outs DoubleRegs:$Rdd32),
(ins u10_0Imm:$Ii),
"$Rdd32 = dfmake(#$Ii):pos",
-tc_234a11a5, TypeALU64>, Enc_e6c957, Requires<[HasV5]> {
+tc_234a11a5, TypeALU64>, Enc_e6c957 {
let Inst{20-16} = 0b00000;
let Inst{31-22} = 0b1101100100;
let prefersSlot3 = 1;
@@ -4422,7 +4422,7 @@ def F2_sfadd : HInst<
(outs IntRegs:$Rd32),
(ins IntRegs:$Rs32, IntRegs:$Rt32),
"$Rd32 = sfadd($Rs32,$Rt32)",
-tc_6792d5ff, TypeM>, Enc_5ab2be, Requires<[HasV5]> {
+tc_6792d5ff, TypeM>, Enc_5ab2be {
let Inst{7-5} = 0b000;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11101011000;
@@ -4436,7 +4436,7 @@ def F2_sfclass : HInst<
(outs PredRegs:$Pd4),
(ins IntRegs:$Rs32, u5_0Imm:$Ii),
"$Pd4 = sfclass($Rs32,#$Ii)",
-tc_7a830544, TypeS_2op>, Enc_83ee64, Requires<[HasV5]> {
+tc_7a830544, TypeS_2op>, Enc_83ee64 {
let Inst{7-2} = 0b000000;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b10000101111;
@@ -4447,7 +4447,7 @@ def F2_sfcmpeq : HInst<
(outs PredRegs:$Pd4),
(ins IntRegs:$Rs32, IntRegs:$Rt32),
"$Pd4 = sfcmp.eq($Rs32,$Rt32)",
-tc_1e856f58, TypeS_3op>, Enc_c2b48e, Requires<[HasV5]> {
+tc_1e856f58, TypeS_3op>, Enc_c2b48e {
let Inst{7-2} = 0b011000;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11000111111;
@@ -4459,7 +4459,7 @@ def F2_sfcmpge : HInst<
(outs PredRegs:$Pd4),
(ins IntRegs:$Rs32, IntRegs:$Rt32),
"$Pd4 = sfcmp.ge($Rs32,$Rt32)",
-tc_1e856f58, TypeS_3op>, Enc_c2b48e, Requires<[HasV5]> {
+tc_1e856f58, TypeS_3op>, Enc_c2b48e {
let Inst{7-2} = 0b000000;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11000111111;
@@ -4471,7 +4471,7 @@ def F2_sfcmpgt : HInst<
(outs PredRegs:$Pd4),
(ins IntRegs:$Rs32, IntRegs:$Rt32),
"$Pd4 = sfcmp.gt($Rs32,$Rt32)",
-tc_1e856f58, TypeS_3op>, Enc_c2b48e, Requires<[HasV5]> {
+tc_1e856f58, TypeS_3op>, Enc_c2b48e {
let Inst{7-2} = 0b100000;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11000111111;
@@ -4483,7 +4483,7 @@ def F2_sfcmpuo : HInst<
(outs PredRegs:$Pd4),
(ins IntRegs:$Rs32, IntRegs:$Rt32),
"$Pd4 = sfcmp.uo($Rs32,$Rt32)",
-tc_1e856f58, TypeS_3op>, Enc_c2b48e, Requires<[HasV5]> {
+tc_1e856f58, TypeS_3op>, Enc_c2b48e {
let Inst{7-2} = 0b001000;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11000111111;
@@ -4495,7 +4495,7 @@ def F2_sffixupd : HInst<
(outs IntRegs:$Rd32),
(ins IntRegs:$Rs32, IntRegs:$Rt32),
"$Rd32 = sffixupd($Rs32,$Rt32)",
-tc_6792d5ff, TypeM>, Enc_5ab2be, Requires<[HasV5]> {
+tc_6792d5ff, TypeM>, Enc_5ab2be {
let Inst{7-5} = 0b001;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11101011110;
@@ -4507,7 +4507,7 @@ def F2_sffixupn : HInst<
(outs IntRegs:$Rd32),
(ins IntRegs:$Rs32, IntRegs:$Rt32),
"$Rd32 = sffixupn($Rs32,$Rt32)",
-tc_6792d5ff, TypeM>, Enc_5ab2be, Requires<[HasV5]> {
+tc_6792d5ff, TypeM>, Enc_5ab2be {
let Inst{7-5} = 0b000;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11101011110;
@@ -4519,7 +4519,7 @@ def F2_sffixupr : HInst<
(outs IntRegs:$Rd32),
(ins IntRegs:$Rs32),
"$Rd32 = sffixupr($Rs32)",
-tc_f3eaa14b, TypeS_2op>, Enc_5e2823, Requires<[HasV5]> {
+tc_f3eaa14b, TypeS_2op>, Enc_5e2823 {
let Inst{13-5} = 0b000000000;
let Inst{31-21} = 0b10001011101;
let hasNewValue = 1;
@@ -4530,7 +4530,7 @@ def F2_sffma : HInst<
(outs IntRegs:$Rx32),
(ins IntRegs:$Rx32in, IntRegs:$Rs32, IntRegs:$Rt32),
"$Rx32 += sfmpy($Rs32,$Rt32)",
-tc_d580173f, TypeM>, Enc_2ae154, Requires<[HasV5]> {
+tc_d580173f, TypeM>, Enc_2ae154 {
let Inst{7-5} = 0b100;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11101111000;
@@ -4544,7 +4544,7 @@ def F2_sffma_lib : HInst<
(outs IntRegs:$Rx32),
(ins IntRegs:$Rx32in, IntRegs:$Rs32, IntRegs:$Rt32),
"$Rx32 += sfmpy($Rs32,$Rt32):lib",
-tc_d580173f, TypeM>, Enc_2ae154, Requires<[HasV5]> {
+tc_d580173f, TypeM>, Enc_2ae154 {
let Inst{7-5} = 0b110;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11101111000;
@@ -4558,7 +4558,7 @@ def F2_sffma_sc : HInst<
(outs IntRegs:$Rx32),
(ins IntRegs:$Rx32in, IntRegs:$Rs32, IntRegs:$Rt32, PredRegs:$Pu4),
"$Rx32 += sfmpy($Rs32,$Rt32,$Pu4):scale",
-tc_038a1342, TypeM>, Enc_437f33, Requires<[HasV5]> {
+tc_038a1342, TypeM>, Enc_437f33 {
let Inst{7-7} = 0b1;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11101111011;
@@ -4572,7 +4572,7 @@ def F2_sffms : HInst<
(outs IntRegs:$Rx32),
(ins IntRegs:$Rx32in, IntRegs:$Rs32, IntRegs:$Rt32),
"$Rx32 -= sfmpy($Rs32,$Rt32)",
-tc_d580173f, TypeM>, Enc_2ae154, Requires<[HasV5]> {
+tc_d580173f, TypeM>, Enc_2ae154 {
let Inst{7-5} = 0b101;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11101111000;
@@ -4586,7 +4586,7 @@ def F2_sffms_lib : HInst<
(outs IntRegs:$Rx32),
(ins IntRegs:$Rx32in, IntRegs:$Rs32, IntRegs:$Rt32),
"$Rx32 -= sfmpy($Rs32,$Rt32):lib",
-tc_d580173f, TypeM>, Enc_2ae154, Requires<[HasV5]> {
+tc_d580173f, TypeM>, Enc_2ae154 {
let Inst{7-5} = 0b111;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11101111000;
@@ -4600,7 +4600,7 @@ def F2_sfimm_n : HInst<
(outs IntRegs:$Rd32),
(ins u10_0Imm:$Ii),
"$Rd32 = sfmake(#$Ii):neg",
-tc_234a11a5, TypeALU64>, Enc_6c9440, Requires<[HasV5]> {
+tc_234a11a5, TypeALU64>, Enc_6c9440 {
let Inst{20-16} = 0b00000;
let Inst{31-22} = 0b1101011001;
let hasNewValue = 1;
@@ -4611,7 +4611,7 @@ def F2_sfimm_p : HInst<
(outs IntRegs:$Rd32),
(ins u10_0Imm:$Ii),
"$Rd32 = sfmake(#$Ii):pos",
-tc_234a11a5, TypeALU64>, Enc_6c9440, Requires<[HasV5]> {
+tc_234a11a5, TypeALU64>, Enc_6c9440 {
let Inst{20-16} = 0b00000;
let Inst{31-22} = 0b1101011000;
let hasNewValue = 1;
@@ -4622,7 +4622,7 @@ def F2_sfinvsqrta : HInst<
(outs IntRegs:$Rd32, PredRegs:$Pe4),
(ins IntRegs:$Rs32),
"$Rd32,$Pe4 = sfinvsqrta($Rs32)",
-tc_4d99bca9, TypeS_2op>, Enc_890909, Requires<[HasV5]> {
+tc_4d99bca9, TypeS_2op>, Enc_890909 {
let Inst{13-7} = 0b0000000;
let Inst{31-21} = 0b10001011111;
let hasNewValue = 1;
@@ -4634,7 +4634,7 @@ def F2_sfmax : HInst<
(outs IntRegs:$Rd32),
(ins IntRegs:$Rs32, IntRegs:$Rt32),
"$Rd32 = sfmax($Rs32,$Rt32)",
-tc_976ddc4f, TypeM>, Enc_5ab2be, Requires<[HasV5]> {
+tc_976ddc4f, TypeM>, Enc_5ab2be {
let Inst{7-5} = 0b000;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11101011100;
@@ -4648,7 +4648,7 @@ def F2_sfmin : HInst<
(outs IntRegs:$Rd32),
(ins IntRegs:$Rs32, IntRegs:$Rt32),
"$Rd32 = sfmin($Rs32,$Rt32)",
-tc_976ddc4f, TypeM>, Enc_5ab2be, Requires<[HasV5]> {
+tc_976ddc4f, TypeM>, Enc_5ab2be {
let Inst{7-5} = 0b001;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11101011100;
@@ -4662,7 +4662,7 @@ def F2_sfmpy : HInst<
(outs IntRegs:$Rd32),
(ins IntRegs:$Rs32, IntRegs:$Rt32),
"$Rd32 = sfmpy($Rs32,$Rt32)",
-tc_6792d5ff, TypeM>, Enc_5ab2be, Requires<[HasV5]> {
+tc_6792d5ff, TypeM>, Enc_5ab2be {
let Inst{7-5} = 0b000;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11101011010;
@@ -4676,7 +4676,7 @@ def F2_sfrecipa : HInst<
(outs IntRegs:$Rd32, PredRegs:$Pe4),
(ins IntRegs:$Rs32, IntRegs:$Rt32),
"$Rd32,$Pe4 = sfrecipa($Rs32,$Rt32)",
-tc_9c00ce8d, TypeM>, Enc_a94f3b, Requires<[HasV5]> {
+tc_9c00ce8d, TypeM>, Enc_a94f3b {
let Inst{7-7} = 0b1;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11101011111;
@@ -4689,7 +4689,7 @@ def F2_sfsub : HInst<
(outs IntRegs:$Rd32),
(ins IntRegs:$Rs32, IntRegs:$Rt32),
"$Rd32 = sfsub($Rs32,$Rt32)",
-tc_6792d5ff, TypeM>, Enc_5ab2be, Requires<[HasV5]> {
+tc_6792d5ff, TypeM>, Enc_5ab2be {
let Inst{7-5} = 0b001;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11101011000;
@@ -16981,7 +16981,7 @@ def M4_cmpyi_whc : HInst<
(outs IntRegs:$Rd32),
(ins DoubleRegs:$Rss32, IntRegs:$Rt32),
"$Rd32 = cmpyiwh($Rss32,$Rt32*):<<1:rnd:sat",
-tc_8fd5f294, TypeS_3op>, Enc_3d5b28, Requires<[HasV5]> {
+tc_8fd5f294, TypeS_3op>, Enc_3d5b28 {
let Inst{7-5} = 0b101;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11000101000;
@@ -17007,7 +17007,7 @@ def M4_cmpyr_whc : HInst<
(outs IntRegs:$Rd32),
(ins DoubleRegs:$Rss32, IntRegs:$Rt32),
"$Rd32 = cmpyrwh($Rss32,$Rt32*):<<1:rnd:sat",
-tc_8fd5f294, TypeS_3op>, Enc_3d5b28, Requires<[HasV5]> {
+tc_8fd5f294, TypeS_3op>, Enc_3d5b28 {
let Inst{7-5} = 0b111;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11000101000;
@@ -17360,7 +17360,7 @@ def M5_vdmacbsu : HInst<
(outs DoubleRegs:$Rxx32),
(ins DoubleRegs:$Rxx32in, DoubleRegs:$Rss32, DoubleRegs:$Rtt32),
"$Rxx32 += vdmpybsu($Rss32,$Rtt32):sat",
-tc_e913dc32, TypeM>, Enc_88c16c, Requires<[HasV5]> {
+tc_e913dc32, TypeM>, Enc_88c16c {
let Inst{7-5} = 0b001;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11101010001;
@@ -17372,7 +17372,7 @@ def M5_vdmpybsu : HInst<
(outs DoubleRegs:$Rdd32),
(ins DoubleRegs:$Rss32, DoubleRegs:$Rtt32),
"$Rdd32 = vdmpybsu($Rss32,$Rtt32):sat",
-tc_8fd5f294, TypeM>, Enc_a56825, Requires<[HasV5]> {
+tc_8fd5f294, TypeM>, Enc_a56825 {
let Inst{7-5} = 0b001;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b11101000101;
@@ -18207,7 +18207,7 @@ def S2_asr_i_p_rnd : HInst<
(outs DoubleRegs:$Rdd32),
(ins DoubleRegs:$Rss32, u6_0Imm:$Ii),
"$Rdd32 = asr($Rss32,#$Ii):rnd",
-tc_2b6f77c6, TypeS_2op>, Enc_5eac98, Requires<[HasV5]> {
+tc_2b6f77c6, TypeS_2op>, Enc_5eac98 {
let Inst{7-5} = 0b111;
let Inst{31-21} = 0b10000000110;
let prefersSlot3 = 1;
@@ -18216,7 +18216,7 @@ def S2_asr_i_p_rnd_goodsyntax : HInst<
(outs DoubleRegs:$Rdd32),
(ins DoubleRegs:$Rss32, u6_0Imm:$Ii),
"$Rdd32 = asrrnd($Rss32,#$Ii)",
-tc_2b6f77c6, TypeS_2op>, Requires<[HasV5]> {
+tc_2b6f77c6, TypeS_2op> {
let isPseudo = 1;
}
def S2_asr_i_r : HInst<
@@ -25151,7 +25151,7 @@ def S5_asrhub_rnd_sat : HInst<
(outs IntRegs:$Rd32),
(ins DoubleRegs:$Rss32, u4_0Imm:$Ii),
"$Rd32 = vasrhub($Rss32,#$Ii):raw",
-tc_2b6f77c6, TypeS_2op>, Enc_11a146, Requires<[HasV5]> {
+tc_2b6f77c6, TypeS_2op>, Enc_11a146 {
let Inst{7-5} = 0b100;
let Inst{13-12} = 0b00;
let Inst{31-21} = 0b10001000011;
@@ -25164,7 +25164,7 @@ def S5_asrhub_rnd_sat_goodsyntax : HInst
(outs IntRegs:$Rd32),
(ins DoubleRegs:$Rss32, u4_0Imm:$Ii),
"$Rd32 = vasrhub($Rss32,#$Ii):rnd:sat",
-tc_2b6f77c6, TypeS_2op>, Requires<[HasV5]> {
+tc_2b6f77c6, TypeS_2op> {
let hasNewValue = 1;
let opNewValue = 0;
let isPseudo = 1;
@@ -25173,7 +25173,7 @@ def S5_asrhub_sat : HInst<
(outs IntRegs:$Rd32),
(ins DoubleRegs:$Rss32, u4_0Imm:$Ii),
"$Rd32 = vasrhub($Rss32,#$Ii):sat",
-tc_2b6f77c6, TypeS_2op>, Enc_11a146, Requires<[HasV5]> {
+tc_2b6f77c6, TypeS_2op>, Enc_11a146 {
let Inst{7-5} = 0b101;
let Inst{13-12} = 0b00;
let Inst{31-21} = 0b10001000011;
@@ -25186,7 +25186,7 @@ def S5_popcountp : HInst<
(outs IntRegs:$Rd32),
(ins DoubleRegs:$Rss32),
"$Rd32 = popcount($Rss32)",
-tc_00afc57e, TypeS_2op>, Enc_90cd8b, Requires<[HasV5]> {
+tc_00afc57e, TypeS_2op>, Enc_90cd8b {
let Inst{13-5} = 0b000000011;
let Inst{31-21} = 0b10001000011;
let hasNewValue = 1;
@@ -25197,7 +25197,7 @@ def S5_vasrhrnd : HInst<
(outs DoubleRegs:$Rdd32),
(ins DoubleRegs:$Rss32, u4_0Imm:$Ii),
"$Rdd32 = vasrh($Rss32,#$Ii):raw",
-tc_2b6f77c6, TypeS_2op>, Enc_12b6e9, Requires<[HasV5]> {
+tc_2b6f77c6, TypeS_2op>, Enc_12b6e9 {
let Inst{7-5} = 0b000;
let Inst{13-12} = 0b00;
let Inst{31-21} = 0b10000000001;
@@ -25207,7 +25207,7 @@ def S5_vasrhrnd_goodsyntax : HInst<
(outs DoubleRegs:$Rdd32),
(ins DoubleRegs:$Rss32, u4_0Imm:$Ii),
"$Rdd32 = vasrh($Rss32,#$Ii):rnd",
-tc_2b6f77c6, TypeS_2op>, Requires<[HasV5]> {
+tc_2b6f77c6, TypeS_2op> {
let isPseudo = 1;
}
def S6_allocframe_to_raw : HInst<
@@ -37007,7 +37007,7 @@ def Y5_l2fetch : HInst<
(outs),
(ins IntRegs:$Rs32, DoubleRegs:$Rtt32),
"l2fetch($Rs32,$Rtt32)",
-tc_daa058fa, TypeST>, Enc_e6abcf, Requires<[HasV5]> {
+tc_daa058fa, TypeST>, Enc_e6abcf {
let Inst{7-0} = 0b00000000;
let Inst{13-13} = 0b0;
let Inst{31-21} = 0b10100110100;
Modified: llvm/trunk/lib/Target/Hexagon/HexagonISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonISelLowering.cpp?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonISelLowering.cpp Fri Oct 19 10:31:11 2018
@@ -1228,7 +1228,6 @@ HexagonTargetLowering::HexagonTargetLowe
const HexagonSubtarget &ST)
: TargetLowering(TM), HTM(static_cast<const HexagonTargetMachine&>(TM)),
Subtarget(ST) {
- bool IsV4 = !Subtarget.hasV5Ops();
auto &HRI = *Subtarget.getRegisterInfo();
setPrefLoopAlignment(4);
@@ -1270,10 +1269,8 @@ HexagonTargetLowering::HexagonTargetLowe
addRegisterClass(MVT::v4i16, &Hexagon::DoubleRegsRegClass);
addRegisterClass(MVT::v2i32, &Hexagon::DoubleRegsRegClass);
- if (Subtarget.hasV5Ops()) {
- addRegisterClass(MVT::f32, &Hexagon::IntRegsRegClass);
- addRegisterClass(MVT::f64, &Hexagon::DoubleRegsRegClass);
- }
+ addRegisterClass(MVT::f32, &Hexagon::IntRegsRegClass);
+ addRegisterClass(MVT::f64, &Hexagon::DoubleRegsRegClass);
//
// Handling of scalar operations.
@@ -1351,8 +1348,7 @@ HexagonTargetLowering::HexagonTargetLowe
setOperationAction(ISD::CTTZ, MVT::i8, Promote);
setOperationAction(ISD::CTTZ, MVT::i16, Promote);
- // In V5, popcount can count # of 1s in i64 but returns i32.
- // On V4 it will be expanded (set later).
+ // Popcount can count # of 1s in i64 but returns i32.
setOperationAction(ISD::CTPOP, MVT::i8, Promote);
setOperationAction(ISD::CTPOP, MVT::i16, Promote);
setOperationAction(ISD::CTPOP, MVT::i32, Promote);
@@ -1515,57 +1511,28 @@ HexagonTargetLowering::HexagonTargetLowe
setOperationAction(ISD::ROTL, MVT::i32, Custom);
setOperationAction(ISD::ROTL, MVT::i64, Custom);
}
- if (Subtarget.hasV5Ops()) {
- setOperationAction(ISD::FMA, MVT::f64, Expand);
- setOperationAction(ISD::FADD, MVT::f64, Expand);
- setOperationAction(ISD::FSUB, MVT::f64, Expand);
- setOperationAction(ISD::FMUL, MVT::f64, Expand);
-
- setOperationAction(ISD::FMINNUM, MVT::f32, Legal);
- setOperationAction(ISD::FMAXNUM, MVT::f32, Legal);
-
- setOperationAction(ISD::FP_TO_UINT, MVT::i1, Promote);
- setOperationAction(ISD::FP_TO_UINT, MVT::i8, Promote);
- setOperationAction(ISD::FP_TO_UINT, MVT::i16, Promote);
- setOperationAction(ISD::FP_TO_SINT, MVT::i1, Promote);
- setOperationAction(ISD::FP_TO_SINT, MVT::i8, Promote);
- setOperationAction(ISD::FP_TO_SINT, MVT::i16, Promote);
- setOperationAction(ISD::UINT_TO_FP, MVT::i1, Promote);
- setOperationAction(ISD::UINT_TO_FP, MVT::i8, Promote);
- setOperationAction(ISD::UINT_TO_FP, MVT::i16, Promote);
- setOperationAction(ISD::SINT_TO_FP, MVT::i1, Promote);
- setOperationAction(ISD::SINT_TO_FP, MVT::i8, Promote);
- setOperationAction(ISD::SINT_TO_FP, MVT::i16, Promote);
- } else { // V4
- setOperationAction(ISD::SINT_TO_FP, MVT::i32, Expand);
- setOperationAction(ISD::SINT_TO_FP, MVT::i64, Expand);
- setOperationAction(ISD::UINT_TO_FP, MVT::i32, Expand);
- setOperationAction(ISD::UINT_TO_FP, MVT::i64, Expand);
- setOperationAction(ISD::FP_TO_SINT, MVT::f64, Expand);
- setOperationAction(ISD::FP_TO_SINT, MVT::f32, Expand);
- setOperationAction(ISD::FP_EXTEND, MVT::f32, Expand);
- setOperationAction(ISD::FP_ROUND, MVT::f64, Expand);
- setCondCodeAction(ISD::SETUNE, MVT::f64, Expand);
-
- setOperationAction(ISD::CTPOP, MVT::i8, Expand);
- setOperationAction(ISD::CTPOP, MVT::i16, Expand);
- setOperationAction(ISD::CTPOP, MVT::i32, Expand);
- setOperationAction(ISD::CTPOP, MVT::i64, Expand);
-
- // Expand these operations for both f32 and f64:
- for (unsigned FPExpOpV4 :
- {ISD::FADD, ISD::FSUB, ISD::FMUL, ISD::FABS, ISD::FNEG, ISD::FMA}) {
- setOperationAction(FPExpOpV4, MVT::f32, Expand);
- setOperationAction(FPExpOpV4, MVT::f64, Expand);
- }
-
- for (ISD::CondCode FPExpCCV4 :
- {ISD::SETOEQ, ISD::SETOGT, ISD::SETOLT, ISD::SETOGE, ISD::SETOLE,
- ISD::SETUO, ISD::SETO}) {
- setCondCodeAction(FPExpCCV4, MVT::f32, Expand);
- setCondCodeAction(FPExpCCV4, MVT::f64, Expand);
- }
- }
+
+ // V5+.
+ setOperationAction(ISD::FMA, MVT::f64, Expand);
+ setOperationAction(ISD::FADD, MVT::f64, Expand);
+ setOperationAction(ISD::FSUB, MVT::f64, Expand);
+ setOperationAction(ISD::FMUL, MVT::f64, Expand);
+
+ setOperationAction(ISD::FMINNUM, MVT::f32, Legal);
+ setOperationAction(ISD::FMAXNUM, MVT::f32, Legal);
+
+ setOperationAction(ISD::FP_TO_UINT, MVT::i1, Promote);
+ setOperationAction(ISD::FP_TO_UINT, MVT::i8, Promote);
+ setOperationAction(ISD::FP_TO_UINT, MVT::i16, Promote);
+ setOperationAction(ISD::FP_TO_SINT, MVT::i1, Promote);
+ setOperationAction(ISD::FP_TO_SINT, MVT::i8, Promote);
+ setOperationAction(ISD::FP_TO_SINT, MVT::i16, Promote);
+ setOperationAction(ISD::UINT_TO_FP, MVT::i1, Promote);
+ setOperationAction(ISD::UINT_TO_FP, MVT::i8, Promote);
+ setOperationAction(ISD::UINT_TO_FP, MVT::i16, Promote);
+ setOperationAction(ISD::SINT_TO_FP, MVT::i1, Promote);
+ setOperationAction(ISD::SINT_TO_FP, MVT::i8, Promote);
+ setOperationAction(ISD::SINT_TO_FP, MVT::i16, Promote);
// Handling of indexed loads/stores: default is "expand".
//
@@ -1601,42 +1568,18 @@ HexagonTargetLowering::HexagonTargetLowe
setLibcallName(RTLIB::FPTOSINT_F32_I128, "__hexagon_fixsfti");
setLibcallName(RTLIB::FPTOSINT_F64_I128, "__hexagon_fixdfti");
- if (IsV4) {
- // Handle single-precision floating point operations on V4.
- if (FastMath) {
- setLibcallName(RTLIB::ADD_F32, "__hexagon_fast_addsf3");
- setLibcallName(RTLIB::SUB_F32, "__hexagon_fast_subsf3");
- setLibcallName(RTLIB::MUL_F32, "__hexagon_fast_mulsf3");
- setLibcallName(RTLIB::OGT_F32, "__hexagon_fast_gtsf2");
- setLibcallName(RTLIB::OLT_F32, "__hexagon_fast_ltsf2");
- // Double-precision compares.
- setLibcallName(RTLIB::OGT_F64, "__hexagon_fast_gtdf2");
- setLibcallName(RTLIB::OLT_F64, "__hexagon_fast_ltdf2");
- } else {
- setLibcallName(RTLIB::ADD_F32, "__hexagon_addsf3");
- setLibcallName(RTLIB::SUB_F32, "__hexagon_subsf3");
- setLibcallName(RTLIB::MUL_F32, "__hexagon_mulsf3");
- setLibcallName(RTLIB::OGT_F32, "__hexagon_gtsf2");
- setLibcallName(RTLIB::OLT_F32, "__hexagon_ltsf2");
- // Double-precision compares.
- setLibcallName(RTLIB::OGT_F64, "__hexagon_gtdf2");
- setLibcallName(RTLIB::OLT_F64, "__hexagon_ltdf2");
- }
- }
-
// This is the only fast library function for sqrtd.
if (FastMath)
setLibcallName(RTLIB::SQRT_F64, "__hexagon_fast2_sqrtdf2");
// Prefix is: nothing for "slow-math",
- // "fast2_" for V4 fast-math and V5+ fast-math double-precision
+ // "fast2_" for V5+ fast-math double-precision
// (actually, keep fast-math and fast-math2 separate for now)
if (FastMath) {
setLibcallName(RTLIB::ADD_F64, "__hexagon_fast_adddf3");
setLibcallName(RTLIB::SUB_F64, "__hexagon_fast_subdf3");
setLibcallName(RTLIB::MUL_F64, "__hexagon_fast_muldf3");
setLibcallName(RTLIB::DIV_F64, "__hexagon_fast_divdf3");
- // Calling __hexagon_fast2_divsf3 with fast-math on V5 (ok).
setLibcallName(RTLIB::DIV_F32, "__hexagon_fast_divsf3");
} else {
setLibcallName(RTLIB::ADD_F64, "__hexagon_adddf3");
@@ -1646,44 +1589,10 @@ HexagonTargetLowering::HexagonTargetLowe
setLibcallName(RTLIB::DIV_F32, "__hexagon_divsf3");
}
- if (Subtarget.hasV5Ops()) {
- if (FastMath)
- setLibcallName(RTLIB::SQRT_F32, "__hexagon_fast2_sqrtf");
- else
- setLibcallName(RTLIB::SQRT_F32, "__hexagon_sqrtf");
- } else {
- // V4
- setLibcallName(RTLIB::SINTTOFP_I32_F32, "__hexagon_floatsisf");
- setLibcallName(RTLIB::SINTTOFP_I32_F64, "__hexagon_floatsidf");
- setLibcallName(RTLIB::SINTTOFP_I64_F32, "__hexagon_floatdisf");
- setLibcallName(RTLIB::SINTTOFP_I64_F64, "__hexagon_floatdidf");
- setLibcallName(RTLIB::UINTTOFP_I32_F32, "__hexagon_floatunsisf");
- setLibcallName(RTLIB::UINTTOFP_I32_F64, "__hexagon_floatunsidf");
- setLibcallName(RTLIB::UINTTOFP_I64_F32, "__hexagon_floatundisf");
- setLibcallName(RTLIB::UINTTOFP_I64_F64, "__hexagon_floatundidf");
- setLibcallName(RTLIB::FPTOUINT_F32_I32, "__hexagon_fixunssfsi");
- setLibcallName(RTLIB::FPTOUINT_F32_I64, "__hexagon_fixunssfdi");
- setLibcallName(RTLIB::FPTOUINT_F64_I32, "__hexagon_fixunsdfsi");
- setLibcallName(RTLIB::FPTOUINT_F64_I64, "__hexagon_fixunsdfdi");
- setLibcallName(RTLIB::FPTOSINT_F32_I32, "__hexagon_fixsfsi");
- setLibcallName(RTLIB::FPTOSINT_F32_I64, "__hexagon_fixsfdi");
- setLibcallName(RTLIB::FPTOSINT_F64_I32, "__hexagon_fixdfsi");
- setLibcallName(RTLIB::FPTOSINT_F64_I64, "__hexagon_fixdfdi");
- setLibcallName(RTLIB::FPEXT_F32_F64, "__hexagon_extendsfdf2");
- setLibcallName(RTLIB::FPROUND_F64_F32, "__hexagon_truncdfsf2");
- setLibcallName(RTLIB::OEQ_F32, "__hexagon_eqsf2");
- setLibcallName(RTLIB::OEQ_F64, "__hexagon_eqdf2");
- setLibcallName(RTLIB::OGE_F32, "__hexagon_gesf2");
- setLibcallName(RTLIB::OGE_F64, "__hexagon_gedf2");
- setLibcallName(RTLIB::OLE_F32, "__hexagon_lesf2");
- setLibcallName(RTLIB::OLE_F64, "__hexagon_ledf2");
- setLibcallName(RTLIB::UNE_F32, "__hexagon_nesf2");
- setLibcallName(RTLIB::UNE_F64, "__hexagon_nedf2");
- setLibcallName(RTLIB::UO_F32, "__hexagon_unordsf2");
- setLibcallName(RTLIB::UO_F64, "__hexagon_unorddf2");
- setLibcallName(RTLIB::O_F32, "__hexagon_unordsf2");
- setLibcallName(RTLIB::O_F64, "__hexagon_unorddf2");
- }
+ if (FastMath)
+ setLibcallName(RTLIB::SQRT_F32, "__hexagon_fast2_sqrtf");
+ else
+ setLibcallName(RTLIB::SQRT_F32, "__hexagon_sqrtf");
// These cause problems when the shift amount is non-constant.
setLibcallName(RTLIB::SHL_I128, nullptr);
@@ -3007,7 +2916,7 @@ HexagonTargetLowering::getRegForInlineAs
/// specified FP immediate natively. If false, the legalizer will
/// materialize the FP immediate as a load from a constant pool.
bool HexagonTargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT) const {
- return Subtarget.hasV5Ops();
+ return true;
}
/// isLegalAddressingMode - Return true if the addressing mode represented by
Modified: llvm/trunk/lib/Target/Hexagon/HexagonInstrFormats.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonInstrFormats.td?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonInstrFormats.td (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonInstrFormats.td Fri Oct 19 10:31:11 2018
@@ -194,8 +194,6 @@ class HInst<dag outs, dag ins, string as
// Instruction Classes Definitions +
//===----------------------------------------------------------------------===//
-// LD Instruction Class in V2/V3/V4.
-// Definition of the instruction class NOT CHANGED.
let mayLoad = 1 in
class LDInst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
string cstr = "", InstrItinClass itin = LD_tc_ld_SLOT01>
@@ -205,9 +203,6 @@ class CONSTLDInst<dag outs, dag ins, str
string cstr = "", InstrItinClass itin = LD_tc_ld_SLOT01>
: InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeLD>, OpcodeHexagon;
-// ST Instruction Class in V2/V3 can take SLOT0 only.
-// ST Instruction Class in V4 can take SLOT0 & SLOT1.
-// Definition of the instruction class CHANGED from V2/V3 to V4.
let mayStore = 1 in
class STInst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
string cstr = "", InstrItinClass itin = ST_tc_st_SLOT01>
@@ -235,15 +230,6 @@ class PseudoM<dag outs, dag ins, string
// Instruction Classes Definitions -
//===----------------------------------------------------------------------===//
-//===----------------------------------------------------------------------===//
-// V4 Instruction Format Definitions +
-//===----------------------------------------------------------------------===//
-
-include "HexagonInstrFormatsV4.td"
-
-//===----------------------------------------------------------------------===//
-// V60+ Instruction Format Definitions +
-//===----------------------------------------------------------------------===//
-
+include "HexagonInstrFormatsV5.td"
include "HexagonInstrFormatsV60.td"
include "HexagonInstrFormatsV65.td"
Removed: llvm/trunk/lib/Target/Hexagon/HexagonInstrFormatsV4.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonInstrFormatsV4.td?rev=344790&view=auto
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonInstrFormatsV4.td (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonInstrFormatsV4.td (removed)
@@ -1,87 +0,0 @@
-//==- HexagonInstrFormatsV4.td - Hexagon Instruction Formats --*- tablegen -==//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file describes the Hexagon V4 instruction classes in TableGen format.
-//
-//===----------------------------------------------------------------------===//
-
-// Duplex Instruction Class Declaration
-//===----------------------------------------------------------------------===//
-
-class OpcodeDuplex {
- field bits<32> Inst = ?; // Default to an invalid insn.
- bits<4> IClass = 0; // ICLASS
- bits<13> ISubHi = 0; // Low sub-insn
- bits<13> ISubLo = 0; // High sub-insn
-
- let Inst{31-29} = IClass{3-1};
- let Inst{13} = IClass{0};
- let Inst{15-14} = 0;
- let Inst{28-16} = ISubHi;
- let Inst{12-0} = ISubLo;
-}
-
-class InstDuplex<bits<4> iClass, list<dag> pattern = [],
- string cstr = "">
- : Instruction, OpcodeDuplex {
- let Namespace = "Hexagon";
- IType Type = TypeDUPLEX; // uses slot 0,1
- let isCodeGenOnly = 1;
- let hasSideEffects = 0;
- dag OutOperandList = (outs);
- dag InOperandList = (ins);
- let IClass = iClass;
- let Constraints = cstr;
- let Itinerary = DUPLEX;
- let Size = 4;
-
- // SoftFail is a field the disassembler can use to provide a way for
- // instructions to not match without killing the whole decode process. It is
- // mainly used for ARM, but Tablegen expects this field to exist or it fails
- // to build the decode table.
- field bits<32> SoftFail = 0;
-
- // *** Must match MCTargetDesc/HexagonBaseInfo.h ***
-
- let TSFlags{5-0} = Type.Value;
-
- // Predicated instructions.
- bits<1> isPredicated = 0;
- let TSFlags{6} = isPredicated;
- bits<1> isPredicatedFalse = 0;
- let TSFlags{7} = isPredicatedFalse;
- bits<1> isPredicatedNew = 0;
- let TSFlags{8} = isPredicatedNew;
-
- // New-value insn helper fields.
- bits<1> isNewValue = 0;
- let TSFlags{9} = isNewValue; // New-value consumer insn.
- bits<1> hasNewValue = 0;
- let TSFlags{10} = hasNewValue; // New-value producer insn.
- bits<3> opNewValue = 0;
- let TSFlags{13-11} = opNewValue; // New-value produced operand.
- bits<1> isNVStorable = 0;
- let TSFlags{14} = isNVStorable; // Store that can become new-value store.
- bits<1> isNVStore = 0;
- let TSFlags{15} = isNVStore; // New-value store insn.
-
- // Immediate extender helper fields.
- bits<1> isExtendable = 0;
- let TSFlags{16} = isExtendable; // Insn may be extended.
- bits<1> isExtended = 0;
- let TSFlags{17} = isExtended; // Insn must be extended.
- bits<3> opExtendable = 0;
- let TSFlags{20-18} = opExtendable; // Which operand may be extended.
- bits<1> isExtentSigned = 0;
- let TSFlags{21} = isExtentSigned; // Signed or unsigned range.
- bits<5> opExtentBits = 0;
- let TSFlags{26-22} = opExtentBits; //Number of bits of range before extending.
- bits<2> opExtentAlign = 0;
- let TSFlags{28-27} = opExtentAlign; // Alignment exponent before extending.
-}
Added: llvm/trunk/lib/Target/Hexagon/HexagonInstrFormatsV5.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonInstrFormatsV5.td?rev=344791&view=auto
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonInstrFormatsV5.td (added)
+++ llvm/trunk/lib/Target/Hexagon/HexagonInstrFormatsV5.td Fri Oct 19 10:31:11 2018
@@ -0,0 +1,87 @@
+//==- HexagonInstrFormatsV5.td - Hexagon Instruction Formats --*- tablegen -==//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file describes the Hexagon V5 instruction classes in TableGen format.
+//
+//===----------------------------------------------------------------------===//
+
+// Duplex Instruction Class Declaration
+//===----------------------------------------------------------------------===//
+
+class OpcodeDuplex {
+ field bits<32> Inst = ?; // Default to an invalid insn.
+ bits<4> IClass = 0; // ICLASS
+ bits<13> ISubHi = 0; // Low sub-insn
+ bits<13> ISubLo = 0; // High sub-insn
+
+ let Inst{31-29} = IClass{3-1};
+ let Inst{13} = IClass{0};
+ let Inst{15-14} = 0;
+ let Inst{28-16} = ISubHi;
+ let Inst{12-0} = ISubLo;
+}
+
+class InstDuplex<bits<4> iClass, list<dag> pattern = [],
+ string cstr = "">
+ : Instruction, OpcodeDuplex {
+ let Namespace = "Hexagon";
+ IType Type = TypeDUPLEX; // uses slot 0,1
+ let isCodeGenOnly = 1;
+ let hasSideEffects = 0;
+ dag OutOperandList = (outs);
+ dag InOperandList = (ins);
+ let IClass = iClass;
+ let Constraints = cstr;
+ let Itinerary = DUPLEX;
+ let Size = 4;
+
+ // SoftFail is a field the disassembler can use to provide a way for
+ // instructions to not match without killing the whole decode process. It is
+ // mainly used for ARM, but Tablegen expects this field to exist or it fails
+ // to build the decode table.
+ field bits<32> SoftFail = 0;
+
+ // *** Must match MCTargetDesc/HexagonBaseInfo.h ***
+
+ let TSFlags{5-0} = Type.Value;
+
+ // Predicated instructions.
+ bits<1> isPredicated = 0;
+ let TSFlags{6} = isPredicated;
+ bits<1> isPredicatedFalse = 0;
+ let TSFlags{7} = isPredicatedFalse;
+ bits<1> isPredicatedNew = 0;
+ let TSFlags{8} = isPredicatedNew;
+
+ // New-value insn helper fields.
+ bits<1> isNewValue = 0;
+ let TSFlags{9} = isNewValue; // New-value consumer insn.
+ bits<1> hasNewValue = 0;
+ let TSFlags{10} = hasNewValue; // New-value producer insn.
+ bits<3> opNewValue = 0;
+ let TSFlags{13-11} = opNewValue; // New-value produced operand.
+ bits<1> isNVStorable = 0;
+ let TSFlags{14} = isNVStorable; // Store that can become new-value store.
+ bits<1> isNVStore = 0;
+ let TSFlags{15} = isNVStore; // New-value store insn.
+
+ // Immediate extender helper fields.
+ bits<1> isExtendable = 0;
+ let TSFlags{16} = isExtendable; // Insn may be extended.
+ bits<1> isExtended = 0;
+ let TSFlags{17} = isExtended; // Insn must be extended.
+ bits<3> opExtendable = 0;
+ let TSFlags{20-18} = opExtendable; // Which operand may be extended.
+ bits<1> isExtentSigned = 0;
+ let TSFlags{21} = isExtentSigned; // Signed or unsigned range.
+ bits<5> opExtentBits = 0;
+ let TSFlags{26-22} = opExtentBits; //Number of bits of range before extending.
+ bits<2> opExtentAlign = 0;
+ let TSFlags{28-27} = opExtentAlign; // Alignment exponent before extending.
+}
Modified: llvm/trunk/lib/Target/Hexagon/HexagonIntrinsics.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonIntrinsics.td?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonIntrinsics.td (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonIntrinsics.td Fri Oct 19 10:31:11 2018
@@ -1398,7 +1398,5 @@ def: T_R_pat<Y2_dczeroa, int_hexagon
def: T_RR_pat<Y4_l2fetch, int_hexagon_Y4_l2fetch>;
def: T_RP_pat<Y5_l2fetch, int_hexagon_Y5_l2fetch>;
-include "HexagonIntrinsicsV3.td"
-include "HexagonIntrinsicsV4.td"
include "HexagonIntrinsicsV5.td"
include "HexagonIntrinsicsV60.td"
Removed: llvm/trunk/lib/Target/Hexagon/HexagonIntrinsicsV3.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonIntrinsicsV3.td?rev=344790&view=auto
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonIntrinsicsV3.td (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonIntrinsicsV3.td (removed)
@@ -1,27 +0,0 @@
-//=- HexagonIntrinsicsV3.td - Target Description for Hexagon -*- tablegen -*-=//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file describes the Hexagon V3 Compiler Intrinsics in TableGen format.
-//
-//===----------------------------------------------------------------------===//
-
-// Vector reduce complex multiply real or imaginary
-def : T_PR_pat <M2_vrcmpys_s1, int_hexagon_M2_vrcmpys_s1>;
-def : T_PPR_pat<M2_vrcmpys_acc_s1, int_hexagon_M2_vrcmpys_acc_s1>;
-def : T_PR_pat <M2_vrcmpys_s1rp, int_hexagon_M2_vrcmpys_s1rp>;
-
-// Vector reduce add unsigned halfwords
-def : T_PP_pat<M2_vradduh, int_hexagon_M2_vradduh>;
-
-def: T_RP_pat<A2_addsp, int_hexagon_A2_addsp>;
-def: T_PP_pat<A2_addpsat, int_hexagon_A2_addpsat>;
-def: T_PP_pat<A2_minp, int_hexagon_A2_minp>;
-def: T_PP_pat<A2_minup, int_hexagon_A2_minup>;
-def: T_PP_pat<A2_maxp, int_hexagon_A2_maxp>;
-def: T_PP_pat<A2_maxup, int_hexagon_A2_maxup>;
Removed: llvm/trunk/lib/Target/Hexagon/HexagonIntrinsicsV4.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonIntrinsicsV4.td?rev=344790&view=auto
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonIntrinsicsV4.td (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonIntrinsicsV4.td (removed)
@@ -1,305 +0,0 @@
-//===- HexagonIntrinsicsV4.td - V4 Instruction intrinsics --*- tablegen -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-// This is populated based on the following specs:
-// Hexagon V4 Architecture Extensions
-// Application-Level Specification
-// 80-V9418-12 Rev. A
-// June 15, 2010
-
-// Vector reduce multiply word by signed half (32x16)
-//Rdd=vrmpyweh(Rss,Rtt)[:<<1]
-def : T_PP_pat <M4_vrmpyeh_s0, int_hexagon_M4_vrmpyeh_s0>;
-def : T_PP_pat <M4_vrmpyeh_s1, int_hexagon_M4_vrmpyeh_s1>;
-
-//Rdd=vrmpywoh(Rss,Rtt)[:<<1]
-def : T_PP_pat <M4_vrmpyoh_s0, int_hexagon_M4_vrmpyoh_s0>;
-def : T_PP_pat <M4_vrmpyoh_s1, int_hexagon_M4_vrmpyoh_s1>;
-
-//Rdd+=vrmpyweh(Rss,Rtt)[:<<1]
-def : T_PPP_pat <M4_vrmpyeh_acc_s0, int_hexagon_M4_vrmpyeh_acc_s0>;
-def : T_PPP_pat <M4_vrmpyeh_acc_s1, int_hexagon_M4_vrmpyeh_acc_s1>;
-
-//Rdd=vrmpywoh(Rss,Rtt)[:<<1]
-def : T_PPP_pat <M4_vrmpyoh_acc_s0, int_hexagon_M4_vrmpyoh_acc_s0>;
-def : T_PPP_pat <M4_vrmpyoh_acc_s1, int_hexagon_M4_vrmpyoh_acc_s1>;
-
-// Vector multiply halfwords, signed by unsigned
-// Rdd=vmpyhsu(Rs,Rt)[:<<1]:sat
-def : T_RR_pat <M2_vmpy2su_s0, int_hexagon_M2_vmpy2su_s0>;
-def : T_RR_pat <M2_vmpy2su_s1, int_hexagon_M2_vmpy2su_s1>;
-
-// Rxx+=vmpyhsu(Rs,Rt)[:<<1]:sat
-def : T_PRR_pat <M2_vmac2su_s0, int_hexagon_M2_vmac2su_s0>;
-def : T_PRR_pat <M2_vmac2su_s1, int_hexagon_M2_vmac2su_s1>;
-
-// Vector polynomial multiply halfwords
-// Rdd=vpmpyh(Rs,Rt)
-def : T_RR_pat <M4_vpmpyh, int_hexagon_M4_vpmpyh>;
-// Rxx[^]=vpmpyh(Rs,Rt)
-def : T_PRR_pat <M4_vpmpyh_acc, int_hexagon_M4_vpmpyh_acc>;
-
-// Polynomial multiply words
-// Rdd=pmpyw(Rs,Rt)
-def : T_RR_pat <M4_pmpyw, int_hexagon_M4_pmpyw>;
-// Rxx^=pmpyw(Rs,Rt)
-def : T_PRR_pat <M4_pmpyw_acc, int_hexagon_M4_pmpyw_acc>;
-
-//Rxx^=asr(Rss,Rt)
-def : T_PPR_pat <S2_asr_r_p_xor, int_hexagon_S2_asr_r_p_xor>;
-//Rxx^=asl(Rss,Rt)
-def : T_PPR_pat <S2_asl_r_p_xor, int_hexagon_S2_asl_r_p_xor>;
-//Rxx^=lsr(Rss,Rt)
-def : T_PPR_pat <S2_lsr_r_p_xor, int_hexagon_S2_lsr_r_p_xor>;
-//Rxx^=lsl(Rss,Rt)
-def : T_PPR_pat <S2_lsl_r_p_xor, int_hexagon_S2_lsl_r_p_xor>;
-
-// Multiply and use upper result
-def : T_RR_pat <M2_mpysu_up, int_hexagon_M2_mpysu_up>;
-def : T_RR_pat <M2_mpy_up_s1, int_hexagon_M2_mpy_up_s1>;
-def : T_RR_pat <M2_hmmpyh_s1, int_hexagon_M2_hmmpyh_s1>;
-def : T_RR_pat <M2_hmmpyl_s1, int_hexagon_M2_hmmpyl_s1>;
-def : T_RR_pat <M2_mpy_up_s1_sat, int_hexagon_M2_mpy_up_s1_sat>;
-
-def : T_PP_pat <A2_vaddub, int_hexagon_A2_vaddb_map>;
-def : T_PP_pat <A2_vsubub, int_hexagon_A2_vsubb_map>;
-
-// Vector reduce add unsigned halfwords
-def : T_PP_pat <M2_vraddh, int_hexagon_M2_vraddh>;
-
-def: T_P_pat<S2_brevp, int_hexagon_S2_brevp>;
-def: T_P_pat<S2_ct0p, int_hexagon_S2_ct0p>;
-def: T_P_pat<S2_ct1p, int_hexagon_S2_ct1p>;
-
-def: T_Q_RR_pat<C4_nbitsset, int_hexagon_C4_nbitsset>;
-def: T_Q_RR_pat<C4_nbitsclr, int_hexagon_C4_nbitsclr>;
-def: T_Q_RI_pat<C4_nbitsclri, int_hexagon_C4_nbitsclri>;
-
-def : T_Q_PI_pat<A4_vcmpbeqi, int_hexagon_A4_vcmpbeqi>;
-def : T_Q_PI_pat<A4_vcmpbgti, int_hexagon_A4_vcmpbgti>;
-def : T_Q_PI_pat<A4_vcmpbgtui, int_hexagon_A4_vcmpbgtui>;
-def : T_Q_PI_pat<A4_vcmpheqi, int_hexagon_A4_vcmpheqi>;
-def : T_Q_PI_pat<A4_vcmphgti, int_hexagon_A4_vcmphgti>;
-def : T_Q_PI_pat<A4_vcmphgtui, int_hexagon_A4_vcmphgtui>;
-def : T_Q_PI_pat<A4_vcmpweqi, int_hexagon_A4_vcmpweqi>;
-def : T_Q_PI_pat<A4_vcmpwgti, int_hexagon_A4_vcmpwgti>;
-def : T_Q_PI_pat<A4_vcmpwgtui, int_hexagon_A4_vcmpwgtui>;
-def : T_Q_PP_pat<A4_vcmpbeq_any, int_hexagon_A4_vcmpbeq_any>;
-
-def : T_Q_RR_pat<A4_cmpbeq, int_hexagon_A4_cmpbeq>;
-def : T_Q_RR_pat<A4_cmpbgt, int_hexagon_A4_cmpbgt>;
-def : T_Q_RR_pat<A4_cmpbgtu, int_hexagon_A4_cmpbgtu>;
-def : T_Q_RR_pat<A4_cmpheq, int_hexagon_A4_cmpheq>;
-def : T_Q_RR_pat<A4_cmphgt, int_hexagon_A4_cmphgt>;
-def : T_Q_RR_pat<A4_cmphgtu, int_hexagon_A4_cmphgtu>;
-
-def : T_Q_RI_pat<A4_cmpbeqi, int_hexagon_A4_cmpbeqi>;
-def : T_Q_RI_pat<A4_cmpbgti, int_hexagon_A4_cmpbgti>;
-def : T_Q_RI_pat<A4_cmpbgtui, int_hexagon_A4_cmpbgtui>;
-
-def : T_Q_RI_pat<A4_cmpheqi, int_hexagon_A4_cmpheqi>;
-def : T_Q_RI_pat<A4_cmphgti, int_hexagon_A4_cmphgti>;
-def : T_Q_RI_pat<A4_cmphgtui, int_hexagon_A4_cmphgtui>;
-
-def : T_Q_RP_pat<A4_boundscheck, int_hexagon_A4_boundscheck>;
-def : T_Q_PR_pat<A4_tlbmatch, int_hexagon_A4_tlbmatch>;
-
-def : T_RRR_pat <M4_mpyrr_addr, int_hexagon_M4_mpyrr_addr>;
-def : T_IRR_pat <M4_mpyrr_addi, int_hexagon_M4_mpyrr_addi>;
-def : T_IRI_pat <M4_mpyri_addi, int_hexagon_M4_mpyri_addi>;
-def : T_RIR_pat <M4_mpyri_addr_u2, int_hexagon_M4_mpyri_addr_u2>;
-def : T_RRI_pat <M4_mpyri_addr, int_hexagon_M4_mpyri_addr>;
-def : T_RRR_pat <M4_mac_up_s1_sat, int_hexagon_M4_mac_up_s1_sat>;
-def : T_RRR_pat <M4_nac_up_s1_sat, int_hexagon_M4_nac_up_s1_sat>;
-
-// Complex multiply 32x16
-def : T_PR_pat <M4_cmpyi_wh, int_hexagon_M4_cmpyi_wh>;
-def : T_PR_pat <M4_cmpyr_wh, int_hexagon_M4_cmpyr_wh>;
-
-def : T_PR_pat <M4_cmpyi_whc, int_hexagon_M4_cmpyi_whc>;
-def : T_PR_pat <M4_cmpyr_whc, int_hexagon_M4_cmpyr_whc>;
-
-def : T_PP_pat<A4_andnp, int_hexagon_A4_andnp>;
-def : T_PP_pat<A4_ornp, int_hexagon_A4_ornp>;
-
-// Complex add/sub halfwords/words
-def : T_PP_pat <S4_vxaddsubw, int_hexagon_S4_vxaddsubw>;
-def : T_PP_pat <S4_vxsubaddw, int_hexagon_S4_vxsubaddw>;
-def : T_PP_pat <S4_vxaddsubh, int_hexagon_S4_vxaddsubh>;
-def : T_PP_pat <S4_vxsubaddh, int_hexagon_S4_vxsubaddh>;
-
-def : T_PP_pat <S4_vxaddsubhr, int_hexagon_S4_vxaddsubhr>;
-def : T_PP_pat <S4_vxsubaddhr, int_hexagon_S4_vxsubaddhr>;
-
-// Extract bitfield
-def : T_PP_pat <S4_extractp_rp, int_hexagon_S4_extractp_rp>;
-def : T_RP_pat <S4_extract_rp, int_hexagon_S4_extract_rp>;
-def : T_PII_pat <S4_extractp, int_hexagon_S4_extractp>;
-def : T_RII_pat <S4_extract, int_hexagon_S4_extract>;
-
-// Vector conditional negate
-// Rdd=vcnegh(Rss,Rt)
-def : T_PR_pat <S2_vcnegh, int_hexagon_S2_vcnegh>;
-
-// Shift an immediate left by register amount
-def : T_IR_pat<S4_lsli, int_hexagon_S4_lsli>;
-
-// Vector reduce maximum halfwords
-def : T_PPR_pat <A4_vrmaxh, int_hexagon_A4_vrmaxh>;
-def : T_PPR_pat <A4_vrmaxuh, int_hexagon_A4_vrmaxuh>;
-
-// Vector reduce maximum words
-def : T_PPR_pat <A4_vrmaxw, int_hexagon_A4_vrmaxw>;
-def : T_PPR_pat <A4_vrmaxuw, int_hexagon_A4_vrmaxuw>;
-
-// Vector reduce minimum halfwords
-def : T_PPR_pat <A4_vrminh, int_hexagon_A4_vrminh>;
-def : T_PPR_pat <A4_vrminuh, int_hexagon_A4_vrminuh>;
-
-// Vector reduce minimum words
-def : T_PPR_pat <A4_vrminw, int_hexagon_A4_vrminw>;
-def : T_PPR_pat <A4_vrminuw, int_hexagon_A4_vrminuw>;
-
-// Rotate and reduce bytes
-def : Pat <(int_hexagon_S4_vrcrotate DoubleRegs:$src1, IntRegs:$src2,
- u2_0ImmPred:$src3),
- (S4_vrcrotate DoubleRegs:$src1, IntRegs:$src2, u2_0ImmPred:$src3)>;
-
-// Rotate and reduce bytes with accumulation
-// Rxx+=vrcrotate(Rss,Rt,#u2)
-def : Pat <(int_hexagon_S4_vrcrotate_acc DoubleRegs:$src1, DoubleRegs:$src2,
- IntRegs:$src3, u2_0ImmPred:$src4),
- (S4_vrcrotate_acc DoubleRegs:$src1, DoubleRegs:$src2,
- IntRegs:$src3, u2_0ImmPred:$src4)>;
-
-// Vector conditional negate
-def : T_PPR_pat<S2_vrcnegh, int_hexagon_S2_vrcnegh>;
-
-// Logical xor with xor accumulation
-def : T_PPP_pat<M4_xor_xacc, int_hexagon_M4_xor_xacc>;
-
-// ALU64 - Vector min/max byte
-def : T_PP_pat <A2_vminb, int_hexagon_A2_vminb>;
-def : T_PP_pat <A2_vmaxb, int_hexagon_A2_vmaxb>;
-
-// Shift and add/sub/and/or
-def : T_IRI_pat <S4_andi_asl_ri, int_hexagon_S4_andi_asl_ri>;
-def : T_IRI_pat <S4_ori_asl_ri, int_hexagon_S4_ori_asl_ri>;
-def : T_IRI_pat <S4_addi_asl_ri, int_hexagon_S4_addi_asl_ri>;
-def : T_IRI_pat <S4_subi_asl_ri, int_hexagon_S4_subi_asl_ri>;
-def : T_IRI_pat <S4_andi_lsr_ri, int_hexagon_S4_andi_lsr_ri>;
-def : T_IRI_pat <S4_ori_lsr_ri, int_hexagon_S4_ori_lsr_ri>;
-def : T_IRI_pat <S4_addi_lsr_ri, int_hexagon_S4_addi_lsr_ri>;
-def : T_IRI_pat <S4_subi_lsr_ri, int_hexagon_S4_subi_lsr_ri>;
-
-// Split bitfield
-def : T_RI_pat <A4_bitspliti, int_hexagon_A4_bitspliti>;
-def : T_RR_pat <A4_bitsplit, int_hexagon_A4_bitsplit>;
-
-def: T_RR_pat<S4_parity, int_hexagon_S4_parity>;
-
-def: T_Q_RI_pat<S4_ntstbit_i, int_hexagon_S4_ntstbit_i>;
-def: T_Q_RR_pat<S4_ntstbit_r, int_hexagon_S4_ntstbit_r>;
-
-def: T_RI_pat<S4_clbaddi, int_hexagon_S4_clbaddi>;
-def: T_PI_pat<S4_clbpaddi, int_hexagon_S4_clbpaddi>;
-def: T_P_pat <S4_clbpnorm, int_hexagon_S4_clbpnorm>;
-
-//*******************************************************************
-// ALU32/ALU
-//*******************************************************************
-
-// ALU32 / ALU / Logical Operations.
-def: T_RR_pat<A4_andn, int_hexagon_A4_andn>;
-def: T_RR_pat<A4_orn, int_hexagon_A4_orn>;
-
-//*******************************************************************
-// ALU32/PERM
-//*******************************************************************
-
-// Combine Words Into Doublewords.
-def: T_RI_pat<A4_combineri, int_hexagon_A4_combineri, s32_0ImmPred>;
-def: T_IR_pat<A4_combineir, int_hexagon_A4_combineir, s32_0ImmPred>;
-
-//*******************************************************************
-// ALU32/PRED
-//*******************************************************************
-
-// Compare
-def : T_Q_RI_pat<C4_cmpneqi, int_hexagon_C4_cmpneqi, s32_0ImmPred>;
-def : T_Q_RI_pat<C4_cmpltei, int_hexagon_C4_cmpltei, s32_0ImmPred>;
-def : T_Q_RI_pat<C4_cmplteui, int_hexagon_C4_cmplteui, u32_0ImmPred>;
-
-// Compare To General Register.
-def: T_Q_RR_pat<C4_cmpneq, int_hexagon_C4_cmpneq>;
-def: T_Q_RR_pat<C4_cmplte, int_hexagon_C4_cmplte>;
-def: T_Q_RR_pat<C4_cmplteu, int_hexagon_C4_cmplteu>;
-
-def: T_RR_pat<A4_rcmpeq, int_hexagon_A4_rcmpeq>;
-def: T_RR_pat<A4_rcmpneq, int_hexagon_A4_rcmpneq>;
-
-def: T_RI_pat<A4_rcmpeqi, int_hexagon_A4_rcmpeqi>;
-def: T_RI_pat<A4_rcmpneqi, int_hexagon_A4_rcmpneqi>;
-
-//*******************************************************************
-// CR
-//*******************************************************************
-
-// CR / Logical Operations On Predicates.
-def: T_Q_QQQ_pat<C4_and_and, int_hexagon_C4_and_and>;
-def: T_Q_QQQ_pat<C4_and_andn, int_hexagon_C4_and_andn>;
-def: T_Q_QQQ_pat<C4_and_or, int_hexagon_C4_and_or>;
-def: T_Q_QQQ_pat<C4_and_orn, int_hexagon_C4_and_orn>;
-def: T_Q_QQQ_pat<C4_or_and, int_hexagon_C4_or_and>;
-def: T_Q_QQQ_pat<C4_or_andn, int_hexagon_C4_or_andn>;
-def: T_Q_QQQ_pat<C4_or_or, int_hexagon_C4_or_or>;
-def: T_Q_QQQ_pat<C4_or_orn, int_hexagon_C4_or_orn>;
-
-//*******************************************************************
-// XTYPE/ALU
-//*******************************************************************
-
-// Add And Accumulate.
-
-def : T_RRI_pat <S4_addaddi, int_hexagon_S4_addaddi>;
-def : T_RIR_pat <S4_subaddi, int_hexagon_S4_subaddi>;
-
-
-// XTYPE / ALU / Logical-logical Words.
-def : T_RRR_pat <M4_or_xor, int_hexagon_M4_or_xor>;
-def : T_RRR_pat <M4_and_xor, int_hexagon_M4_and_xor>;
-def : T_RRR_pat <M4_or_and, int_hexagon_M4_or_and>;
-def : T_RRR_pat <M4_and_and, int_hexagon_M4_and_and>;
-def : T_RRR_pat <M4_xor_and, int_hexagon_M4_xor_and>;
-def : T_RRR_pat <M4_or_or, int_hexagon_M4_or_or>;
-def : T_RRR_pat <M4_and_or, int_hexagon_M4_and_or>;
-def : T_RRR_pat <M4_xor_or, int_hexagon_M4_xor_or>;
-def : T_RRR_pat <M4_or_andn, int_hexagon_M4_or_andn>;
-def : T_RRR_pat <M4_and_andn, int_hexagon_M4_and_andn>;
-def : T_RRR_pat <M4_xor_andn, int_hexagon_M4_xor_andn>;
-
-def : T_RRI_pat <S4_or_andi, int_hexagon_S4_or_andi>;
-def : T_RRI_pat <S4_or_andix, int_hexagon_S4_or_andix>;
-def : T_RRI_pat <S4_or_ori, int_hexagon_S4_or_ori>;
-
-// Modulo wrap.
-def : T_RR_pat <A4_modwrapu, int_hexagon_A4_modwrapu>;
-
-// Arithmetic/Convergent round
-// Rd=[cround|round](Rs,Rt)[:sat]
-// Rd=[cround|round](Rs,#u5)[:sat]
-def : T_RI_pat <A4_cround_ri, int_hexagon_A4_cround_ri>;
-def : T_RR_pat <A4_cround_rr, int_hexagon_A4_cround_rr>;
-
-def : T_RI_pat <A4_round_ri, int_hexagon_A4_round_ri>;
-def : T_RR_pat <A4_round_rr, int_hexagon_A4_round_rr>;
-
-def : T_RI_pat <A4_round_ri_sat, int_hexagon_A4_round_ri_sat>;
-def : T_RR_pat <A4_round_rr_sat, int_hexagon_A4_round_rr_sat>;
-
-def : T_P_pat <A2_roundsat, int_hexagon_A2_roundsat>;
Modified: llvm/trunk/lib/Target/Hexagon/HexagonIntrinsicsV5.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonIntrinsicsV5.td?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonIntrinsicsV5.td (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonIntrinsicsV5.td Fri Oct 19 10:31:11 2018
@@ -7,9 +7,314 @@
//
//===----------------------------------------------------------------------===//
+def : T_PR_pat <M2_vrcmpys_s1, int_hexagon_M2_vrcmpys_s1>;
+def : T_PPR_pat<M2_vrcmpys_acc_s1, int_hexagon_M2_vrcmpys_acc_s1>;
+def : T_PR_pat <M2_vrcmpys_s1rp, int_hexagon_M2_vrcmpys_s1rp>;
+
+// Vector reduce add unsigned halfwords
+def : T_PP_pat<M2_vradduh, int_hexagon_M2_vradduh>;
+
+def: T_RP_pat<A2_addsp, int_hexagon_A2_addsp>;
+def: T_PP_pat<A2_addpsat, int_hexagon_A2_addpsat>;
+def: T_PP_pat<A2_minp, int_hexagon_A2_minp>;
+def: T_PP_pat<A2_minup, int_hexagon_A2_minup>;
+def: T_PP_pat<A2_maxp, int_hexagon_A2_maxp>;
+def: T_PP_pat<A2_maxup, int_hexagon_A2_maxup>;
+
+// Vector reduce multiply word by signed half (32x16)
+//Rdd=vrmpyweh(Rss,Rtt)[:<<1]
+def : T_PP_pat <M4_vrmpyeh_s0, int_hexagon_M4_vrmpyeh_s0>;
+def : T_PP_pat <M4_vrmpyeh_s1, int_hexagon_M4_vrmpyeh_s1>;
+
+//Rdd=vrmpywoh(Rss,Rtt)[:<<1]
+def : T_PP_pat <M4_vrmpyoh_s0, int_hexagon_M4_vrmpyoh_s0>;
+def : T_PP_pat <M4_vrmpyoh_s1, int_hexagon_M4_vrmpyoh_s1>;
+
+//Rdd+=vrmpyweh(Rss,Rtt)[:<<1]
+def : T_PPP_pat <M4_vrmpyeh_acc_s0, int_hexagon_M4_vrmpyeh_acc_s0>;
+def : T_PPP_pat <M4_vrmpyeh_acc_s1, int_hexagon_M4_vrmpyeh_acc_s1>;
+
+//Rdd=vrmpywoh(Rss,Rtt)[:<<1]
+def : T_PPP_pat <M4_vrmpyoh_acc_s0, int_hexagon_M4_vrmpyoh_acc_s0>;
+def : T_PPP_pat <M4_vrmpyoh_acc_s1, int_hexagon_M4_vrmpyoh_acc_s1>;
+
+// Vector multiply halfwords, signed by unsigned
+// Rdd=vmpyhsu(Rs,Rt)[:<<1]:sat
+def : T_RR_pat <M2_vmpy2su_s0, int_hexagon_M2_vmpy2su_s0>;
+def : T_RR_pat <M2_vmpy2su_s1, int_hexagon_M2_vmpy2su_s1>;
+
+// Rxx+=vmpyhsu(Rs,Rt)[:<<1]:sat
+def : T_PRR_pat <M2_vmac2su_s0, int_hexagon_M2_vmac2su_s0>;
+def : T_PRR_pat <M2_vmac2su_s1, int_hexagon_M2_vmac2su_s1>;
+
+// Vector polynomial multiply halfwords
+// Rdd=vpmpyh(Rs,Rt)
+def : T_RR_pat <M4_vpmpyh, int_hexagon_M4_vpmpyh>;
+// Rxx[^]=vpmpyh(Rs,Rt)
+def : T_PRR_pat <M4_vpmpyh_acc, int_hexagon_M4_vpmpyh_acc>;
+
+// Polynomial multiply words
+// Rdd=pmpyw(Rs,Rt)
+def : T_RR_pat <M4_pmpyw, int_hexagon_M4_pmpyw>;
+// Rxx^=pmpyw(Rs,Rt)
+def : T_PRR_pat <M4_pmpyw_acc, int_hexagon_M4_pmpyw_acc>;
+
+//Rxx^=asr(Rss,Rt)
+def : T_PPR_pat <S2_asr_r_p_xor, int_hexagon_S2_asr_r_p_xor>;
+//Rxx^=asl(Rss,Rt)
+def : T_PPR_pat <S2_asl_r_p_xor, int_hexagon_S2_asl_r_p_xor>;
+//Rxx^=lsr(Rss,Rt)
+def : T_PPR_pat <S2_lsr_r_p_xor, int_hexagon_S2_lsr_r_p_xor>;
+//Rxx^=lsl(Rss,Rt)
+def : T_PPR_pat <S2_lsl_r_p_xor, int_hexagon_S2_lsl_r_p_xor>;
+
+// Multiply and use upper result
+def : T_RR_pat <M2_mpysu_up, int_hexagon_M2_mpysu_up>;
+def : T_RR_pat <M2_mpy_up_s1, int_hexagon_M2_mpy_up_s1>;
+def : T_RR_pat <M2_hmmpyh_s1, int_hexagon_M2_hmmpyh_s1>;
+def : T_RR_pat <M2_hmmpyl_s1, int_hexagon_M2_hmmpyl_s1>;
+def : T_RR_pat <M2_mpy_up_s1_sat, int_hexagon_M2_mpy_up_s1_sat>;
+
+def : T_PP_pat <A2_vaddub, int_hexagon_A2_vaddb_map>;
+def : T_PP_pat <A2_vsubub, int_hexagon_A2_vsubb_map>;
+
+// Vector reduce add unsigned halfwords
+def : T_PP_pat <M2_vraddh, int_hexagon_M2_vraddh>;
+
+def: T_P_pat<S2_brevp, int_hexagon_S2_brevp>;
+def: T_P_pat<S2_ct0p, int_hexagon_S2_ct0p>;
+def: T_P_pat<S2_ct1p, int_hexagon_S2_ct1p>;
+
+def: T_Q_RR_pat<C4_nbitsset, int_hexagon_C4_nbitsset>;
+def: T_Q_RR_pat<C4_nbitsclr, int_hexagon_C4_nbitsclr>;
+def: T_Q_RI_pat<C4_nbitsclri, int_hexagon_C4_nbitsclri>;
+
+def : T_Q_PI_pat<A4_vcmpbeqi, int_hexagon_A4_vcmpbeqi>;
+def : T_Q_PI_pat<A4_vcmpbgti, int_hexagon_A4_vcmpbgti>;
+def : T_Q_PI_pat<A4_vcmpbgtui, int_hexagon_A4_vcmpbgtui>;
+def : T_Q_PI_pat<A4_vcmpheqi, int_hexagon_A4_vcmpheqi>;
+def : T_Q_PI_pat<A4_vcmphgti, int_hexagon_A4_vcmphgti>;
+def : T_Q_PI_pat<A4_vcmphgtui, int_hexagon_A4_vcmphgtui>;
+def : T_Q_PI_pat<A4_vcmpweqi, int_hexagon_A4_vcmpweqi>;
+def : T_Q_PI_pat<A4_vcmpwgti, int_hexagon_A4_vcmpwgti>;
+def : T_Q_PI_pat<A4_vcmpwgtui, int_hexagon_A4_vcmpwgtui>;
+def : T_Q_PP_pat<A4_vcmpbeq_any, int_hexagon_A4_vcmpbeq_any>;
+
+def : T_Q_RR_pat<A4_cmpbeq, int_hexagon_A4_cmpbeq>;
+def : T_Q_RR_pat<A4_cmpbgt, int_hexagon_A4_cmpbgt>;
+def : T_Q_RR_pat<A4_cmpbgtu, int_hexagon_A4_cmpbgtu>;
+def : T_Q_RR_pat<A4_cmpheq, int_hexagon_A4_cmpheq>;
+def : T_Q_RR_pat<A4_cmphgt, int_hexagon_A4_cmphgt>;
+def : T_Q_RR_pat<A4_cmphgtu, int_hexagon_A4_cmphgtu>;
+
+def : T_Q_RI_pat<A4_cmpbeqi, int_hexagon_A4_cmpbeqi>;
+def : T_Q_RI_pat<A4_cmpbgti, int_hexagon_A4_cmpbgti>;
+def : T_Q_RI_pat<A4_cmpbgtui, int_hexagon_A4_cmpbgtui>;
+
+def : T_Q_RI_pat<A4_cmpheqi, int_hexagon_A4_cmpheqi>;
+def : T_Q_RI_pat<A4_cmphgti, int_hexagon_A4_cmphgti>;
+def : T_Q_RI_pat<A4_cmphgtui, int_hexagon_A4_cmphgtui>;
+
+def : T_Q_RP_pat<A4_boundscheck, int_hexagon_A4_boundscheck>;
+def : T_Q_PR_pat<A4_tlbmatch, int_hexagon_A4_tlbmatch>;
+
+def : T_RRR_pat <M4_mpyrr_addr, int_hexagon_M4_mpyrr_addr>;
+def : T_IRR_pat <M4_mpyrr_addi, int_hexagon_M4_mpyrr_addi>;
+def : T_IRI_pat <M4_mpyri_addi, int_hexagon_M4_mpyri_addi>;
+def : T_RIR_pat <M4_mpyri_addr_u2, int_hexagon_M4_mpyri_addr_u2>;
+def : T_RRI_pat <M4_mpyri_addr, int_hexagon_M4_mpyri_addr>;
+def : T_RRR_pat <M4_mac_up_s1_sat, int_hexagon_M4_mac_up_s1_sat>;
+def : T_RRR_pat <M4_nac_up_s1_sat, int_hexagon_M4_nac_up_s1_sat>;
+
+// Complex multiply 32x16
+def : T_PR_pat <M4_cmpyi_wh, int_hexagon_M4_cmpyi_wh>;
+def : T_PR_pat <M4_cmpyr_wh, int_hexagon_M4_cmpyr_wh>;
+
+def : T_PR_pat <M4_cmpyi_whc, int_hexagon_M4_cmpyi_whc>;
+def : T_PR_pat <M4_cmpyr_whc, int_hexagon_M4_cmpyr_whc>;
+
+def : T_PP_pat<A4_andnp, int_hexagon_A4_andnp>;
+def : T_PP_pat<A4_ornp, int_hexagon_A4_ornp>;
+
+// Complex add/sub halfwords/words
+def : T_PP_pat <S4_vxaddsubw, int_hexagon_S4_vxaddsubw>;
+def : T_PP_pat <S4_vxsubaddw, int_hexagon_S4_vxsubaddw>;
+def : T_PP_pat <S4_vxaddsubh, int_hexagon_S4_vxaddsubh>;
+def : T_PP_pat <S4_vxsubaddh, int_hexagon_S4_vxsubaddh>;
+
+def : T_PP_pat <S4_vxaddsubhr, int_hexagon_S4_vxaddsubhr>;
+def : T_PP_pat <S4_vxsubaddhr, int_hexagon_S4_vxsubaddhr>;
+
+// Extract bitfield
+def : T_PP_pat <S4_extractp_rp, int_hexagon_S4_extractp_rp>;
+def : T_RP_pat <S4_extract_rp, int_hexagon_S4_extract_rp>;
+def : T_PII_pat <S4_extractp, int_hexagon_S4_extractp>;
+def : T_RII_pat <S4_extract, int_hexagon_S4_extract>;
+
+// Vector conditional negate
+// Rdd=vcnegh(Rss,Rt)
+def : T_PR_pat <S2_vcnegh, int_hexagon_S2_vcnegh>;
+
+// Shift an immediate left by register amount
+def : T_IR_pat<S4_lsli, int_hexagon_S4_lsli>;
+
+// Vector reduce maximum halfwords
+def : T_PPR_pat <A4_vrmaxh, int_hexagon_A4_vrmaxh>;
+def : T_PPR_pat <A4_vrmaxuh, int_hexagon_A4_vrmaxuh>;
+
+// Vector reduce maximum words
+def : T_PPR_pat <A4_vrmaxw, int_hexagon_A4_vrmaxw>;
+def : T_PPR_pat <A4_vrmaxuw, int_hexagon_A4_vrmaxuw>;
+
+// Vector reduce minimum halfwords
+def : T_PPR_pat <A4_vrminh, int_hexagon_A4_vrminh>;
+def : T_PPR_pat <A4_vrminuh, int_hexagon_A4_vrminuh>;
+
+// Vector reduce minimum words
+def : T_PPR_pat <A4_vrminw, int_hexagon_A4_vrminw>;
+def : T_PPR_pat <A4_vrminuw, int_hexagon_A4_vrminuw>;
+
+// Rotate and reduce bytes
+def : Pat <(int_hexagon_S4_vrcrotate DoubleRegs:$src1, IntRegs:$src2,
+ u2_0ImmPred:$src3),
+ (S4_vrcrotate DoubleRegs:$src1, IntRegs:$src2, u2_0ImmPred:$src3)>;
+
+// Rotate and reduce bytes with accumulation
+// Rxx+=vrcrotate(Rss,Rt,#u2)
+def : Pat <(int_hexagon_S4_vrcrotate_acc DoubleRegs:$src1, DoubleRegs:$src2,
+ IntRegs:$src3, u2_0ImmPred:$src4),
+ (S4_vrcrotate_acc DoubleRegs:$src1, DoubleRegs:$src2,
+ IntRegs:$src3, u2_0ImmPred:$src4)>;
+
+// Vector conditional negate
+def : T_PPR_pat<S2_vrcnegh, int_hexagon_S2_vrcnegh>;
+
+// Logical xor with xor accumulation
+def : T_PPP_pat<M4_xor_xacc, int_hexagon_M4_xor_xacc>;
+
+// ALU64 - Vector min/max byte
+def : T_PP_pat <A2_vminb, int_hexagon_A2_vminb>;
+def : T_PP_pat <A2_vmaxb, int_hexagon_A2_vmaxb>;
+
+// Shift and add/sub/and/or
+def : T_IRI_pat <S4_andi_asl_ri, int_hexagon_S4_andi_asl_ri>;
+def : T_IRI_pat <S4_ori_asl_ri, int_hexagon_S4_ori_asl_ri>;
+def : T_IRI_pat <S4_addi_asl_ri, int_hexagon_S4_addi_asl_ri>;
+def : T_IRI_pat <S4_subi_asl_ri, int_hexagon_S4_subi_asl_ri>;
+def : T_IRI_pat <S4_andi_lsr_ri, int_hexagon_S4_andi_lsr_ri>;
+def : T_IRI_pat <S4_ori_lsr_ri, int_hexagon_S4_ori_lsr_ri>;
+def : T_IRI_pat <S4_addi_lsr_ri, int_hexagon_S4_addi_lsr_ri>;
+def : T_IRI_pat <S4_subi_lsr_ri, int_hexagon_S4_subi_lsr_ri>;
+
+// Split bitfield
+def : T_RI_pat <A4_bitspliti, int_hexagon_A4_bitspliti>;
+def : T_RR_pat <A4_bitsplit, int_hexagon_A4_bitsplit>;
+
+def: T_RR_pat<S4_parity, int_hexagon_S4_parity>;
+
+def: T_Q_RI_pat<S4_ntstbit_i, int_hexagon_S4_ntstbit_i>;
+def: T_Q_RR_pat<S4_ntstbit_r, int_hexagon_S4_ntstbit_r>;
+
+def: T_RI_pat<S4_clbaddi, int_hexagon_S4_clbaddi>;
+def: T_PI_pat<S4_clbpaddi, int_hexagon_S4_clbpaddi>;
+def: T_P_pat <S4_clbpnorm, int_hexagon_S4_clbpnorm>;
+
+//*******************************************************************
+// ALU32/ALU
+//*******************************************************************
+
+// ALU32 / ALU / Logical Operations.
+def: T_RR_pat<A4_andn, int_hexagon_A4_andn>;
+def: T_RR_pat<A4_orn, int_hexagon_A4_orn>;
+
+//*******************************************************************
+// ALU32/PERM
+//*******************************************************************
+
+// Combine Words Into Doublewords.
+def: T_RI_pat<A4_combineri, int_hexagon_A4_combineri, s32_0ImmPred>;
+def: T_IR_pat<A4_combineir, int_hexagon_A4_combineir, s32_0ImmPred>;
+
+//*******************************************************************
+// ALU32/PRED
+//*******************************************************************
+
+// Compare
+def : T_Q_RI_pat<C4_cmpneqi, int_hexagon_C4_cmpneqi, s32_0ImmPred>;
+def : T_Q_RI_pat<C4_cmpltei, int_hexagon_C4_cmpltei, s32_0ImmPred>;
+def : T_Q_RI_pat<C4_cmplteui, int_hexagon_C4_cmplteui, u32_0ImmPred>;
+
+// Compare To General Register.
+def: T_Q_RR_pat<C4_cmpneq, int_hexagon_C4_cmpneq>;
+def: T_Q_RR_pat<C4_cmplte, int_hexagon_C4_cmplte>;
+def: T_Q_RR_pat<C4_cmplteu, int_hexagon_C4_cmplteu>;
+
+def: T_RR_pat<A4_rcmpeq, int_hexagon_A4_rcmpeq>;
+def: T_RR_pat<A4_rcmpneq, int_hexagon_A4_rcmpneq>;
+
+def: T_RI_pat<A4_rcmpeqi, int_hexagon_A4_rcmpeqi>;
+def: T_RI_pat<A4_rcmpneqi, int_hexagon_A4_rcmpneqi>;
+
+//*******************************************************************
+// CR
+//*******************************************************************
+
+// CR / Logical Operations On Predicates.
+def: T_Q_QQQ_pat<C4_and_and, int_hexagon_C4_and_and>;
+def: T_Q_QQQ_pat<C4_and_andn, int_hexagon_C4_and_andn>;
+def: T_Q_QQQ_pat<C4_and_or, int_hexagon_C4_and_or>;
+def: T_Q_QQQ_pat<C4_and_orn, int_hexagon_C4_and_orn>;
+def: T_Q_QQQ_pat<C4_or_and, int_hexagon_C4_or_and>;
+def: T_Q_QQQ_pat<C4_or_andn, int_hexagon_C4_or_andn>;
+def: T_Q_QQQ_pat<C4_or_or, int_hexagon_C4_or_or>;
+def: T_Q_QQQ_pat<C4_or_orn, int_hexagon_C4_or_orn>;
+
+//*******************************************************************
+// XTYPE/ALU
+//*******************************************************************
+
+// Add And Accumulate.
+
+def : T_RRI_pat <S4_addaddi, int_hexagon_S4_addaddi>;
+def : T_RIR_pat <S4_subaddi, int_hexagon_S4_subaddi>;
+
+
+// XTYPE / ALU / Logical-logical Words.
+def : T_RRR_pat <M4_or_xor, int_hexagon_M4_or_xor>;
+def : T_RRR_pat <M4_and_xor, int_hexagon_M4_and_xor>;
+def : T_RRR_pat <M4_or_and, int_hexagon_M4_or_and>;
+def : T_RRR_pat <M4_and_and, int_hexagon_M4_and_and>;
+def : T_RRR_pat <M4_xor_and, int_hexagon_M4_xor_and>;
+def : T_RRR_pat <M4_or_or, int_hexagon_M4_or_or>;
+def : T_RRR_pat <M4_and_or, int_hexagon_M4_and_or>;
+def : T_RRR_pat <M4_xor_or, int_hexagon_M4_xor_or>;
+def : T_RRR_pat <M4_or_andn, int_hexagon_M4_or_andn>;
+def : T_RRR_pat <M4_and_andn, int_hexagon_M4_and_andn>;
+def : T_RRR_pat <M4_xor_andn, int_hexagon_M4_xor_andn>;
+
+def : T_RRI_pat <S4_or_andi, int_hexagon_S4_or_andi>;
+def : T_RRI_pat <S4_or_andix, int_hexagon_S4_or_andix>;
+def : T_RRI_pat <S4_or_ori, int_hexagon_S4_or_ori>;
+
+// Modulo wrap.
+def : T_RR_pat <A4_modwrapu, int_hexagon_A4_modwrapu>;
+
+// Arithmetic/Convergent round
+// Rd=[cround|round](Rs,Rt)[:sat]
+// Rd=[cround|round](Rs,#u5)[:sat]
+def : T_RI_pat <A4_cround_ri, int_hexagon_A4_cround_ri>;
+def : T_RR_pat <A4_cround_rr, int_hexagon_A4_cround_rr>;
+
+def : T_RI_pat <A4_round_ri, int_hexagon_A4_round_ri>;
+def : T_RR_pat <A4_round_rr, int_hexagon_A4_round_rr>;
+
+def : T_RI_pat <A4_round_ri_sat, int_hexagon_A4_round_ri_sat>;
+def : T_RR_pat <A4_round_rr_sat, int_hexagon_A4_round_rr_sat>;
+
+def : T_P_pat <A2_roundsat, int_hexagon_A2_roundsat>;
+
//Rdd[+]=vrmpybsu(Rss,Rtt)
//Rdd[+]=vrmpybuu(Rss,Rtt)
-let Predicates = [HasV5] in {
def : T_PP_pat <M5_vrmpybsu, int_hexagon_M5_vrmpybsu>;
def : T_PP_pat <M5_vrmpybuu, int_hexagon_M5_vrmpybuu>;
@@ -31,7 +336,6 @@ def : T_PRR_pat <M5_vmacbuu, int_hexagon
// Rd=vaddhub(Rss,Rtt):sat
def : T_PP_pat <A5_vaddhubs, int_hexagon_A5_vaddhubs>;
-}
def : T_FF_pat<F2_sfadd, int_hexagon_F2_sfadd>;
def : T_FF_pat<F2_sfsub, int_hexagon_F2_sfsub>;
Modified: llvm/trunk/lib/Target/Hexagon/HexagonPatterns.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonPatterns.td?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonPatterns.td (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonPatterns.td Fri Oct 19 10:31:11 2018
@@ -365,38 +365,34 @@ def ToI32: OutPatFrag<(ops node:$V), (A2
// --(2) Type cast -------------------------------------------------------
//
-let Predicates = [HasV5] in {
- def: OpR_R_pat<F2_conv_sf2df, pf1<fpextend>, f64, F32>;
- def: OpR_R_pat<F2_conv_df2sf, pf1<fpround>, f32, F64>;
-
- def: OpR_R_pat<F2_conv_w2sf, pf1<sint_to_fp>, f32, I32>;
- def: OpR_R_pat<F2_conv_d2sf, pf1<sint_to_fp>, f32, I64>;
- def: OpR_R_pat<F2_conv_w2df, pf1<sint_to_fp>, f64, I32>;
- def: OpR_R_pat<F2_conv_d2df, pf1<sint_to_fp>, f64, I64>;
-
- def: OpR_R_pat<F2_conv_uw2sf, pf1<uint_to_fp>, f32, I32>;
- def: OpR_R_pat<F2_conv_ud2sf, pf1<uint_to_fp>, f32, I64>;
- def: OpR_R_pat<F2_conv_uw2df, pf1<uint_to_fp>, f64, I32>;
- def: OpR_R_pat<F2_conv_ud2df, pf1<uint_to_fp>, f64, I64>;
-
- def: OpR_R_pat<F2_conv_sf2w_chop, pf1<fp_to_sint>, i32, F32>;
- def: OpR_R_pat<F2_conv_df2w_chop, pf1<fp_to_sint>, i32, F64>;
- def: OpR_R_pat<F2_conv_sf2d_chop, pf1<fp_to_sint>, i64, F32>;
- def: OpR_R_pat<F2_conv_df2d_chop, pf1<fp_to_sint>, i64, F64>;
-
- def: OpR_R_pat<F2_conv_sf2uw_chop, pf1<fp_to_uint>, i32, F32>;
- def: OpR_R_pat<F2_conv_df2uw_chop, pf1<fp_to_uint>, i32, F64>;
- def: OpR_R_pat<F2_conv_sf2ud_chop, pf1<fp_to_uint>, i64, F32>;
- def: OpR_R_pat<F2_conv_df2ud_chop, pf1<fp_to_uint>, i64, F64>;
-}
+def: OpR_R_pat<F2_conv_sf2df, pf1<fpextend>, f64, F32>;
+def: OpR_R_pat<F2_conv_df2sf, pf1<fpround>, f32, F64>;
+
+def: OpR_R_pat<F2_conv_w2sf, pf1<sint_to_fp>, f32, I32>;
+def: OpR_R_pat<F2_conv_d2sf, pf1<sint_to_fp>, f32, I64>;
+def: OpR_R_pat<F2_conv_w2df, pf1<sint_to_fp>, f64, I32>;
+def: OpR_R_pat<F2_conv_d2df, pf1<sint_to_fp>, f64, I64>;
+
+def: OpR_R_pat<F2_conv_uw2sf, pf1<uint_to_fp>, f32, I32>;
+def: OpR_R_pat<F2_conv_ud2sf, pf1<uint_to_fp>, f32, I64>;
+def: OpR_R_pat<F2_conv_uw2df, pf1<uint_to_fp>, f64, I32>;
+def: OpR_R_pat<F2_conv_ud2df, pf1<uint_to_fp>, f64, I64>;
+
+def: OpR_R_pat<F2_conv_sf2w_chop, pf1<fp_to_sint>, i32, F32>;
+def: OpR_R_pat<F2_conv_df2w_chop, pf1<fp_to_sint>, i32, F64>;
+def: OpR_R_pat<F2_conv_sf2d_chop, pf1<fp_to_sint>, i64, F32>;
+def: OpR_R_pat<F2_conv_df2d_chop, pf1<fp_to_sint>, i64, F64>;
+
+def: OpR_R_pat<F2_conv_sf2uw_chop, pf1<fp_to_uint>, i32, F32>;
+def: OpR_R_pat<F2_conv_df2uw_chop, pf1<fp_to_uint>, i32, F64>;
+def: OpR_R_pat<F2_conv_sf2ud_chop, pf1<fp_to_uint>, i64, F32>;
+def: OpR_R_pat<F2_conv_df2ud_chop, pf1<fp_to_uint>, i64, F64>;
// Bitcast is different than [fp|sint|uint]_to_[sint|uint|fp].
-let Predicates = [HasV5] in {
- def: Pat<(i32 (bitconvert F32:$v)), (I32:$v)>;
- def: Pat<(f32 (bitconvert I32:$v)), (F32:$v)>;
- def: Pat<(i64 (bitconvert F64:$v)), (I64:$v)>;
- def: Pat<(f64 (bitconvert I64:$v)), (F64:$v)>;
-}
+def: Pat<(i32 (bitconvert F32:$v)), (I32:$v)>;
+def: Pat<(f32 (bitconvert I32:$v)), (F32:$v)>;
+def: Pat<(i64 (bitconvert F64:$v)), (I64:$v)>;
+def: Pat<(f64 (bitconvert I64:$v)), (F64:$v)>;
multiclass Cast_pat<ValueType Ta, ValueType Tb, RegisterClass RC> {
def: Pat<(Tb (bitconvert (Ta RC:$Rs))), (Tb RC:$Rs)>;
@@ -599,31 +595,29 @@ def: OpR_RR_pat<A2_vcmpwgtu, RevCmp<set
def: OpR_RR_pat<A2_vcmpwgtu, setugt, i1, V2I32>;
def: OpR_RR_pat<A2_vcmpwgtu, setugt, v2i1, V2I32>;
-let Predicates = [HasV5] in {
- def: OpR_RR_pat<F2_sfcmpeq, seteq, i1, F32>;
- def: OpR_RR_pat<F2_sfcmpgt, setgt, i1, F32>;
- def: OpR_RR_pat<F2_sfcmpge, setge, i1, F32>;
- def: OpR_RR_pat<F2_sfcmpeq, setoeq, i1, F32>;
- def: OpR_RR_pat<F2_sfcmpgt, setogt, i1, F32>;
- def: OpR_RR_pat<F2_sfcmpge, setoge, i1, F32>;
- def: OpR_RR_pat<F2_sfcmpgt, RevCmp<setolt>, i1, F32>;
- def: OpR_RR_pat<F2_sfcmpge, RevCmp<setole>, i1, F32>;
- def: OpR_RR_pat<F2_sfcmpgt, RevCmp<setlt>, i1, F32>;
- def: OpR_RR_pat<F2_sfcmpge, RevCmp<setle>, i1, F32>;
- def: OpR_RR_pat<F2_sfcmpuo, setuo, i1, F32>;
-
- def: OpR_RR_pat<F2_dfcmpeq, seteq, i1, F64>;
- def: OpR_RR_pat<F2_dfcmpgt, setgt, i1, F64>;
- def: OpR_RR_pat<F2_dfcmpge, setge, i1, F64>;
- def: OpR_RR_pat<F2_dfcmpeq, setoeq, i1, F64>;
- def: OpR_RR_pat<F2_dfcmpgt, setogt, i1, F64>;
- def: OpR_RR_pat<F2_dfcmpge, setoge, i1, F64>;
- def: OpR_RR_pat<F2_dfcmpgt, RevCmp<setolt>, i1, F64>;
- def: OpR_RR_pat<F2_dfcmpge, RevCmp<setole>, i1, F64>;
- def: OpR_RR_pat<F2_dfcmpgt, RevCmp<setlt>, i1, F64>;
- def: OpR_RR_pat<F2_dfcmpge, RevCmp<setle>, i1, F64>;
- def: OpR_RR_pat<F2_dfcmpuo, setuo, i1, F64>;
-}
+def: OpR_RR_pat<F2_sfcmpeq, seteq, i1, F32>;
+def: OpR_RR_pat<F2_sfcmpgt, setgt, i1, F32>;
+def: OpR_RR_pat<F2_sfcmpge, setge, i1, F32>;
+def: OpR_RR_pat<F2_sfcmpeq, setoeq, i1, F32>;
+def: OpR_RR_pat<F2_sfcmpgt, setogt, i1, F32>;
+def: OpR_RR_pat<F2_sfcmpge, setoge, i1, F32>;
+def: OpR_RR_pat<F2_sfcmpgt, RevCmp<setolt>, i1, F32>;
+def: OpR_RR_pat<F2_sfcmpge, RevCmp<setole>, i1, F32>;
+def: OpR_RR_pat<F2_sfcmpgt, RevCmp<setlt>, i1, F32>;
+def: OpR_RR_pat<F2_sfcmpge, RevCmp<setle>, i1, F32>;
+def: OpR_RR_pat<F2_sfcmpuo, setuo, i1, F32>;
+
+def: OpR_RR_pat<F2_dfcmpeq, seteq, i1, F64>;
+def: OpR_RR_pat<F2_dfcmpgt, setgt, i1, F64>;
+def: OpR_RR_pat<F2_dfcmpge, setge, i1, F64>;
+def: OpR_RR_pat<F2_dfcmpeq, setoeq, i1, F64>;
+def: OpR_RR_pat<F2_dfcmpgt, setogt, i1, F64>;
+def: OpR_RR_pat<F2_dfcmpge, setoge, i1, F64>;
+def: OpR_RR_pat<F2_dfcmpgt, RevCmp<setolt>, i1, F64>;
+def: OpR_RR_pat<F2_dfcmpge, RevCmp<setole>, i1, F64>;
+def: OpR_RR_pat<F2_dfcmpgt, RevCmp<setlt>, i1, F64>;
+def: OpR_RR_pat<F2_dfcmpge, RevCmp<setle>, i1, F64>;
+def: OpR_RR_pat<F2_dfcmpuo, setuo, i1, F64>;
// Avoid C4_cmpneqi, C4_cmpltei, C4_cmplteui, since they cannot form compounds.
@@ -746,32 +740,28 @@ class Cmpud<InstHexagon MI>: T3<C2_or,
class Cmpufn<InstHexagon MI>: T3<C2_orn, F2_sfcmpuo, MI>;
class Cmpudn<InstHexagon MI>: T3<C2_orn, F2_dfcmpuo, MI>;
-let Predicates = [HasV5] in {
- def: OpmR_RR_pat<Cmpuf<F2_sfcmpeq>, setueq, i1, F32>;
- def: OpmR_RR_pat<Cmpuf<F2_sfcmpge>, setuge, i1, F32>;
- def: OpmR_RR_pat<Cmpuf<F2_sfcmpgt>, setugt, i1, F32>;
- def: OpmR_RR_pat<Cmpuf<F2_sfcmpge>, RevCmp<setule>, i1, F32>;
- def: OpmR_RR_pat<Cmpuf<F2_sfcmpgt>, RevCmp<setult>, i1, F32>;
- def: OpmR_RR_pat<Cmpufn<F2_sfcmpeq>, setune, i1, F32>;
-
- def: OpmR_RR_pat<Cmpud<F2_dfcmpeq>, setueq, i1, F64>;
- def: OpmR_RR_pat<Cmpud<F2_dfcmpge>, setuge, i1, F64>;
- def: OpmR_RR_pat<Cmpud<F2_dfcmpgt>, setugt, i1, F64>;
- def: OpmR_RR_pat<Cmpud<F2_dfcmpge>, RevCmp<setule>, i1, F64>;
- def: OpmR_RR_pat<Cmpud<F2_dfcmpgt>, RevCmp<setult>, i1, F64>;
- def: OpmR_RR_pat<Cmpudn<F2_dfcmpeq>, setune, i1, F64>;
-}
-
-let Predicates = [HasV5] in {
- def: OpmR_RR_pat<Outn<F2_sfcmpeq>, setone, i1, F32>;
- def: OpmR_RR_pat<Outn<F2_sfcmpeq>, setne, i1, F32>;
+def: OpmR_RR_pat<Cmpuf<F2_sfcmpeq>, setueq, i1, F32>;
+def: OpmR_RR_pat<Cmpuf<F2_sfcmpge>, setuge, i1, F32>;
+def: OpmR_RR_pat<Cmpuf<F2_sfcmpgt>, setugt, i1, F32>;
+def: OpmR_RR_pat<Cmpuf<F2_sfcmpge>, RevCmp<setule>, i1, F32>;
+def: OpmR_RR_pat<Cmpuf<F2_sfcmpgt>, RevCmp<setult>, i1, F32>;
+def: OpmR_RR_pat<Cmpufn<F2_sfcmpeq>, setune, i1, F32>;
+
+def: OpmR_RR_pat<Cmpud<F2_dfcmpeq>, setueq, i1, F64>;
+def: OpmR_RR_pat<Cmpud<F2_dfcmpge>, setuge, i1, F64>;
+def: OpmR_RR_pat<Cmpud<F2_dfcmpgt>, setugt, i1, F64>;
+def: OpmR_RR_pat<Cmpud<F2_dfcmpge>, RevCmp<setule>, i1, F64>;
+def: OpmR_RR_pat<Cmpud<F2_dfcmpgt>, RevCmp<setult>, i1, F64>;
+def: OpmR_RR_pat<Cmpudn<F2_dfcmpeq>, setune, i1, F64>;
- def: OpmR_RR_pat<Outn<F2_dfcmpeq>, setone, i1, F64>;
- def: OpmR_RR_pat<Outn<F2_dfcmpeq>, setne, i1, F64>;
+def: OpmR_RR_pat<Outn<F2_sfcmpeq>, setone, i1, F32>;
+def: OpmR_RR_pat<Outn<F2_sfcmpeq>, setne, i1, F32>;
- def: OpmR_RR_pat<Outn<F2_sfcmpuo>, seto, i1, F32>;
- def: OpmR_RR_pat<Outn<F2_dfcmpuo>, seto, i1, F64>;
-}
+def: OpmR_RR_pat<Outn<F2_dfcmpeq>, setone, i1, F64>;
+def: OpmR_RR_pat<Outn<F2_dfcmpeq>, setne, i1, F64>;
+
+def: OpmR_RR_pat<Outn<F2_sfcmpuo>, seto, i1, F32>;
+def: OpmR_RR_pat<Outn<F2_dfcmpuo>, seto, i1, F64>;
// --(6) Select ----------------------------------------------------------
@@ -801,27 +791,25 @@ def: Pat<(select I1:$Pu, I64:$Rs, I64:$R
(Combinew (C2_mux I1:$Pu, (HiReg $Rs), (HiReg $Rt)),
(C2_mux I1:$Pu, (LoReg $Rs), (LoReg $Rt)))>;
-let Predicates = [HasV5] in {
- def: Pat<(select I1:$Pu, F32:$Rs, f32ImmPred:$I),
- (C2_muxir I1:$Pu, F32:$Rs, (ftoi $I))>;
- def: Pat<(select I1:$Pu, f32ImmPred:$I, F32:$Rt),
- (C2_muxri I1:$Pu, (ftoi $I), F32:$Rt)>;
- def: Pat<(select I1:$Pu, F32:$Rs, F32:$Rt),
- (C2_mux I1:$Pu, F32:$Rs, F32:$Rt)>;
- def: Pat<(select I1:$Pu, F64:$Rs, F64:$Rt),
- (Combinew (C2_mux I1:$Pu, (HiReg $Rs), (HiReg $Rt)),
- (C2_mux I1:$Pu, (LoReg $Rs), (LoReg $Rt)))>;
-
- def: Pat<(select (i1 (setult F32:$Ra, F32:$Rb)), F32:$Rs, F32:$Rt),
- (C2_mux (F2_sfcmpgt F32:$Rb, F32:$Ra), F32:$Rs, F32:$Rt)>;
- def: Pat<(select (i1 (setult F64:$Ra, F64:$Rb)), F64:$Rs, F64:$Rt),
- (C2_vmux (F2_dfcmpgt F64:$Rb, F64:$Ra), F64:$Rs, F64:$Rt)>;
-
- def: Pat<(select (not I1:$Pu), f32ImmPred:$I, F32:$Rs),
- (C2_muxir I1:$Pu, F32:$Rs, (ftoi $I))>;
- def: Pat<(select (not I1:$Pu), F32:$Rt, f32ImmPred:$I),
- (C2_muxri I1:$Pu, (ftoi $I), F32:$Rt)>;
-}
+def: Pat<(select I1:$Pu, F32:$Rs, f32ImmPred:$I),
+ (C2_muxir I1:$Pu, F32:$Rs, (ftoi $I))>;
+def: Pat<(select I1:$Pu, f32ImmPred:$I, F32:$Rt),
+ (C2_muxri I1:$Pu, (ftoi $I), F32:$Rt)>;
+def: Pat<(select I1:$Pu, F32:$Rs, F32:$Rt),
+ (C2_mux I1:$Pu, F32:$Rs, F32:$Rt)>;
+def: Pat<(select I1:$Pu, F64:$Rs, F64:$Rt),
+ (Combinew (C2_mux I1:$Pu, (HiReg $Rs), (HiReg $Rt)),
+ (C2_mux I1:$Pu, (LoReg $Rs), (LoReg $Rt)))>;
+
+def: Pat<(select (i1 (setult F32:$Ra, F32:$Rb)), F32:$Rs, F32:$Rt),
+ (C2_mux (F2_sfcmpgt F32:$Rb, F32:$Ra), F32:$Rs, F32:$Rt)>;
+def: Pat<(select (i1 (setult F64:$Ra, F64:$Rb)), F64:$Rs, F64:$Rt),
+ (C2_vmux (F2_dfcmpgt F64:$Rb, F64:$Ra), F64:$Rs, F64:$Rt)>;
+
+def: Pat<(select (not I1:$Pu), f32ImmPred:$I, F32:$Rs),
+ (C2_muxir I1:$Pu, F32:$Rs, (ftoi $I))>;
+def: Pat<(select (not I1:$Pu), F32:$Rt, f32ImmPred:$I),
+ (C2_muxri I1:$Pu, (ftoi $I), F32:$Rt)>;
def: Pat<(select I1:$Pu, V4I8:$Rs, V4I8:$Rt),
(LoReg (C2_vmux I1:$Pu, (ToZext64 $Rs), (ToZext64 $Rt)))>;
@@ -889,7 +877,7 @@ let AddedComplexity = 200 in {
defm: SelMinMax_pats<setult, I64, A2_minup, A2_maxup>;
}
-let AddedComplexity = 100, Predicates = [HasV5] in {
+let AddedComplexity = 100 in {
defm: SelMinMax_pats<setolt, F32, F2_sfmin, F2_sfmax>;
defm: SelMinMax_pats<setole, F32, F2_sfmin, F2_sfmax>;
defm: SelMinMax_pats<setogt, F32, F2_sfmax, F2_sfmin>;
@@ -1014,7 +1002,7 @@ let Predicates = [HasV60] in {
def: Pat<(sra (add (sra I32:$Rs, u5_0ImmPred:$u5), 1), (i32 1)),
(S2_asr_i_r_rnd I32:$Rs, imm:$u5)>;
def: Pat<(sra (add (sra I64:$Rs, u6_0ImmPred:$u6), 1), (i32 1)),
- (S2_asr_i_p_rnd I64:$Rs, imm:$u6)>, Requires<[HasV5]>;
+ (S2_asr_i_p_rnd I64:$Rs, imm:$u6)>;
// Prefer S2_addasl_rrri over S2_asl_i_r_acc.
let AddedComplexity = 120 in
@@ -1191,17 +1179,15 @@ def: Pat<(not I32:$Rs), (A2_subri -1, I
def: Pat<(not I64:$Rs), (A2_notp I64:$Rs)>;
def: Pat<(ineg I64:$Rs), (A2_negp I64:$Rs)>;
-let Predicates = [HasV5] in {
- def: Pat<(fabs F32:$Rs), (S2_clrbit_i F32:$Rs, 31)>;
- def: Pat<(fneg F32:$Rs), (S2_togglebit_i F32:$Rs, 31)>;
-
- def: Pat<(fabs F64:$Rs),
- (Combinew (S2_clrbit_i (HiReg $Rs), 31),
- (i32 (LoReg $Rs)))>;
- def: Pat<(fneg F64:$Rs),
- (Combinew (S2_togglebit_i (HiReg $Rs), 31),
- (i32 (LoReg $Rs)))>;
-}
+def: Pat<(fabs F32:$Rs), (S2_clrbit_i F32:$Rs, 31)>;
+def: Pat<(fneg F32:$Rs), (S2_togglebit_i F32:$Rs, 31)>;
+
+def: Pat<(fabs F64:$Rs),
+ (Combinew (S2_clrbit_i (HiReg $Rs), 31),
+ (i32 (LoReg $Rs)))>;
+def: Pat<(fneg F64:$Rs),
+ (Combinew (S2_togglebit_i (HiReg $Rs), 31),
+ (i32 (LoReg $Rs)))>;
def: Pat<(add I32:$Rs, anyimm:$s16), (A2_addi I32:$Rs, imm:$s16)>;
def: Pat<(or I32:$Rs, anyimm:$s10), (A2_orir I32:$Rs, imm:$s10)>;
@@ -1267,13 +1253,11 @@ def: OpR_RR_pat<C2_and, Mul,
def: OpR_RR_pat<C2_and, Mul, v4i1, V4I1>;
def: OpR_RR_pat<C2_and, Mul, v8i1, V8I1>;
-let Predicates = [HasV5] in {
- def: OpR_RR_pat<F2_sfadd, pf2<fadd>, f32, F32>;
- def: OpR_RR_pat<F2_sfsub, pf2<fsub>, f32, F32>;
- def: OpR_RR_pat<F2_sfmpy, pf2<fmul>, f32, F32>;
- def: OpR_RR_pat<F2_sfmin, pf2<fminnum>, f32, F32>;
- def: OpR_RR_pat<F2_sfmax, pf2<fmaxnum>, f32, F32>;
-}
+def: OpR_RR_pat<F2_sfadd, pf2<fadd>, f32, F32>;
+def: OpR_RR_pat<F2_sfsub, pf2<fsub>, f32, F32>;
+def: OpR_RR_pat<F2_sfmpy, pf2<fmul>, f32, F32>;
+def: OpR_RR_pat<F2_sfmin, pf2<fminnum>, f32, F32>;
+def: OpR_RR_pat<F2_sfmax, pf2<fmaxnum>, f32, F32>;
// In expressions like a0*b0 + a1*b1 + ..., prefer to generate multiply-add,
// over add-add with individual multiplies as inputs.
@@ -1506,14 +1490,12 @@ def: Pat<(add I32:$Ru, (Su<Mul> I32:$Ry,
(M4_mpyrr_addr IntRegs:$Ru, IntRegs:$Ry, IntRegs:$Rs)>;
-let Predicates = [HasV5] in {
- def: Pat<(fma F32:$Rs, F32:$Rt, F32:$Rx),
- (F2_sffma F32:$Rx, F32:$Rs, F32:$Rt)>;
- def: Pat<(fma (fneg F32:$Rs), F32:$Rt, F32:$Rx),
- (F2_sffms F32:$Rx, F32:$Rs, F32:$Rt)>;
- def: Pat<(fma F32:$Rs, (fneg F32:$Rt), F32:$Rx),
- (F2_sffms F32:$Rx, F32:$Rs, F32:$Rt)>;
-}
+def: Pat<(fma F32:$Rs, F32:$Rt, F32:$Rx),
+ (F2_sffma F32:$Rx, F32:$Rs, F32:$Rt)>;
+def: Pat<(fma (fneg F32:$Rs), F32:$Rt, F32:$Rx),
+ (F2_sffms F32:$Rx, F32:$Rs, F32:$Rt)>;
+def: Pat<(fma F32:$Rs, (fneg F32:$Rt), F32:$Rx),
+ (F2_sffms F32:$Rx, F32:$Rs, F32:$Rt)>;
def: Pat<(mul V2I32:$Rs, V2I32:$Rt),
@@ -1540,14 +1522,12 @@ def: Pat<(v4i16 (mul V4I16:$Rs, V4I16:$R
// Multiplies two v4i8 vectors.
def: Pat<(v4i8 (mul V4I8:$Rs, V4I8:$Rt)),
- (S2_vtrunehb (M5_vmpybuu V4I8:$Rs, V4I8:$Rt))>,
- Requires<[HasV5]>;
+ (S2_vtrunehb (M5_vmpybuu V4I8:$Rs, V4I8:$Rt))>;
// Multiplies two v8i8 vectors.
def: Pat<(v8i8 (mul V8I8:$Rs, V8I8:$Rt)),
(Combinew (S2_vtrunehb (M5_vmpybuu (HiReg $Rs), (HiReg $Rt))),
- (S2_vtrunehb (M5_vmpybuu (LoReg $Rs), (LoReg $Rt))))>,
- Requires<[HasV5]>;
+ (S2_vtrunehb (M5_vmpybuu (LoReg $Rs), (LoReg $Rt))))>;
// --(10) Bit ------------------------------------------------------------
Modified: llvm/trunk/lib/Target/Hexagon/HexagonRegisterInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonRegisterInfo.cpp?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonRegisterInfo.cpp (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonRegisterInfo.cpp Fri Oct 19 10:31:11 2018
@@ -118,18 +118,7 @@ HexagonRegisterInfo::getCalleeSavedRegs(
bool HasEHReturn = MF->getInfo<HexagonMachineFunctionInfo>()->hasEHReturn();
- switch (MF->getSubtarget<HexagonSubtarget>().getHexagonArchVersion()) {
- case Hexagon::ArchEnum::V4:
- case Hexagon::ArchEnum::V5:
- case Hexagon::ArchEnum::V55:
- case Hexagon::ArchEnum::V60:
- case Hexagon::ArchEnum::V62:
- case Hexagon::ArchEnum::V65:
- return HasEHReturn ? CalleeSavedRegsV3EHReturn : CalleeSavedRegsV3;
- }
-
- llvm_unreachable("Callee saved registers requested for unknown architecture "
- "version");
+ return HasEHReturn ? CalleeSavedRegsV3EHReturn : CalleeSavedRegsV3;
}
Modified: llvm/trunk/lib/Target/Hexagon/HexagonSchedule.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonSchedule.td?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonSchedule.td (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonSchedule.td Fri Oct 19 10:31:11 2018
@@ -57,10 +57,10 @@ include "HexagonDepIICScalar.td"
include "HexagonDepIICHVX.td"
//===----------------------------------------------------------------------===//
-// V4 Machine Info +
+// V5 Machine Info +
//===----------------------------------------------------------------------===//
-include "HexagonScheduleV4.td"
+include "HexagonScheduleV5.td"
// V55 Machine Info +
include "HexagonScheduleV55.td"
Removed: llvm/trunk/lib/Target/Hexagon/HexagonScheduleV4.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonScheduleV4.td?rev=344790&view=auto
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonScheduleV4.td (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonScheduleV4.td (removed)
@@ -1,46 +0,0 @@
-//=-HexagonScheduleV4.td - HexagonV4 Scheduling Definitions --*- tablegen -*-=//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-def LD_tc_ld_SLOT01 : InstrItinClass;
-def ST_tc_st_SLOT01 : InstrItinClass;
-
-class HexagonV4PseudoItin {
- list<InstrItinData> V4PseudoItin_list = [
- InstrItinData<PSEUDO, [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
- InstrItinData<PSEUDOM, [InstrStage<1, [SLOT2, SLOT3], 0>,
- InstrStage<1, [SLOT2, SLOT3]>]>,
- InstrItinData<DUPLEX, [InstrStage<1, [SLOT0]>]>,
- InstrItinData<tc_ENDLOOP, [InstrStage<1, [SLOT_ENDLOOP]>]>
- ];
-}
-
-def HexagonV4ItinList : DepScalarItinV4, HexagonV4PseudoItin {
- list<InstrItinData> V4Itin_list = [
- InstrItinData<LD_tc_ld_SLOT01, [InstrStage<1, [SLOT0, SLOT1]>]>,
- InstrItinData<ST_tc_st_SLOT01, [InstrStage<1, [SLOT0, SLOT1]>]>
- ];
- list<InstrItinData> ItinList =
- !listconcat(V4Itin_list, DepScalarItinV4_list, V4PseudoItin_list);
-}
-
-def HexagonItinerariesV4 :
- ProcessorItineraries<[SLOT0, SLOT1, SLOT2, SLOT3, SLOT_ENDLOOP],
- [Hex_FWD], HexagonV4ItinList.ItinList>;
-
-def HexagonModelV4 : SchedMachineModel {
- // Max issue per cycle == bundle width.
- let IssueWidth = 4;
- let Itineraries = HexagonItinerariesV4;
- let LoadLatency = 1;
- let CompleteModel = 0;
-}
-
-//===----------------------------------------------------------------------===//
-// Hexagon V4 Resource Definitions -
-//===----------------------------------------------------------------------===//
Added: llvm/trunk/lib/Target/Hexagon/HexagonScheduleV5.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonScheduleV5.td?rev=344791&view=auto
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonScheduleV5.td (added)
+++ llvm/trunk/lib/Target/Hexagon/HexagonScheduleV5.td Fri Oct 19 10:31:11 2018
@@ -0,0 +1,46 @@
+//=-HexagonScheduleV5.td - HexagonV5 Scheduling Definitions --*- tablegen -*-=//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+def LD_tc_ld_SLOT01 : InstrItinClass;
+def ST_tc_st_SLOT01 : InstrItinClass;
+
+class HexagonV5PseudoItin {
+ list<InstrItinData> V5PseudoItin_list = [
+ InstrItinData<PSEUDO, [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
+ InstrItinData<PSEUDOM, [InstrStage<1, [SLOT2, SLOT3], 0>,
+ InstrStage<1, [SLOT2, SLOT3]>]>,
+ InstrItinData<DUPLEX, [InstrStage<1, [SLOT0]>]>,
+ InstrItinData<tc_ENDLOOP, [InstrStage<1, [SLOT_ENDLOOP]>]>
+ ];
+}
+
+def HexagonV5ItinList : DepScalarItinV5, HexagonV5PseudoItin {
+ list<InstrItinData> V5Itin_list = [
+ InstrItinData<LD_tc_ld_SLOT01, [InstrStage<1, [SLOT0, SLOT1]>]>,
+ InstrItinData<ST_tc_st_SLOT01, [InstrStage<1, [SLOT0, SLOT1]>]>
+ ];
+ list<InstrItinData> ItinList =
+ !listconcat(V5Itin_list, DepScalarItinV5_list, V5PseudoItin_list);
+}
+
+def HexagonItinerariesV5 :
+ ProcessorItineraries<[SLOT0, SLOT1, SLOT2, SLOT3, SLOT_ENDLOOP],
+ [Hex_FWD], HexagonV5ItinList.ItinList>;
+
+def HexagonModelV5 : SchedMachineModel {
+ // Max issue per cycle == bundle width.
+ let IssueWidth = 4;
+ let Itineraries = HexagonItinerariesV5;
+ let LoadLatency = 1;
+ let CompleteModel = 0;
+}
+
+//===----------------------------------------------------------------------===//
+// Hexagon V5 Resource Definitions -
+//===----------------------------------------------------------------------===//
Modified: llvm/trunk/lib/Target/Hexagon/HexagonSubtarget.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonSubtarget.cpp?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonSubtarget.cpp (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonSubtarget.cpp Fri Oct 19 10:31:11 2018
@@ -93,7 +93,6 @@ HexagonSubtarget &
HexagonSubtarget::initializeSubtargetDependencies(StringRef CPU, StringRef FS) {
static std::map<StringRef, Hexagon::ArchEnum> CpuTable{
{"generic", Hexagon::ArchEnum::V60},
- {"hexagonv4", Hexagon::ArchEnum::V4},
{"hexagonv5", Hexagon::ArchEnum::V5},
{"hexagonv55", Hexagon::ArchEnum::V55},
{"hexagonv60", Hexagon::ArchEnum::V60},
Modified: llvm/trunk/lib/Target/Hexagon/HexagonSubtarget.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonSubtarget.h?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonSubtarget.h (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonSubtarget.h Fri Oct 19 10:31:11 2018
@@ -59,7 +59,7 @@ class HexagonSubtarget : public HexagonG
public:
Hexagon::ArchEnum HexagonArchVersion;
- Hexagon::ArchEnum HexagonHVXVersion = Hexagon::ArchEnum::V4;
+ Hexagon::ArchEnum HexagonHVXVersion = Hexagon::ArchEnum::NoArch;
CodeGenOpt::Level OptLevel;
/// True if the target should use Back-Skip-Back scheduling. This is the
/// default for V60.
@@ -158,7 +158,9 @@ public:
bool useNewValueStores() const { return UseNewValueStores; }
bool useSmallData() const { return UseSmallData; }
- bool useHVXOps() const { return HexagonHVXVersion > Hexagon::ArchEnum::V4; }
+ bool useHVXOps() const {
+ return HexagonHVXVersion > Hexagon::ArchEnum::NoArch;
+ }
bool useHVX128BOps() const { return useHVXOps() && UseHVX128BOps; }
bool useHVX64BOps() const { return useHVXOps() && UseHVX64BOps; }
Modified: llvm/trunk/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp Fri Oct 19 10:31:11 2018
@@ -768,7 +768,7 @@ bool HexagonPacketizerList::canPromoteTo
// Make sure that for non-POST_INC stores:
// 1. The only use of reg is DepReg and no other registers.
- // This handles V4 base+index registers.
+ // This handles base+index registers.
// The following store can not be dot new.
// Eg. r0 = add(r0, #3)
// memw(r1+r0<<#2) = r0
@@ -838,11 +838,7 @@ static bool isImplicitDependency(const M
return false;
}
-// Check to see if an instruction can be dot new
-// There are three kinds.
-// 1. dot new on predicate - V2/V3/V4
-// 2. dot new on stores NV/ST - V4
-// 3. dot new on jump NV/J - V4 -- This is generated in a pass.
+// Check to see if an instruction can be dot new.
bool HexagonPacketizerList::canPromoteToDotNew(const MachineInstr &MI,
const SUnit *PacketSU, unsigned DepReg, MachineBasicBlock::iterator &MII,
const TargetRegisterClass* RC) {
@@ -1075,9 +1071,6 @@ bool HexagonPacketizerList::isSoloInstru
if (MI.isInlineAsm() && !ScheduleInlineAsm)
return true;
- // From Hexagon V4 Programmer's Reference Manual 3.4.4 Grouping constraints:
- // trap, pause, barrier, icinva, isync, and syncht are solo instructions.
- // They must not be grouped with other instructions in a packet.
if (isSchedBarrier(MI))
return true;
@@ -1289,8 +1282,8 @@ bool HexagonPacketizerList::hasRegMaskDe
return false;
}
-bool HexagonPacketizerList::hasV4SpecificDependence(const MachineInstr &I,
- const MachineInstr &J) {
+bool HexagonPacketizerList::hasDualStoreDependence(const MachineInstr &I,
+ const MachineInstr &J) {
bool SysI = isSystemInstr(I), SysJ = isSystemInstr(J);
bool StoreI = I.mayStore(), StoreJ = J.mayStore();
if ((SysI && StoreJ) || (SysJ && StoreI))
@@ -1343,10 +1336,10 @@ bool HexagonPacketizerList::isLegalToPac
if (Dependence)
return false;
- // V4 allows dual stores. It does not allow second store, if the first
- // store is not in SLOT0. New value store, new value jump, dealloc_return
- // and memop always take SLOT0. Arch spec 3.4.4.2.
- Dependence = hasV4SpecificDependence(I, J);
+ // Dual-store does not allow second store, if the first store is not
+ // in SLOT0. New value store, new value jump, dealloc_return and memop
+ // always take SLOT0. Arch spec 3.4.4.2.
+ Dependence = hasDualStoreDependence(I, J);
if (Dependence)
return false;
@@ -1505,10 +1498,10 @@ bool HexagonPacketizerList::isLegalToPac
}
// For Order dependences:
- // 1. On V4 or later, volatile loads/stores can be packetized together,
- // unless other rules prevent is.
+ // 1. Volatile loads/stores can be packetized together, unless other
+ // rules prevent is.
// 2. Store followed by a load is not allowed.
- // 3. Store followed by a store is only valid on V4 or later.
+ // 3. Store followed by a store is valid.
// 4. Load followed by any memory operation is allowed.
if (DepType == SDep::Order) {
if (!PacketizeVolatiles) {
@@ -1555,7 +1548,7 @@ bool HexagonPacketizerList::isLegalToPac
continue;
}
- // For V4, special case ALLOCFRAME. Even though there is dependency
+ // Special case for ALLOCFRAME: even though there is dependency
// between ALLOCFRAME and subsequent store, allow it to be packetized
// in a same packet. This implies that the store is using the caller's
// SP. Hence, offset needs to be updated accordingly.
Modified: llvm/trunk/lib/Target/Hexagon/HexagonVLIWPacketizer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonVLIWPacketizer.h?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonVLIWPacketizer.h (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonVLIWPacketizer.h Fri Oct 19 10:31:11 2018
@@ -149,7 +149,7 @@ protected:
bool hasDeadDependence(const MachineInstr &I, const MachineInstr &J);
bool hasControlDependence(const MachineInstr &I, const MachineInstr &J);
bool hasRegMaskDependence(const MachineInstr &I, const MachineInstr &J);
- bool hasV4SpecificDependence(const MachineInstr &I, const MachineInstr &J);
+ bool hasDualStoreDependence(const MachineInstr &I, const MachineInstr &J);
bool producesStall(const MachineInstr &MI);
};
Modified: llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonMCDuplexInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonMCDuplexInfo.cpp?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonMCDuplexInfo.cpp (original)
+++ llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonMCDuplexInfo.cpp Fri Oct 19 10:31:11 2018
@@ -634,8 +634,7 @@ bool HexagonMCInstrInfo::isOrderedDuplex
return false;
}
- if (STI.getCPU().equals_lower("hexagonv4") ||
- STI.getCPU().equals_lower("hexagonv5") ||
+ if (STI.getCPU().equals_lower("hexagonv5") ||
STI.getCPU().equals_lower("hexagonv55") ||
STI.getCPU().equals_lower("hexagonv60")) {
// If a store appears, it must be in slot 0 (MIa) 1st, and then slot 1 (MIb);
Modified: llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp (original)
+++ llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp Fri Oct 19 10:31:11 2018
@@ -61,8 +61,6 @@ cl::opt<bool> llvm::HexagonDisableDuplex
cl::desc("Disable looking for duplex instructions for Hexagon"));
namespace { // These flags are to be deprecated
-cl::opt<bool> MV4("mv4", cl::Hidden, cl::desc("Build for Hexagon V4"),
- cl::init(false));
cl::opt<bool> MV5("mv5", cl::Hidden, cl::desc("Build for Hexagon V5"),
cl::init(false));
cl::opt<bool> MV55("mv55", cl::Hidden, cl::desc("Build for Hexagon V55"),
@@ -83,18 +81,18 @@ cl::opt<Hexagon::ArchEnum>
clEnumValN(Hexagon::ArchEnum::V62, "v62", "Build for HVX v62"),
clEnumValN(Hexagon::ArchEnum::V65, "v65", "Build for HVX v65"),
// Sentinal for no value specified
- clEnumValN(Hexagon::ArchEnum::V5, "", "")),
+ clEnumValN(Hexagon::ArchEnum::Generic, "", "")),
// Sentinal for flag not present
- cl::init(Hexagon::ArchEnum::V4), cl::ValueOptional);
+ cl::init(Hexagon::ArchEnum::NoArch), cl::ValueOptional);
+
static cl::opt<bool>
- DisableHVX("mno-hvx", cl::Hidden, cl::desc("Disable Hexagon Vector eXtensions"));
+ DisableHVX("mno-hvx", cl::Hidden,
+ cl::desc("Disable Hexagon Vector eXtensions"));
static StringRef DefaultArch = "hexagonv60";
static StringRef HexagonGetArchVariant() {
- if (MV4)
- return "hexagonv4";
if (MV5)
return "hexagonv5";
if (MV55)
@@ -123,7 +121,7 @@ StringRef Hexagon_MC::selectHexagonCPU(S
return ArchV;
}
-unsigned llvm::HexagonGetLastSlot() { return HexagonItinerariesV4FU::SLOT3; }
+unsigned llvm::HexagonGetLastSlot() { return HexagonItinerariesV5FU::SLOT3; }
namespace {
@@ -279,6 +277,7 @@ std::string selectHexagonFS(StringRef CP
Result.push_back(FS);
switch (EnableHVX) {
+ case Hexagon::ArchEnum::V5:
case Hexagon::ArchEnum::V55:
break;
case Hexagon::ArchEnum::V60:
@@ -290,14 +289,14 @@ std::string selectHexagonFS(StringRef CP
case Hexagon::ArchEnum::V65:
Result.push_back("+hvxv65");
break;
- case Hexagon::ArchEnum::V5:{
+ case Hexagon::ArchEnum::Generic:{
Result.push_back(StringSwitch<StringRef>(CPU)
.Case("hexagonv60", "+hvxv60")
.Case("hexagonv62", "+hvxv62")
.Case("hexagonv65", "+hvxv65"));
break;
}
- case Hexagon::ArchEnum::V4:
+ case Hexagon::ArchEnum::NoArch:
// Sentinal if -mhvx isn't specified
break;
}
@@ -307,15 +306,9 @@ std::string selectHexagonFS(StringRef CP
static bool isCPUValid(std::string CPU)
{
- std::vector<std::string> table
- {
- "generic",
- "hexagonv4",
- "hexagonv5",
- "hexagonv55",
- "hexagonv60",
- "hexagonv62",
- "hexagonv65",
+ std::vector<std::string> table {
+ "generic", "hexagonv5", "hexagonv55", "hexagonv60",
+ "hexagonv62", "hexagonv65",
};
return std::find(table.begin(), table.end(), CPU) != table.end();
@@ -336,8 +329,8 @@ FeatureBitset Hexagon_MC::completeHVXFea
// Make sure that +hvx-length turns hvx on, and that "hvx" alone
// turns on hvxvNN, corresponding to the existing ArchVNN.
FeatureBitset FB = S;
- unsigned CpuArch = ArchV4;
- for (unsigned F : {ArchV65, ArchV62, ArchV60, ArchV55, ArchV5, ArchV4}) {
+ unsigned CpuArch = ArchV5;
+ for (unsigned F : {ArchV65, ArchV62, ArchV60, ArchV55, ArchV5}) {
if (!FB.test(F))
continue;
CpuArch = F;
@@ -402,7 +395,6 @@ MCSubtargetInfo *Hexagon_MC::createHexag
unsigned Hexagon_MC::GetELFFlags(const MCSubtargetInfo &STI) {
static std::map<StringRef,unsigned> ElfFlags = {
- {"hexagonv4", ELF::EF_HEXAGON_MACH_V4},
{"hexagonv5", ELF::EF_HEXAGON_MACH_V5},
{"hexagonv55", ELF::EF_HEXAGON_MACH_V55},
{"hexagonv60", ELF::EF_HEXAGON_MACH_V60},
Modified: llvm/trunk/test/CodeGen/Hexagon/cfi-late.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/cfi-late.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/cfi-late.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/cfi-late.ll Fri Oct 19 10:31:11 2018
@@ -32,8 +32,8 @@ declare i32 @bar(i32, i32) #1
; Function Attrs: nounwind readnone
declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #2
-attributes #0 = { nounwind "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="hexagonv4" "unsafe-fp-math"="false" "use-soft-float"="false" }
-attributes #1 = { "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="hexagonv4" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
+attributes #1 = { "target-cpu"="hexagonv5" }
attributes #2 = { nounwind readnone }
attributes #3 = { nounwind }
Modified: llvm/trunk/test/CodeGen/Hexagon/double.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/double.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/double.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/double.ll Fri Oct 19 10:31:11 2018
@@ -1,22 +1,24 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
+; RUN: llc -march=hexagon < %s | FileCheck %s
; CHECK: __hexagon_adddf3
; CHECK: __hexagon_subdf3
-define void @foo(double* %acc, double %num, double %num2) nounwind {
-entry:
- %acc.addr = alloca double*, align 4
- %num.addr = alloca double, align 8
- %num2.addr = alloca double, align 8
- store double* %acc, double** %acc.addr, align 4
- store double %num, double* %num.addr, align 8
- store double %num2, double* %num2.addr, align 8
- %0 = load double*, double** %acc.addr, align 4
- %1 = load double, double* %0
- %2 = load double, double* %num.addr, align 8
- %add = fadd double %1, %2
- %3 = load double, double* %num2.addr, align 8
- %sub = fsub double %add, %3
- %4 = load double*, double** %acc.addr, align 4
- store double %sub, double* %4
+define void @f0(double* %a0, double %a1, double %a2) #0 {
+b0:
+ %v0 = alloca double*, align 4
+ %v1 = alloca double, align 8
+ %v2 = alloca double, align 8
+ store double* %a0, double** %v0, align 4
+ store double %a1, double* %v1, align 8
+ store double %a2, double* %v2, align 8
+ %v3 = load double*, double** %v0, align 4
+ %v4 = load double, double* %v3
+ %v5 = load double, double* %v1, align 8
+ %v6 = fadd double %v4, %v5
+ %v7 = load double, double* %v2, align 8
+ %v8 = fsub double %v6, %v7
+ %v9 = load double*, double** %v0, align 4
+ store double %v8, double* %v9
ret void
}
+
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/float.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/float.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/float.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/float.ll Fri Oct 19 10:31:11 2018
@@ -1,22 +1,24 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
-; CHECK: __hexagon_addsf3
-; CHECK: __hexagon_subsf3
+; RUN: llc -march=hexagon < %s | FileCheck %s
+; CHECK: sfadd
+; CHECK: sfsub
-define void @foo(float* %acc, float %num, float %num2) nounwind {
-entry:
- %acc.addr = alloca float*, align 4
- %num.addr = alloca float, align 4
- %num2.addr = alloca float, align 4
- store float* %acc, float** %acc.addr, align 4
- store float %num, float* %num.addr, align 4
- store float %num2, float* %num2.addr, align 4
- %0 = load float*, float** %acc.addr, align 4
- %1 = load float, float* %0
- %2 = load float, float* %num.addr, align 4
- %add = fadd float %1, %2
- %3 = load float, float* %num2.addr, align 4
- %sub = fsub float %add, %3
- %4 = load float*, float** %acc.addr, align 4
- store float %sub, float* %4
+define void @f0(float* %a0, float %a1, float %a2) #0 {
+b0:
+ %v0 = alloca float*, align 4
+ %v1 = alloca float, align 4
+ %v2 = alloca float, align 4
+ store float* %a0, float** %v0, align 4
+ store float %a1, float* %v1, align 4
+ store float %a2, float* %v2, align 4
+ %v3 = load float*, float** %v0, align 4
+ %v4 = load float, float* %v3
+ %v5 = load float, float* %v1, align 4
+ %v6 = fadd float %v4, %v5
+ %v7 = load float, float* %v2, align 4
+ %v8 = fsub float %v6, %v7
+ %v9 = load float*, float** %v0, align 4
+ store float %v8, float* %v9
ret void
}
+
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/floatconvert-ieee-rnd-near.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/floatconvert-ieee-rnd-near.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/floatconvert-ieee-rnd-near.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/floatconvert-ieee-rnd-near.ll Fri Oct 19 10:31:11 2018
@@ -1,22 +1,24 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
-; CHECK: __hexagon_addsf3
-; CHECK: __hexagon_subsf3
+; RUN: llc -march=hexagon < %s | FileCheck %s
+; CHECK: sfadd
+; CHECK: sfsub
-define void @foo(float* %acc, float %num, float %num2) nounwind {
-entry:
- %acc.addr = alloca float*, align 4
- %num.addr = alloca float, align 4
- %num2.addr = alloca float, align 4
- store float* %acc, float** %acc.addr, align 4
- store float %num, float* %num.addr, align 4
- store float %num2, float* %num2.addr, align 4
- %0 = load float*, float** %acc.addr, align 4
- %1 = load float, float* %0
- %2 = load float, float* %num.addr, align 4
- %add = fadd float %1, %2
- %3 = load float, float* %num2.addr, align 4
- %sub = fsub float %add, %3
- %4 = load float*, float** %acc.addr, align 4
- store float %sub, float* %4
+define void @f0(float* %a0, float %a1, float %a2) #0 {
+b0:
+ %v0 = alloca float*, align 4
+ %v1 = alloca float, align 4
+ %v2 = alloca float, align 4
+ store float* %a0, float** %v0, align 4
+ store float %a1, float* %v1, align 4
+ store float %a2, float* %v2, align 4
+ %v3 = load float*, float** %v0, align 4
+ %v4 = load float, float* %v3
+ %v5 = load float, float* %v1, align 4
+ %v6 = fadd float %v4, %v5
+ %v7 = load float, float* %v2, align 4
+ %v8 = fsub float %v6, %v7
+ %v9 = load float*, float** %v0, align 4
+ store float %v8, float* %v9
ret void
}
+
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/gp-plus-offset-load.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/gp-plus-offset-load.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/gp-plus-offset-load.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/gp-plus-offset-load.ll Fri Oct 19 10:31:11 2018
@@ -1,51 +1,57 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
+; RUN: llc -march=hexagon < %s | FileCheck %s
; Check that we generate load instructions with global + offset
-%struct.struc = type { i8, i8, i16, i32 }
- at foo = common global %struct.struc zeroinitializer, align 4
+%s.0 = type { i8, i8, i16, i32 }
-define void @loadWord(i32 %val1, i32 %val2, i32* nocapture %ival) nounwind {
-; CHECK: r{{[0-9]+}} = memw(##foo+4)
-entry:
- %cmp = icmp sgt i32 %val1, %val2
- br i1 %cmp, label %if.then, label %if.end
-
-if.then: ; preds = %entry
- %0 = load i32, i32* getelementptr inbounds (%struct.struc, %struct.struc* @foo, i32 0, i32 3), align 4
- store i32 %0, i32* %ival, align 4
- br label %if.end
+ at g0 = common global %s.0 zeroinitializer, align 4
-if.end: ; preds = %if.then, %entry
+; CHECK-LABEL: f0:
+; CHECK: r{{[0-9]+}} = memw(##g0+4)
+define void @f0(i32 %a0, i32 %a1, i32* nocapture %a2) #0 {
+b0:
+ %v0 = icmp sgt i32 %a0, %a1
+ br i1 %v0, label %b1, label %b2
+
+b1: ; preds = %b0
+ %v1 = load i32, i32* getelementptr inbounds (%s.0, %s.0* @g0, i32 0, i32 3), align 4
+ store i32 %v1, i32* %a2, align 4
+ br label %b2
+
+b2: ; preds = %b1, %b0
ret void
}
-define void @loadByte(i32 %val1, i32 %val2, i8* nocapture %ival) nounwind {
-; CHECK: r{{[0-9]+}} = memub(##foo+1)
-entry:
- %cmp = icmp sgt i32 %val1, %val2
- br i1 %cmp, label %if.then, label %if.end
-
-if.then: ; preds = %entry
- %0 = load i8, i8* getelementptr inbounds (%struct.struc, %struct.struc* @foo, i32 0, i32 1), align 1
- store i8 %0, i8* %ival, align 1
- br label %if.end
+; CHECK-LABEL: f1:
+; CHECK: r{{[0-9]+}} = memub(##g0+1)
+define void @f1(i32 %a0, i32 %a1, i8* nocapture %a2) #0 {
+b0:
+ %v0 = icmp sgt i32 %a0, %a1
+ br i1 %v0, label %b1, label %b2
+
+b1: ; preds = %b0
+ %v1 = load i8, i8* getelementptr inbounds (%s.0, %s.0* @g0, i32 0, i32 1), align 1
+ store i8 %v1, i8* %a2, align 1
+ br label %b2
-if.end: ; preds = %if.then, %entry
+b2: ; preds = %b1, %b0
ret void
}
-define void @loadHWord(i32 %val1, i32 %val2, i16* %ival) nounwind {
-; CHECK: r{{[0-9]+}} = memuh(##foo+2)
-entry:
- %cmp = icmp sgt i32 %val1, %val2
- br i1 %cmp, label %if.then, label %if.end
-
-if.then: ; preds = %entry
- %0 = load i16, i16* getelementptr inbounds (%struct.struc, %struct.struc* @foo, i32 0, i32 2), align 2
- store i16 %0, i16* %ival, align 2
- br label %if.end
+; CHECK-LABEL: f2:
+; CHECK: r{{[0-9]+}} = memuh(##g0+2)
+define void @f2(i32 %a0, i32 %a1, i16* %a2) #0 {
+b0:
+ %v0 = icmp sgt i32 %a0, %a1
+ br i1 %v0, label %b1, label %b2
+
+b1: ; preds = %b0
+ %v1 = load i16, i16* getelementptr inbounds (%s.0, %s.0* @g0, i32 0, i32 2), align 2
+ store i16 %v1, i16* %a2, align 2
+ br label %b2
-if.end: ; preds = %if.then, %entry
+b2: ; preds = %b1, %b0
ret void
}
+
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/gp-plus-offset-store.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/gp-plus-offset-store.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/gp-plus-offset-store.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/gp-plus-offset-store.ll Fri Oct 19 10:31:11 2018
@@ -1,35 +1,38 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
+; RUN: llc -march=hexagon < %s | FileCheck %s
; Check that we generate store instructions with global + offset
-%struct.struc = type { i8, i8, i16, i32 }
+%s.0 = type { i8, i8, i16, i32 }
- at foo = common global %struct.struc zeroinitializer, align 4
+ at g0 = common global %s.0 zeroinitializer, align 4
-define void @storeByte(i32 %val1, i32 %val2, i8 zeroext %ival) nounwind {
-; CHECK: memb(##foo+1) = r{{[0-9]+}}
-entry:
- %cmp = icmp sgt i32 %val1, %val2
- br i1 %cmp, label %if.then, label %if.end
+; CHECK-LABEL: f0:
+; CHECK: memb(##g0+1) = r{{[0-9]+}}
+define void @f0(i32 %a0, i32 %a1, i8 zeroext %a2) #0 {
+b0:
+ %v0 = icmp sgt i32 %a0, %a1
+ br i1 %v0, label %b1, label %b2
+
+b1: ; preds = %b0
+ store i8 %a2, i8* getelementptr inbounds (%s.0, %s.0* @g0, i32 0, i32 1), align 1
+ br label %b2
-if.then: ; preds = %entry
- store i8 %ival, i8* getelementptr inbounds (%struct.struc, %struct.struc* @foo, i32 0, i32 1), align 1
- br label %if.end
-
-if.end: ; preds = %if.then, %entry
+b2: ; preds = %b1, %b0
ret void
}
-define void @storeHW(i32 %val1, i32 %val2, i16 signext %ival) nounwind {
-; CHECK: memh(##foo+2) = r{{[0-9]+}}
-entry:
- %cmp = icmp sgt i32 %val1, %val2
- br i1 %cmp, label %if.then, label %if.end
-
-if.then: ; preds = %entry
- store i16 %ival, i16* getelementptr inbounds (%struct.struc, %struct.struc* @foo, i32 0, i32 2), align 2
- br label %if.end
+; CHECK-LABEL: f1:
+; CHECK: memh(##g0+2) = r{{[0-9]+}}
+define void @f1(i32 %a0, i32 %a1, i16 signext %a2) #0 {
+b0:
+ %v0 = icmp sgt i32 %a0, %a1
+ br i1 %v0, label %b1, label %b2
+
+b1: ; preds = %b0
+ store i16 %a2, i16* getelementptr inbounds (%s.0, %s.0* @g0, i32 0, i32 2), align 2
+ br label %b2
-if.end: ; preds = %if.then, %entry
+b2: ; preds = %b1, %b0
ret void
}
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/gp-rel.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/gp-rel.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/gp-rel.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/gp-rel.ll Fri Oct 19 10:31:11 2018
@@ -1,33 +1,36 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
+; RUN: llc -march=hexagon < %s | FileCheck %s
; Check that gp-relative instructions are being generated.
- at a = common global i32 0, align 4
- at b = common global i32 0, align 4
- at c = common global i32 0, align 4
-
-define i32 @foo(i32 %p) #0 {
-entry:
-; CHECK: r{{[0-9]+}} = memw(gp+#a)
-; CHECK: r{{[0-9]+}} = memw(gp+#b)
-; CHECK: if (p{{[0-3]}}) memw(##c) = r{{[0-9]+}}
- %0 = load i32, i32* @a, align 4
- %1 = load i32, i32* @b, align 4
- %add = add nsw i32 %1, %0
- %cmp = icmp eq i32 %0, %1
- br i1 %cmp, label %if.then, label %entry.if.end_crit_edge
-
-entry.if.end_crit_edge:
- %.pre = load i32, i32* @c, align 4
- br label %if.end
-
-if.then:
- %add1 = add nsw i32 %add, %0
- store i32 %add1, i32* @c, align 4
- br label %if.end
-
-if.end:
- %2 = phi i32 [ %.pre, %entry.if.end_crit_edge ], [ %add1, %if.then ]
- %cmp2 = icmp eq i32 %add, %2
- %sel1 = select i1 %cmp2, i32 %2, i32 %1
- ret i32 %sel1
+; CHECK: r{{[0-9]+}} = memw(gp+#g0)
+; CHECK: r{{[0-9]+}} = memw(gp+#g1)
+; CHECK: if (p{{[0-3]}}) memw(##g2) = r{{[0-9]+}}
+
+ at g0 = common global i32 0, align 4
+ at g1 = common global i32 0, align 4
+ at g2 = common global i32 0, align 4
+
+define i32 @f0(i32 %a0) #0 {
+b0:
+ %v0 = load i32, i32* @g0, align 4
+ %v1 = load i32, i32* @g1, align 4
+ %v2 = add nsw i32 %v1, %v0
+ %v3 = icmp eq i32 %v0, %v1
+ br i1 %v3, label %b2, label %b1
+
+b1: ; preds = %b0
+ %v4 = load i32, i32* @g2, align 4
+ br label %b3
+
+b2: ; preds = %b0
+ %v5 = add nsw i32 %v2, %v0
+ store i32 %v5, i32* @g2, align 4
+ br label %b3
+
+b3: ; preds = %b2, %b1
+ %v6 = phi i32 [ %v4, %b1 ], [ %v5, %b2 ]
+ %v7 = icmp eq i32 %v2, %v6
+ %v8 = select i1 %v7, i32 %v6, i32 %v1
+ ret i32 %v8
}
+
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/hwloop-cleanup.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/hwloop-cleanup.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/hwloop-cleanup.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/hwloop-cleanup.ll Fri Oct 19 10:31:11 2018
@@ -1,87 +1,91 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 -no-phi-elim-live-out-early-exit \
-; RUN: < %s | FileCheck %s
+; RUN: llc -march=hexagon -no-phi-elim-live-out-early-exit < %s | FileCheck %s
; Check that we remove the compare and induction variable instructions
; after generating hardware loops.
; Bug 6685.
+; CHECK-LABEL: f0:
; CHECK: loop0
; CHECK-NOT: r{{[0-9]+}} = add(r{{[0-9]+}},#-1)
; CHECK-NOT: cmp.eq
; CHECK: endloop0
-define i32 @test1(i32* nocapture %b, i32 %n) nounwind readonly {
-entry:
- %cmp1 = icmp sgt i32 %n, 0
- br i1 %cmp1, label %for.body.preheader, label %for.end
-
-for.body.preheader:
- br label %for.body
-
-for.body: ; preds = %for.body.preheader, %for.body
- %sum.03 = phi i32 [ %add, %for.body ], [ 0, %for.body.preheader ]
- %arrayidx.phi = phi i32* [ %arrayidx.inc, %for.body ], [ %b, %for.body.preheader ]
- %i.02 = phi i32 [ %inc, %for.body ], [ 0, %for.body.preheader ]
- %0 = load i32, i32* %arrayidx.phi, align 4
- %add = add nsw i32 %0, %sum.03
- %inc = add nsw i32 %i.02, 1
- %exitcond = icmp eq i32 %inc, %n
- %arrayidx.inc = getelementptr i32, i32* %arrayidx.phi, i32 1
- br i1 %exitcond, label %for.end.loopexit, label %for.body
-
-for.end.loopexit:
- br label %for.end
-
-for.end:
- %sum.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.end.loopexit ]
- ret i32 %sum.0.lcssa
+define i32 @f0(i32* nocapture %a0, i32 %a1) #0 {
+b0:
+ %v0 = icmp sgt i32 %a1, 0
+ br i1 %v0, label %b1, label %b4
+
+b1: ; preds = %b0
+ br label %b2
+
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %v5, %b2 ], [ 0, %b1 ]
+ %v2 = phi i32* [ %v8, %b2 ], [ %a0, %b1 ]
+ %v3 = phi i32 [ %v6, %b2 ], [ 0, %b1 ]
+ %v4 = load i32, i32* %v2, align 4
+ %v5 = add nsw i32 %v4, %v1
+ %v6 = add nsw i32 %v3, 1
+ %v7 = icmp eq i32 %v6, %a1
+ %v8 = getelementptr i32, i32* %v2, i32 1
+ br i1 %v7, label %b3, label %b2
+
+b3: ; preds = %b2
+ br label %b4
+
+b4: ; preds = %b3, %b0
+ %v9 = phi i32 [ 0, %b0 ], [ %v5, %b3 ]
+ ret i32 %v9
}
; This test checks that that initial loop count value is removed.
+; CHECK-LABEL: f1:
; CHECK-NOT: ={{.}}#40
; CHECK: loop0
; CHECK-NOT: r{{[0-9]+}} = add(r{{[0-9]+}},#-1)
; CHECK-NOT: cmp.eq
; CHECK: endloop0
-define i32 @test2(i32* nocapture %b) nounwind readonly {
-entry:
- br label %for.body
-
-for.body:
- %sum.02 = phi i32 [ 0, %entry ], [ %add, %for.body ]
- %arrayidx.phi = phi i32* [ %b, %entry ], [ %arrayidx.inc, %for.body ]
- %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
- %0 = load i32, i32* %arrayidx.phi, align 4
- %add = add nsw i32 %0, %sum.02
- %inc = add nsw i32 %i.01, 1
- %exitcond = icmp eq i32 %inc, 40
- %arrayidx.inc = getelementptr i32, i32* %arrayidx.phi, i32 1
- br i1 %exitcond, label %for.end, label %for.body
+define i32 @f1(i32* nocapture %a0) #0 {
+b0:
+ br label %b1
+
+b1: ; preds = %b1, %b0
+ %v0 = phi i32 [ 0, %b0 ], [ %v4, %b1 ]
+ %v1 = phi i32* [ %a0, %b0 ], [ %v7, %b1 ]
+ %v2 = phi i32 [ 0, %b0 ], [ %v5, %b1 ]
+ %v3 = load i32, i32* %v1, align 4
+ %v4 = add nsw i32 %v3, %v0
+ %v5 = add nsw i32 %v2, 1
+ %v6 = icmp eq i32 %v5, 40
+ %v7 = getelementptr i32, i32* %v1, i32 1
+ br i1 %v6, label %b2, label %b1
-for.end:
- ret i32 %add
+b2: ; preds = %b1
+ ret i32 %v4
}
; This test checks that we don't remove the induction variable since it's used.
+; CHECK-LABEL: f2:
; CHECK: loop0
; CHECK: r{{[0-9]+}} = add(r{{[0-9]+}},#1)
; CHECK-NOT: cmp.eq
; CHECK: endloop0
-define i32 @test3(i32* nocapture %b) nounwind {
-entry:
- br label %for.body
-
-for.body:
- %arrayidx.phi = phi i32* [ %b, %entry ], [ %arrayidx.inc, %for.body ]
- %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
- store i32 %i.01, i32* %arrayidx.phi, align 4
- %inc = add nsw i32 %i.01, 1
- %exitcond = icmp eq i32 %inc, 40
- %arrayidx.inc = getelementptr i32, i32* %arrayidx.phi, i32 1
- br i1 %exitcond, label %for.end, label %for.body
-for.end:
+define i32 @f2(i32* nocapture %a0) #1 {
+b0:
+ br label %b1
+
+b1: ; preds = %b1, %b0
+ %v0 = phi i32* [ %a0, %b0 ], [ %v4, %b1 ]
+ %v1 = phi i32 [ 0, %b0 ], [ %v2, %b1 ]
+ store i32 %v1, i32* %v0, align 4
+ %v2 = add nsw i32 %v1, 1
+ %v3 = icmp eq i32 %v2, 40
+ %v4 = getelementptr i32, i32* %v0, i32 1
+ br i1 %v3, label %b2, label %b1
+
+b2: ; preds = %b1
ret i32 0
}
-
+attributes #0 = { nounwind readonly "target-cpu"="hexagonv5" }
+attributes #1 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/hwloop-const.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/hwloop-const.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/hwloop-const.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/hwloop-const.ll Fri Oct 19 10:31:11 2018
@@ -1,27 +1,27 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 -O2 < %s | FileCheck %s
-; ModuleID = 'hwloop-const.c'
-target datalayout = "e-p:32:32:32-i64:64:64-i32:32:32-i16:16:16-i1:32:32-f64:64:64-f32:32:32-v64:64:64-v32:32:32-a0:0-n16:32"
+; RUN: llc -march=hexagon < %s | FileCheck %s
+; CHECK: endloop
+
target triple = "hexagon-unknown-linux-gnu"
- at b = common global [25000 x i32] zeroinitializer, align 8
- at a = common global [25000 x i32] zeroinitializer, align 8
- at c = common global [25000 x i32] zeroinitializer, align 8
-
-define i32 @hwloop_bug() nounwind {
-entry:
- br label %for.body
+ at g0 = common global [25000 x i32] zeroinitializer, align 8
+ at g1 = common global [25000 x i32] zeroinitializer, align 8
-; CHECK: endloop
-for.body: ; preds = %for.body, %entry
- %i.02 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds [25000 x i32], [25000 x i32]* @b, i32 0, i32 %i.02
- store i32 %i.02, i32* %arrayidx, align 4
- %arrayidx1 = getelementptr inbounds [25000 x i32], [25000 x i32]* @a, i32 0, i32 %i.02
- store i32 %i.02, i32* %arrayidx1, align 4
- %inc = add nsw i32 %i.02, 1
- %exitcond = icmp eq i32 %inc, 25000
- br i1 %exitcond, label %for.end, label %for.body
+define i32 @f0() #0 {
+b0:
+ br label %b1
-for.end: ; preds = %for.body
+b1: ; preds = %b1, %b0
+ %v0 = phi i32 [ 0, %b0 ], [ %v3, %b1 ]
+ %v1 = getelementptr inbounds [25000 x i32], [25000 x i32]* @g0, i32 0, i32 %v0
+ store i32 %v0, i32* %v1, align 4
+ %v2 = getelementptr inbounds [25000 x i32], [25000 x i32]* @g1, i32 0, i32 %v0
+ store i32 %v0, i32* %v2, align 4
+ %v3 = add nsw i32 %v0, 1
+ %v4 = icmp eq i32 %v3, 25000
+ br i1 %v4, label %b2, label %b1
+
+b2: ; preds = %b1
ret i32 0
}
+
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/hwloop-dbg.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/hwloop-dbg.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/hwloop-dbg.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/hwloop-dbg.ll Fri Oct 19 10:31:11 2018
@@ -1,63 +1,64 @@
-; RUN: llc < %s -march=hexagon -mcpu=hexagonv4 -O2 -disable-lsr | FileCheck %s
-; ModuleID = 'hwloop-dbg.o'
-target datalayout = "e-p:32:32:32-i64:64:64-i32:32:32-i16:16:16-i1:32:32-f64:64:64-f32:32:32-v64:64:64-v32:32:32-a0:0-n16:32"
-target triple = "hexagon"
+; RUN: llc < %s -march=hexagon -disable-lsr | FileCheck %s
-define void @foo(i32* nocapture %a, i32* nocapture %b) nounwind !dbg !5 {
-entry:
- tail call void @llvm.dbg.value(metadata i32* %a, i64 0, metadata !13, metadata !DIExpression()), !dbg !17
- tail call void @llvm.dbg.value(metadata i32* %b, i64 0, metadata !14, metadata !DIExpression()), !dbg !18
- tail call void @llvm.dbg.value(metadata i32 0, i64 0, metadata !15, metadata !DIExpression()), !dbg !19
- br label %for.body, !dbg !19
-
-for.body: ; preds = %for.body, %entry
; CHECK: loop0(
; CHECK-NOT: add({{r[0-9]*}}, #
; CHECK: endloop0
- %arrayidx.phi = phi i32* [ %a, %entry ], [ %arrayidx.inc, %for.body ]
- %i.02 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
- %b.addr.01 = phi i32* [ %b, %entry ], [ %incdec.ptr, %for.body ]
- %incdec.ptr = getelementptr inbounds i32, i32* %b.addr.01, i32 1, !dbg !21
- tail call void @llvm.dbg.value(metadata i32* %incdec.ptr, i64 0, metadata !14, metadata !DIExpression()), !dbg !21
- %0 = load i32, i32* %b.addr.01, align 4, !dbg !21
- store i32 %0, i32* %arrayidx.phi, align 4, !dbg !21
- %inc = add nsw i32 %i.02, 1, !dbg !26
- tail call void @llvm.dbg.value(metadata i32 %inc, i64 0, metadata !15, metadata !DIExpression()), !dbg !26
- %exitcond = icmp eq i32 %inc, 10, !dbg !19
- %arrayidx.inc = getelementptr i32, i32* %arrayidx.phi, i32 1
- br i1 %exitcond, label %for.end, label %for.body, !dbg !19
-for.end: ; preds = %for.body
- ret void, !dbg !27
+target datalayout = "e-p:32:32:32-i64:64:64-i32:32:32-i16:16:16-i1:32:32-f64:64:64-f32:32:32-v64:64:64-v32:32:32-a0:0-n16:32"
+target triple = "hexagon"
+
+define void @f0(i32* nocapture %a0, i32* nocapture %a1) #0 !dbg !4 {
+b0:
+ call void @llvm.dbg.value(metadata i32* %a0, metadata !10, metadata !DIExpression()), !dbg !14
+ call void @llvm.dbg.value(metadata i32* %a1, metadata !11, metadata !DIExpression()), !dbg !15
+ call void @llvm.dbg.value(metadata i32 0, metadata !12, metadata !DIExpression()), !dbg !16
+ br label %b1, !dbg !16
+
+b1: ; preds = %b1, %b0
+ %v0 = phi i32* [ %a0, %b0 ], [ %v7, %b1 ]
+ %v1 = phi i32 [ 0, %b0 ], [ %v5, %b1 ]
+ %v2 = phi i32* [ %a1, %b0 ], [ %v3, %b1 ]
+ %v3 = getelementptr inbounds i32, i32* %v2, i32 1, !dbg !18
+ call void @llvm.dbg.value(metadata i32* %v3, metadata !11, metadata !DIExpression()), !dbg !18
+ %v4 = load i32, i32* %v2, align 4, !dbg !18
+ store i32 %v4, i32* %v0, align 4, !dbg !18
+ %v5 = add nsw i32 %v1, 1, !dbg !20
+ call void @llvm.dbg.value(metadata i32 %v5, metadata !12, metadata !DIExpression()), !dbg !20
+ %v6 = icmp eq i32 %v5, 10, !dbg !16
+ %v7 = getelementptr i32, i32* %v0, i32 1
+ br i1 %v6, label %b2, label %b1, !dbg !16
+
+b2: ; preds = %b1
+ ret void, !dbg !21
}
-declare void @llvm.dbg.value(metadata, i64, metadata, metadata) nounwind readnone
+declare void @llvm.dbg.value(metadata, metadata, metadata) #1
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
+attributes #1 = { nounwind readnone speculatable }
!llvm.dbg.cu = !{!0}
-!llvm.module.flags = !{!29}
+!llvm.module.flags = !{!3}
-!0 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "QuIC LLVM Hexagon Clang version 6.1-pre-unknown, (git://git-hexagon-aus.quicinc.com/llvm/clang-mainline.git e9382867661454cdf44addb39430741578e9765c) (llvm/llvm-mainline.git 36412bb1fcf03ed426d4437b41198bae066675ac)", isOptimized: true, emissionKind: FullDebug, file: !28, enums: !2, retainedTypes: !2, globals: !2)
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "QuIC LLVM Hexagon Clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !2, globals: !2)
+!1 = !DIFile(filename: "hwloop-dbg.c", directory: "/test")
!2 = !{}
-!5 = distinct !DISubprogram(name: "foo", line: 1, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: true, unit: !0, scopeLine: 1, file: !28, scope: null, type: !7, retainedNodes: !11)
-!6 = !DIFile(filename: "hwloop-dbg.c", directory: "/usr2/kparzysz/s.hex/t")
-!7 = !DISubroutineType(types: !8)
-!8 = !{null, !9, !9}
-!9 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 32, align: 32, baseType: !10)
-!10 = !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
-!11 = !{!13, !14, !15}
-!13 = !DILocalVariable(name: "a", line: 1, arg: 1, scope: !5, file: !6, type: !9)
-!14 = !DILocalVariable(name: "b", line: 1, arg: 2, scope: !5, file: !6, type: !9)
-!15 = !DILocalVariable(name: "i", line: 2, scope: !16, file: !6, type: !10)
-!16 = distinct !DILexicalBlock(line: 1, column: 26, file: !28, scope: !5)
-!17 = !DILocation(line: 1, column: 15, scope: !5)
-!18 = !DILocation(line: 1, column: 23, scope: !5)
-!19 = !DILocation(line: 3, column: 8, scope: !20)
-!20 = distinct !DILexicalBlock(line: 3, column: 3, file: !28, scope: !16)
-!21 = !DILocation(line: 4, column: 5, scope: !22)
-!22 = distinct !DILexicalBlock(line: 3, column: 28, file: !28, scope: !20)
-!26 = !DILocation(line: 3, column: 23, scope: !20)
-!27 = !DILocation(line: 6, column: 1, scope: !16)
-!28 = !DIFile(filename: "hwloop-dbg.c", directory: "/usr2/kparzysz/s.hex/t")
-!29 = !{i32 1, !"Debug Info Version", i32 3}
-!30 = !{i32 0}
+!3 = !{i32 1, !"Debug Info Version", i32 3}
+!4 = distinct !DISubprogram(name: "foo", scope: null, file: !1, line: 1, type: !5, isLocal: false, isDefinition: true, scopeLine: 1, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !9)
+!5 = !DISubroutineType(types: !6)
+!6 = !{null, !7, !7}
+!7 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !8, size: 32, align: 32)
+!8 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
+!9 = !{!10, !11, !12}
+!10 = !DILocalVariable(name: "a", arg: 1, scope: !4, file: !1, line: 1, type: !7)
+!11 = !DILocalVariable(name: "b", arg: 2, scope: !4, file: !1, line: 1, type: !7)
+!12 = !DILocalVariable(name: "i", scope: !13, file: !1, line: 2, type: !8)
+!13 = distinct !DILexicalBlock(scope: !4, file: !1, line: 1, column: 26)
+!14 = !DILocation(line: 1, column: 15, scope: !4)
+!15 = !DILocation(line: 1, column: 23, scope: !4)
+!16 = !DILocation(line: 3, column: 8, scope: !17)
+!17 = distinct !DILexicalBlock(scope: !13, file: !1, line: 3, column: 3)
+!18 = !DILocation(line: 4, column: 5, scope: !19)
+!19 = distinct !DILexicalBlock(scope: !17, file: !1, line: 3, column: 28)
+!20 = !DILocation(line: 3, column: 23, scope: !17)
+!21 = !DILocation(line: 6, column: 1, scope: !13)
Modified: llvm/trunk/test/CodeGen/Hexagon/hwloop-le.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/hwloop-le.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/hwloop-le.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/hwloop-le.ll Fri Oct 19 10:31:11 2018
@@ -1,438 +1,408 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 -O3 < %s | FileCheck %s
+; RUN: llc -march=hexagon -mcpu=hexagonv5 -O3 < %s | FileCheck %s
-
-; CHECK: test_pos1_ir_sle
+; CHECK-LABEL: f0:
; CHECK: loop0
; a < b
-define void @test_pos1_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp sle i32 28395, %b
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f0(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp sle i32 28395, %a2
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ 28395, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 1
- %cmp = icmp sle i32 %inc, %b
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ 28395, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 1
+ %v8 = icmp sle i32 %v7, %a2
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos2_ir_sle
+; CHECK-LABEL: f1:
; CHECK: loop0
; a < b
-define void @test_pos2_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp sle i32 9073, %b
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f1(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp sle i32 9073, %a2
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ 9073, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 2
- %cmp = icmp sle i32 %inc, %b
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ 9073, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 2
+ %v8 = icmp sle i32 %v7, %a2
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos4_ir_sle
+; CHECK-LABEL: f2:
; CHECK: loop0
; a < b
-define void @test_pos4_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp sle i32 21956, %b
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f2(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp sle i32 21956, %a2
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ 21956, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 4
- %cmp = icmp sle i32 %inc, %b
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ 21956, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 4
+ %v8 = icmp sle i32 %v7, %a2
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos8_ir_sle
+; CHECK-LABEL: f3:
; CHECK: loop0
; a < b
-define void @test_pos8_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp sle i32 16782, %b
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f3(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp sle i32 16782, %a2
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ 16782, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 8
- %cmp = icmp sle i32 %inc, %b
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ 16782, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 8
+ %v8 = icmp sle i32 %v7, %a2
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos16_ir_sle
+; CHECK-LABEL: f4:
; CHECK: loop0
; a < b
-define void @test_pos16_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp sle i32 19097, %b
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f4(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp sle i32 19097, %a2
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ 19097, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 16
- %cmp = icmp sle i32 %inc, %b
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ 19097, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 16
+ %v8 = icmp sle i32 %v7, %a2
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos1_ri_sle
+; CHECK-LABEL: f5:
; CHECK: loop0
; a < b
-define void @test_pos1_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp sle i32 %a, 14040
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f5(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp sle i32 %a1, 14040
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 1
- %cmp = icmp sle i32 %inc, 14040
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %a1, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 1
+ %v8 = icmp sle i32 %v7, 14040
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos2_ri_sle
+; CHECK-LABEL: f6:
; CHECK: loop0
; a < b
-define void @test_pos2_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp sle i32 %a, 13710
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f6(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp sle i32 %a1, 13710
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 2
- %cmp = icmp sle i32 %inc, 13710
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %a1, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 2
+ %v8 = icmp sle i32 %v7, 13710
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos4_ri_sle
+; CHECK-LABEL: f7:
; CHECK: loop0
; a < b
-define void @test_pos4_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp sle i32 %a, 9920
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f7(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp sle i32 %a1, 9920
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 4
- %cmp = icmp sle i32 %inc, 9920
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %a1, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 4
+ %v8 = icmp sle i32 %v7, 9920
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos8_ri_sle
+; CHECK-LABEL: f8:
; CHECK: loop0
; a < b
-define void @test_pos8_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp sle i32 %a, 18924
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f8(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp sle i32 %a1, 18924
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 8
- %cmp = icmp sle i32 %inc, 18924
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %a1, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 8
+ %v8 = icmp sle i32 %v7, 18924
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos16_ri_sle
+; CHECK-LABEL: f9:
; CHECK: loop0
; a < b
-define void @test_pos16_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp sle i32 %a, 11812
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f9(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp sle i32 %a1, 11812
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 16
- %cmp = icmp sle i32 %inc, 11812
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %a1, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 16
+ %v8 = icmp sle i32 %v7, 11812
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos1_rr_sle
+; CHECK-LABEL: f10:
; CHECK: loop0
; a < b
-define void @test_pos1_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp sle i32 %a, %b
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f10(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp sle i32 %a1, %a2
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 1
- %cmp = icmp sle i32 %inc, %b
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %a1, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 1
+ %v8 = icmp sle i32 %v7, %a2
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos2_rr_sle
+; CHECK-LABEL: f11:
; CHECK: loop0
; a < b
-define void @test_pos2_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp sle i32 %a, %b
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f11(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp sle i32 %a1, %a2
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 2
- %cmp = icmp sle i32 %inc, %b
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %a1, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 2
+ %v8 = icmp sle i32 %v7, %a2
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos4_rr_sle
+; CHECK-LABEL: f12:
; CHECK: loop0
; a < b
-define void @test_pos4_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp sle i32 %a, %b
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f12(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp sle i32 %a1, %a2
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 4
- %cmp = icmp sle i32 %inc, %b
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %a1, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 4
+ %v8 = icmp sle i32 %v7, %a2
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos8_rr_sle
+; CHECK-LABEL: f13:
; CHECK: loop0
; a < b
-define void @test_pos8_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp sle i32 %a, %b
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f13(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp sle i32 %a1, %a2
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 8
- %cmp = icmp sle i32 %inc, %b
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %a1, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 8
+ %v8 = icmp sle i32 %v7, %a2
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos16_rr_sle
+; CHECK-LABEL: f14:
; CHECK: loop0
; a < b
-define void @test_pos16_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp sle i32 %a, %b
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f14(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp sle i32 %a1, %a2
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 16
- %cmp = icmp sle i32 %inc, %b
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %a1, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 16
+ %v8 = icmp sle i32 %v7, %a2
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/hwloop-ne.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/hwloop-ne.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/hwloop-ne.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/hwloop-ne.ll Fri Oct 19 10:31:11 2018
@@ -1,438 +1,408 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 -O3 < %s | FileCheck %s
+; RUN: llc -march=hexagon -O3 < %s | FileCheck %s
-
-; CHECK: test_pos1_ir_ne
+; CHECK-LABEL: f0:
; CHECK: loop0
; a < b
-define void @test_pos1_ir_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp slt i32 32623, %b
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f0(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp slt i32 32623, %a2
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ 32623, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 1
- %cmp = icmp ne i32 %inc, %b
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ 32623, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 1
+ %v8 = icmp ne i32 %v7, %a2
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos2_ir_ne
+; CHECK-LABEL: f1:
; CHECK: loop0
; a < b
-define void @test_pos2_ir_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp slt i32 29554, %b
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f1(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp slt i32 29554, %a2
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ 29554, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 2
- %cmp = icmp ne i32 %inc, %b
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ 29554, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 2
+ %v8 = icmp ne i32 %v7, %a2
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos4_ir_ne
+; CHECK-LABEL: f2:
; CHECK: loop0
; a < b
-define void @test_pos4_ir_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp slt i32 15692, %b
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f2(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp slt i32 15692, %a2
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ 15692, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 4
- %cmp = icmp ne i32 %inc, %b
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ 15692, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 4
+ %v8 = icmp ne i32 %v7, %a2
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos8_ir_ne
+; CHECK-LABEL: f3:
; CHECK: loop0
; a < b
-define void @test_pos8_ir_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp slt i32 10449, %b
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f3(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp slt i32 10449, %a2
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ 10449, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 8
- %cmp = icmp ne i32 %inc, %b
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ 10449, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 8
+ %v8 = icmp ne i32 %v7, %a2
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos16_ir_ne
+; CHECK-LABEL: f4:
; CHECK: loop0
; a < b
-define void @test_pos16_ir_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp slt i32 32087, %b
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f4(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp slt i32 32087, %a2
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ 32087, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 16
- %cmp = icmp ne i32 %inc, %b
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ 32087, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 16
+ %v8 = icmp ne i32 %v7, %a2
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos1_ri_ne
+; CHECK-LABEL: f5:
; CHECK: loop0
; a < b
-define void @test_pos1_ri_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp slt i32 %a, 3472
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f5(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp slt i32 %a1, 3472
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 1
- %cmp = icmp ne i32 %inc, 3472
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %a1, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 1
+ %v8 = icmp ne i32 %v7, 3472
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos2_ri_ne
+; CHECK-LABEL: f6:
; CHECK: loop0
; a < b
-define void @test_pos2_ri_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp slt i32 %a, 8730
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f6(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp slt i32 %a1, 8730
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 2
- %cmp = icmp ne i32 %inc, 8730
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %a1, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 2
+ %v8 = icmp ne i32 %v7, 8730
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos4_ri_ne
+; CHECK-LABEL: f7:
; CHECK: loop0
; a < b
-define void @test_pos4_ri_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp slt i32 %a, 1493
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f7(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp slt i32 %a1, 1493
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 4
- %cmp = icmp ne i32 %inc, 1493
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %a1, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 4
+ %v8 = icmp ne i32 %v7, 1493
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos8_ri_ne
+; CHECK-LABEL: f8:
; CHECK: loop0
; a < b
-define void @test_pos8_ri_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp slt i32 %a, 1706
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f8(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp slt i32 %a1, 1706
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 8
- %cmp = icmp ne i32 %inc, 1706
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %a1, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 8
+ %v8 = icmp ne i32 %v7, 1706
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos16_ri_ne
+; CHECK-LABEL: f9:
; CHECK: loop0
; a < b
-define void @test_pos16_ri_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp slt i32 %a, 1886
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f9(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp slt i32 %a1, 1886
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 16
- %cmp = icmp ne i32 %inc, 1886
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %a1, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 16
+ %v8 = icmp ne i32 %v7, 1886
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos1_rr_ne
+; CHECK-LABEL: f10:
; CHECK: loop0
; a < b
-define void @test_pos1_rr_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp slt i32 %a, %b
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f10(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp slt i32 %a1, %a2
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 1
- %cmp = icmp ne i32 %inc, %b
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %a1, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 1
+ %v8 = icmp ne i32 %v7, %a2
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos2_rr_ne
+; CHECK-LABEL: f11:
; CHECK: loop0
; a < b
-define void @test_pos2_rr_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp slt i32 %a, %b
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f11(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp slt i32 %a1, %a2
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 2
- %cmp = icmp ne i32 %inc, %b
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %a1, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 2
+ %v8 = icmp ne i32 %v7, %a2
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos4_rr_ne
+; CHECK-LABEL: f12:
; CHECK: loop0
; a < b
-define void @test_pos4_rr_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp slt i32 %a, %b
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f12(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp slt i32 %a1, %a2
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 4
- %cmp = icmp ne i32 %inc, %b
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %a1, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 4
+ %v8 = icmp ne i32 %v7, %a2
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos8_rr_ne
+; CHECK-LABEL: f13
; CHECK: loop0
; a < b
-define void @test_pos8_rr_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp slt i32 %a, %b
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f13(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp slt i32 %a1, %a2
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 8
- %cmp = icmp ne i32 %inc, %b
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %a1, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 8
+ %v8 = icmp ne i32 %v7, %a2
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
-; CHECK: test_pos16_rr_ne
+; CHECK-LABEL: f14
; CHECK: loop0
; a < b
-define void @test_pos16_rr_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind {
-entry:
- %cmp3 = icmp slt i32 %a, %b
- br i1 %cmp3, label %for.body.lr.ph, label %for.end
+define void @f14(i8* nocapture %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp slt i32 %a1, %a2
+ br i1 %v0, label %b1, label %b3
-for.body.lr.ph: ; preds = %entry
- br label %for.body
+b1: ; preds = %b0
+ br label %b2
-for.body: ; preds = %for.body.lr.ph, %for.body
- %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
- %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
- %0 = load i8, i8* %arrayidx, align 1
- %conv = zext i8 %0 to i32
- %add = add nsw i32 %conv, 1
- %conv1 = trunc i32 %add to i8
- store i8 %conv1, i8* %arrayidx, align 1
- %inc = add nsw i32 %i.04, 16
- %cmp = icmp ne i32 %inc, %b
- br i1 %cmp, label %for.body, label %for.end
+b2: ; preds = %b2, %b1
+ %v1 = phi i32 [ %a1, %b1 ], [ %v7, %b2 ]
+ %v2 = getelementptr inbounds i8, i8* %a0, i32 %v1
+ %v3 = load i8, i8* %v2, align 1
+ %v4 = zext i8 %v3 to i32
+ %v5 = add nsw i32 %v4, 1
+ %v6 = trunc i32 %v5 to i8
+ store i8 %v6, i8* %v2, align 1
+ %v7 = add nsw i32 %v1, 16
+ %v8 = icmp ne i32 %v7, %a2
+ br i1 %v8, label %b2, label %b3
-for.end: ; preds = %for.body, %entry
+b3: ; preds = %b2, %b0
ret void
}
-
-
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/i16_VarArg.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/i16_VarArg.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/i16_VarArg.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/i16_VarArg.ll Fri Oct 19 10:31:11 2018
@@ -1,40 +1,36 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
-; CHECK: call __hexagon_{{[A-Z_a-z0-9]+}}
+; RUN: llc -march=hexagon < %s | FileCheck %s
+; CHECK: dfcmp
- at a_str = internal constant [8 x i8] c"a = %f\0A\00"
- at b_str = internal constant [8 x i8] c"b = %f\0A\00"
- at add_str = internal constant [12 x i8] c"a + b = %f\0A\00"
- at sub_str = internal constant [12 x i8] c"a - b = %f\0A\00"
- at mul_str = internal constant [12 x i8] c"a * b = %f\0A\00"
- at div_str = internal constant [12 x i8] c"b / a = %f\0A\00"
- at rem_str = internal constant [13 x i8] c"b %% a = %f\0A\00"
- at lt_str = internal constant [12 x i8] c"a < b = %d\0A\00"
- at le_str = internal constant [13 x i8] c"a <= b = %d\0A\00"
- at gt_str = internal constant [12 x i8] c"a > b = %d\0A\00"
- at ge_str = internal constant [13 x i8] c"a >= b = %d\0A\00"
- at eq_str = internal constant [13 x i8] c"a == b = %d\0A\00"
- at ne_str = internal constant [13 x i8] c"a != b = %d\0A\00"
- at A = global double 2.000000e+00
- at B = global double 5.000000e+00
+ at g0 = internal constant [12 x i8] c"a < b = %d\0A\00"
+ at g1 = internal constant [13 x i8] c"a <= b = %d\0A\00"
+ at g2 = internal constant [12 x i8] c"a > b = %d\0A\00"
+ at g3 = internal constant [13 x i8] c"a >= b = %d\0A\00"
+ at g4 = internal constant [13 x i8] c"a == b = %d\0A\00"
+ at g5 = internal constant [13 x i8] c"a != b = %d\0A\00"
+ at g6 = global double 2.000000e+00
+ at g7 = global double 5.000000e+00
-declare i32 @printf(i8*, ...)
+declare i32 @f0(i8*, ...) #0
-define i32 @main() {
- %a = load double, double* @A
- %b = load double, double* @B
- %lt_r = fcmp olt double %a, %b
- %le_r = fcmp ole double %a, %b
- %gt_r = fcmp ogt double %a, %b
- %ge_r = fcmp oge double %a, %b
- %eq_r = fcmp oeq double %a, %b
- %ne_r = fcmp une double %a, %b
- %val1 = zext i1 %lt_r to i16
- %lt_s = getelementptr [12 x i8], [12 x i8]* @lt_str, i64 0, i64 0
- %le_s = getelementptr [13 x i8], [13 x i8]* @le_str, i64 0, i64 0
- %gt_s = getelementptr [12 x i8], [12 x i8]* @gt_str, i64 0, i64 0
- %ge_s = getelementptr [13 x i8], [13 x i8]* @ge_str, i64 0, i64 0
- %eq_s = getelementptr [13 x i8], [13 x i8]* @eq_str, i64 0, i64 0
- %ne_s = getelementptr [13 x i8], [13 x i8]* @ne_str, i64 0, i64 0
- call i32 (i8*, ...) @printf( i8* %lt_s, i16 %val1 )
- ret i32 0
+define i32 @f1() #0 {
+b0:
+ %v0 = load double, double* @g6
+ %v1 = load double, double* @g7
+ %v2 = fcmp olt double %v0, %v1
+ %v3 = fcmp ole double %v0, %v1
+ %v4 = fcmp ogt double %v0, %v1
+ %v5 = fcmp oge double %v0, %v1
+ %v6 = fcmp oeq double %v0, %v1
+ %v7 = fcmp une double %v0, %v1
+ %v8 = zext i1 %v2 to i16
+ %v9 = getelementptr [12 x i8], [12 x i8]* @g0, i64 0, i64 0
+ %v10 = getelementptr [13 x i8], [13 x i8]* @g1, i64 0, i64 0
+ %v11 = getelementptr [12 x i8], [12 x i8]* @g2, i64 0, i64 0
+ %v12 = getelementptr [13 x i8], [13 x i8]* @g3, i64 0, i64 0
+ %v13 = getelementptr [13 x i8], [13 x i8]* @g4, i64 0, i64 0
+ %v14 = getelementptr [13 x i8], [13 x i8]* @g5, i64 0, i64 0
+ %v15 = call i32 (i8*, ...) @f0(i8* %v9, i16 %v8)
+ ret i32 0
}
+
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/i1_VarArg.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/i1_VarArg.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/i1_VarArg.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/i1_VarArg.ll Fri Oct 19 10:31:11 2018
@@ -1,44 +1,40 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
-; CHECK: call __hexagon_{{[_A-Za-z0-9]+}}
+; RUN: llc -march=hexagon < %s | FileCheck %s
+; CHECK: dfcmp
- at a_str = internal constant [8 x i8] c"a = %f\0A\00"
- at b_str = internal constant [8 x i8] c"b = %f\0A\00"
- at add_str = internal constant [12 x i8] c"a + b = %f\0A\00"
- at sub_str = internal constant [12 x i8] c"a - b = %f\0A\00"
- at mul_str = internal constant [12 x i8] c"a * b = %f\0A\00"
- at div_str = internal constant [12 x i8] c"b / a = %f\0A\00"
- at rem_str = internal constant [13 x i8] c"b %% a = %f\0A\00"
- at lt_str = internal constant [12 x i8] c"a < b = %d\0A\00"
- at le_str = internal constant [13 x i8] c"a <= b = %d\0A\00"
- at gt_str = internal constant [12 x i8] c"a > b = %d\0A\00"
- at ge_str = internal constant [13 x i8] c"a >= b = %d\0A\00"
- at eq_str = internal constant [13 x i8] c"a == b = %d\0A\00"
- at ne_str = internal constant [13 x i8] c"a != b = %d\0A\00"
- at A = global double 2.000000e+00
- at B = global double 5.000000e+00
+ at g0 = internal constant [12 x i8] c"a < b = %d\0A\00"
+ at g1 = internal constant [13 x i8] c"a <= b = %d\0A\00"
+ at g2 = internal constant [12 x i8] c"a > b = %d\0A\00"
+ at g3 = internal constant [13 x i8] c"a >= b = %d\0A\00"
+ at g4 = internal constant [13 x i8] c"a == b = %d\0A\00"
+ at g5 = internal constant [13 x i8] c"a != b = %d\0A\00"
+ at g6 = global double 2.000000e+00
+ at g7 = global double 5.000000e+00
-declare i32 @printf(i8*, ...)
+declare i32 @f0(i8*, ...) #0
-define i32 @main() {
- %a = load double, double* @A
- %b = load double, double* @B
- %lt_r = fcmp olt double %a, %b
- %le_r = fcmp ole double %a, %b
- %gt_r = fcmp ogt double %a, %b
- %ge_r = fcmp oge double %a, %b
- %eq_r = fcmp oeq double %a, %b
- %ne_r = fcmp une double %a, %b
- %lt_s = getelementptr [12 x i8], [12 x i8]* @lt_str, i64 0, i64 0
- %le_s = getelementptr [13 x i8], [13 x i8]* @le_str, i64 0, i64 0
- %gt_s = getelementptr [12 x i8], [12 x i8]* @gt_str, i64 0, i64 0
- %ge_s = getelementptr [13 x i8], [13 x i8]* @ge_str, i64 0, i64 0
- %eq_s = getelementptr [13 x i8], [13 x i8]* @eq_str, i64 0, i64 0
- %ne_s = getelementptr [13 x i8], [13 x i8]* @ne_str, i64 0, i64 0
- call i32 (i8*, ...) @printf( i8* %lt_s, i1 %lt_r )
- call i32 (i8*, ...) @printf( i8* %le_s, i1 %le_r )
- call i32 (i8*, ...) @printf( i8* %gt_s, i1 %gt_r )
- call i32 (i8*, ...) @printf( i8* %ge_s, i1 %ge_r )
- call i32 (i8*, ...) @printf( i8* %eq_s, i1 %eq_r )
- call i32 (i8*, ...) @printf( i8* %ne_s, i1 %ne_r )
- ret i32 0
+define i32 @f1() #0 {
+b0:
+ %v0 = load double, double* @g6
+ %v1 = load double, double* @g7
+ %v2 = fcmp olt double %v0, %v1
+ %v3 = fcmp ole double %v0, %v1
+ %v4 = fcmp ogt double %v0, %v1
+ %v5 = fcmp oge double %v0, %v1
+ %v6 = fcmp oeq double %v0, %v1
+ %v7 = fcmp une double %v0, %v1
+ %v8 = getelementptr [12 x i8], [12 x i8]* @g0, i64 0, i64 0
+ %v9 = getelementptr [13 x i8], [13 x i8]* @g1, i64 0, i64 0
+ %v10 = getelementptr [12 x i8], [12 x i8]* @g2, i64 0, i64 0
+ %v11 = getelementptr [13 x i8], [13 x i8]* @g3, i64 0, i64 0
+ %v12 = getelementptr [13 x i8], [13 x i8]* @g4, i64 0, i64 0
+ %v13 = getelementptr [13 x i8], [13 x i8]* @g5, i64 0, i64 0
+ %v14 = call i32 (i8*, ...) @f0(i8* %v8, i1 %v2)
+ %v15 = call i32 (i8*, ...) @f0(i8* %v9, i1 %v3)
+ %v16 = call i32 (i8*, ...) @f0(i8* %v10, i1 %v4)
+ %v17 = call i32 (i8*, ...) @f0(i8* %v11, i1 %v5)
+ %v18 = call i32 (i8*, ...) @f0(i8* %v12, i1 %v6)
+ %v19 = call i32 (i8*, ...) @f0(i8* %v13, i1 %v7)
+ ret i32 0
}
+
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/i8_VarArg.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/i8_VarArg.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/i8_VarArg.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/i8_VarArg.ll Fri Oct 19 10:31:11 2018
@@ -1,40 +1,36 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
-; CHECK: call __hexagon_{{[A-Z_a-z0-9]+}}
+; RUN: llc -march=hexagon < %s | FileCheck %s
+; CHECK: dfcmp
- at a_str = internal constant [8 x i8] c"a = %f\0A\00"
- at b_str = internal constant [8 x i8] c"b = %f\0A\00"
- at add_str = internal constant [12 x i8] c"a + b = %f\0A\00"
- at sub_str = internal constant [12 x i8] c"a - b = %f\0A\00"
- at mul_str = internal constant [12 x i8] c"a * b = %f\0A\00"
- at div_str = internal constant [12 x i8] c"b / a = %f\0A\00"
- at rem_str = internal constant [13 x i8] c"b %% a = %f\0A\00"
- at lt_str = internal constant [12 x i8] c"a < b = %d\0A\00"
- at le_str = internal constant [13 x i8] c"a <= b = %d\0A\00"
- at gt_str = internal constant [12 x i8] c"a > b = %d\0A\00"
- at ge_str = internal constant [13 x i8] c"a >= b = %d\0A\00"
- at eq_str = internal constant [13 x i8] c"a == b = %d\0A\00"
- at ne_str = internal constant [13 x i8] c"a != b = %d\0A\00"
- at A = global double 2.000000e+00
- at B = global double 5.000000e+00
+ at g0 = internal constant [12 x i8] c"a < b = %d\0A\00"
+ at g1 = internal constant [13 x i8] c"a <= b = %d\0A\00"
+ at g2 = internal constant [12 x i8] c"a > b = %d\0A\00"
+ at g3 = internal constant [13 x i8] c"a >= b = %d\0A\00"
+ at g4 = internal constant [13 x i8] c"a == b = %d\0A\00"
+ at g5 = internal constant [13 x i8] c"a != b = %d\0A\00"
+ at g6 = global double 2.000000e+00
+ at g7 = global double 5.000000e+00
-declare i32 @printf(i8*, ...)
+declare i32 @f0(i8*, ...) #0
-define i32 @main() {
- %a = load double, double* @A
- %b = load double, double* @B
- %lt_r = fcmp olt double %a, %b
- %le_r = fcmp ole double %a, %b
- %gt_r = fcmp ogt double %a, %b
- %ge_r = fcmp oge double %a, %b
- %eq_r = fcmp oeq double %a, %b
- %ne_r = fcmp une double %a, %b
- %val1 = zext i1 %lt_r to i8
- %lt_s = getelementptr [12 x i8], [12 x i8]* @lt_str, i64 0, i64 0
- %le_s = getelementptr [13 x i8], [13 x i8]* @le_str, i64 0, i64 0
- %gt_s = getelementptr [12 x i8], [12 x i8]* @gt_str, i64 0, i64 0
- %ge_s = getelementptr [13 x i8], [13 x i8]* @ge_str, i64 0, i64 0
- %eq_s = getelementptr [13 x i8], [13 x i8]* @eq_str, i64 0, i64 0
- %ne_s = getelementptr [13 x i8], [13 x i8]* @ne_str, i64 0, i64 0
- call i32 (i8*, ...) @printf( i8* %lt_s, i8 %val1 )
- ret i32 0
+define i32 @f1() #0 {
+b0:
+ %v0 = load double, double* @g6
+ %v1 = load double, double* @g7
+ %v2 = fcmp olt double %v0, %v1
+ %v3 = fcmp ole double %v0, %v1
+ %v4 = fcmp ogt double %v0, %v1
+ %v5 = fcmp oge double %v0, %v1
+ %v6 = fcmp oeq double %v0, %v1
+ %v7 = fcmp une double %v0, %v1
+ %v8 = zext i1 %v2 to i8
+ %v9 = getelementptr [12 x i8], [12 x i8]* @g0, i64 0, i64 0
+ %v10 = getelementptr [13 x i8], [13 x i8]* @g1, i64 0, i64 0
+ %v11 = getelementptr [12 x i8], [12 x i8]* @g2, i64 0, i64 0
+ %v12 = getelementptr [13 x i8], [13 x i8]* @g3, i64 0, i64 0
+ %v13 = getelementptr [13 x i8], [13 x i8]* @g4, i64 0, i64 0
+ %v14 = getelementptr [13 x i8], [13 x i8]* @g5, i64 0, i64 0
+ %v15 = call i32 (i8*, ...) @f0(i8* %v9, i8 %v8)
+ ret i32 0
}
+
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/macint.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/macint.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/macint.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/macint.ll Fri Oct 19 10:31:11 2018
@@ -1,14 +1,15 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
+; RUN: llc -march=hexagon < %s | FileCheck %s
; Check that we generate integer multiply accumulate.
; CHECK: r{{[0-9]+}} {{\+|\-}}= mpyi(r{{[0-9]+}},
-define i32 @main(i32* %a, i32* %b) nounwind {
- entry:
- %0 = load i32, i32* %a, align 4
- %div = udiv i32 %0, 10000
- %rem = urem i32 %div, 10
- store i32 %rem, i32* %b, align 4
+define i32 @f0(i32* %a0, i32* %a1) #0 {
+b0:
+ %v0 = load i32, i32* %a0, align 4
+ %v1 = udiv i32 %v0, 10000
+ %v2 = urem i32 %v1, 10
+ store i32 %v2, i32* %a1, align 4
ret i32 0
}
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/misaligned-access.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/misaligned-access.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/misaligned-access.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/misaligned-access.ll Fri Oct 19 10:31:11 2018
@@ -1,16 +1,19 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s
+; RUN: llc -march=hexagon < %s
; Check that the mis-aligned load doesn't cause compiler to assert.
-declare i32 @_hi(i64) #1
- at temp1 = common global i32 0, align 4
+ at g0 = common global i32 0, align 4
-define i32 @CSDRSEARCH_executeSearchManager() #0 {
-entry:
- %temp = alloca i32, align 4
- %0 = load i32, i32* @temp1, align 4
- store i32 %0, i32* %temp, align 4
- %1 = bitcast i32* %temp to i64*
- %2 = load i64, i64* %1, align 8
- %call = call i32 @_hi(i64 %2)
- ret i32 %call
+declare i32 @f0(i64) #0
+
+define i32 @f1() #0 {
+b0:
+ %v0 = alloca i32, align 4
+ %v1 = load i32, i32* @g0, align 4
+ store i32 %v1, i32* %v0, align 4
+ %v2 = bitcast i32* %v0 to i64*
+ %v3 = load i64, i64* %v2, align 8
+ %v4 = call i32 @f0(i64 %v3)
+ ret i32 %v4
}
+
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/mpy.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/mpy.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/mpy.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/mpy.ll Fri Oct 19 10:31:11 2018
@@ -1,19 +1,21 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
+; RUN: llc -march=hexagon < %s | FileCheck %s
; CHECK: += mpyi
-define void @foo(i32 %acc, i32 %num, i32 %num2) nounwind {
-entry:
- %acc.addr = alloca i32, align 4
- %num.addr = alloca i32, align 4
- %num2.addr = alloca i32, align 4
- store i32 %acc, i32* %acc.addr, align 4
- store i32 %num, i32* %num.addr, align 4
- store i32 %num2, i32* %num2.addr, align 4
- %0 = load i32, i32* %num.addr, align 4
- %1 = load i32, i32* %acc.addr, align 4
- %mul = mul nsw i32 %0, %1
- %2 = load i32, i32* %num2.addr, align 4
- %add = add nsw i32 %mul, %2
- store i32 %add, i32* %num.addr, align 4
+define void @f0(i32 %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = alloca i32, align 4
+ %v1 = alloca i32, align 4
+ %v2 = alloca i32, align 4
+ store i32 %a0, i32* %v0, align 4
+ store i32 %a1, i32* %v1, align 4
+ store i32 %a2, i32* %v2, align 4
+ %v3 = load i32, i32* %v1, align 4
+ %v4 = load i32, i32* %v0, align 4
+ %v5 = mul nsw i32 %v3, %v4
+ %v6 = load i32, i32* %v2, align 4
+ %v7 = add nsw i32 %v5, %v6
+ store i32 %v7, i32* %v1, align 4
ret void
}
+
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/newvaluejump.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/newvaluejump.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/newvaluejump.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/newvaluejump.ll Fri Oct 19 10:31:11 2018
@@ -1,33 +1,36 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
+; RUN: llc -march=hexagon < %s | FileCheck %s
; Check that we generate new value jump.
- at i = global i32 0, align 4
- at j = global i32 10, align 4
-
-define i32 @foo(i32 %a) nounwind {
-entry:
; CHECK: if (cmp.eq(r{{[0-9]+}}.new,#0)) jump{{.}}
- %addr1 = alloca i32, align 4
- %addr2 = alloca i32, align 4
- %0 = load i32, i32* @i, align 4
- store i32 %0, i32* %addr1, align 4
- call void @bar(i32 1, i32 2)
- %1 = load i32, i32* @j, align 4
- %tobool = icmp ne i32 %1, 0
- br i1 %tobool, label %if.then, label %if.else
-
-if.then:
- call void @baz(i32 1, i32 2)
- br label %if.end
-
-if.else:
- call void @guy(i32 10, i32 20)
- br label %if.end
-if.end:
+ at g0 = global i32 0, align 4
+ at g1 = global i32 10, align 4
+
+define i32 @f0(i32 %a0) #0 {
+b0:
+ %v0 = alloca i32, align 4
+ %v1 = alloca i32, align 4
+ %v2 = load i32, i32* @g0, align 4
+ store i32 %v2, i32* %v0, align 4
+ call void @f2(i32 1, i32 2)
+ %v3 = load i32, i32* @g1, align 4
+ %v4 = icmp ne i32 %v3, 0
+ br i1 %v4, label %b1, label %b2
+
+b1: ; preds = %b0
+ call void @f3(i32 1, i32 2)
+ br label %b3
+
+b2: ; preds = %b0
+ call void @f1(i32 10, i32 20)
+ br label %b3
+
+b3: ; preds = %b2, %b1
ret i32 0
}
-declare void @guy(i32, i32)
-declare void @bar(i32, i32)
-declare void @baz(i32, i32)
+declare void @f1(i32, i32) #0
+declare void @f2(i32, i32) #0
+declare void @f3(i32, i32) #0
+
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/packetize_cond_inst.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/packetize_cond_inst.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/packetize_cond_inst.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/packetize_cond_inst.ll Fri Oct 19 10:31:11 2018
@@ -1,10 +1,8 @@
-; RUN: llc -mcpu=hexagonv4 -tail-dup-size=1 < %s | FileCheck %s
+; RUN: llc -march=hexagon -tail-dup-size=1 < %s | FileCheck %s
-target datalayout = "e-p:32:32:32-i64:64:64-i32:32:32-i16:16:16-i1:32:32-f64:64:64-f32:32:32-v64:64:64-v32:32:32-a0:0-n16:32"
target triple = "hexagon-unknown--elf"
; Make sure we put the two conditionally executed adds in a packet.
-; ifcnv_add:
; {
; p0 = cmp.gt(r2, r1)
; if (!p0.new) r0 = add(r2, r1)
@@ -13,20 +11,23 @@ target triple = "hexagon-unknown--elf"
; CHECK: cmp
; CHECK-NEXT: add
; CHECK-NEXT: add
-define i32 @ifcnv_add(i32, i32, i32) nounwind readnone {
- %4 = icmp sgt i32 %2, %1
- br i1 %4, label %5, label %7
-
-; <label>:5 ; preds = %3
- %6 = add nsw i32 %0, 10
- br label %9
-
-; <label>:7 ; preds = %3
- %8 = add nsw i32 %2, %1
- br label %9
-
-; <label>:9 ; preds = %7, %5
- %10 = phi i32 [ %6, %5 ], [ %8, %7 ]
- %11 = add nsw i32 %10, 1
- ret i32 %11
+define i32 @f0(i32 %a0, i32 %a1, i32 %a2) #0 {
+b0:
+ %v0 = icmp sgt i32 %a2, %a1
+ br i1 %v0, label %b1, label %b2
+
+b1: ; preds = %b0
+ %v1 = add nsw i32 %a0, 10
+ br label %b3
+
+b2: ; preds = %b0
+ %v2 = add nsw i32 %a2, %a1
+ br label %b3
+
+b3: ; preds = %b2, %b1
+ %v3 = phi i32 [ %v1, %b1 ], [ %v2, %b2 ]
+ %v4 = add nsw i32 %v3, 1
+ ret i32 %v4
}
+
+attributes #0 = { nounwind readnone "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/postinc-load.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/postinc-load.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/postinc-load.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/postinc-load.ll Fri Oct 19 10:31:11 2018
@@ -1,29 +1,30 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
+; RUN: llc -march=hexagon < %s | FileCheck %s
; Check that post-increment load instructions are being generated.
; CHECK: r{{[0-9]+}} = memw(r{{[0-9]+}}++#4)
-define i32 @sum(i32* nocapture %a, i16* nocapture %b, i32 %n) nounwind {
-entry:
- br label %for.body
+define i32 @f0(i32* nocapture %a0, i16* nocapture %a1, i32 %a2) #0 {
+b0:
+ br label %b1
-for.body:
- %lsr.iv = phi i32 [ %lsr.iv.next, %for.body ], [ 10, %entry ]
- %arrayidx.phi = phi i32* [ %a, %entry ], [ %arrayidx.inc, %for.body ]
- %arrayidx1.phi = phi i16* [ %b, %entry ], [ %arrayidx1.inc, %for.body ]
- %sum.03 = phi i32 [ 0, %entry ], [ %add2, %for.body ]
- %0 = load i32, i32* %arrayidx.phi, align 4
- %1 = load i16, i16* %arrayidx1.phi, align 2
- %conv = sext i16 %1 to i32
- %add = add i32 %0, %sum.03
- %add2 = add i32 %add, %conv
- %arrayidx.inc = getelementptr i32, i32* %arrayidx.phi, i32 1
- %arrayidx1.inc = getelementptr i16, i16* %arrayidx1.phi, i32 1
- %lsr.iv.next = add i32 %lsr.iv, -1
- %exitcond = icmp eq i32 %lsr.iv.next, 0
- br i1 %exitcond, label %for.end, label %for.body
+b1: ; preds = %b1, %b0
+ %v0 = phi i32 [ %v11, %b1 ], [ 10, %b0 ]
+ %v1 = phi i32* [ %a0, %b0 ], [ %v9, %b1 ]
+ %v2 = phi i16* [ %a1, %b0 ], [ %v10, %b1 ]
+ %v3 = phi i32 [ 0, %b0 ], [ %v8, %b1 ]
+ %v4 = load i32, i32* %v1, align 4
+ %v5 = load i16, i16* %v2, align 2
+ %v6 = sext i16 %v5 to i32
+ %v7 = add i32 %v4, %v3
+ %v8 = add i32 %v7, %v6
+ %v9 = getelementptr i32, i32* %v1, i32 1
+ %v10 = getelementptr i16, i16* %v2, i32 1
+ %v11 = add i32 %v0, -1
+ %v12 = icmp eq i32 %v11, 0
+ br i1 %v12, label %b2, label %b1
-for.end:
- ret i32 %add2
+b2: ; preds = %b1
+ ret i32 %v8
}
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/postinc-store.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/postinc-store.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/postinc-store.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/postinc-store.ll Fri Oct 19 10:31:11 2018
@@ -1,29 +1,30 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
+; RUN: llc -march=hexagon < %s | FileCheck %s
; Check that post-increment store instructions are being generated.
; CHECK: memw(r{{[0-9]+}}++#4) = r{{[0-9]+}}
-define i32 @sum(i32* nocapture %a, i16* nocapture %b, i32 %n) nounwind {
-entry:
- br label %for.body
+define i32 @f0(i32* nocapture %a0, i16* nocapture %a1, i32 %a2) #0 {
+b0:
+ br label %b1
-for.body: ; preds = %for.body, %entry
- %lsr.iv = phi i32 [ %lsr.iv.next, %for.body ], [ 10, %entry ]
- %arrayidx.phi = phi i32* [ %a, %entry ], [ %arrayidx.inc, %for.body ]
- %arrayidx1.phi = phi i16* [ %b, %entry ], [ %arrayidx1.inc, %for.body ]
- %0 = load i32, i32* %arrayidx.phi, align 4
- %1 = load i16, i16* %arrayidx1.phi, align 2
- %conv = sext i16 %1 to i32
- %factor = mul i32 %0, 2
- %add3 = add i32 %factor, %conv
- store i32 %add3, i32* %arrayidx.phi, align 4
+b1: ; preds = %b1, %b0
+ %v0 = phi i32 [ %v10, %b1 ], [ 10, %b0 ]
+ %v1 = phi i32* [ %a0, %b0 ], [ %v8, %b1 ]
+ %v2 = phi i16* [ %a1, %b0 ], [ %v9, %b1 ]
+ %v3 = load i32, i32* %v1, align 4
+ %v4 = load i16, i16* %v2, align 2
+ %v5 = sext i16 %v4 to i32
+ %v6 = mul i32 %v3, 2
+ %v7 = add i32 %v6, %v5
+ store i32 %v7, i32* %v1, align 4
+ %v8 = getelementptr i32, i32* %v1, i32 1
+ %v9 = getelementptr i16, i16* %v2, i32 1
+ %v10 = add i32 %v0, -1
+ %v11 = icmp eq i32 %v10, 0
+ br i1 %v11, label %b2, label %b1
- %arrayidx.inc = getelementptr i32, i32* %arrayidx.phi, i32 1
- %arrayidx1.inc = getelementptr i16, i16* %arrayidx1.phi, i32 1
- %lsr.iv.next = add i32 %lsr.iv, -1
- %exitcond = icmp eq i32 %lsr.iv.next, 0
- br i1 %exitcond, label %for.end, label %for.body
-
-for.end: ; preds = %for.body
+b2: ; preds = %b1
ret i32 0
}
+
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/pred-gp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/pred-gp.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/pred-gp.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/pred-gp.ll Fri Oct 19 10:31:11 2018
@@ -1,28 +1,30 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
+; RUN: llc -march=hexagon < %s | FileCheck %s
; Check that we are able to predicate instructions with gp-relative
; addressing mode.
- at d = external global i32
- at c = common global i32 0, align 4
+; CHECK: if ({{!?}}p{{[0-3]+}}{{(.new)?}}) r{{[0-9]+}} = memw(##g{{[01]}})
+; CHECK: if ({{!?}}p{{[0-3]+}}) r{{[0-9]+}} = memw(##g{{[01]}})
-; Function Attrs: nounwind
-define i32 @test2(i8 zeroext %a, i8 zeroext %b) #0 {
-; CHECK: if ({{!?}}p{{[0-3]+}}{{(.new)?}}) r{{[0-9]+}} = memw(##{{[cd]}})
-; CHECK: if ({{!?}}p{{[0-3]+}}) r{{[0-9]+}} = memw(##{{[cd]}})
-entry:
- %cmp = icmp eq i8 %a, %b
- br i1 %cmp, label %if.then, label %entry.if.end_crit_edge
-
-entry.if.end_crit_edge:
- %.pre = load i32, i32* @c, align 4
- br label %if.end
-
-if.then:
- %0 = load i32, i32* @d, align 4
- store i32 %0, i32* @c, align 4
- br label %if.end
-
-if.end:
- %1 = phi i32 [ %.pre, %entry.if.end_crit_edge ], [ %0, %if.then ]
- ret i32 %1
+ at g0 = external global i32
+ at g1 = common global i32 0, align 4
+
+define i32 @f0(i8 zeroext %a0, i8 zeroext %a1) #0 {
+b0:
+ %v0 = icmp eq i8 %a0, %a1
+ br i1 %v0, label %b2, label %b1
+
+b1: ; preds = %b0
+ %v1 = load i32, i32* @g1, align 4
+ br label %b3
+
+b2: ; preds = %b0
+ %v2 = load i32, i32* @g0, align 4
+ store i32 %v2, i32* @g1, align 4
+ br label %b3
+
+b3: ; preds = %b2, %b1
+ %v3 = phi i32 [ %v1, %b1 ], [ %v2, %b2 ]
+ ret i32 %v3
}
+
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/pred-instrs.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/pred-instrs.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/pred-instrs.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/pred-instrs.ll Fri Oct 19 10:31:11 2018
@@ -1,30 +1,32 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
+; RUN: llc -march=hexagon < %s | FileCheck %s
; Check that we are able to predicate instructions.
; CHECK: if ({{!?}}p{{[0-3]}}{{(.new)?}}) r{{[0-9]+}} = {{and|aslh}}
; CHECK: if ({{!?}}p{{[0-3]}}{{(.new)?}}) r{{[0-9]+}} = {{and|aslh}}
- at a = external global i32
- at d = external global i32
-; Function Attrs: nounwind
-define i32 @test1(i8 zeroext %la, i8 zeroext %lb) {
-entry:
- %cmp = icmp eq i8 %la, %lb
- br i1 %cmp, label %if.then, label %if.else
-
-if.then: ; preds = %entry
- %conv1 = zext i8 %la to i32
- %shl = shl nuw nsw i32 %conv1, 16
- br label %if.end
-
-if.else: ; preds = %entry
- %and8 = and i8 %lb, %la
- %and = zext i8 %and8 to i32
- br label %if.end
-
-if.end: ; preds = %if.else, %if.then
- %storemerge = phi i32 [ %and, %if.else ], [ %shl, %if.then ]
- store i32 %storemerge, i32* @a, align 4
- %0 = load i32, i32* @d, align 4
- ret i32 %0
+ at g0 = external global i32
+ at g1 = external global i32
+
+define i32 @f0(i8 zeroext %a0, i8 zeroext %a1) #0 {
+b0:
+ %v0 = icmp eq i8 %a0, %a1
+ br i1 %v0, label %b1, label %b2
+
+b1: ; preds = %b0
+ %v1 = zext i8 %a0 to i32
+ %v2 = shl nuw nsw i32 %v1, 16
+ br label %b3
+
+b2: ; preds = %b0
+ %v3 = and i8 %a1, %a0
+ %v4 = zext i8 %v3 to i32
+ br label %b3
+
+b3: ; preds = %b2, %b1
+ %v5 = phi i32 [ %v4, %b2 ], [ %v2, %b1 ]
+ store i32 %v5, i32* @g0, align 4
+ %v6 = load i32, i32* @g1, align 4
+ ret i32 %v6
}
+
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/predicate-copy.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/predicate-copy.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/predicate-copy.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/predicate-copy.ll Fri Oct 19 10:31:11 2018
@@ -1,8 +1,10 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 -O3 < %s | FileCheck %s
+; RUN: llc -march=hexagon -O3 < %s | FileCheck %s
; CHECK: r{{[0-9]+}} = p{{[0-9]+}}
-define i1 @foo() {
-entry:
+
+define i1 @f0() #0 {
+b0:
ret i1 false
}
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/remove_lsr.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/remove_lsr.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/remove_lsr.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/remove_lsr.ll Fri Oct 19 10:31:11 2018
@@ -1,6 +1,6 @@
; Test fix for PR-13709.
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
-; CHECK: foo
+; RUN: llc -march=hexagon < %s | FileCheck %s
+; CHECK: f0
; CHECK-NOT: lsr(r{{[0-9]+}}:{{[0-9]+}}, #32)
; CHECK-NOT: lsr(r{{[0-9]+}}:{{[0-9]+}}, #32)
@@ -13,64 +13,64 @@
; This makes the lsr instruction dead and it gets removed subsequently
; by a dead code removal pass.
-%union.vect64 = type { i64 }
-%union.vect32 = type { i32 }
-define void @foo(%union.vect64* nocapture %sss_extracted_bit_rx_data_ptr,
- %union.vect32* nocapture %s_even, %union.vect32* nocapture %s_odd,
- i8* nocapture %scr_s_even_code_ptr, i8* nocapture %scr_s_odd_code_ptr)
- nounwind {
-entry:
- %scevgep = getelementptr %union.vect64, %union.vect64* %sss_extracted_bit_rx_data_ptr, i32 1
- %scevgep28 = getelementptr %union.vect32, %union.vect32* %s_odd, i32 1
- %scevgep32 = getelementptr %union.vect32, %union.vect32* %s_even, i32 1
- %scevgep36 = getelementptr i8, i8* %scr_s_odd_code_ptr, i32 1
- %scevgep39 = getelementptr i8, i8* %scr_s_even_code_ptr, i32 1
- br label %for.body
-
-for.body: ; preds = %for.body, %entry
- %lsr.iv42 = phi i32 [ %lsr.iv.next, %for.body ], [ 2, %entry ]
- %lsr.iv40 = phi i8* [ %scevgep41, %for.body ], [ %scevgep39, %entry ]
- %lsr.iv37 = phi i8* [ %scevgep38, %for.body ], [ %scevgep36, %entry ]
- %lsr.iv33 = phi %union.vect32* [ %scevgep34, %for.body ], [ %scevgep32, %entry ]
- %lsr.iv29 = phi %union.vect32* [ %scevgep30, %for.body ], [ %scevgep28, %entry ]
- %lsr.iv = phi %union.vect64* [ %scevgep26, %for.body ], [ %scevgep, %entry ]
- %predicate_1.023 = phi i8 [ undef, %entry ], [ %10, %for.body ]
- %predicate.022 = phi i8 [ undef, %entry ], [ %9, %for.body ]
- %val.021 = phi i64 [ undef, %entry ], [ %srcval, %for.body ]
- %lsr.iv3335 = bitcast %union.vect32* %lsr.iv33 to i32*
- %lsr.iv2931 = bitcast %union.vect32* %lsr.iv29 to i32*
- %lsr.iv27 = bitcast %union.vect64* %lsr.iv to i64*
- %0 = tail call i64 @llvm.hexagon.A2.vsubhs(i64 0, i64 %val.021)
- %conv3 = sext i8 %predicate.022 to i32
- %1 = trunc i64 %val.021 to i32
- %2 = trunc i64 %0 to i32
- %3 = tail call i32 @llvm.hexagon.C2.mux(i32 %conv3, i32 %1, i32 %2)
- store i32 %3, i32* %lsr.iv3335, align 4
- %conv8 = sext i8 %predicate_1.023 to i32
- %4 = lshr i64 %val.021, 32
- %5 = trunc i64 %4 to i32
- %6 = lshr i64 %0, 32
- %7 = trunc i64 %6 to i32
- %8 = tail call i32 @llvm.hexagon.C2.mux(i32 %conv8, i32 %5, i32 %7)
- store i32 %8, i32* %lsr.iv2931, align 4
- %srcval = load i64, i64* %lsr.iv27, align 8
- %9 = load i8, i8* %lsr.iv40, align 1
- %10 = load i8, i8* %lsr.iv37, align 1
- %lftr.wideiv = trunc i32 %lsr.iv42 to i8
- %exitcond = icmp eq i8 %lftr.wideiv, 32
- %scevgep26 = getelementptr %union.vect64, %union.vect64* %lsr.iv, i32 1
- %scevgep30 = getelementptr %union.vect32, %union.vect32* %lsr.iv29, i32 1
- %scevgep34 = getelementptr %union.vect32, %union.vect32* %lsr.iv33, i32 1
- %scevgep38 = getelementptr i8, i8* %lsr.iv37, i32 1
- %scevgep41 = getelementptr i8, i8* %lsr.iv40, i32 1
- %lsr.iv.next = add i32 %lsr.iv42, 1
- br i1 %exitcond, label %for.end, label %for.body
+%s.0 = type { i64 }
+%s.1 = type { i32 }
-for.end: ; preds = %for.body
+define void @f0(%s.0* nocapture %a0, %s.1* nocapture %a1, %s.1* nocapture %a2, i8* nocapture %a3, i8* nocapture %a4) #0 {
+b0:
+ %v0 = getelementptr %s.0, %s.0* %a0, i32 1
+ %v1 = getelementptr %s.1, %s.1* %a2, i32 1
+ %v2 = getelementptr %s.1, %s.1* %a1, i32 1
+ %v3 = getelementptr i8, i8* %a4, i32 1
+ %v4 = getelementptr i8, i8* %a3, i32 1
+ br label %b1
+
+b1: ; preds = %b1, %b0
+ %v5 = phi i32 [ %v38, %b1 ], [ 2, %b0 ]
+ %v6 = phi i8* [ %v37, %b1 ], [ %v4, %b0 ]
+ %v7 = phi i8* [ %v36, %b1 ], [ %v3, %b0 ]
+ %v8 = phi %s.1* [ %v35, %b1 ], [ %v2, %b0 ]
+ %v9 = phi %s.1* [ %v34, %b1 ], [ %v1, %b0 ]
+ %v10 = phi %s.0* [ %v33, %b1 ], [ %v0, %b0 ]
+ %v11 = phi i8 [ undef, %b0 ], [ %v30, %b1 ]
+ %v12 = phi i8 [ undef, %b0 ], [ %v29, %b1 ]
+ %v13 = phi i64 [ undef, %b0 ], [ %v28, %b1 ]
+ %v14 = bitcast %s.1* %v8 to i32*
+ %v15 = bitcast %s.1* %v9 to i32*
+ %v16 = bitcast %s.0* %v10 to i64*
+ %v17 = tail call i64 @llvm.hexagon.A2.vsubhs(i64 0, i64 %v13)
+ %v18 = sext i8 %v12 to i32
+ %v19 = trunc i64 %v13 to i32
+ %v20 = trunc i64 %v17 to i32
+ %v21 = tail call i32 @llvm.hexagon.C2.mux(i32 %v18, i32 %v19, i32 %v20)
+ store i32 %v21, i32* %v14, align 4
+ %v22 = sext i8 %v11 to i32
+ %v23 = lshr i64 %v13, 32
+ %v24 = trunc i64 %v23 to i32
+ %v25 = lshr i64 %v17, 32
+ %v26 = trunc i64 %v25 to i32
+ %v27 = tail call i32 @llvm.hexagon.C2.mux(i32 %v22, i32 %v24, i32 %v26)
+ store i32 %v27, i32* %v15, align 4
+ %v28 = load i64, i64* %v16, align 8
+ %v29 = load i8, i8* %v6, align 1
+ %v30 = load i8, i8* %v7, align 1
+ %v31 = trunc i32 %v5 to i8
+ %v32 = icmp eq i8 %v31, 32
+ %v33 = getelementptr %s.0, %s.0* %v10, i32 1
+ %v34 = getelementptr %s.1, %s.1* %v9, i32 1
+ %v35 = getelementptr %s.1, %s.1* %v8, i32 1
+ %v36 = getelementptr i8, i8* %v7, i32 1
+ %v37 = getelementptr i8, i8* %v6, i32 1
+ %v38 = add i32 %v5, 1
+ br i1 %v32, label %b2, label %b1
+
+b2: ; preds = %b1
ret void
}
-declare i64 @llvm.hexagon.A2.vsubhs(i64, i64) nounwind readnone
+declare i64 @llvm.hexagon.A2.vsubhs(i64, i64) #1
+declare i32 @llvm.hexagon.C2.mux(i32, i32, i32) #1
-declare i32 @llvm.hexagon.C2.mux(i32, i32, i32) nounwind readnone
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
+attributes #1 = { nounwind readnone "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/simpletailcall.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/simpletailcall.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/simpletailcall.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/simpletailcall.ll Fri Oct 19 10:31:11 2018
@@ -1,14 +1,16 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
-; CHECK: foo_empty
+; RUN: llc -march=hexagon < %s | FileCheck %s
+; CHECK: f0
; CHECK-NOT: allocframe
; CHECK-NOT: memd(r29
-; CHECK: jump bar_empty
+; CHECK: jump f1
-define void @foo_empty(i32 %h) nounwind {
-entry:
- %add = add nsw i32 %h, 3
- %call = tail call i32 bitcast (i32 (...)* @bar_empty to i32 (i32)*)(i32 %add) nounwind
+define void @f0(i32 %a0) #0 {
+b0:
+ %v0 = add nsw i32 %a0, 3
+ %v1 = tail call i32 bitcast (i32 (...)* @f1 to i32 (i32)*)(i32 %v0) #0
ret void
}
-declare i32 @bar_empty(...)
+declare i32 @f1(...) #0
+
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/union-1.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/union-1.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/union-1.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/union-1.ll Fri Oct 19 10:31:11 2018
@@ -1,19 +1,21 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
-; CHECK: word
+; RUN: llc -march=hexagon < %s | FileCheck %s
+; CHECK: f0
; CHECK-NOT: combine(#0
-; CHECK: jump bar
+; CHECK: jump f1
-define void @word(i32* nocapture %a) nounwind {
-entry:
- %0 = load i32, i32* %a, align 4
- %1 = zext i32 %0 to i64
- %add.ptr = getelementptr inbounds i32, i32* %a, i32 1
- %2 = load i32, i32* %add.ptr, align 4
- %3 = zext i32 %2 to i64
- %4 = shl nuw i64 %3, 32
- %ins = or i64 %4, %1
- tail call void @bar(i64 %ins) nounwind
+define void @f0(i32* nocapture %a0) #0 {
+b0:
+ %v0 = load i32, i32* %a0, align 4
+ %v1 = zext i32 %v0 to i64
+ %v2 = getelementptr inbounds i32, i32* %a0, i32 1
+ %v3 = load i32, i32* %v2, align 4
+ %v4 = zext i32 %v3 to i64
+ %v5 = shl nuw i64 %v4, 32
+ %v6 = or i64 %v5, %v1
+ tail call void @f1(i64 %v6) #0
ret void
}
-declare void @bar(i64)
+declare void @f1(i64) #0
+
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/vaddh.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/vaddh.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/vaddh.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/vaddh.ll Fri Oct 19 10:31:11 2018
@@ -1,16 +1,19 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
+; RUN: llc -march=hexagon < %s | FileCheck %s
; CHECK: vaddh(r{{[0-9]+}},r{{[0-9]+}})
- at j = external global i32
- at k = external global i32
+ at g0 = external global i32
+ at g1 = external global i32
-define void @foo() nounwind {
-entry:
- %0 = load i32, i32* @j, align 4
- %1 = load i32, i32* @k, align 4
- %2 = call i32 @llvm.hexagon.A2.svaddh(i32 %0, i32 %1)
- store i32 %2, i32* @k, align 4
+define void @f0() #0 {
+b0:
+ %v0 = load i32, i32* @g0, align 4
+ %v1 = load i32, i32* @g1, align 4
+ %v2 = call i32 @llvm.hexagon.A2.svaddh(i32 %v0, i32 %v1)
+ store i32 %v2, i32* @g1, align 4
ret void
}
-declare i32 @llvm.hexagon.A2.svaddh(i32, i32) nounwind readnone
+declare i32 @llvm.hexagon.A2.svaddh(i32, i32) #1
+
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
+attributes #1 = { nounwind readnone "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/CodeGen/Hexagon/validate-offset.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/validate-offset.ll?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/validate-offset.ll (original)
+++ llvm/trunk/test/CodeGen/Hexagon/validate-offset.ll Fri Oct 19 10:31:11 2018
@@ -1,36 +1,38 @@
-; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s -O0
+; RUN: llc -march=hexagon -O0 < %s
; This is a regression test which makes sure that the offset check
; is available for STRiw_indexed instruction. This is required
; by 'Hexagon Expand Predicate Spill Code' pass.
-define i32 @f(i32 %a, i32 %b) nounwind {
-entry:
- %retval = alloca i32, align 4
- %a.addr = alloca i32, align 4
- %b.addr = alloca i32, align 4
- store i32 %a, i32* %a.addr, align 4
- store i32 %b, i32* %b.addr, align 4
- %0 = load i32, i32* %a.addr, align 4
- %1 = load i32, i32* %b.addr, align 4
- %cmp = icmp sgt i32 %0, %1
- br i1 %cmp, label %if.then, label %if.else
-
-if.then:
- %2 = load i32, i32* %a.addr, align 4
- %3 = load i32, i32* %b.addr, align 4
- %add = add nsw i32 %2, %3
- store i32 %add, i32* %retval
- br label %return
-
-if.else:
- %4 = load i32, i32* %a.addr, align 4
- %5 = load i32, i32* %b.addr, align 4
- %sub = sub nsw i32 %4, %5
- store i32 %sub, i32* %retval
- br label %return
-
-return:
- %6 = load i32, i32* %retval
- ret i32 %6
+define i32 @f0(i32 %a0, i32 %a1) #0 {
+b0:
+ %v0 = alloca i32, align 4
+ %v1 = alloca i32, align 4
+ %v2 = alloca i32, align 4
+ store i32 %a0, i32* %v1, align 4
+ store i32 %a1, i32* %v2, align 4
+ %v3 = load i32, i32* %v1, align 4
+ %v4 = load i32, i32* %v2, align 4
+ %v5 = icmp sgt i32 %v3, %v4
+ br i1 %v5, label %b1, label %b2
+
+b1: ; preds = %b0
+ %v6 = load i32, i32* %v1, align 4
+ %v7 = load i32, i32* %v2, align 4
+ %v8 = add nsw i32 %v6, %v7
+ store i32 %v8, i32* %v0
+ br label %b3
+
+b2: ; preds = %b0
+ %v9 = load i32, i32* %v1, align 4
+ %v10 = load i32, i32* %v2, align 4
+ %v11 = sub nsw i32 %v9, %v10
+ store i32 %v11, i32* %v0
+ br label %b3
+
+b3: ; preds = %b2, %b1
+ %v12 = load i32, i32* %v0
+ ret i32 %v12
}
+
+attributes #0 = { nounwind "target-cpu"="hexagonv5" }
Modified: llvm/trunk/test/MC/Hexagon/elf-flags.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Hexagon/elf-flags.s?rev=344791&r1=344790&r2=344791&view=diff
==============================================================================
--- llvm/trunk/test/MC/Hexagon/elf-flags.s (original)
+++ llvm/trunk/test/MC/Hexagon/elf-flags.s Fri Oct 19 10:31:11 2018
@@ -1,10 +1,8 @@
-# RUN: llvm-mc -arch=hexagon -mcpu=hexagonv4 --filetype=obj %s -o - | llvm-readobj -file-headers -elf-output-style=GNU | FileCheck --check-prefix=CHECK-V4 %s
# RUN: llvm-mc -arch=hexagon -mcpu=hexagonv5 --filetype=obj %s -o - | llvm-readobj -file-headers -elf-output-style=GNU | FileCheck --check-prefix=CHECK-V5 %s
# RUN: llvm-mc -arch=hexagon -mcpu=hexagonv55 --filetype=obj %s -o - | llvm-readobj -file-headers -elf-output-style=GNU | FileCheck --check-prefix=CHECK-V55 %s
# RUN: llvm-mc -arch=hexagon -mcpu=hexagonv60 --filetype=obj %s -o - | llvm-readobj -file-headers -elf-output-style=GNU | FileCheck --check-prefix=CHECK-V60 %s
# RUN: llvm-mc -arch=hexagon -mcpu=hexagonv62 --filetype=obj %s -o - | llvm-readobj -file-headers -elf-output-style=GNU | FileCheck --check-prefix=CHECK-V62 %s
-# CHECK-V4: Flags: 0x3
# CHECK-V5: Flags: 0x4
# CHECK-V55: Flags: 0x5
# CHECK-V60: Flags: 0x60
More information about the llvm-commits
mailing list