message: [XLA] Emit less IR for tuple-select
  For the number of tuple elements n, this used to emit n selects, 2n loads and n
  stores. Instead emit one select on the address and a memcpy.
diff: @@ -50,23 +50,12 @@ void EmitTupleSelect(const IrArray& select, const IrArray& pred,
  VLOG(2) << " pred_value: " << DumpToString(*pred_value);
  VLOG(2) << " pred_cond: " << DumpToString(*pred_cond);
  - for (int i = 0; i < ShapeUtil::TupleElementCount(select.GetShape()); ++i) {
  - llvm::Value* const element_index[] = {b->getInt64(0), b->getInt64(i)};
  - llvm::Value* on_true_element_address =
  - b->CreateInBoundsGEP(on_true, element_index);
  - llvm::Value* on_true_element = b->CreateLoad(
  - on_true_element_address, "on_true_element_" + llvm::Twine(i));
  - llvm::Value* on_false_element_address =
  - b->CreateInBoundsGEP(on_false, element_index);
  - llvm::Value* on_false_element = b->CreateLoad(
  - on_false_element_address, "on_false_element_" + llvm::Twine(i));
  -
  - llvm::Value* output_element_address =
  - b->CreateInBoundsGEP(select.GetBasePointer(), element_index);
  - b->CreateStore(b->CreateSelect(pred_cond, on_true_element, on_false_element,
  - "select_output_element_" + llvm::Twine(i)),
  - output_element_address);
  - }
  + llvm::Value* src = b->CreateSelect(pred_cond, on_true, on_false);
  + llvm::Value* dst = select.GetBasePointer();
  + int64 table_size = ShapeUtil::ByteSizeOfTupleIndexTable(
  + select.GetShape(), module->getDataLayout().getPointerSize());
  + b->CreateMemCpy(dst, /*DstAlign=*/1, src, /*SrcAlign=*/1,
  + b->getInt64(table_size));
  }
  void EmitTuple(const IrArray& tuple, absl::Span<llvm::Value* const> operands,
  