1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck %s
8 ; CHECK-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
9 ; CHECK-NEXT: [[I:%.*]] = alloca i32, align 4
10 ; CHECK-NEXT: [[Z:%.*]] = alloca i32, align 4
11 ; CHECK-NEXT: [[Z16:%.*]] = alloca i32, align 4
12 ; CHECK-NEXT: %"alloca point" = bitcast i32 0 to i32
13 ; CHECK-NEXT: store i32 0, i32* [[I]], align 4
14 ; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i8 1, 0
15 ; CHECK-NEXT: br i1 [[TOBOOL]], label [[COND_TRUE:%.*]], label [[COND_FALSE33:%.*]]
17 ; CHECK-NEXT: store i32 0, i32* [[Z]], align 4
18 ; CHECK-NEXT: br label [[BB:%.*]]
20 ; CHECK-NEXT: [[TMP:%.*]] = load i32, i32* [[Z]], align 4
21 ; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[TMP]], 16384
22 ; CHECK-NEXT: store i32 [[TMP1]], i32* [[Z]], align 4
23 ; CHECK-NEXT: [[TMP2:%.*]] = load i32, i32* [[I]], align 4
24 ; CHECK-NEXT: [[TMP3:%.*]] = add i32 [[TMP2]], 1
25 ; CHECK-NEXT: store i32 [[TMP3]], i32* [[I]], align 4
26 ; CHECK-NEXT: [[TMP4:%.*]] = load i32, i32* [[I]], align 4
27 ; CHECK-NEXT: [[TMP5:%.*]] = icmp sgt i32 [[TMP4]], 262144
28 ; CHECK-NEXT: [[TMP56:%.*]] = zext i1 [[TMP5]] to i8
29 ; CHECK-NEXT: [[TOBOOL7:%.*]] = icmp ne i8 [[TMP56]], 0
30 ; CHECK-NEXT: br i1 [[TOBOOL7]], label [[COND_TRUE8:%.*]], label [[COND_NEXT:%.*]]
32 ; CHECK-NEXT: call void @abort()
33 ; CHECK-NEXT: unreachable
35 ; CHECK-NEXT: [[TMP9:%.*]] = load i32, i32* [[Z]], align 4
36 ; CHECK-NEXT: [[TMP10:%.*]] = icmp ne i32 [[TMP9]], 0
37 ; CHECK-NEXT: [[TMP1011:%.*]] = zext i1 [[TMP10]] to i8
38 ; CHECK-NEXT: [[TOBOOL12:%.*]] = icmp ne i8 [[TMP1011]], 0
39 ; CHECK-NEXT: br i1 [[TOBOOL12]], label [[BB]], label [[BB13:%.*]]
41 ; CHECK-NEXT: call void @exit(i32 0)
42 ; CHECK-NEXT: unreachable
43 ; CHECK: cond_false33:
44 ; CHECK-NEXT: call void @exit(i32 0)
45 ; CHECK-NEXT: unreachable
48 %retval = alloca i32, align 4 ; <i32*> [#uses=1]
49 %i = alloca i32, align 4 ; <i32*> [#uses=7]
50 %z = alloca i32, align 4 ; <i32*> [#uses=4]
51 %z16 = alloca i32, align 4 ; <i32*> [#uses=4]
52 %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
54 %toBool = icmp ne i8 1, 0 ; <i1> [#uses=1]
55 br i1 %toBool, label %cond_true, label %cond_false
57 cond_true: ; preds = %entry
61 bb: ; preds = %cond_next, %cond_true
62 %tmp = load i32, i32* %z ; <i32> [#uses=1]
63 %tmp1 = sub i32 %tmp, 16384 ; <i32> [#uses=1]
64 store i32 %tmp1, i32* %z
65 %tmp2 = load i32, i32* %i ; <i32> [#uses=1]
66 %tmp3 = add i32 %tmp2, 1 ; <i32> [#uses=1]
67 store i32 %tmp3, i32* %i
68 %tmp4 = load i32, i32* %i ; <i32> [#uses=1]
69 %tmp5 = icmp sgt i32 %tmp4, 262144 ; <i1> [#uses=1]
70 %tmp56 = zext i1 %tmp5 to i8 ; <i8> [#uses=1]
71 %toBool7 = icmp ne i8 %tmp56, 0 ; <i1> [#uses=1]
72 br i1 %toBool7, label %cond_true8, label %cond_next
74 cond_true8: ; preds = %bb
78 cond_next: ; preds = %bb
79 %tmp9 = load i32, i32* %z ; <i32> [#uses=1]
80 %tmp10 = icmp ne i32 %tmp9, 0 ; <i1> [#uses=1]
81 %tmp1011 = zext i1 %tmp10 to i8 ; <i8> [#uses=1]
82 %toBool12 = icmp ne i8 %tmp1011, 0 ; <i1> [#uses=1]
83 br i1 %toBool12, label %bb, label %bb13
85 bb13: ; preds = %cond_next
86 call void @exit( i32 0 )
89 cond_false: ; preds = %entry
90 %toBool14 = icmp ne i8 1, 0 ; <i1> [#uses=1]
91 br i1 %toBool14, label %cond_true15, label %cond_false33
93 cond_true15: ; preds = %cond_false
94 store i32 0, i32* %z16
97 bb17: ; preds = %cond_next27, %cond_true15
98 %tmp18 = load i32, i32* %z16 ; <i32> [#uses=1]
99 %tmp19 = sub i32 %tmp18, 16384 ; <i32> [#uses=1]
100 store i32 %tmp19, i32* %z16
101 %tmp20 = load i32, i32* %i ; <i32> [#uses=1]
102 %tmp21 = add i32 %tmp20, 1 ; <i32> [#uses=1]
103 store i32 %tmp21, i32* %i
104 %tmp22 = load i32, i32* %i ; <i32> [#uses=1]
105 %tmp23 = icmp sgt i32 %tmp22, 262144 ; <i1> [#uses=1]
106 %tmp2324 = zext i1 %tmp23 to i8 ; <i8> [#uses=1]
107 %toBool25 = icmp ne i8 %tmp2324, 0 ; <i1> [#uses=1]
108 br i1 %toBool25, label %cond_true26, label %cond_next27
110 cond_true26: ; preds = %bb17
114 cond_next27: ; preds = %bb17
115 %tmp28 = load i32, i32* %z16 ; <i32> [#uses=1]
116 %tmp29 = icmp ne i32 %tmp28, 0 ; <i1> [#uses=1]
117 %tmp2930 = zext i1 %tmp29 to i8 ; <i8> [#uses=1]
118 %toBool31 = icmp ne i8 %tmp2930, 0 ; <i1> [#uses=1]
119 br i1 %toBool31, label %bb17, label %bb32
121 bb32: ; preds = %cond_next27
122 call void @exit( i32 0 )
125 cond_false33: ; preds = %cond_false
126 call void @exit( i32 0 )
129 cond_next34: ; No predecessors!
130 br label %cond_next35
132 cond_next35: ; preds = %cond_next34
135 return: ; preds = %cond_next35
136 %retval36 = load i32, i32* %retval ; <i32> [#uses=1]
140 declare void @abort()
142 declare void @exit(i32)