xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/2009-08-06-branchfolder-crash.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -O3
2*9880d681SAndroid Build Coastguard Worker; PR4626
3*9880d681SAndroid Build Coastguard Worker; ModuleID = '<stdin>'
4*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32"
5*9880d681SAndroid Build Coastguard Workertarget triple = "i386-pc-linux-gnu"
6*9880d681SAndroid Build Coastguard Worker@g_3 = common global i8 0, align 1		; <i8*> [#uses=2]
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerdefine signext i8 @safe_mul_func_int16_t_s_s(i32 %_si1, i8 signext %_si2) nounwind readnone {
9*9880d681SAndroid Build Coastguard Workerentry:
10*9880d681SAndroid Build Coastguard Worker	%tobool = icmp eq i32 %_si1, 0		; <i1> [#uses=1]
11*9880d681SAndroid Build Coastguard Worker	%cmp = icmp sgt i8 %_si2, 0		; <i1> [#uses=2]
12*9880d681SAndroid Build Coastguard Worker	%or.cond = or i1 %cmp, %tobool		; <i1> [#uses=1]
13*9880d681SAndroid Build Coastguard Worker	br i1 %or.cond, label %lor.rhs, label %land.lhs.true3
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerland.lhs.true3:		; preds = %entry
16*9880d681SAndroid Build Coastguard Worker	%conv5 = sext i8 %_si2 to i32		; <i32> [#uses=1]
17*9880d681SAndroid Build Coastguard Worker	%cmp7 = icmp slt i32 %conv5, %_si1		; <i1> [#uses=1]
18*9880d681SAndroid Build Coastguard Worker	br i1 %cmp7, label %cond.end, label %lor.rhs
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerlor.rhs:		; preds = %land.lhs.true3, %entry
21*9880d681SAndroid Build Coastguard Worker	%cmp10.not = icmp slt i32 %_si1, 1		; <i1> [#uses=1]
22*9880d681SAndroid Build Coastguard Worker	%or.cond23 = and i1 %cmp, %cmp10.not		; <i1> [#uses=1]
23*9880d681SAndroid Build Coastguard Worker	br i1 %or.cond23, label %lor.end, label %cond.false
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerlor.end:		; preds = %lor.rhs
26*9880d681SAndroid Build Coastguard Worker	%tobool19 = icmp ne i8 %_si2, 0		; <i1> [#uses=2]
27*9880d681SAndroid Build Coastguard Worker	%lor.ext = zext i1 %tobool19 to i32		; <i32> [#uses=1]
28*9880d681SAndroid Build Coastguard Worker	br i1 %tobool19, label %cond.end, label %cond.false
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workercond.false:		; preds = %lor.end, %lor.rhs
31*9880d681SAndroid Build Coastguard Worker	%conv21 = sext i8 %_si2 to i32		; <i32> [#uses=1]
32*9880d681SAndroid Build Coastguard Worker	br label %cond.end
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workercond.end:		; preds = %cond.false, %lor.end, %land.lhs.true3
35*9880d681SAndroid Build Coastguard Worker	%cond = phi i32 [ %conv21, %cond.false ], [ 1, %land.lhs.true3 ], [ %lor.ext, %lor.end ]		; <i32> [#uses=1]
36*9880d681SAndroid Build Coastguard Worker	%conv22 = trunc i32 %cond to i8		; <i8> [#uses=1]
37*9880d681SAndroid Build Coastguard Worker	ret i8 %conv22
38*9880d681SAndroid Build Coastguard Worker}
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Workerdefine i32 @func_34(i8 signext %p_35) nounwind readonly {
41*9880d681SAndroid Build Coastguard Workerentry:
42*9880d681SAndroid Build Coastguard Worker	%tobool = icmp eq i8 %p_35, 0		; <i1> [#uses=1]
43*9880d681SAndroid Build Coastguard Worker	br i1 %tobool, label %lor.lhs.false, label %if.then
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerlor.lhs.false:		; preds = %entry
46*9880d681SAndroid Build Coastguard Worker	%tmp1 = load i8, i8* @g_3		; <i8> [#uses=1]
47*9880d681SAndroid Build Coastguard Worker	%tobool3 = icmp eq i8 %tmp1, 0		; <i1> [#uses=1]
48*9880d681SAndroid Build Coastguard Worker	br i1 %tobool3, label %return, label %if.then
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerif.then:		; preds = %lor.lhs.false, %entry
51*9880d681SAndroid Build Coastguard Worker	%tmp4 = load i8, i8* @g_3		; <i8> [#uses=1]
52*9880d681SAndroid Build Coastguard Worker	%conv5 = sext i8 %tmp4 to i32		; <i32> [#uses=1]
53*9880d681SAndroid Build Coastguard Worker	ret i32 %conv5
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Workerreturn:		; preds = %lor.lhs.false
56*9880d681SAndroid Build Coastguard Worker	ret i32 0
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerdefine void @foo(i32 %p_5) noreturn nounwind {
60*9880d681SAndroid Build Coastguard Workerentry:
61*9880d681SAndroid Build Coastguard Worker	%cmp = icmp sgt i32 %p_5, 0		; <i1> [#uses=2]
62*9880d681SAndroid Build Coastguard Worker	%call = tail call i32 @safe() nounwind		; <i32> [#uses=1]
63*9880d681SAndroid Build Coastguard Worker	%conv1 = trunc i32 %call to i8		; <i8> [#uses=3]
64*9880d681SAndroid Build Coastguard Worker	%tobool.i = xor i1 %cmp, true		; <i1> [#uses=3]
65*9880d681SAndroid Build Coastguard Worker	%cmp.i = icmp sgt i8 %conv1, 0		; <i1> [#uses=3]
66*9880d681SAndroid Build Coastguard Worker	%or.cond.i = or i1 %cmp.i, %tobool.i		; <i1> [#uses=1]
67*9880d681SAndroid Build Coastguard Worker	br i1 %or.cond.i, label %lor.rhs.i, label %land.lhs.true3.i
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Workerland.lhs.true3.i:		; preds = %entry
70*9880d681SAndroid Build Coastguard Worker	%xor = zext i1 %cmp to i32		; <i32> [#uses=1]
71*9880d681SAndroid Build Coastguard Worker	%conv5.i = sext i8 %conv1 to i32		; <i32> [#uses=1]
72*9880d681SAndroid Build Coastguard Worker	%cmp7.i = icmp slt i32 %conv5.i, %xor		; <i1> [#uses=1]
73*9880d681SAndroid Build Coastguard Worker	%cmp7.i.not = xor i1 %cmp7.i, true		; <i1> [#uses=1]
74*9880d681SAndroid Build Coastguard Worker	%or.cond23.i = and i1 %cmp.i, %tobool.i		; <i1> [#uses=1]
75*9880d681SAndroid Build Coastguard Worker	%or.cond = and i1 %cmp7.i.not, %or.cond23.i		; <i1> [#uses=1]
76*9880d681SAndroid Build Coastguard Worker	br i1 %or.cond, label %lor.end.i, label %for.inc
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerlor.rhs.i:		; preds = %entry
79*9880d681SAndroid Build Coastguard Worker	%or.cond23.i.old = and i1 %cmp.i, %tobool.i		; <i1> [#uses=1]
80*9880d681SAndroid Build Coastguard Worker	br i1 %or.cond23.i.old, label %lor.end.i, label %for.inc
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Workerlor.end.i:		; preds = %lor.rhs.i, %land.lhs.true3.i
83*9880d681SAndroid Build Coastguard Worker	%tobool19.i = icmp eq i8 %conv1, 0		; <i1> [#uses=0]
84*9880d681SAndroid Build Coastguard Worker	br label %for.inc
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Workerfor.inc:		; preds = %for.inc, %lor.end.i, %lor.rhs.i, %land.lhs.true3.i
87*9880d681SAndroid Build Coastguard Worker	br label %for.inc
88*9880d681SAndroid Build Coastguard Worker}
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Workerdefine i32 @func_35(i8 signext %p_35) nounwind readonly {
91*9880d681SAndroid Build Coastguard Workerentry:
92*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i8 %p_35, 0                   ; <i1> [#uses=1]
93*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %lor.lhs.false, label %if.then
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerlor.lhs.false:                                    ; preds = %entry
96*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i8, i8* @g_3                           ; <i8> [#uses=1]
97*9880d681SAndroid Build Coastguard Worker  %tobool3 = icmp eq i8 %tmp1, 0                  ; <i1> [#uses=1]
98*9880d681SAndroid Build Coastguard Worker  br i1 %tobool3, label %return, label %if.then
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %lor.lhs.false, %entry
101*9880d681SAndroid Build Coastguard Worker  %tmp4 = load i8, i8* @g_3                           ; <i8> [#uses=1]
102*9880d681SAndroid Build Coastguard Worker  %conv5 = sext i8 %tmp4 to i32                   ; <i32> [#uses=1]
103*9880d681SAndroid Build Coastguard Worker  ret i32 %conv5
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %lor.lhs.false
106*9880d681SAndroid Build Coastguard Worker  ret i32 0
107*9880d681SAndroid Build Coastguard Worker}
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Workerdefine void @bar(i32 %p_5) noreturn nounwind {
110*9880d681SAndroid Build Coastguard Workerentry:
111*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %p_5, 0                     ; <i1> [#uses=2]
112*9880d681SAndroid Build Coastguard Worker  %call = tail call i32 @safe() nounwind          ; <i32> [#uses=1]
113*9880d681SAndroid Build Coastguard Worker  %conv1 = trunc i32 %call to i8                  ; <i8> [#uses=3]
114*9880d681SAndroid Build Coastguard Worker  %tobool.i = xor i1 %cmp, true                   ; <i1> [#uses=3]
115*9880d681SAndroid Build Coastguard Worker  %cmp.i = icmp sgt i8 %conv1, 0                  ; <i1> [#uses=3]
116*9880d681SAndroid Build Coastguard Worker  %or.cond.i = or i1 %cmp.i, %tobool.i            ; <i1> [#uses=1]
117*9880d681SAndroid Build Coastguard Worker  br i1 %or.cond.i, label %lor.rhs.i, label %land.lhs.true3.i
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerland.lhs.true3.i:                                 ; preds = %entry
120*9880d681SAndroid Build Coastguard Worker  %xor = zext i1 %cmp to i32                      ; <i32> [#uses=1]
121*9880d681SAndroid Build Coastguard Worker  %conv5.i = sext i8 %conv1 to i32                ; <i32> [#uses=1]
122*9880d681SAndroid Build Coastguard Worker  %cmp7.i = icmp slt i32 %conv5.i, %xor           ; <i1> [#uses=1]
123*9880d681SAndroid Build Coastguard Worker  %cmp7.i.not = xor i1 %cmp7.i, true              ; <i1> [#uses=1]
124*9880d681SAndroid Build Coastguard Worker  %or.cond23.i = and i1 %cmp.i, %tobool.i         ; <i1> [#uses=1]
125*9880d681SAndroid Build Coastguard Worker  %or.cond = and i1 %cmp7.i.not, %or.cond23.i     ; <i1> [#uses=1]
126*9880d681SAndroid Build Coastguard Worker  br i1 %or.cond, label %lor.end.i, label %for.inc
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Workerlor.rhs.i:                                        ; preds = %entry
129*9880d681SAndroid Build Coastguard Worker  %or.cond23.i.old = and i1 %cmp.i, %tobool.i     ; <i1> [#uses=1]
130*9880d681SAndroid Build Coastguard Worker  br i1 %or.cond23.i.old, label %lor.end.i, label %for.inc
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Workerlor.end.i:                                        ; preds = %lor.rhs.i, %land.lhs.true3.i
133*9880d681SAndroid Build Coastguard Worker  %tobool19.i = icmp eq i8 %conv1, 0              ; <i1> [#uses=0]
134*9880d681SAndroid Build Coastguard Worker  br label %for.inc
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Workerfor.inc:                                          ; preds = %for.inc, %lor.end.i, %lor.rhs.i, %land.lhs.true3.i
137*9880d681SAndroid Build Coastguard Worker  br label %for.inc
138*9880d681SAndroid Build Coastguard Worker}
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Workerdeclare i32 @safe()
141