loop-multiple-exits.ll 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. ; RUN: opt -S -structurizecfg %s -o - | FileCheck %s
  2. ;
  3. ; void loop(int *out, int cond_a, int cond_b) {
  4. ;
  5. ; unsigned i;
  6. ; for (i = 0; i < cond_a; i++) {
  7. ; out[i] = i;
  8. ; if (i > cond_b) {
  9. ; break;
  10. ; }
  11. ; out[i + cond_a] = i;
  12. ; }
  13. ; }
  14. define void @loop(i32 addrspace(1)* %out, i32 %cond_a, i32 %cond_b) nounwind uwtable {
  15. entry:
  16. br label %for.cond
  17. for.cond: ; preds = %for.inc, %entry
  18. %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
  19. %cmp = icmp ult i32 %i.0, %cond_a
  20. br i1 %cmp, label %for.body, label %for.end
  21. ; CHECK: for.body:
  22. for.body: ; preds = %for.cond
  23. %arrayidx = getelementptr inbounds i32, i32 addrspace(1)* %out, i32 %i.0
  24. store i32 %i.0, i32 addrspace(1)* %arrayidx, align 4
  25. %cmp1 = icmp ugt i32 %i.0, %cond_b
  26. ; CHECK: br i1 %{{[0-9a-zA-Z_]+}}, label %for.inc, label %[[FLOW1:[0-9a-zA-Z_]+]]
  27. br i1 %cmp1, label %for.end, label %for.inc
  28. ; CHECK: [[FLOW:[0-9a-zA-Z]+]]:
  29. ; CHECK: br i1 %{{[0-9a-zA-Z_]+}}, label %for.end, label %for.cond
  30. ; CHECK: for.inc:
  31. ; CHECK: br label %[[FLOW1]]
  32. for.inc: ; preds = %for.body
  33. %0 = add i32 %cond_a, %i.0
  34. %arrayidx3 = getelementptr inbounds i32, i32 addrspace(1)* %out, i32 %0
  35. store i32 %i.0, i32 addrspace(1)* %arrayidx3, align 4
  36. %inc = add i32 %i.0, 1
  37. br label %for.cond
  38. ; CHECK: [[FLOW1]]
  39. ; CHECK: br label %[[FLOW]]
  40. for.end: ; preds = %for.cond, %for.body
  41. ret void
  42. }