Fix an infinite alternation in JumpThreading where two transforms would repeatedly undo each other. The solution is to perform more aggressive constant folding to make one of the edges just folded away rather than trying to thread it.

Fixes <rdar://problem/9284786>.

Discovered with CSmith.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129538 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Owen Anderson
2011-04-14 21:35:50 +00:00
parent 481823aa81
commit f6832bbda0
2 changed files with 46 additions and 3 deletions

View File

@@ -0,0 +1,31 @@
; RUN: opt -jump-threading < %s
; <rdar://problem/9284786>
%0 = type <{ i64, i16, i64, i8, i8 }>
@g_338 = external global %0, align 8
define void @func_1() nounwind ssp {
entry:
ret void
for.cond1177:
%inc1187 = add nsw i32 0, 1
%cmp1179 = icmp slt i32 %inc1187, 5
br i1 %cmp1179, label %for.cond1177, label %land.rhs1320
land.rhs1320:
%tmp1324 = volatile load i64* getelementptr inbounds (%0* @g_338, i64 0, i32 2), align 1, !tbaa !0
br label %if.end.i
if.end.i:
%tobool.pr.i = phi i1 [ false, %if.end.i ], [ false, %land.rhs1320 ]
br i1 %tobool.pr.i, label %return, label %if.end.i
return:
ret void
}
!0 = metadata !{metadata !"long long", metadata !1}
!1 = metadata !{metadata !"omnipotent char", metadata !2}
!2 = metadata !{metadata !"Simple C/C++ TBAA", null}