Home | History | Annotate | Download | only in MergeFunc
      1 ; RUN: opt %s -mergefunc -globalopt -S -o - | FileCheck %s
      2 
      3 ; Make sure we don't crash on this example. This test is supposed to test that
      4 ; MergeFunctions clears its GlobalNumbers value map. If this map still contains
      5 ; entries when running globalopt and the MergeFunctions instance is still alive
      6 ; the optimization of @G would cause an assert because globalopt would do an
      7 ; RAUW on @G which still exists as an entry in the GlobalNumbers ValueMap which
      8 ; causes an assert in the ValueHandle call back because we are RAUWing with a
      9 ; different type (AllocaInst) than its key type (GlobalValue).
     10 
     11 @G = internal global i8** null
     12 @G2 = internal global i8** null
     13 
     14 define i32 @main(i32 %argc, i8** %argv) norecurse {
     15 ; CHECK: alloca
     16   store i8** %argv, i8*** @G
     17   ret i32 0
     18 }
     19 
     20 define internal i8** @dead1(i64 %p) {
     21   call void @right(i64 %p)
     22   call void @right(i64 %p)
     23   call void @right(i64 %p)
     24   call void @right(i64 %p)
     25   %tmp = load i8**, i8*** @G
     26   ret i8** %tmp
     27 }
     28 
     29 define internal i8** @dead2(i64 %p) {
     30   call void @right(i64 %p)
     31   call void @right(i64 %p)
     32   call void @right(i64 %p)
     33   call void @right(i64 %p)
     34   %tmp = load i8**, i8*** @G2
     35   ret i8** %tmp
     36 }
     37 
     38 define void @left(i64 %p) {
     39 entry-block:
     40   call void @right(i64 %p)
     41   call void @right(i64 %p)
     42   call void @right(i64 %p)
     43   call void @right(i64 %p)
     44   ret void
     45 }
     46 
     47 define void @right(i64 %p) {
     48 entry-block:
     49   call void @left(i64 %p)
     50   call void @left(i64 %p)
     51   call void @left(i64 %p)
     52   call void @left(i64 %p)
     53   ret void
     54 }
     55