//===--- NonUniformVisitor.cpp - NonUniform Visitor --------------*- C++ -*-==//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "NonUniformVisitor.h"

namespace clang {
namespace spirv {

bool NonUniformVisitor::visit(SpirvLoad *instr) {
  if(instr->getPointer()->isNonUniform())
    instr->setNonUniform();
  return true;
}

bool NonUniformVisitor::visit(SpirvAccessChain *instr) {
  bool isNonUniform = instr->isNonUniform() || instr->getBase()->isNonUniform();
  for (auto *index : instr->getIndexes())
    isNonUniform = isNonUniform || index->isNonUniform();
  instr->setNonUniform(isNonUniform);
  return true;
}

bool NonUniformVisitor::visit(SpirvUnaryOp *instr) {
  if (instr->getOperand()->isNonUniform())
    instr->setNonUniform();
  return true;
}

bool NonUniformVisitor::visit(SpirvBinaryOp *instr) {
  if (instr->getOperand1()->isNonUniform() ||
      instr->getOperand2()->isNonUniform())
    instr->setNonUniform();
  return true;
}

bool NonUniformVisitor::visit(SpirvSampledImage *instr) {
  if (instr->getImage()->isNonUniform() || instr->getSampler()->isNonUniform())
    instr->setNonUniform();
  return true;
}

bool NonUniformVisitor::visit(SpirvImageTexelPointer *instr) {
  if (instr->getImage()->isNonUniform())
    instr->setNonUniform();
  return true;
}

bool NonUniformVisitor::visit(SpirvAtomic *instr) {
  if (instr->getPointer()->isNonUniform())
    instr->setNonUniform();
  return true;
}

} // end namespace spirv
} // end namespace clang
