OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [testsuite/] [g++.dg/] [tm/] [pr47530.C] - Rev 693

Compare with Previous | Blame | View Log

// { dg-do compile }
// { dg-options "-fgnu-tm -O2 -fdump-tree-optimized" }

typedef __SIZE_TYPE__ size_t;
extern void *malloc(size_t);

namespace bench
{
    class LLNode
    {
        LLNode* next;
        int data;

    public:
        __attribute__((transaction_safe))
        LLNode(int val, LLNode* m_next)
        {
                data = val;
                next = m_next;
        }
        __attribute__((transaction_safe))
          ~LLNode(){}
        __attribute__((transaction_safe))
          int get_val()  {return data;}
        __attribute__((transaction_safe))
          LLNode* get_next()  {return next;}
        __attribute__((transaction_safe))
          void set_val(int val) {data = val;}
        __attribute__((transaction_safe))
          void set_next(LLNode* n)  {next = n;}
        __attribute__((transaction_safe))
          void *operator new(size_t size);
    };

    class LinkedList
    {
      LLNode* head;
    public:
        LinkedList();
        void insert(int val);
    };
}

using bench::LinkedList;
using bench::LLNode;


__attribute__((transaction_safe))
void* LLNode::operator new(size_t size)
{
  return malloc(size);
}

LinkedList::LinkedList() : head(new LLNode(-1, 0)) { }

void LinkedList::insert(int val)
{
  __transaction_atomic {
    LLNode* prev = head;
    LLNode* curr = head->get_next();

    while (curr != 0) {
      if (curr->get_val() >= val)
        break;
      prev = curr;
      curr = prev->get_next();
    }

    if (!curr || (curr->get_val() > val)){
      LLNode* tmp = new LLNode(val,curr);
      prev->set_next(tmp);
    }
  }
}

// Make sure we don't do tail optimization on the commit.
// { dg-final { scan-tree-dump-times "commitTransaction...; .tail call" 0 "optimized" } }
// { dg-final { cleanup-tree-dump "optimized" } }

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.