1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 03:02:36 +01:00
llvm-mirror/test/Transforms/SimplifyCFG/2005-12-03-IncorrectPHIFold.ll
Roman Lebedev 495950222a [NFCI][SimplifyCFG] Mark all the SimplifyCFG tests that already don't invalidate DomTree as such
First step after e1133179587dd895962a2fe4d6eb0cb1e63b5ee2,
in these tests, DomTree is valid afterwards, so mark them as such,
so that they don't regress.

In further steps, SimplifyCFG transforms shall taught to preserve DomTree,
in as small steps as possible.
2020-12-17 01:03:49 +03:00

124 lines
6.2 KiB
LLVM

; Make sure this doesn't turn into an infinite loop
; RUN: opt < %s -simplifycfg -simplifycfg-require-and-preserve-domtree=1 -instsimplify -simplifycfg -simplifycfg-require-and-preserve-domtree=1 | llvm-dis | FileCheck %s
%struct.anon = type { i32, i32, i32, i32, [1024 x i8] }
@_zero_ = external global %struct.anon* ; <%struct.anon**> [#uses=2]
@_one_ = external global %struct.anon* ; <%struct.anon**> [#uses=4]
@str = internal constant [4 x i8] c"%d\0A\00" ; <[4 x i8]*> [#uses=0]
declare i32 @bc_compare(%struct.anon*, %struct.anon*)
declare void @free_num(%struct.anon**)
declare %struct.anon* @copy_num(%struct.anon*)
declare void @init_num(%struct.anon**)
declare %struct.anon* @new_num(i32, i32)
declare void @int2num(%struct.anon**, i32)
declare void @bc_multiply(%struct.anon*, %struct.anon*, %struct.anon**, i32)
declare void @bc_raise(%struct.anon*, %struct.anon*, %struct.anon**, i32)
declare i32 @bc_divide(%struct.anon*, %struct.anon*, %struct.anon**, i32)
declare void @bc_add(%struct.anon*, %struct.anon*, %struct.anon**)
declare i32 @_do_compare(%struct.anon*, %struct.anon*, i32, i32)
declare i32 @printf(i8*, ...)
define i32 @bc_sqrt(%struct.anon** %num, i32 %scale) {
entry:
%guess = alloca %struct.anon* ; <%struct.anon**> [#uses=7]
%guess1 = alloca %struct.anon* ; <%struct.anon**> [#uses=7]
%point5 = alloca %struct.anon* ; <%struct.anon**> [#uses=3]
%tmp = load %struct.anon*, %struct.anon** %num ; <%struct.anon*> [#uses=1]
%tmp1 = load %struct.anon*, %struct.anon** @_zero_ ; <%struct.anon*> [#uses=1]
%tmp.upgrd.1 = call i32 @bc_compare( %struct.anon* %tmp, %struct.anon* %tmp1 ) ; <i32> [#uses=2]
%tmp.upgrd.2 = icmp slt i32 %tmp.upgrd.1, 0 ; <i1> [#uses=1]
br i1 %tmp.upgrd.2, label %cond_true, label %cond_false
cond_true: ; preds = %entry
ret i32 0
cond_false: ; preds = %entry
%tmp5 = icmp eq i32 %tmp.upgrd.1, 0 ; <i1> [#uses=1]
br i1 %tmp5, label %cond_true6, label %cond_next13
cond_true6: ; preds = %cond_false
call void @free_num( %struct.anon** %num )
%tmp8 = load %struct.anon*, %struct.anon** @_zero_ ; <%struct.anon*> [#uses=1]
%tmp9 = call %struct.anon* @copy_num( %struct.anon* %tmp8 ) ; <%struct.anon*> [#uses=1]
store %struct.anon* %tmp9, %struct.anon** %num
ret i32 1
cond_next13: ; preds = %cond_false
%tmp15 = load %struct.anon*, %struct.anon** %num ; <%struct.anon*> [#uses=1]
%tmp16 = load %struct.anon*, %struct.anon** @_one_ ; <%struct.anon*> [#uses=1]
%tmp17 = call i32 @bc_compare( %struct.anon* %tmp15, %struct.anon* %tmp16 ) ; <i32> [#uses=2]
%tmp19 = icmp eq i32 %tmp17, 0 ; <i1> [#uses=1]
br i1 %tmp19, label %cond_true20, label %cond_next27
cond_true20: ; preds = %cond_next13
call void @free_num( %struct.anon** %num )
%tmp22 = load %struct.anon*, %struct.anon** @_one_ ; <%struct.anon*> [#uses=1]
%tmp23 = call %struct.anon* @copy_num( %struct.anon* %tmp22 ) ; <%struct.anon*> [#uses=1]
store %struct.anon* %tmp23, %struct.anon** %num
ret i32 1
cond_next27: ; preds = %cond_next13
%tmp29 = load %struct.anon*, %struct.anon** %num ; <%struct.anon*> [#uses=1]
%tmp30 = getelementptr %struct.anon, %struct.anon* %tmp29, i32 0, i32 2 ; <i32*> [#uses=1]
%tmp31 = load i32, i32* %tmp30 ; <i32> [#uses=2]
%tmp33 = icmp sge i32 %tmp31, %scale ; <i1> [#uses=1]
%max = select i1 %tmp33, i32 %tmp31, i32 %scale ; <i32> [#uses=4]
%tmp35 = add i32 %max, 2 ; <i32> [#uses=0]
call void @init_num( %struct.anon** %guess )
call void @init_num( %struct.anon** %guess1 )
%tmp36 = call %struct.anon* @new_num( i32 1, i32 1 ) ; <%struct.anon*> [#uses=2]
store %struct.anon* %tmp36, %struct.anon** %point5
%tmp.upgrd.3 = getelementptr %struct.anon, %struct.anon* %tmp36, i32 0, i32 4, i32 1 ; <i8*> [#uses=1]
store i8 5, i8* %tmp.upgrd.3
%tmp39 = icmp slt i32 %tmp17, 0 ; <i1> [#uses=1]
br i1 %tmp39, label %cond_true40, label %cond_false43
cond_true40: ; preds = %cond_next27
%tmp41 = load %struct.anon*, %struct.anon** @_one_ ; <%struct.anon*> [#uses=1]
%tmp42 = call %struct.anon* @copy_num( %struct.anon* %tmp41 ) ; <%struct.anon*> [#uses=1]
store %struct.anon* %tmp42, %struct.anon** %guess
br label %bb80.outer
cond_false43: ; preds = %cond_next27
call void @int2num( %struct.anon** %guess, i32 10 )
%tmp45 = load %struct.anon*, %struct.anon** %num ; <%struct.anon*> [#uses=1]
%tmp46 = getelementptr %struct.anon, %struct.anon* %tmp45, i32 0, i32 1 ; <i32*> [#uses=1]
%tmp47 = load i32, i32* %tmp46 ; <i32> [#uses=1]
call void @int2num( %struct.anon** %guess1, i32 %tmp47 )
%tmp48 = load %struct.anon*, %struct.anon** %guess1 ; <%struct.anon*> [#uses=1]
%tmp49 = load %struct.anon*, %struct.anon** %point5 ; <%struct.anon*> [#uses=1]
call void @bc_multiply( %struct.anon* %tmp48, %struct.anon* %tmp49, %struct.anon** %guess1, i32 %max )
%tmp51 = load %struct.anon*, %struct.anon** %guess1 ; <%struct.anon*> [#uses=1]
%tmp52 = getelementptr %struct.anon, %struct.anon* %tmp51, i32 0, i32 2 ; <i32*> [#uses=1]
store i32 0, i32* %tmp52
%tmp53 = load %struct.anon*, %struct.anon** %guess ; <%struct.anon*> [#uses=1]
%tmp54 = load %struct.anon*, %struct.anon** %guess1 ; <%struct.anon*> [#uses=1]
call void @bc_raise( %struct.anon* %tmp53, %struct.anon* %tmp54, %struct.anon** %guess, i32 %max )
br label %bb80.outer
bb80.outer: ; preds = %cond_true83, %cond_false43, %cond_true40
%done.1.ph = phi i32 [ 1, %cond_true83 ], [ 0, %cond_true40 ], [ 0, %cond_false43 ] ; <i32> [#uses=1]
br label %bb80
bb80: ; preds = %cond_true83, %bb80.outer
%tmp82 = icmp eq i32 %done.1.ph, 0 ; <i1> [#uses=1]
br i1 %tmp82, label %cond_true83, label %bb86
cond_true83: ; preds = %bb80
%tmp71 = call i32 @_do_compare( %struct.anon* null, %struct.anon* null, i32 0, i32 1 ) ; <i32> [#uses=1]
%tmp76 = icmp eq i32 %tmp71, 0 ; <i1> [#uses=1]
br i1 %tmp76, label %bb80.outer, label %bb80
; CHECK: bb86
bb86: ; preds = %bb80
call void @free_num( %struct.anon** %num )
%tmp88 = load %struct.anon*, %struct.anon** %guess ; <%struct.anon*> [#uses=1]
%tmp89 = load %struct.anon*, %struct.anon** @_one_ ; <%struct.anon*> [#uses=1]
%tmp92 = call i32 @bc_divide( %struct.anon* %tmp88, %struct.anon* %tmp89, %struct.anon** %num, i32 %max ) ; <i32> [#uses=0]
call void @free_num( %struct.anon** %guess )
call void @free_num( %struct.anon** %guess1 )
call void @free_num( %struct.anon** %point5 )
ret i32 1
}