recursivetype.ll 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. ; RUN: llvm-as < %s | llvm-dis > %t1.ll
  2. ; RUN: llvm-as %t1.ll -o - | llvm-dis > %t2.ll
  3. ; RUN: diff %t1.ll %t2.ll
  4. ; This file contains the output from the following compiled C code:
  5. ; typedef struct list {
  6. ; struct list *Next;
  7. ; int Data;
  8. ; } list;
  9. ;
  10. ; // Iterative insert fn
  11. ; void InsertIntoListTail(list **L, int Data) {
  12. ; while (*L)
  13. ; L = &(*L)->Next;
  14. ; *L = (list*)malloc(sizeof(list));
  15. ; (*L)->Data = Data;
  16. ; (*L)->Next = 0;
  17. ; }
  18. ;
  19. ; // Recursive list search fn
  20. ; list *FindData(list *L, int Data) {
  21. ; if (L == 0) return 0;
  22. ; if (L->Data == Data) return L;
  23. ; return FindData(L->Next, Data);
  24. ; }
  25. ;
  26. ; void DoListStuff() {
  27. ; list *MyList = 0;
  28. ; InsertIntoListTail(&MyList, 100);
  29. ; InsertIntoListTail(&MyList, 12);
  30. ; InsertIntoListTail(&MyList, 42);
  31. ; InsertIntoListTail(&MyList, 1123);
  32. ; InsertIntoListTail(&MyList, 1213);
  33. ;
  34. ; if (FindData(MyList, 75)) foundIt();
  35. ; if (FindData(MyList, 42)) foundIt();
  36. ; if (FindData(MyList, 700)) foundIt();
  37. ; }
  38. %list = type { %list*, i32 }
  39. declare i8* @malloc(i32)
  40. define void @InsertIntoListTail(%list** %L, i32 %Data) {
  41. bb1:
  42. %reg116 = load %list*, %list** %L ; <%list*> [#uses=1]
  43. %cast1004 = inttoptr i64 0 to %list* ; <%list*> [#uses=1]
  44. %cond1000 = icmp eq %list* %reg116, %cast1004 ; <i1> [#uses=1]
  45. br i1 %cond1000, label %bb3, label %bb2
  46. bb2: ; preds = %bb2, %bb1
  47. %reg117 = phi %list** [ %reg118, %bb2 ], [ %L, %bb1 ] ; <%list**> [#uses=1]
  48. %cast1010 = bitcast %list** %reg117 to %list*** ; <%list***> [#uses=1]
  49. %reg118 = load %list**, %list*** %cast1010 ; <%list**> [#uses=3]
  50. %reg109 = load %list*, %list** %reg118 ; <%list*> [#uses=1]
  51. %cast1005 = inttoptr i64 0 to %list* ; <%list*> [#uses=1]
  52. %cond1001 = icmp ne %list* %reg109, %cast1005 ; <i1> [#uses=1]
  53. br i1 %cond1001, label %bb2, label %bb3
  54. bb3: ; preds = %bb2, %bb1
  55. %reg119 = phi %list** [ %reg118, %bb2 ], [ %L, %bb1 ] ; <%list**> [#uses=1]
  56. %cast1006 = bitcast %list** %reg119 to i8** ; <i8**> [#uses=1]
  57. %reg111 = call i8* @malloc( i32 16 ) ; <i8*> [#uses=3]
  58. store i8* %reg111, i8** %cast1006
  59. %reg111.upgrd.1 = ptrtoint i8* %reg111 to i64 ; <i64> [#uses=1]
  60. %reg1002 = add i64 %reg111.upgrd.1, 8 ; <i64> [#uses=1]
  61. %reg1002.upgrd.2 = inttoptr i64 %reg1002 to i8* ; <i8*> [#uses=1]
  62. %cast1008 = bitcast i8* %reg1002.upgrd.2 to i32* ; <i32*> [#uses=1]
  63. store i32 %Data, i32* %cast1008
  64. %cast1003 = inttoptr i64 0 to i64* ; <i64*> [#uses=1]
  65. %cast1009 = bitcast i8* %reg111 to i64** ; <i64**> [#uses=1]
  66. store i64* %cast1003, i64** %cast1009
  67. ret void
  68. }
  69. define %list* @FindData(%list* %L, i32 %Data) {
  70. bb1:
  71. br label %bb2
  72. bb2: ; preds = %bb6, %bb1
  73. %reg115 = phi %list* [ %reg116, %bb6 ], [ %L, %bb1 ] ; <%list*> [#uses=4]
  74. %cast1014 = inttoptr i64 0 to %list* ; <%list*> [#uses=1]
  75. %cond1011 = icmp ne %list* %reg115, %cast1014 ; <i1> [#uses=1]
  76. br i1 %cond1011, label %bb4, label %bb3
  77. bb3: ; preds = %bb2
  78. ret %list* null
  79. bb4: ; preds = %bb2
  80. %idx = getelementptr %list, %list* %reg115, i64 0, i32 1 ; <i32*> [#uses=1]
  81. %reg111 = load i32, i32* %idx ; <i32> [#uses=1]
  82. %cond1013 = icmp ne i32 %reg111, %Data ; <i1> [#uses=1]
  83. br i1 %cond1013, label %bb6, label %bb5
  84. bb5: ; preds = %bb4
  85. ret %list* %reg115
  86. bb6: ; preds = %bb4
  87. %idx2 = getelementptr %list, %list* %reg115, i64 0, i32 0 ; <%list**> [#uses=1]
  88. %reg116 = load %list*, %list** %idx2 ; <%list*> [#uses=1]
  89. br label %bb2
  90. }