diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-10-16 20:46:32 +0000 | 
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-10-16 20:46:32 +0000 | 
| commit | 34ed76e1803cd5173aeb9460824b9be65f2b326f (patch) | |
| tree | bb4e1890c616c015e7d8f9423f96d31fc771d6db | |
| parent | a4f6b598462e39107aecad1f8d4fb1cfd7583580 (diff) | |
| download | bcm5719-llvm-34ed76e1803cd5173aeb9460824b9be65f2b326f.tar.gz bcm5719-llvm-34ed76e1803cd5173aeb9460824b9be65f2b326f.zip  | |
GlobalISel: Implement lower for G_SADDO/G_SSUBO
Port directly from SelectionDAG, minus the path using
ISD::SADDSAT/ISD::SSUBSAT.
llvm-svn: 375042
8 files changed, 322 insertions, 140 deletions
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h b/llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h index f65bf269c88..fbfe71255a3 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h @@ -236,6 +236,7 @@ public:    LegalizeResult lowerDynStackAlloc(MachineInstr &MI);    LegalizeResult lowerExtract(MachineInstr &MI);    LegalizeResult lowerInsert(MachineInstr &MI); +  LegalizeResult lowerSADDO_SSUBO(MachineInstr &MI);  private:    MachineRegisterInfo &MRI; diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp index c5830ff8652..21512e54387 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -1903,6 +1903,9 @@ LegalizerHelper::lower(MachineInstr &MI, unsigned TypeIdx, LLT Ty) {      MI.eraseFromParent();      return Legalized;    } +  case TargetOpcode::G_SADDO: +  case TargetOpcode::G_SSUBO: +    return lowerSADDO_SSUBO(MI);    case TargetOpcode::G_SMULO:    case TargetOpcode::G_UMULO: {      // Generate G_UMULH/G_SMULH to check for overflow and a normal G_MUL for the @@ -4236,3 +4239,39 @@ LegalizerHelper::LegalizeResult LegalizerHelper::lowerInsert(MachineInstr &MI) {    return UnableToLegalize;  } + +LegalizerHelper::LegalizeResult +LegalizerHelper::lowerSADDO_SSUBO(MachineInstr &MI) { +  Register Dst0 = MI.getOperand(0).getReg(); +  Register Dst1 = MI.getOperand(1).getReg(); +  Register LHS = MI.getOperand(2).getReg(); +  Register RHS = MI.getOperand(3).getReg(); +  const bool IsAdd = MI.getOpcode() == TargetOpcode::G_SADDO; + +  LLT Ty = MRI.getType(Dst0); +  LLT BoolTy = MRI.getType(Dst1); + +  if (IsAdd) +    MIRBuilder.buildAdd(Dst0, LHS, RHS); +  else +    MIRBuilder.buildSub(Dst0, LHS, RHS); + +  // TODO: If SADDSAT/SSUBSAT is legal, compare results to detect overflow. + +  auto Zero = MIRBuilder.buildConstant(Ty, 0); + +  // For an addition, the result should be less than one of the operands (LHS) +  // if and only if the other operand (RHS) is negative, otherwise there will +  // be overflow. +  // For a subtraction, the result should be less than one of the operands +  // (LHS) if and only if the other operand (RHS) is (non-zero) positive, +  // otherwise there will be overflow. +  auto ResultLowerThanLHS = +      MIRBuilder.buildICmp(CmpInst::ICMP_SLT, BoolTy, Dst0, LHS); +  auto ConditionRHS = MIRBuilder.buildICmp( +      IsAdd ? CmpInst::ICMP_SLT : CmpInst::ICMP_SGT, BoolTy, RHS, Zero); + +  MIRBuilder.buildXor(Dst1, ConditionRHS, ResultLowerThanLHS); +  MI.eraseFromParent(); +  return Legalized; +} diff --git a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp index 7fe0298f1c3..b226f6c2d2e 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp @@ -287,12 +287,15 @@ AMDGPULegalizerInfo::AMDGPULegalizerInfo(const GCNSubtarget &ST_,      .widenScalarToNextPow2(0)      .scalarize(0); -  getActionDefinitionsBuilder({G_UADDO, G_SADDO, G_USUBO, G_SSUBO, +  getActionDefinitionsBuilder({G_UADDO, G_USUBO,                                 G_UADDE, G_SADDE, G_USUBE, G_SSUBE})      .legalFor({{S32, S1}})      .clampScalar(0, S32, S32)      .scalarize(0); // TODO: Implement. +  getActionDefinitionsBuilder({G_SADDO, G_SSUBO}) +    .lower(); +    getActionDefinitionsBuilder(G_BITCAST)      // Don't worry about the size constraint.      .legalIf(all(isRegisterType(0), isRegisterType(1))) diff --git a/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp index aded210bd84..4d78188b3dc 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp @@ -2276,9 +2276,7 @@ AMDGPURegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {    case AMDGPU::G_LSHR:    case AMDGPU::G_ASHR:    case AMDGPU::G_UADDO: -  case AMDGPU::G_SADDO:    case AMDGPU::G_USUBO: -  case AMDGPU::G_SSUBO:    case AMDGPU::G_UADDE:    case AMDGPU::G_SADDE:    case AMDGPU::G_USUBE: diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-saddo.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-saddo.mir new file mode 100644 index 00000000000..0572fd8dad9 --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-saddo.mir @@ -0,0 +1,139 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=tahiti -O0 -run-pass=legalizer -o - %s | FileCheck %s + +--- +name: test_saddo_s16 +body: | +  bb.0: +    liveins: $vgpr0, $vgpr1 + +    ; CHECK-LABEL: name: test_saddo_s16 +    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 +    ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 +    ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; CHECK: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32) +    ; CHECK: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY2]], [[COPY3]] +    ; CHECK: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 0 +    ; CHECK: [[COPY4:%[0-9]+]]:_(s32) = COPY [[ADD]](s32) +    ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 +    ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY4]], [[C1]](s32) +    ; CHECK: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s32) +    ; CHECK: [[COPY5:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[COPY5]], [[C1]](s32) +    ; CHECK: [[ASHR1:%[0-9]+]]:_(s32) = G_ASHR [[SHL1]], [[C1]](s32) +    ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(slt), [[ASHR]](s32), [[ASHR1]] +    ; CHECK: [[COPY6:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32) +    ; CHECK: [[SHL2:%[0-9]+]]:_(s32) = G_SHL [[COPY6]], [[C1]](s32) +    ; CHECK: [[ASHR2:%[0-9]+]]:_(s32) = G_ASHR [[SHL2]], [[C1]](s32) +    ; CHECK: [[SEXT:%[0-9]+]]:_(s32) = G_SEXT [[C]](s16) +    ; CHECK: [[ICMP1:%[0-9]+]]:_(s1) = G_ICMP intpred(slt), [[ASHR2]](s32), [[SEXT]] +    ; CHECK: [[XOR:%[0-9]+]]:_(s1) = G_XOR [[ICMP1]], [[ICMP]] +    ; CHECK: [[COPY7:%[0-9]+]]:_(s32) = COPY [[ADD]](s32) +    ; CHECK: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[XOR]](s1) +    ; CHECK: $vgpr0 = COPY [[COPY7]](s32) +    ; CHECK: $vgpr1 = COPY [[ZEXT]](s32) +    %0:_(s32) = COPY $vgpr0 +    %1:_(s32) = COPY $vgpr1 +    %2:_(s16) = G_TRUNC %0 +    %3:_(s16) = G_TRUNC %1 +    %4:_(s16), %5:_(s1) = G_SADDO %2, %3 +    %6:_(s32) = G_ANYEXT %4 +    %7:_(s32) = G_ZEXT %5 +    $vgpr0 = COPY %6 +    $vgpr1 = COPY %7 +... + +--- +name: test_saddo_s32 +body: | +  bb.0: +    liveins: $vgpr0, $vgpr1 + +    ; CHECK-LABEL: name: test_saddo_s32 +    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 +    ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 +    ; CHECK: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY]], [[COPY1]] +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 +    ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(slt), [[ADD]](s32), [[COPY]] +    ; CHECK: [[ICMP1:%[0-9]+]]:_(s1) = G_ICMP intpred(slt), [[COPY1]](s32), [[C]] +    ; CHECK: [[XOR:%[0-9]+]]:_(s1) = G_XOR [[ICMP1]], [[ICMP]] +    ; CHECK: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[XOR]](s1) +    ; CHECK: $vgpr0 = COPY [[ADD]](s32) +    ; CHECK: $vgpr1 = COPY [[ZEXT]](s32) +    %0:_(s32) = COPY $vgpr0 +    %1:_(s32) = COPY $vgpr1 +    %2:_(s32), %3:_(s1) = G_SADDO %0, %1 +    %4:_(s32) = G_ZEXT %3 +    $vgpr0 = COPY %2 +    $vgpr1 = COPY %4 +... + +--- +name: test_saddo_s64 +body: | +  bb.0: +    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 + +    ; CHECK-LABEL: name: test_saddo_s64 +    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1 +    ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY $vgpr2_vgpr3 +    ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](s64) +    ; CHECK: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](s64) +    ; CHECK: [[UADDO:%[0-9]+]]:_(s32), [[UADDO1:%[0-9]+]]:_(s1) = G_UADDO [[UV]], [[UV2]] +    ; CHECK: [[UADDE:%[0-9]+]]:_(s32), [[UADDE1:%[0-9]+]]:_(s1) = G_UADDE [[UV1]], [[UV3]], [[UADDO1]] +    ; CHECK: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[UADDO]](s32), [[UADDE]](s32) +    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 +    ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(slt), [[MV]](s64), [[COPY]] +    ; CHECK: [[ICMP1:%[0-9]+]]:_(s1) = G_ICMP intpred(slt), [[COPY1]](s64), [[C]] +    ; CHECK: [[XOR:%[0-9]+]]:_(s1) = G_XOR [[ICMP1]], [[ICMP]] +    ; CHECK: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[XOR]](s1) +    ; CHECK: $vgpr0_vgpr1 = COPY [[MV]](s64) +    ; CHECK: $vgpr2 = COPY [[ZEXT]](s32) +    %0:_(s64) = COPY $vgpr0_vgpr1 +    %1:_(s64) = COPY $vgpr2_vgpr3 +    %2:_(s64), %3:_(s1) = G_SADDO %0, %1 +    %4:_(s32) = G_ZEXT %3 +    $vgpr0_vgpr1 = COPY %2 +    $vgpr2 = COPY %4 +... + +--- +name: test_saddo_v2s32 +body: | +  bb.0: +    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 + +    ; CHECK-LABEL: name: test_saddo_v2s32 +    ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 +    ; CHECK: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr2_vgpr3 +    ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>) +    ; CHECK: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](<2 x s32>) +    ; CHECK: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[UV]], [[UV2]] +    ; CHECK: [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[UV1]], [[UV3]] +    ; CHECK: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[ADD]](s32), [[ADD1]](s32) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 +    ; CHECK: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>) +    ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(slt), [[ADD]](s32), [[UV4]] +    ; CHECK: [[ICMP1:%[0-9]+]]:_(s1) = G_ICMP intpred(slt), [[ADD1]](s32), [[UV5]] +    ; CHECK: [[UV6:%[0-9]+]]:_(s32), [[UV7:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](<2 x s32>) +    ; CHECK: [[ICMP2:%[0-9]+]]:_(s1) = G_ICMP intpred(slt), [[UV6]](s32), [[C]] +    ; CHECK: [[ICMP3:%[0-9]+]]:_(s1) = G_ICMP intpred(slt), [[UV7]](s32), [[C]] +    ; CHECK: [[XOR:%[0-9]+]]:_(s1) = G_XOR [[ICMP2]], [[ICMP]] +    ; CHECK: [[XOR1:%[0-9]+]]:_(s1) = G_XOR [[ICMP3]], [[ICMP1]] +    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[XOR]](s1) +    ; CHECK: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[XOR1]](s1) +    ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 +    ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[ANYEXT]](s32) +    ; CHECK: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY2]], [[C1]] +    ; CHECK: [[COPY3:%[0-9]+]]:_(s32) = COPY [[ANYEXT1]](s32) +    ; CHECK: [[AND1:%[0-9]+]]:_(s32) = G_AND [[COPY3]], [[C1]] +    ; CHECK: [[BUILD_VECTOR1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[AND]](s32), [[AND1]](s32) +    ; CHECK: $vgpr0_vgpr1 = COPY [[BUILD_VECTOR]](<2 x s32>) +    ; CHECK: $vgpr2_vgpr3 = COPY [[BUILD_VECTOR1]](<2 x s32>) +    %0:_(<2 x s32>) = COPY $vgpr0_vgpr1 +    %1:_(<2 x s32>) = COPY $vgpr2_vgpr3 +    %2:_(<2 x s32>), %3:_(<2 x s1>) = G_SADDO %0, %1 +    %4:_(<2 x s32>) = G_ZEXT %3 +    $vgpr0_vgpr1 = COPY %2 +    $vgpr2_vgpr3 = COPY %4 +... diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-ssubo.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-ssubo.mir new file mode 100644 index 00000000000..ed699d48006 --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-ssubo.mir @@ -0,0 +1,139 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=tahiti -O0 -run-pass=legalizer -o - %s | FileCheck %s + +--- +name: test_ssubo_s16 +body: | +  bb.0: +    liveins: $vgpr0, $vgpr1 + +    ; CHECK-LABEL: name: test_ssubo_s16 +    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 +    ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 +    ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; CHECK: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32) +    ; CHECK: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[COPY2]], [[COPY3]] +    ; CHECK: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 0 +    ; CHECK: [[COPY4:%[0-9]+]]:_(s32) = COPY [[SUB]](s32) +    ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 +    ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY4]], [[C1]](s32) +    ; CHECK: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s32) +    ; CHECK: [[COPY5:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[COPY5]], [[C1]](s32) +    ; CHECK: [[ASHR1:%[0-9]+]]:_(s32) = G_ASHR [[SHL1]], [[C1]](s32) +    ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(slt), [[ASHR]](s32), [[ASHR1]] +    ; CHECK: [[COPY6:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32) +    ; CHECK: [[SHL2:%[0-9]+]]:_(s32) = G_SHL [[COPY6]], [[C1]](s32) +    ; CHECK: [[ASHR2:%[0-9]+]]:_(s32) = G_ASHR [[SHL2]], [[C1]](s32) +    ; CHECK: [[SEXT:%[0-9]+]]:_(s32) = G_SEXT [[C]](s16) +    ; CHECK: [[ICMP1:%[0-9]+]]:_(s1) = G_ICMP intpred(sgt), [[ASHR2]](s32), [[SEXT]] +    ; CHECK: [[XOR:%[0-9]+]]:_(s1) = G_XOR [[ICMP1]], [[ICMP]] +    ; CHECK: [[COPY7:%[0-9]+]]:_(s32) = COPY [[SUB]](s32) +    ; CHECK: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[XOR]](s1) +    ; CHECK: $vgpr0 = COPY [[COPY7]](s32) +    ; CHECK: $vgpr1 = COPY [[ZEXT]](s32) +    %0:_(s32) = COPY $vgpr0 +    %1:_(s32) = COPY $vgpr1 +    %2:_(s16) = G_TRUNC %0 +    %3:_(s16) = G_TRUNC %1 +    %4:_(s16), %5:_(s1) = G_SSUBO %2, %3 +    %6:_(s32) = G_ANYEXT %4 +    %7:_(s32) = G_ZEXT %5 +    $vgpr0 = COPY %6 +    $vgpr1 = COPY %7 +... + +--- +name: test_ssubo_s32 +body: | +  bb.0: +    liveins: $vgpr0, $vgpr1 + +    ; CHECK-LABEL: name: test_ssubo_s32 +    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 +    ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 +    ; CHECK: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[COPY]], [[COPY1]] +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 +    ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(slt), [[SUB]](s32), [[COPY]] +    ; CHECK: [[ICMP1:%[0-9]+]]:_(s1) = G_ICMP intpred(sgt), [[COPY1]](s32), [[C]] +    ; CHECK: [[XOR:%[0-9]+]]:_(s1) = G_XOR [[ICMP1]], [[ICMP]] +    ; CHECK: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[XOR]](s1) +    ; CHECK: $vgpr0 = COPY [[SUB]](s32) +    ; CHECK: $vgpr1 = COPY [[ZEXT]](s32) +    %0:_(s32) = COPY $vgpr0 +    %1:_(s32) = COPY $vgpr1 +    %2:_(s32), %3:_(s1) = G_SSUBO %0, %1 +    %4:_(s32) = G_ZEXT %3 +    $vgpr0 = COPY %2 +    $vgpr1 = COPY %4 +... + +--- +name: test_ssubo_s64 +body: | +  bb.0: +    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 + +    ; CHECK-LABEL: name: test_ssubo_s64 +    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1 +    ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY $vgpr2_vgpr3 +    ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](s64) +    ; CHECK: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](s64) +    ; CHECK: [[USUBO:%[0-9]+]]:_(s32), [[USUBO1:%[0-9]+]]:_(s1) = G_USUBO [[UV]], [[UV2]] +    ; CHECK: [[USUBE:%[0-9]+]]:_(s32), [[USUBE1:%[0-9]+]]:_(s1) = G_USUBE [[UV1]], [[UV3]], [[USUBO1]] +    ; CHECK: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[USUBO]](s32), [[USUBE]](s32) +    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 +    ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(slt), [[MV]](s64), [[COPY]] +    ; CHECK: [[ICMP1:%[0-9]+]]:_(s1) = G_ICMP intpred(sgt), [[COPY1]](s64), [[C]] +    ; CHECK: [[XOR:%[0-9]+]]:_(s1) = G_XOR [[ICMP1]], [[ICMP]] +    ; CHECK: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[XOR]](s1) +    ; CHECK: $vgpr0_vgpr1 = COPY [[MV]](s64) +    ; CHECK: $vgpr2 = COPY [[ZEXT]](s32) +    %0:_(s64) = COPY $vgpr0_vgpr1 +    %1:_(s64) = COPY $vgpr2_vgpr3 +    %2:_(s64), %3:_(s1) = G_SSUBO %0, %1 +    %4:_(s32) = G_ZEXT %3 +    $vgpr0_vgpr1 = COPY %2 +    $vgpr2 = COPY %4 +... + +--- +name: test_ssubo_v2s32 +body: | +  bb.0: +    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 + +    ; CHECK-LABEL: name: test_ssubo_v2s32 +    ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 +    ; CHECK: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr2_vgpr3 +    ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>) +    ; CHECK: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](<2 x s32>) +    ; CHECK: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[UV]], [[UV2]] +    ; CHECK: [[SUB1:%[0-9]+]]:_(s32) = G_SUB [[UV1]], [[UV3]] +    ; CHECK: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[SUB]](s32), [[SUB1]](s32) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 +    ; CHECK: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>) +    ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(slt), [[SUB]](s32), [[UV4]] +    ; CHECK: [[ICMP1:%[0-9]+]]:_(s1) = G_ICMP intpred(slt), [[SUB1]](s32), [[UV5]] +    ; CHECK: [[UV6:%[0-9]+]]:_(s32), [[UV7:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](<2 x s32>) +    ; CHECK: [[ICMP2:%[0-9]+]]:_(s1) = G_ICMP intpred(sgt), [[UV6]](s32), [[C]] +    ; CHECK: [[ICMP3:%[0-9]+]]:_(s1) = G_ICMP intpred(sgt), [[UV7]](s32), [[C]] +    ; CHECK: [[XOR:%[0-9]+]]:_(s1) = G_XOR [[ICMP2]], [[ICMP]] +    ; CHECK: [[XOR1:%[0-9]+]]:_(s1) = G_XOR [[ICMP3]], [[ICMP1]] +    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[XOR]](s1) +    ; CHECK: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[XOR1]](s1) +    ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 +    ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[ANYEXT]](s32) +    ; CHECK: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY2]], [[C1]] +    ; CHECK: [[COPY3:%[0-9]+]]:_(s32) = COPY [[ANYEXT1]](s32) +    ; CHECK: [[AND1:%[0-9]+]]:_(s32) = G_AND [[COPY3]], [[C1]] +    ; CHECK: [[BUILD_VECTOR1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[AND]](s32), [[AND1]](s32) +    ; CHECK: $vgpr0_vgpr1 = COPY [[BUILD_VECTOR]](<2 x s32>) +    ; CHECK: $vgpr2_vgpr3 = COPY [[BUILD_VECTOR1]](<2 x s32>) +    %0:_(<2 x s32>) = COPY $vgpr0_vgpr1 +    %1:_(<2 x s32>) = COPY $vgpr2_vgpr3 +    %2:_(<2 x s32>), %3:_(<2 x s1>) = G_SSUBO %0, %1 +    %4:_(<2 x s32>) = G_ZEXT %3 +    $vgpr0_vgpr1 = COPY %2 +    $vgpr2_vgpr3 = COPY %4 +... diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-saddo.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-saddo.mir deleted file mode 100644 index 2f60834479a..00000000000 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-saddo.mir +++ /dev/null @@ -1,68 +0,0 @@ -# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py -# RUN: llc -march=amdgcn -mcpu=fiji -run-pass=regbankselect %s -verify-machineinstrs -o - -regbankselect-fast | FileCheck %s -# RUN: llc -march=amdgcn -mcpu=fiji -run-pass=regbankselect %s -verify-machineinstrs -o - -regbankselect-greedy | FileCheck %s ---- -name: saddo_s32_ss -legalized: true - -body: | -  bb.0: -    liveins: $sgpr0, $sgpr1 -    ; CHECK-LABEL: name: saddo_s32_ss -    ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 -    ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 -    ; CHECK: [[SADDO:%[0-9]+]]:sgpr(s32), [[SADDO1:%[0-9]+]]:scc(s1) = G_SADDO [[COPY]], [[COPY1]] -    %0:_(s32) = COPY $sgpr0 -    %1:_(s32) = COPY $sgpr1 -    %2:_(s32), %3:_(s1) = G_SADDO %0, %1 -... - ---- -name: saddo_s32_sv -legalized: true - -body: | -  bb.0: -    liveins: $sgpr0, $vgpr0 -    ; CHECK-LABEL: name: saddo_s32_sv -    ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 -    ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 -    ; CHECK: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY [[COPY]](s32) -    ; CHECK: [[SADDO:%[0-9]+]]:vgpr(s32), [[SADDO1:%[0-9]+]]:vcc(s1) = G_SADDO [[COPY2]], [[COPY1]] -    %0:_(s32) = COPY $sgpr0 -    %1:_(s32) = COPY $vgpr0 -    %2:_(s32), %3:_(s1) = G_SADDO %0, %1 -... - ---- -name: saddo_s32_vs -legalized: true - -body: | -  bb.0: -    liveins: $sgpr0, $vgpr0 -    ; CHECK-LABEL: name: saddo_s32_vs -    ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 -    ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 -    ; CHECK: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY [[COPY1]](s32) -    ; CHECK: [[SADDO:%[0-9]+]]:vgpr(s32), [[SADDO1:%[0-9]+]]:vcc(s1) = G_SADDO [[COPY]], [[COPY2]] -    %0:_(s32) = COPY $vgpr0 -    %1:_(s32) = COPY $sgpr0 -    %2:_(s32), %3:_(s1) = G_SADDO %0, %1 -... - ---- -name: saddo_s32_vv -legalized: true - -body: | -  bb.0: -    liveins: $vgpr0, $vgpr1 -    ; CHECK-LABEL: name: saddo_s32_vv -    ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 -    ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1 -    ; CHECK: [[SADDO:%[0-9]+]]:vgpr(s32), [[SADDO1:%[0-9]+]]:vcc(s1) = G_SADDO [[COPY]], [[COPY1]] -    %0:_(s32) = COPY $vgpr0 -    %1:_(s32) = COPY $vgpr1 -    %2:_(s32), %3:_(s1) = G_SADDO %0, %1 -... diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-ssubo.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-ssubo.mir deleted file mode 100644 index 63834e4e746..00000000000 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-ssubo.mir +++ /dev/null @@ -1,69 +0,0 @@ -# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py -# RUN: llc -march=amdgcn -mcpu=fiji -run-pass=regbankselect %s -verify-machineinstrs -o - -regbankselect-fast | FileCheck %s -# RUN: llc -march=amdgcn -mcpu=fiji -run-pass=regbankselect %s -verify-machineinstrs -o - -regbankselect-fast | FileCheck %s - ---- -name: ssubo_s32_ss -legalized: true - -body: | -  bb.0: -    liveins: $sgpr0, $sgpr1 -    ; CHECK-LABEL: name: ssubo_s32_ss -    ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 -    ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 -    ; CHECK: [[SSUBO:%[0-9]+]]:sgpr(s32), [[SSUBO1:%[0-9]+]]:scc(s1) = G_SSUBO [[COPY]], [[COPY1]] -    %0:_(s32) = COPY $sgpr0 -    %1:_(s32) = COPY $sgpr1 -    %2:_(s32), %3:_(s1) = G_SSUBO %0, %1 -... - ---- -name: ssubo_s32_sv -legalized: true - -body: | -  bb.0: -    liveins: $sgpr0, $vgpr0 -    ; CHECK-LABEL: name: ssubo_s32_sv -    ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 -    ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 -    ; CHECK: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY [[COPY]](s32) -    ; CHECK: [[SSUBO:%[0-9]+]]:vgpr(s32), [[SSUBO1:%[0-9]+]]:vcc(s1) = G_SSUBO [[COPY2]], [[COPY1]] -    %0:_(s32) = COPY $sgpr0 -    %1:_(s32) = COPY $vgpr0 -    %2:_(s32), %3:_(s1) = G_SSUBO %0, %1 -... - ---- -name: ssubo_s32_vs -legalized: true - -body: | -  bb.0: -    liveins: $sgpr0, $vgpr0 -    ; CHECK-LABEL: name: ssubo_s32_vs -    ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 -    ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 -    ; CHECK: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY [[COPY1]](s32) -    ; CHECK: [[SSUBO:%[0-9]+]]:vgpr(s32), [[SSUBO1:%[0-9]+]]:vcc(s1) = G_SSUBO [[COPY]], [[COPY2]] -    %0:_(s32) = COPY $vgpr0 -    %1:_(s32) = COPY $sgpr0 -    %2:_(s32), %3:_(s1) = G_SSUBO %0, %1 -... - ---- -name: ssubo_s32_vv -legalized: true - -body: | -  bb.0: -    liveins: $vgpr0, $vgpr1 -    ; CHECK-LABEL: name: ssubo_s32_vv -    ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 -    ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1 -    ; CHECK: [[SSUBO:%[0-9]+]]:vgpr(s32), [[SSUBO1:%[0-9]+]]:vcc(s1) = G_SSUBO [[COPY]], [[COPY1]] -    %0:_(s32) = COPY $vgpr0 -    %1:_(s32) = COPY $vgpr1 -    %2:_(s32), %3:_(s1) = G_SSUBO %0, %1 -...  | 

