diff options
| author | Benjamin Kramer <benny.kra@googlemail.com> | 2019-07-11 17:11:25 +0000 | 
|---|---|---|
| committer | Benjamin Kramer <benny.kra@googlemail.com> | 2019-07-11 17:11:25 +0000 | 
| commit | fa1a4e4de536d2693ccee67761c9da77f1cccff2 (patch) | |
| tree | 40693e2e4c34b9910d16e1428172a82c09beb411 /llvm/lib | |
| parent | e5d5b5c2ac8ef0ac2ce125708ea67cf4becb2fff (diff) | |
| download | bcm5719-llvm-fa1a4e4de536d2693ccee67761c9da77f1cccff2.tar.gz bcm5719-llvm-fa1a4e4de536d2693ccee67761c9da77f1cccff2.zip  | |
[NVPTX] Use atomicrmw fadd instead of intrinsics
AutoUpgrade the old intrinsics to atomicrmw fadd.
llvm-svn: 365796
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/IR/AutoUpgrade.cpp | 8 | ||||
| -rw-r--r-- | llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/NVPTX/NVPTXIntrinsics.td | 30 | ||||
| -rw-r--r-- | llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp | 1 | 
4 files changed, 20 insertions, 21 deletions
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index e8ecee858d7..a2d82035282 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -764,6 +764,8 @@ static bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) {                          .Cases("clz.ll", "popc.ll", "h2f", true)                          .Cases("max.i", "max.ll", "max.ui", "max.ull", true)                          .Cases("min.i", "min.ll", "min.ui", "min.ull", true) +                        .StartsWith("atomic.load.add.f32.p", true) +                        .StartsWith("atomic.load.add.f64.p", true)                          .Default(false);        if (Expand) {          NewFn = nullptr; @@ -3426,6 +3428,12 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) {        Value *Cmp = Builder.CreateICmpSGE(            Arg, llvm::Constant::getNullValue(Arg->getType()), "abs.cond");        Rep = Builder.CreateSelect(Cmp, Arg, Neg, "abs"); +    } else if (IsNVVM && (Name.startswith("atomic.load.add.f32.p") || +                          Name.startswith("atomic.load.add.f64.p"))) { +      Value *Ptr = CI->getArgOperand(0); +      Value *Val = CI->getArgOperand(1); +      Rep = Builder.CreateAtomicRMW(AtomicRMWInst::FAdd, Ptr, Val, +                                    AtomicOrdering::SequentiallyConsistent);      } else if (IsNVVM && (Name == "max.i" || Name == "max.ll" ||                            Name == "max.ui" || Name == "max.ull")) {        Value *Arg0 = CI->getArgOperand(0); diff --git a/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp b/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp index 07b35c12474..ae1aa98da0e 100644 --- a/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp @@ -3749,8 +3749,6 @@ bool NVPTXTargetLowering::getTgtMemIntrinsic(      return true;    } -  case Intrinsic::nvvm_atomic_load_add_f32: -  case Intrinsic::nvvm_atomic_load_add_f64:    case Intrinsic::nvvm_atomic_load_inc_32:    case Intrinsic::nvvm_atomic_load_dec_32: diff --git a/llvm/lib/Target/NVPTX/NVPTXIntrinsics.td b/llvm/lib/Target/NVPTX/NVPTXIntrinsics.td index 8d69f7a5153..1752d3e0575 100644 --- a/llvm/lib/Target/NVPTX/NVPTXIntrinsics.td +++ b/llvm/lib/Target/NVPTX/NVPTXIntrinsics.td @@ -1134,18 +1134,12 @@ def atomic_load_add_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),    (atomic_load_add_64 node:$a, node:$b)>;  def atomic_load_add_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),    (atomic_load_add_64 node:$a, node:$b)>; -def atomic_load_add_f32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), -  (int_nvvm_atomic_load_add_f32 node:$a, node:$b)>; -def atomic_load_add_f32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), -  (int_nvvm_atomic_load_add_f32 node:$a, node:$b)>; -def atomic_load_add_f32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), -  (int_nvvm_atomic_load_add_f32 node:$a, node:$b)>; -def atomic_load_add_f64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), -  (int_nvvm_atomic_load_add_f64 node:$a, node:$b)>; -def atomic_load_add_f64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), -  (int_nvvm_atomic_load_add_f64 node:$a, node:$b)>; -def atomic_load_add_f64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), -  (int_nvvm_atomic_load_add_f64 node:$a, node:$b)>; +def atomic_load_add_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), +  (atomic_load_fadd node:$a, node:$b)>; +def atomic_load_add_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), +  (atomic_load_fadd node:$a, node:$b)>; +def atomic_load_add_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), +  (atomic_load_fadd node:$a, node:$b)>;  defm INT_PTX_ATOM_ADD_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".u32", ".add",    atomic_load_add_32_g, i32imm, imm>; @@ -1166,18 +1160,18 @@ defm INT_PTX_ATOM_ADD_GEN_64_USE_G : F_ATOMIC_2<Int64Regs, ".global", ".u64",    ".add", atomic_load_add_64_gen, i64imm, imm>;  defm INT_PTX_ATOM_ADD_G_F32 : F_ATOMIC_2<Float32Regs, ".global", ".f32", ".add", -  atomic_load_add_f32_g, f32imm, fpimm>; +  atomic_load_add_g, f32imm, fpimm>;  defm INT_PTX_ATOM_ADD_S_F32 : F_ATOMIC_2<Float32Regs, ".shared", ".f32", ".add", -  atomic_load_add_f32_s, f32imm, fpimm>; +  atomic_load_add_s, f32imm, fpimm>;  defm INT_PTX_ATOM_ADD_GEN_F32 : F_ATOMIC_2<Float32Regs, "", ".f32", ".add", -  atomic_load_add_f32_gen, f32imm, fpimm>; +  atomic_load_add_gen, f32imm, fpimm>;  defm INT_PTX_ATOM_ADD_G_F64 : F_ATOMIC_2<Float64Regs, ".global", ".f64", ".add", -  atomic_load_add_f64_g, f64imm, fpimm, [hasAtomAddF64]>; +  atomic_load_add_g, f64imm, fpimm, [hasAtomAddF64]>;  defm INT_PTX_ATOM_ADD_S_F64 : F_ATOMIC_2<Float64Regs, ".shared", ".f64", ".add", -  atomic_load_add_f64_s, f64imm, fpimm, [hasAtomAddF64]>; +  atomic_load_add_s, f64imm, fpimm, [hasAtomAddF64]>;  defm INT_PTX_ATOM_ADD_GEN_F64 : F_ATOMIC_2<Float64Regs, "", ".f64", ".add", -  atomic_load_add_f64_gen, f64imm, fpimm, [hasAtomAddF64]>; +  atomic_load_add_gen, f64imm, fpimm, [hasAtomAddF64]>;  // atom_sub diff --git a/llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp b/llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp index 6bee8fdbf5b..be0416f90fc 100644 --- a/llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp @@ -38,7 +38,6 @@ static bool readsLaneId(const IntrinsicInst *II) {  static bool isNVVMAtomic(const IntrinsicInst *II) {    switch (II->getIntrinsicID()) {      default: return false; -    case Intrinsic::nvvm_atomic_load_add_f32:      case Intrinsic::nvvm_atomic_load_inc_32:      case Intrinsic::nvvm_atomic_load_dec_32:  | 

