1*9880d681SAndroid Build Coastguard Worker// RUN: llvm-tblgen %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker// XFAIL: vg_leak 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 5*9880d681SAndroid Build Coastguard Worker// Substitution of an int. 6*9880d681SAndroid Build Coastguard Workerdef X1; 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerclass C1<int N> { 9*9880d681SAndroid Build Coastguard Worker dag d = (X1 N); 10*9880d681SAndroid Build Coastguard Worker} 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdef VAL1 : C1<13>; 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker// CHECK: def VAL1 { 15*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: dag d = (X1 13) 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 19*9880d681SAndroid Build Coastguard Worker// Substitution of a DAG. 20*9880d681SAndroid Build Coastguard Workerdef X2; 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerclass yclass; 23*9880d681SAndroid Build Coastguard Workerdef Y2 : yclass; 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerclass C2<yclass N> { 26*9880d681SAndroid Build Coastguard Worker dag d = (X2 N); 27*9880d681SAndroid Build Coastguard Worker dag e = (N X2); 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdef VAL2 : C2<Y2>; 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker// CHECK: def VAL2 { 33*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: dag d = (X2 Y2) 34*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: dag e = (Y2 X2) 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 38*9880d681SAndroid Build Coastguard Worker// Complex dag operator (F.TheOp). 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerclass operator; 41*9880d681SAndroid Build Coastguard Workerdef somedef1 : operator; 42*9880d681SAndroid Build Coastguard Workerdef somedef2 : operator; 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerclass foo<operator a> { 45*9880d681SAndroid Build Coastguard Worker operator TheOp = a; 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerclass bar<foo F, operator a> { 49*9880d681SAndroid Build Coastguard Worker dag Dag1 = (somedef1 1); 50*9880d681SAndroid Build Coastguard Worker dag Dag2 = (a 2); 51*9880d681SAndroid Build Coastguard Worker dag Dag3 = (F.TheOp 2); 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerdef foo1 : foo<somedef1>; 55*9880d681SAndroid Build Coastguard Workerdef foo2 : foo<somedef2>; 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerdef VAL3 : bar<foo1, somedef1>; 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker// CHECK: def VAL3 { // bar 60*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: dag Dag1 = (somedef1 1); 61*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: dag Dag2 = (somedef1 2); 62*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: dag Dag3 = (somedef1 2); 63*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: NAME = ? 64*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: } 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerdef VAL4 : bar<foo2, somedef2>; 68*9880d681SAndroid Build Coastguard Worker// CHECK: def VAL4 { 69*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: dag Dag1 = (somedef1 1); 70*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: dag Dag2 = (somedef2 2); 71*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: dag Dag3 = (somedef2 2); 72*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: NAME = ? 73*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: } 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdef VAL5 : bar<foo2, somedef2> { 76*9880d681SAndroid Build Coastguard Worker // Named operands. 77*9880d681SAndroid Build Coastguard Worker let Dag1 = (somedef1 1:$name1); 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker // Name, no node. 80*9880d681SAndroid Build Coastguard Worker let Dag2 = (somedef2 $name2, $name3); 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker// CHECK: def VAL5 { 84*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: dag Dag1 = (somedef1 1:$name1); 85*9880d681SAndroid Build Coastguard Worker// CHECK-NEXT: dag Dag2 = (somedef2 ?:$name2, ?:$name3); 86