Viewing file: pr47530.C (1.59 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
// { 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, except on // the uninstrumented code path. // { dg-final { scan-tree-dump-times "commitTransaction...; .tail call" 1 "optimized" } }
|