|
41 | 41 | store i64 %0, i64 addrspace(13)* %4, align 8
|
42 | 42 | ret {} addrspace(10)* %1
|
43 | 43 | }
|
| 44 | + |
| 45 | +; COM: A type used for testing that remove-addrspaces can handle recursive types. |
| 46 | +%list = type { i64, %list* } |
| 47 | + |
| 48 | +; COM: There's nothing to remove in this function; but remove-addrspaces shouldn't crash. |
| 49 | +define i64 @sum.linked.list() #0 { |
| 50 | +; CHECK-LABEL: @sum.linked.list |
| 51 | +top: |
| 52 | + %a = alloca %list |
| 53 | + %b = alloca %list |
| 54 | + %c = alloca %list |
| 55 | + %a.car = getelementptr %list, %list* %a, i32 0, i32 0 |
| 56 | + %a.cdr = getelementptr %list, %list* %a, i32 0, i32 1 |
| 57 | + %b.car = getelementptr %list, %list* %b, i32 0, i32 0 |
| 58 | + %b.cdr = getelementptr %list, %list* %b, i32 0, i32 1 |
| 59 | + %c.car = getelementptr %list, %list* %c, i32 0, i32 0 |
| 60 | + %c.cdr = getelementptr %list, %list* %c, i32 0, i32 1 |
| 61 | +; COM: Allow remove-addrspaces to rename the type but expect it to use the same prefix. |
| 62 | +; CHECK: getelementptr %list |
| 63 | +; CHECK-SAME: %list |
| 64 | +; CHECK-SAME: * %a |
| 65 | +; CHECK: getelementptr %list |
| 66 | +; CHECK-SAME: %list |
| 67 | +; CHECK-SAME: * %a |
| 68 | +; CHECK: getelementptr %list |
| 69 | +; CHECK-SAME: %list |
| 70 | +; CHECK-SAME: * %b |
| 71 | +; CHECK: getelementptr %list |
| 72 | +; CHECK-SAME: %list |
| 73 | +; CHECK-SAME: * %b |
| 74 | +; CHECK: getelementptr %list |
| 75 | +; CHECK-SAME: %list |
| 76 | +; CHECK-SAME: * %c |
| 77 | +; CHECK: getelementptr %list |
| 78 | +; CHECK-SAME: %list |
| 79 | +; CHECK-SAME: * %c |
| 80 | + store i64 111, i64* %a.car |
| 81 | + store i64 222, i64* %b.car |
| 82 | + store i64 333, i64* %c.car |
| 83 | + store %list* %b, %list** %a.cdr |
| 84 | + store %list* %c, %list** %b.cdr |
| 85 | + store %list* null, %list** %c.cdr |
| 86 | + br label %loop |
| 87 | + |
| 88 | +loop: |
| 89 | + %x = phi %list* [ %a, %top ], [ %x.cdr.value, %loop ] |
| 90 | + %sum.prev = phi i64 [ 0, %top ], [ %sum, %loop ] |
| 91 | + %x.car = getelementptr %list, %list* %x, i32 0, i32 0 |
| 92 | + %x.cdr = getelementptr %list, %list* %x, i32 0, i32 1 |
| 93 | + %x.car.value = load i64, i64* %x.car |
| 94 | + %x.cdr.value = load %list*, %list** %x.cdr |
| 95 | + %sum = add i64 %sum.prev, %x.car.value |
| 96 | + %null.int = ptrtoint %list* null to i64 |
| 97 | + %x.cdr.value.int = ptrtoint %list* %x.cdr.value to i64 |
| 98 | + %cond = icmp eq i64 %x.cdr.value.int, %null.int |
| 99 | + br i1 %cond, label %exit, label %loop |
| 100 | + |
| 101 | +exit: |
| 102 | + ret i64 %sum |
| 103 | +} |
0 commit comments