simplifylatch.ll 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. ; RUN: opt -S < %s -loop-rotate -licm -verify-dom-info -verify-loop-info | FileCheck %s
  2. ; PR2624 unroll multiple exits
  3. @mode_table = global [4 x i32] zeroinitializer ; <[4 x i32]*> [#uses=1]
  4. ; CHECK-LABEL: @f(
  5. ; CHECK-NOT: bb:
  6. define i8 @f() {
  7. entry:
  8. tail call i32 @fegetround( ) ; <i32>:0 [#uses=1]
  9. br label %bb
  10. bb: ; preds = %bb4, %entry
  11. %mode.0 = phi i8 [ 0, %entry ], [ %indvar.next, %bb4 ] ; <i8> [#uses=4]
  12. zext i8 %mode.0 to i32 ; <i32>:1 [#uses=1]
  13. getelementptr [4 x i32], [4 x i32]* @mode_table, i32 0, i32 %1 ; <i32*>:2 [#uses=1]
  14. load i32, i32* %2, align 4 ; <i32>:3 [#uses=1]
  15. icmp eq i32 %3, %0 ; <i1>:4 [#uses=1]
  16. br i1 %4, label %bb1, label %bb2
  17. bb1: ; preds = %bb
  18. ret i8 %mode.0
  19. bb2: ; preds = %bb
  20. icmp eq i8 %mode.0, 1 ; <i1>:5 [#uses=1]
  21. br i1 %5, label %bb5, label %bb4
  22. bb4: ; preds = %bb2
  23. %indvar.next = add i8 %mode.0, 1 ; <i8> [#uses=1]
  24. br label %bb
  25. bb5: ; preds = %bb2
  26. tail call void @raise_exception( ) noreturn
  27. unreachable
  28. }
  29. declare i32 @fegetround()
  30. declare void @raise_exception() noreturn
  31. ;CHECK: for.body.lr.ph:
  32. ;CHECK-NEXT: %arrayidx1 = getelementptr inbounds i8, i8* %CurPtr, i64 0
  33. ;CHECK-NEXT: %0 = load i8, i8* %arrayidx1, align 1
  34. ;CHECK-NEXT: %conv2 = sext i8 %0 to i32
  35. ;CHECK-NEXT: br label %for.body
  36. define i32 @foo(i8* %CurPtr, i32 %a) #0 {
  37. entry:
  38. br label %for.cond
  39. for.cond: ; preds = %for.inc, %entry
  40. %i.0 = phi i32 [ 1, %entry ], [ %inc, %for.inc ]
  41. %cmp = icmp ne i32 %i.0, %a
  42. br i1 %cmp, label %for.body, label %return
  43. for.body: ; preds = %for.cond
  44. %idxprom = zext i32 %i.0 to i64
  45. %arrayidx = getelementptr inbounds i8, i8* %CurPtr, i64 %idxprom
  46. %0 = load i8, i8* %arrayidx, align 1
  47. %conv = sext i8 %0 to i32
  48. %arrayidx1 = getelementptr inbounds i8, i8* %CurPtr, i64 0
  49. %1 = load i8, i8* %arrayidx1, align 1
  50. %conv2 = sext i8 %1 to i32
  51. %cmp3 = icmp ne i32 %conv, %conv2
  52. br i1 %cmp3, label %return, label %for.inc
  53. for.inc: ; preds = %for.body
  54. %inc = add i32 %i.0, 1
  55. br label %for.cond
  56. return: ; preds = %for.cond, %for.body
  57. %retval.0 = phi i32 [ 0, %for.body ], [ 1, %for.cond ]
  58. ret i32 %retval.0
  59. }
  60. attributes #0 = { nounwind uwtable }