Eric Christopher | cee313d | 2019-04-17 04:52:47 +0000 | [diff] [blame] | 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 | } |