| OLD | NEW |
| 1 ; RUN: llc < %s | FileCheck %s | 1 ; RUN: llc < %s | FileCheck %s |
| 2 | 2 |
| 3 ; Lifetime intrinsics are typically just referencing a single alloca, but | 3 ; Lifetime intrinsics are typically just referencing a single alloca, but |
| 4 ; sometimes PRE decides to totally optimize a redundant bitcast and insert | 4 ; sometimes PRE decides to totally optimize a redundant bitcast and insert |
| 5 ; phis. We need to look through the phis. In the code below, l_1565.i has | 5 ; phis. We need to look through the phis. In the code below, l_1565.i has |
| 6 ; an overlapping lifetime with l_766.i which is only visible if we can | 6 ; an overlapping lifetime with l_766.i which is only visible if we can |
| 7 ; see through phis. | 7 ; see through phis. |
| 8 | 8 |
| 9 ; CHECK: $vararg_buffer3 = sp; | 9 ; CHECK: $vararg_buffer3 = sp; |
| 10 ; CHECK: $l_1565$i = sp + 16|0; | 10 ; CHECK: $l_1565$i = sp + 16|0; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 define void @test() { | 33 define void @test() { |
| 34 entry: | 34 entry: |
| 35 %vararg_buffer3 = alloca <{ i32*, i32**, i32* }>, align 8 | 35 %vararg_buffer3 = alloca <{ i32*, i32**, i32* }>, align 8 |
| 36 %vararg_lifetime_bitcast4 = bitcast <{ i32*, i32**, i32* }>* %vararg_buffer3 t
o i8* | 36 %vararg_lifetime_bitcast4 = bitcast <{ i32*, i32**, i32* }>* %vararg_buffer3 t
o i8* |
| 37 %vararg_buffer = alloca <{ i32*, i32**, i32* }>, align 8 | 37 %vararg_buffer = alloca <{ i32*, i32**, i32* }>, align 8 |
| 38 %vararg_lifetime_bitcast = bitcast <{ i32*, i32**, i32* }>* %vararg_buffer to
i8* | 38 %vararg_lifetime_bitcast = bitcast <{ i32*, i32**, i32* }>* %vararg_buffer to
i8* |
| 39 %l_767.i.i = alloca i32, align 4 | 39 %l_767.i.i = alloca i32, align 4 |
| 40 %l_1565.i = alloca i32*, align 4 | 40 %l_1565.i = alloca i32*, align 4 |
| 41 %l_767.i = alloca i32, align 4 | 41 %l_767.i = alloca i32, align 4 |
| 42 %l_766.i = alloca [1 x i16*], align 4 | 42 %l_766.i = alloca [1 x i16*], align 4 |
| 43 %0 = load i32* bitcast ([4 x i8]* @g_15 to i32*), align 4 | 43 %0 = load i32, i32* bitcast ([4 x i8]* @g_15 to i32*), align 4 |
| 44 %tobool = icmp eq i32 %0, 0 | 44 %tobool = icmp eq i32 %0, 0 |
| 45 br i1 %tobool, label %if.then, label %entry.if.end_crit_edge | 45 br i1 %tobool, label %if.then, label %entry.if.end_crit_edge |
| 46 | 46 |
| 47 entry.if.end_crit_edge: ; preds = %entry | 47 entry.if.end_crit_edge: ; preds = %entry |
| 48 %.pre = bitcast [1 x i16*]* %l_766.i to i8* | 48 %.pre = bitcast [1 x i16*]* %l_766.i to i8* |
| 49 %.pre1 = getelementptr inbounds [1 x i16*]* %l_766.i, i32 0, i32 0 | 49 %.pre1 = getelementptr inbounds [1 x i16*], [1 x i16*]* %l_766.i, i32 0, i32 0 |
| 50 br label %if.end | 50 br label %if.end |
| 51 | 51 |
| 52 if.then: ; preds = %entry | 52 if.then: ; preds = %entry |
| 53 %1 = bitcast i32* %l_767.i to i8* | 53 %1 = bitcast i32* %l_767.i to i8* |
| 54 call void @llvm.lifetime.start(i64 4, i8* %1) | 54 call void @llvm.lifetime.start(i64 4, i8* %1) |
| 55 %2 = bitcast [1 x i16*]* %l_766.i to i8* | 55 %2 = bitcast [1 x i16*]* %l_766.i to i8* |
| 56 call void @llvm.lifetime.start(i64 4, i8* %2) | 56 call void @llvm.lifetime.start(i64 4, i8* %2) |
| 57 store i32 -1407759351, i32* %l_767.i, align 4 | 57 store i32 -1407759351, i32* %l_767.i, align 4 |
| 58 %3 = getelementptr inbounds [1 x i16*]* %l_766.i, i32 0, i32 0 | 58 %3 = getelementptr inbounds [1 x i16*], [1 x i16*]* %l_766.i, i32 0, i32 0 |
| 59 store i16* null, i16** %3, align 4 | 59 store i16* null, i16** %3, align 4 |
| 60 br label %for.body.i | 60 br label %for.body.i |
| 61 | 61 |
| 62 for.body.i: ; preds = %for.body.i, %if.the
n | 62 for.body.i: ; preds = %for.body.i, %if.the
n |
| 63 %l_82.02.i = phi i32 [ 0, %if.then ], [ %inc.i, %for.body.i ] | 63 %l_82.02.i = phi i32 [ 0, %if.then ], [ %inc.i, %for.body.i ] |
| 64 %4 = load i32*** bitcast (i32* @g_423 to i32***), align 4 | 64 %4 = load i32**, i32*** bitcast (i32* @g_423 to i32***), align 4 |
| 65 store i32* %l_767.i, i32** %4, align 4 | 65 store i32* %l_767.i, i32** %4, align 4 |
| 66 store i16** %3, i16*** bitcast ([4 x i8]* @g_779 to i16***), align 4 | 66 store i16** %3, i16*** bitcast ([4 x i8]* @g_779 to i16***), align 4 |
| 67 %inc.i = add i32 %l_82.02.i, 1 | 67 %inc.i = add i32 %l_82.02.i, 1 |
| 68 %exitcond.i = icmp eq i32 %inc.i, 27 | 68 %exitcond.i = icmp eq i32 %inc.i, 27 |
| 69 br i1 %exitcond.i, label %_Z7func_34v.exit, label %for.body.i | 69 br i1 %exitcond.i, label %_Z7func_34v.exit, label %for.body.i |
| 70 | 70 |
| 71 _Z7func_34v.exit: ; preds = %for.body.i | 71 _Z7func_34v.exit: ; preds = %for.body.i |
| 72 call void @llvm.lifetime.end(i64 4, i8* %1) | 72 call void @llvm.lifetime.end(i64 4, i8* %1) |
| 73 call void @llvm.lifetime.end(i64 4, i8* %2) | 73 call void @llvm.lifetime.end(i64 4, i8* %2) |
| 74 %5 = load i32*** bitcast (i32* @g_423 to i32***), align 4 | 74 %5 = load i32**, i32*** bitcast (i32* @g_423 to i32***), align 4 |
| 75 store i32* bitcast ([4 x i8]* @g_285 to i32*), i32** %5, align 4 | 75 store i32* bitcast ([4 x i8]* @g_285 to i32*), i32** %5, align 4 |
| 76 br label %if.end | 76 br label %if.end |
| 77 | 77 |
| 78 if.end: ; preds = %_Z7func_34v.exit, %
entry.if.end_crit_edge | 78 if.end: ; preds = %_Z7func_34v.exit, %
entry.if.end_crit_edge |
| 79 %.pre-phi2 = phi i16** [ %.pre1, %entry.if.end_crit_edge ], [ %3, %_Z7func_34v
.exit ] | 79 %.pre-phi2 = phi i16** [ %.pre1, %entry.if.end_crit_edge ], [ %3, %_Z7func_34v
.exit ] |
| 80 %.pre-phi = phi i8* [ %.pre, %entry.if.end_crit_edge ], [ %2, %_Z7func_34v.exi
t ] | 80 %.pre-phi = phi i8* [ %.pre, %entry.if.end_crit_edge ], [ %2, %_Z7func_34v.exi
t ] |
| 81 %6 = bitcast i32** %l_1565.i to i8* | 81 %6 = bitcast i32** %l_1565.i to i8* |
| 82 call void @llvm.lifetime.start(i64 4, i8* %6) | 82 call void @llvm.lifetime.start(i64 4, i8* %6) |
| 83 store i32* bitcast ([4 x i8]* @g_784 to i32*), i32** %l_1565.i, align 4 | 83 store i32* bitcast ([4 x i8]* @g_784 to i32*), i32** %l_1565.i, align 4 |
| 84 call void @llvm.lifetime.start(i64 12, i8* %vararg_lifetime_bitcast) | 84 call void @llvm.lifetime.start(i64 12, i8* %vararg_lifetime_bitcast) |
| 85 %vararg_ptr = getelementptr <{ i32*, i32**, i32* }>* %vararg_buffer, i32 0, i3
2 0 | 85 %vararg_ptr = getelementptr <{ i32*, i32**, i32* }>, <{ i32*, i32**, i32* }>*
%vararg_buffer, i32 0, i32 0 |
| 86 store i32* bitcast ([4 x i8]* @g_784 to i32*), i32** %vararg_ptr, align 4 | 86 store i32* bitcast ([4 x i8]* @g_784 to i32*), i32** %vararg_ptr, align 4 |
| 87 %vararg_ptr1 = getelementptr <{ i32*, i32**, i32* }>* %vararg_buffer, i32 0, i
32 1 | 87 %vararg_ptr1 = getelementptr <{ i32*, i32**, i32* }>, <{ i32*, i32**, i32* }>*
%vararg_buffer, i32 0, i32 1 |
| 88 store i32** %l_1565.i, i32*** %vararg_ptr1, align 4 | 88 store i32** %l_1565.i, i32*** %vararg_ptr1, align 4 |
| 89 %vararg_ptr2 = getelementptr <{ i32*, i32**, i32* }>* %vararg_buffer, i32 0, i
32 2 | 89 %vararg_ptr2 = getelementptr <{ i32*, i32**, i32* }>, <{ i32*, i32**, i32* }>*
%vararg_buffer, i32 0, i32 2 |
| 90 store i32* bitcast ([4 x i8]* @g_784 to i32*), i32** %vararg_ptr2, align 4 | 90 store i32* bitcast ([4 x i8]* @g_784 to i32*), i32** %vararg_ptr2, align 4 |
| 91 %call.i = call i32 bitcast (i32 (i8*, i8*)* @printf to i32 (i8*, <{ i32*, i32*
*, i32* }>*)*)(i8* getelementptr inbounds ([25 x i8]* @.str, i32 0, i32 0), <{ i
32*, i32**, i32* }>* %vararg_buffer) | 91 %call.i = call i32 bitcast (i32 (i8*, i8*)* @printf to i32 (i8*, <{ i32*, i32*
*, i32* }>*)*)(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str, i32 0, i
32 0), <{ i32*, i32**, i32* }>* %vararg_buffer) |
| 92 call void @llvm.lifetime.end(i64 12, i8* %vararg_lifetime_bitcast) | 92 call void @llvm.lifetime.end(i64 12, i8* %vararg_lifetime_bitcast) |
| 93 %7 = bitcast i32* %l_767.i.i to i8* | 93 %7 = bitcast i32* %l_767.i.i to i8* |
| 94 call void @llvm.lifetime.start(i64 4, i8* %7) | 94 call void @llvm.lifetime.start(i64 4, i8* %7) |
| 95 call void @llvm.lifetime.start(i64 4, i8* %.pre-phi) | 95 call void @llvm.lifetime.start(i64 4, i8* %.pre-phi) |
| 96 store i32 -1407759351, i32* %l_767.i.i, align 4 | 96 store i32 -1407759351, i32* %l_767.i.i, align 4 |
| 97 store i16* null, i16** %.pre-phi2, align 4 | 97 store i16* null, i16** %.pre-phi2, align 4 |
| 98 br label %for.body.i.i | 98 br label %for.body.i.i |
| 99 | 99 |
| 100 for.body.i.i: ; preds = %for.body.i.i, %if.e
nd | 100 for.body.i.i: ; preds = %for.body.i.i, %if.e
nd |
| 101 %l_82.02.i.i = phi i32 [ 0, %if.end ], [ %inc.i.i, %for.body.i.i ] | 101 %l_82.02.i.i = phi i32 [ 0, %if.end ], [ %inc.i.i, %for.body.i.i ] |
| 102 %8 = load i32*** bitcast (i32* @g_423 to i32***), align 4 | 102 %8 = load i32**, i32*** bitcast (i32* @g_423 to i32***), align 4 |
| 103 store i32* %l_767.i.i, i32** %8, align 4 | 103 store i32* %l_767.i.i, i32** %8, align 4 |
| 104 store i16** %.pre-phi2, i16*** bitcast ([4 x i8]* @g_779 to i16***), align 4 | 104 store i16** %.pre-phi2, i16*** bitcast ([4 x i8]* @g_779 to i16***), align 4 |
| 105 %inc.i.i = add i32 %l_82.02.i.i, 1 | 105 %inc.i.i = add i32 %l_82.02.i.i, 1 |
| 106 %exitcond.i.i = icmp eq i32 %inc.i.i, 27 | 106 %exitcond.i.i = icmp eq i32 %inc.i.i, 27 |
| 107 br i1 %exitcond.i.i, label %_Z7func_34v.exit.i, label %for.body.i.i | 107 br i1 %exitcond.i.i, label %_Z7func_34v.exit.i, label %for.body.i.i |
| 108 | 108 |
| 109 _Z7func_34v.exit.i: ; preds = %for.body.i.i | 109 _Z7func_34v.exit.i: ; preds = %for.body.i.i |
| 110 call void @llvm.lifetime.end(i64 4, i8* %7) | 110 call void @llvm.lifetime.end(i64 4, i8* %7) |
| 111 call void @llvm.lifetime.end(i64 4, i8* %.pre-phi) | 111 call void @llvm.lifetime.end(i64 4, i8* %.pre-phi) |
| 112 %9 = load i32** %l_1565.i, align 4 | 112 %9 = load i32*, i32** %l_1565.i, align 4 |
| 113 call void @llvm.lifetime.start(i64 12, i8* %vararg_lifetime_bitcast4) | 113 call void @llvm.lifetime.start(i64 12, i8* %vararg_lifetime_bitcast4) |
| 114 %vararg_ptr5 = getelementptr <{ i32*, i32**, i32* }>* %vararg_buffer3, i32 0,
i32 0 | 114 %vararg_ptr5 = getelementptr <{ i32*, i32**, i32* }>, <{ i32*, i32**, i32* }>*
%vararg_buffer3, i32 0, i32 0 |
| 115 store i32* %9, i32** %vararg_ptr5, align 4 | 115 store i32* %9, i32** %vararg_ptr5, align 4 |
| 116 %vararg_ptr6 = getelementptr <{ i32*, i32**, i32* }>* %vararg_buffer3, i32 0,
i32 1 | 116 %vararg_ptr6 = getelementptr <{ i32*, i32**, i32* }>, <{ i32*, i32**, i32* }>*
%vararg_buffer3, i32 0, i32 1 |
| 117 store i32** %l_1565.i, i32*** %vararg_ptr6, align 4 | 117 store i32** %l_1565.i, i32*** %vararg_ptr6, align 4 |
| 118 %vararg_ptr7 = getelementptr <{ i32*, i32**, i32* }>* %vararg_buffer3, i32 0,
i32 2 | 118 %vararg_ptr7 = getelementptr <{ i32*, i32**, i32* }>, <{ i32*, i32**, i32* }>*
%vararg_buffer3, i32 0, i32 2 |
| 119 store i32* bitcast ([4 x i8]* @g_784 to i32*), i32** %vararg_ptr7, align 4 | 119 store i32* bitcast ([4 x i8]* @g_784 to i32*), i32** %vararg_ptr7, align 4 |
| 120 %call1.i = call i32 bitcast (i32 (i8*, i8*)* @printf to i32 (i8*, <{ i32*, i32
**, i32* }>*)*)(i8* getelementptr inbounds ([25 x i8]* @.str1, i32 0, i32 0), <{
i32*, i32**, i32* }>* %vararg_buffer3) | 120 %call1.i = call i32 bitcast (i32 (i8*, i8*)* @printf to i32 (i8*, <{ i32*, i32
**, i32* }>*)*)(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str1, i32 0,
i32 0), <{ i32*, i32**, i32* }>* %vararg_buffer3) |
| 121 call void @llvm.lifetime.end(i64 12, i8* %vararg_lifetime_bitcast4) | 121 call void @llvm.lifetime.end(i64 12, i8* %vararg_lifetime_bitcast4) |
| 122 %10 = load i32** %l_1565.i, align 4 | 122 %10 = load i32*, i32** %l_1565.i, align 4 |
| 123 %cmp.i = icmp eq i32* %10, bitcast ([4 x i8]* @g_784 to i32*) | 123 %cmp.i = icmp eq i32* %10, bitcast ([4 x i8]* @g_784 to i32*) |
| 124 br i1 %cmp.i, label %_Z6func_6v.exit, label %lor.rhs.i | 124 br i1 %cmp.i, label %_Z6func_6v.exit, label %lor.rhs.i |
| 125 | 125 |
| 126 lor.rhs.i: ; preds = %_Z7func_34v.exit.i | 126 lor.rhs.i: ; preds = %_Z7func_34v.exit.i |
| 127 call void @__assert_fail(i8* getelementptr inbounds ([15 x i8]* @.str2, i32 0,
i32 0), i8* getelementptr inbounds ([8 x i8]* @.str3, i32 0, i32 0), i32 33, i8
* getelementptr inbounds ([7 x i8]* @__func__._Z6func_6v, i32 0, i32 0)) #1 | 127 call void @__assert_fail(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.s
tr2, i32 0, i32 0), i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str3, i32
0, i32 0), i32 33, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @__func__._Z6
func_6v, i32 0, i32 0)) #1 |
| 128 unreachable | 128 unreachable |
| 129 | 129 |
| 130 _Z6func_6v.exit: ; preds = %_Z7func_34v.exit.i | 130 _Z6func_6v.exit: ; preds = %_Z7func_34v.exit.i |
| 131 call void @llvm.lifetime.end(i64 4, i8* %6) | 131 call void @llvm.lifetime.end(i64 4, i8* %6) |
| 132 ret void | 132 ret void |
| 133 } | 133 } |
| 134 | 134 |
| 135 ; Function Attrs: nounwind | 135 ; Function Attrs: nounwind |
| 136 declare void @llvm.lifetime.start(i64, i8* nocapture) #0 | 136 declare void @llvm.lifetime.start(i64, i8* nocapture) #0 |
| 137 | 137 |
| 138 ; Function Attrs: nounwind | 138 ; Function Attrs: nounwind |
| 139 declare void @llvm.lifetime.end(i64, i8* nocapture) #0 | 139 declare void @llvm.lifetime.end(i64, i8* nocapture) #0 |
| 140 | 140 |
| 141 attributes #0 = { nounwind } | 141 attributes #0 = { nounwind } |
| 142 attributes #1 = { noreturn } | 142 attributes #1 = { noreturn } |
| OLD | NEW |