Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 ; Test handling of call instructions. | |
| 2 | |
| 3 ; RUN: llvm-as < %s | pnacl-freeze -allow-local-symbol-tables \ | |
| 4 ; RUN: | %llvm2ice -notranslate -verbose=inst -build-on-read \ | |
| 5 ; RUN: -allow-pnacl-reader-error-recovery \ | |
| 6 ; RUN: -allow-local-symbol-tables \ | |
| 7 ; RUN: | FileCheck %s | |
| 8 | |
| 9 define i32 @fib(i32 %n) { | |
|
Jim Stichnoth
2014/09/18 21:41:54
Just so I don't have to pore through all these tes
Karl
2014/09/18 22:01:50
Almost. I removed duplicate calls to an intrinsic
jvoung (off chromium)
2014/09/18 23:43:53
Hmm I'm not sure you need to have calls to all the
Karl
2014/09/19 20:29:51
I can't test a bad type signature, because llvm-as
| |
| 10 entry: | |
| 11 %cmp = icmp slt i32 %n, 2 | |
| 12 br i1 %cmp, label %return, label %if.end | |
| 13 | |
| 14 if.end: ; preds = %entry | |
| 15 %sub = add i32 %n, -1 | |
| 16 %call = tail call i32 @fib(i32 %sub) | |
| 17 %sub1 = add i32 %n, -2 | |
| 18 %call2 = tail call i32 @fib(i32 %sub1) | |
| 19 %add = add i32 %call2, %call | |
| 20 ret i32 %add | |
| 21 | |
| 22 return: ; preds = %entry | |
| 23 ret i32 %n | |
| 24 } | |
| 25 | |
| 26 ; CHECK: define i32 @fib(i32 %n) { | |
| 27 ; CHECK-NEXT: entry: | |
| 28 ; CHECK-NEXT: %cmp = icmp slt i32 %n, 2 | |
| 29 ; CHECK-NEXT: br i1 %cmp, label %return, label %if.end | |
| 30 ; CHECK-NEXT: if.end: | |
| 31 ; CHECK-NEXT: %sub = add i32 %n, -1 | |
| 32 ; CHECK-NEXT: %call = call i32 @fib(i32 %sub) | |
| 33 ; CHECK-NEXT: %sub1 = add i32 %n, -2 | |
| 34 ; CHECK-NEXT: %call2 = call i32 @fib(i32 %sub1) | |
| 35 ; CHECK-NEXT: %add = add i32 %call2, %call | |
| 36 ; CHECK-NEXT: ret i32 %add | |
| 37 ; CHECK-NEXT: return: | |
| 38 ; CHECK-NEXT: ret i32 %n | |
| 39 ; CHECK-NEXT: } | |
| 40 | |
| 41 define i32 @fact(i32 %n) { | |
| 42 entry: | |
| 43 %cmp = icmp slt i32 %n, 2 | |
| 44 br i1 %cmp, label %return, label %if.end | |
| 45 | |
| 46 if.end: ; preds = %entry | |
| 47 %sub = add i32 %n, -1 | |
| 48 %call = tail call i32 @fact(i32 %sub) | |
| 49 %mul = mul i32 %call, %n | |
| 50 ret i32 %mul | |
| 51 | |
| 52 return: ; preds = %entry | |
| 53 ret i32 %n | |
| 54 } | |
| 55 | |
| 56 ; CHECK-NEXT: define i32 @fact(i32 %n) { | |
| 57 ; CHECK-NEXT: entry: | |
| 58 ; CHECK-NEXT: %cmp = icmp slt i32 %n, 2 | |
| 59 ; CHECK-NEXT: br i1 %cmp, label %return, label %if.end | |
| 60 ; CHECK-NEXT: if.end: | |
| 61 ; CHECK-NEXT: %sub = add i32 %n, -1 | |
| 62 ; CHECK-NEXT: %call = call i32 @fact(i32 %sub) | |
| 63 ; CHECK-NEXT: %mul = mul i32 %call, %n | |
| 64 ; CHECK-NEXT: ret i32 %mul | |
| 65 ; CHECK-NEXT: return: | |
| 66 ; CHECK-NEXT: ret i32 %n | |
| 67 ; CHECK-NEXT: } | |
| 68 | |
| 69 define i32 @redirect(i32 %n) { | |
| 70 entry: | |
| 71 %call = tail call i32 @redirect_target(i32 %n) | |
| 72 ret i32 %call | |
| 73 } | |
| 74 | |
| 75 ; CHECK-NEXT: define i32 @redirect(i32 %n) { | |
| 76 ; CHECK-NEXT: entry: | |
| 77 ; CHECK-NEXT: %call = call i32 @redirect_target(i32 %n) | |
| 78 ; CHECK-NEXT: ret i32 %call | |
| 79 ; CHECK-NEXT: } | |
| 80 | |
| 81 declare i32 @redirect_target(i32) | |
| 82 | |
| 83 define void @call_void(i32 %n) { | |
| 84 entry: | |
| 85 %cmp2 = icmp sgt i32 %n, 0 | |
| 86 br i1 %cmp2, label %if.then, label %if.end | |
| 87 | |
| 88 if.then: ; preds = %entry, %if.then | |
| 89 %n.tr3 = phi i32 [ %call.i, %if.then ], [ %n, %entry ] | |
| 90 %sub = add i32 %n.tr3, -1 | |
| 91 %call.i = tail call i32 @redirect_target(i32 %sub) | |
| 92 %cmp = icmp sgt i32 %call.i, 0 | |
| 93 br i1 %cmp, label %if.then, label %if.end | |
| 94 | |
| 95 if.end: ; preds = %if.then, %entry | |
| 96 ret void | |
| 97 } | |
| 98 | |
| 99 ; CHECK-NEXT: define void @call_void(i32 %n) { | |
| 100 ; CHECK-NEXT: entry: | |
| 101 ; CHECK-NEXT: %cmp2 = icmp sgt i32 %n, 0 | |
| 102 ; CHECK-NEXT: br i1 %cmp2, label %if.then, label %if.end | |
| 103 ; CHECK-NEXT: if.then: | |
| 104 ; CHECK-NEXT: %n.tr3 = phi i32 [ %call.i, %if.then ], [ %n, %entry ] | |
| 105 ; CHECK-NEXT: %sub = add i32 %n.tr3, -1 | |
| 106 ; CHECK-NEXT: %call.i = call i32 @redirect_target(i32 %sub) | |
| 107 ; CHECK-NEXT: %cmp = icmp sgt i32 %call.i, 0 | |
| 108 ; CHECK-NEXT: br i1 %cmp, label %if.then, label %if.end | |
| 109 ; CHECK-NEXT: if.end: | |
| 110 ; CHECK-NEXT: ret void | |
| 111 ; CHECK-NEXT: } | |
| 112 | |
| OLD | NEW |