brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.4 KiB · f55db35 Raw
208 lines · plain
1; Verifies that we materialize instruction across suspend points2; RUN: opt < %s -passes='cgscc(coro-split),simplifycfg,early-cse' -S | FileCheck %s3 4; See that we only spilled one value for f5; CHECK: %f.Frame = type { ptr, ptr, i32, i1 }6; CHECK: %f_optnone.Frame = type { ptr, ptr, i32, i32, i1 }7; Check other variants where different levels of materialization are achieved8; CHECK: %f_multiple_remat.Frame = type { ptr, ptr, i32, i1 }9; CHECK: %f_common_def.Frame = type { ptr, ptr, i32, i1 }10; CHECK: %f_common_def_multi_result.Frame = type { ptr, ptr, i32, i1 }11; CHECK-LABEL: @f(12; CHECK-LABEL: @f_optnone13; CHECK-LABEL: @f_multiple_remat(14; CHECK-LABEL: @f_common_def(15; CHECK-LABEL: @f_common_def_multi_result(16 17define ptr @f(i32 %n) presplitcoroutine {18entry:19  %id = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null)20  %size = call i32 @llvm.coro.size.i32()21  %alloc = call ptr @malloc(i32 %size)22  %hdl = call ptr @llvm.coro.begin(token %id, ptr %alloc)23 24  %inc1 = add i32 %n, 125  %sp1 = call i8 @llvm.coro.suspend(token none, i1 false)26  switch i8 %sp1, label %suspend [i8 0, label %resume127                                  i8 1, label %cleanup]28resume1:29  %inc2 = add i32 %inc1, 130  %sp2 = call i8 @llvm.coro.suspend(token none, i1 false)31  switch i8 %sp2, label %suspend [i8 0, label %resume232                                  i8 1, label %cleanup]33 34resume2:35  call void @print(i32 %inc1)36  call void @print(i32 %inc2)37  br label %cleanup38 39cleanup:40  %mem = call ptr @llvm.coro.free(token %id, ptr %hdl)41  call void @free(ptr %mem)42  br label %suspend43suspend:44  call void @llvm.coro.end(ptr %hdl, i1 0, token none)45  ret ptr %hdl46}47 48; Checks that we won't transform functions with optnone.49define ptr @f_optnone(i32 %n) presplitcoroutine optnone noinline {50entry:51  %id = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null)52  %size = call i32 @llvm.coro.size.i32()53  %alloc = call ptr @malloc(i32 %size)54  %hdl = call ptr @llvm.coro.begin(token %id, ptr %alloc)55 56  %inc1 = add i32 %n, 157  %sp1 = call i8 @llvm.coro.suspend(token none, i1 false)58  switch i8 %sp1, label %suspend [i8 0, label %resume159                                  i8 1, label %cleanup]60resume1:61  %inc2 = add i32 %inc1, 162  %sp2 = call i8 @llvm.coro.suspend(token none, i1 false)63  switch i8 %sp2, label %suspend [i8 0, label %resume264                                  i8 1, label %cleanup]65 66resume2:67  call void @print(i32 %inc1)68  call void @print(i32 %inc2)69  br label %cleanup70 71cleanup:72  %mem = call ptr @llvm.coro.free(token %id, ptr %hdl)73  call void @free(ptr %mem)74  br label %suspend75suspend:76  call void @llvm.coro.end(ptr %hdl, i1 0, token none)77  ret ptr %hdl78}79 80define ptr @f_multiple_remat(i32 %n) presplitcoroutine {81entry:82  %id = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null)83  %size = call i32 @llvm.coro.size.i32()84  %alloc = call ptr @malloc(i32 %size)85  %hdl = call ptr @llvm.coro.begin(token %id, ptr %alloc)86 87  %inc1 = add i32 %n, 188  %inc2 = add i32 %inc1, 289  %inc3 = add i32 %inc2, 390  %inc4 = add i32 %inc3, 491  %inc5 = add i32 %inc4, 592  %inc6 = add i32 %inc5, 593  %sp1 = call i8 @llvm.coro.suspend(token none, i1 false)94  switch i8 %sp1, label %suspend [i8 0, label %resume195                                  i8 1, label %cleanup]96resume1:97  %inc7 = add i32 %inc6, 198  %sp2 = call i8 @llvm.coro.suspend(token none, i1 false)99  switch i8 %sp2, label %suspend [i8 0, label %resume2100                                  i8 1, label %cleanup]101 102resume2:103  call void @print(i32 %inc1)104  call void @print(i32 %inc7)105  br label %cleanup106 107cleanup:108  %mem = call ptr @llvm.coro.free(token %id, ptr %hdl)109  call void @free(ptr %mem)110  br label %suspend111suspend:112  call void @llvm.coro.end(ptr %hdl, i1 0, token none)113  ret ptr %hdl114}115 116define ptr @f_common_def(i32 %n) presplitcoroutine {117entry:118  %id = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null)119  %size = call i32 @llvm.coro.size.i32()120  %alloc = call ptr @malloc(i32 %size)121  %hdl = call ptr @llvm.coro.begin(token %id, ptr %alloc)122 123  %inc1 = add i32 %n, 1124  %inc2 = add i32 %inc1, 2125  %inc3 = add i32 %n, 3126  %inc4 = add i32 %inc3, %inc1127  %inc5 = add i32 %inc4, %inc1128  %inc6 = add i32 %inc5, 5129  %sp1 = call i8 @llvm.coro.suspend(token none, i1 false)130  switch i8 %sp1, label %suspend [i8 0, label %resume1131                                  i8 1, label %cleanup]132resume1:133  %inc7 = add i32 %inc6, 1134  %sp2 = call i8 @llvm.coro.suspend(token none, i1 false)135  switch i8 %sp2, label %suspend [i8 0, label %resume2136                                  i8 1, label %cleanup]137 138resume2:139  call void @print(i32 %inc1)140  call void @print(i32 %inc7)141  br label %cleanup142 143cleanup:144  %mem = call ptr @llvm.coro.free(token %id, ptr %hdl)145  call void @free(ptr %mem)146  br label %suspend147suspend:148  call void @llvm.coro.end(ptr %hdl, i1 0, token none)149  ret ptr %hdl150}151 152define ptr @f_common_def_multi_result(i32 %n) presplitcoroutine {153entry:154  %id = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null)155  %size = call i32 @llvm.coro.size.i32()156  %alloc = call ptr @malloc(i32 %size)157  %hdl = call ptr @llvm.coro.begin(token %id, ptr %alloc)158 159  %inc1 = add i32 %n, 1160  %inc2 = add i32 %inc1, 2161  %inc3 = add i32 %n, 3162  %inc4 = add i32 %inc3, %inc1163  %inc5 = add i32 %inc4, %inc1164  %inc6 = add i32 %inc5, 4165  %inc7 = add i32 %inc6, 5166  %inc8 = add i32 %inc4, %inc2167  %inc9 = add i32 %inc8, 5168  %inc10 = add i32 %inc9, 6169  %inc11 = add i32 %inc10, 7170  %sp1 = call i8 @llvm.coro.suspend(token none, i1 false)171  switch i8 %sp1, label %suspend [i8 0, label %resume1172                                  i8 1, label %cleanup]173resume1:174  %inc12 = add i32 %inc7, 1175  %sp2 = call i8 @llvm.coro.suspend(token none, i1 false)176  switch i8 %sp2, label %suspend [i8 0, label %resume2177                                  i8 1, label %cleanup]178 179resume2:180  call void @print(i32 %inc11)181  call void @print(i32 %inc12)182  br label %cleanup183 184cleanup:185  %mem = call ptr @llvm.coro.free(token %id, ptr %hdl)186  call void @free(ptr %mem)187  br label %suspend188suspend:189  call void @llvm.coro.end(ptr %hdl, i1 0, token none)190  ret ptr %hdl191}192 193 194declare ptr @llvm.coro.free(token, ptr)195declare i32 @llvm.coro.size.i32()196declare i8  @llvm.coro.suspend(token, i1)197declare void @llvm.coro.resume(ptr)198declare void @llvm.coro.destroy(ptr)199 200declare token @llvm.coro.id(i32, ptr, ptr, ptr)201declare i1 @llvm.coro.alloc(token)202declare ptr @llvm.coro.begin(token, ptr)203declare void @llvm.coro.end(ptr, i1, token)204 205declare noalias ptr @malloc(i32)206declare void @print(i32)207declare void @free(ptr)208