[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / X86 / pr49466.ll
blobdc8a3bba271cc904e09fcc16d0d03690bc34fd91
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -O2 -codegenprepare -S | FileCheck %s
4 target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
5 target triple = "x86_64-unknown-linux-gnu"
7 @b = dso_local local_unnamed_addr global i64 0, align 8
8 @c = dso_local local_unnamed_addr global i64 0, align 8
9 @d = dso_local local_unnamed_addr global i64 0, align 8
10 @e = dso_local local_unnamed_addr global i64 0, align 8
11 @f = dso_local local_unnamed_addr global i64 0, align 8
12 @g = dso_local local_unnamed_addr global i64 0, align 8
14 define dso_local i32 @m() local_unnamed_addr {
15 ; CHECK-LABEL: @m(
16 ; CHECK-NEXT:  entry:
17 ; CHECK-NEXT:    [[TMP0:%.*]] = load i64, i64* @f, align 8
18 ; CHECK-NEXT:    [[TMP1:%.*]] = load i64, i64* @c, align 8
19 ; CHECK-NEXT:    [[CONV18:%.*]] = trunc i64 [[TMP1]] to i32
20 ; CHECK-NEXT:    [[TMP2:%.*]] = load i64, i64* @d, align 8
21 ; CHECK-NEXT:    [[CONV43:%.*]] = trunc i64 [[TMP2]] to i8
22 ; CHECK-NEXT:    br label [[FOR_COND:%.*]]
23 ; CHECK:       for.cond:
24 ; CHECK-NEXT:    [[J_0:%.*]] = phi i32 [ undef, [[ENTRY:%.*]] ], [ [[J_1_LCSSA:%.*]], [[FOR_COND39_PREHEADER:%.*]] ]
25 ; CHECK-NEXT:    [[P_0:%.*]] = phi i64 [ undef, [[ENTRY]] ], [ [[P_1_LCSSA:%.*]], [[FOR_COND39_PREHEADER]] ]
26 ; CHECK-NEXT:    [[I_0:%.*]] = phi i32 [ undef, [[ENTRY]] ], [ [[I_1_LCSSA:%.*]], [[FOR_COND39_PREHEADER]] ]
27 ; CHECK-NEXT:    [[CMP73:%.*]] = icmp slt i32 [[I_0]], 3
28 ; CHECK-NEXT:    br i1 [[CMP73]], label [[FOR_BODY:%.*]], label [[FOR_COND39_PREHEADER]]
29 ; CHECK:       for.cond1.loopexit:
30 ; CHECK-NEXT:    [[TMP3:%.*]] = icmp slt i32 [[CONV18]], 3
31 ; CHECK-NEXT:    br i1 [[TMP3]], label [[FOR_BODY]], label [[FOR_COND39_PREHEADER]]
32 ; CHECK:       for.cond39.preheader:
33 ; CHECK-NEXT:    [[J_1_LCSSA]] = phi i32 [ [[J_0]], [[FOR_COND]] ], [ [[CONV18]], [[FOR_COND1_LOOPEXIT:%.*]] ]
34 ; CHECK-NEXT:    [[P_1_LCSSA]] = phi i64 [ [[P_0]], [[FOR_COND]] ], [ 0, [[FOR_COND1_LOOPEXIT]] ]
35 ; CHECK-NEXT:    [[I_1_LCSSA]] = phi i32 [ [[I_0]], [[FOR_COND]] ], [ [[CONV18]], [[FOR_COND1_LOOPEXIT]] ]
36 ; CHECK-NEXT:    [[TMP4:%.*]] = icmp eq i8 [[CONV43]], 0
37 ; CHECK-NEXT:    br i1 [[TMP4]], label [[FOR_COND]], label [[FOR_INC42:%.*]]
38 ; CHECK:       for.body:
39 ; CHECK-NEXT:    [[L_176:%.*]] = phi i8 [ [[SUB:%.*]], [[FOR_COND1_LOOPEXIT]] ], [ 0, [[FOR_COND]] ]
40 ; CHECK-NEXT:    [[P_175:%.*]] = phi i64 [ 0, [[FOR_COND1_LOOPEXIT]] ], [ [[P_0]], [[FOR_COND]] ]
41 ; CHECK-NEXT:    [[J_174:%.*]] = phi i32 [ [[CONV18]], [[FOR_COND1_LOOPEXIT]] ], [ [[J_0]], [[FOR_COND]] ]
42 ; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[J_174]], 0
43 ; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[CLEANUP45:%.*]], label [[FOR_COND2_PREHEADER:%.*]]
44 ; CHECK:       for.cond2.preheader:
45 ; CHECK-NEXT:    [[DOTPR_PRE:%.*]] = load i64, i64* @e, align 8
46 ; CHECK-NEXT:    switch i64 [[P_175]], label [[FOR_BODY4_PREHEADER6:%.*]] [
47 ; CHECK-NEXT:    i64 -1, label [[FOR_END12:%.*]]
48 ; CHECK-NEXT:    i64 -2, label [[FOR_END12]]
49 ; CHECK-NEXT:    i64 -3, label [[FOR_END12]]
50 ; CHECK-NEXT:    i64 -4, label [[FOR_END12]]
51 ; CHECK-NEXT:    i64 -5, label [[FOR_END12]]
52 ; CHECK-NEXT:    i64 -6, label [[FOR_END12]]
53 ; CHECK-NEXT:    i64 -7, label [[FOR_END12]]
54 ; CHECK-NEXT:    i64 0, label [[FOR_END12]]
55 ; CHECK-NEXT:    ]
56 ; CHECK:       for.body4.preheader6:
57 ; CHECK-NEXT:    [[TMP5:%.*]] = sub i64 0, [[P_175]]
58 ; CHECK-NEXT:    [[XTRAITER:%.*]] = and i64 [[TMP5]], 7
59 ; CHECK-NEXT:    [[TMP6:%.*]] = add i64 [[P_175]], [[XTRAITER]]
60 ; CHECK-NEXT:    br label [[FOR_BODY4:%.*]]
61 ; CHECK:       for.body4:
62 ; CHECK-NEXT:    [[P_270:%.*]] = phi i64 [ [[INC11_7:%.*]], [[FOR_BODY4]] ], [ [[TMP6]], [[FOR_BODY4_PREHEADER6]] ]
63 ; CHECK-NEXT:    [[INC11_7]] = add i64 [[P_270]], 8
64 ; CHECK-NEXT:    [[TOBOOL3_NOT_7:%.*]] = icmp eq i64 [[INC11_7]], 0
65 ; CHECK-NEXT:    br i1 [[TOBOOL3_NOT_7]], label [[FOR_END12]], label [[FOR_BODY4]]
66 ; CHECK:       for.end12:
67 ; CHECK-NEXT:    [[TMP7:%.*]] = inttoptr i64 [[TMP0]] to i32*
68 ; CHECK-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
69 ; CHECK-NEXT:    [[CONV23:%.*]] = zext i32 [[TMP8]] to i64
70 ; CHECK-NEXT:    [[TMP9:%.*]] = load i64, i64* @b, align 8
71 ; CHECK-NEXT:    [[DIV24:%.*]] = udiv i64 [[TMP9]], [[CONV23]]
72 ; CHECK-NEXT:    store i64 [[DIV24]], i64* @b, align 8
73 ; CHECK-NEXT:    [[SUB]] = add i8 [[L_176]], -1
74 ; CHECK-NEXT:    [[TOBOOL32_NOT72:%.*]] = icmp eq i64 [[DOTPR_PRE]], 0
75 ; CHECK-NEXT:    br i1 [[TOBOOL32_NOT72]], label [[FOR_COND1_LOOPEXIT]], label [[FOR_INC34_PREHEADER:%.*]]
76 ; CHECK:       for.inc34.preheader:
77 ; CHECK-NEXT:    store i64 0, i64* @e, align 8
78 ; CHECK-NEXT:    br label [[FOR_COND1_LOOPEXIT]]
79 ; CHECK:       for.inc42:
80 ; CHECK-NEXT:    br label [[FOR_INC42]]
81 ; CHECK:       cleanup45:
82 ; CHECK-NEXT:    [[CMP13:%.*]] = icmp ne i8 [[L_176]], 0
83 ; CHECK-NEXT:    [[CONV16:%.*]] = zext i1 [[CMP13]] to i32
84 ; CHECK-NEXT:    ret i32 [[CONV16]]
86 entry:
87   %0 = load i64, i64* @f, align 8
88   %1 = inttoptr i64 %0 to i32*
89   %2 = load i64, i64* @c, align 8
90   %conv18 = trunc i64 %2 to i32
91   %cmp = icmp slt i32 %conv18, 3
92   %3 = load i64, i64* @d, align 8
93   %conv43 = trunc i64 %3 to i8
94   %tobool40.not = icmp eq i8 %conv43, 0
95   br label %for.cond
97 for.cond:                                         ; preds = %for.cond39.preheader, %entry
98   %j.0 = phi i32 [ undef, %entry ], [ %j.1.lcssa, %for.cond39.preheader ]
99   %p.0 = phi i64 [ undef, %entry ], [ %p.1.lcssa, %for.cond39.preheader ]
100   %i.0 = phi i32 [ undef, %entry ], [ %i.1.lcssa, %for.cond39.preheader ]
101   %cmp73 = icmp slt i32 %i.0, 3
102   br i1 %cmp73, label %for.body.preheader, label %for.cond39.preheader
104 for.body.preheader:                               ; preds = %for.cond
105   br label %for.body
107 for.cond1.loopexit:                               ; preds = %for.inc34.preheader, %for.end12
108   br i1 %cmp, label %for.body, label %for.cond39.preheader.loopexit
110 for.cond39.preheader.loopexit:                    ; preds = %for.cond1.loopexit
111   br label %for.cond39.preheader
113 for.cond39.preheader:                             ; preds = %for.cond39.preheader.loopexit, %for.cond
114   %j.1.lcssa = phi i32 [ %j.0, %for.cond ], [ %conv18, %for.cond39.preheader.loopexit ]
115   %p.1.lcssa = phi i64 [ %p.0, %for.cond ], [ 0, %for.cond39.preheader.loopexit ]
116   %i.1.lcssa = phi i32 [ %i.0, %for.cond ], [ %conv18, %for.cond39.preheader.loopexit ]
117   br i1 %tobool40.not, label %for.cond, label %for.inc42.preheader
119 for.inc42.preheader:                              ; preds = %for.cond39.preheader
120   br label %for.inc42
122 for.body:                                         ; preds = %for.body.preheader, %for.cond1.loopexit
123   %l.176 = phi i8 [ %sub, %for.cond1.loopexit ], [ 0, %for.body.preheader ]
124   %p.175 = phi i64 [ 0, %for.cond1.loopexit ], [ %p.0, %for.body.preheader ]
125   %j.174 = phi i32 [ %conv18, %for.cond1.loopexit ], [ %j.0, %for.body.preheader ]
126   %tobool.not = icmp eq i32 %j.174, 0
127   br i1 %tobool.not, label %cleanup45, label %for.cond2.preheader
129 for.cond2.preheader:                              ; preds = %for.body
130   %tobool3.not69 = icmp eq i64 %p.175, 0
131   %.pr.pre = load i64, i64* @e, align 8
132   br i1 %tobool3.not69, label %for.end12, label %for.body4.preheader
134 for.body4.preheader:                              ; preds = %for.cond2.preheader
135   %4 = sub i64 0, %p.175
136   %xtraiter = and i64 %4, 7
137   %lcmp.mod.not = icmp eq i64 %xtraiter, 0
138   br i1 %lcmp.mod.not, label %for.body4.prol.loopexit, label %for.body4.prol.preheader
140 for.body4.prol.preheader:                         ; preds = %for.body4.preheader
141   %5 = mul nsw i64 %xtraiter, -1
142   br label %for.body4.prol
144 for.body4.prol:                                   ; preds = %for.body4.prol.preheader, %for.body4.prol
145   %lsr.iv = phi i64 [ 0, %for.body4.prol.preheader ], [ %lsr.iv.next, %for.body4.prol ]
146   %lsr.iv.next = add nsw i64 %lsr.iv, -1
147   %prol.iter.cmp.not = icmp eq i64 %5, %lsr.iv.next
148   br i1 %prol.iter.cmp.not, label %for.body4.prol.loopexit.loopexit, label %for.body4.prol
150 for.body4.prol.loopexit.loopexit:                 ; preds = %for.body4.prol
151   %6 = sub i64 %p.175, %lsr.iv.next
152   br label %for.body4.prol.loopexit
154 for.body4.prol.loopexit:                          ; preds = %for.body4.prol.loopexit.loopexit, %for.body4.preheader
155   %p.270.unr = phi i64 [ %p.175, %for.body4.preheader ], [ %6, %for.body4.prol.loopexit.loopexit ]
156   %7 = icmp ugt i64 %p.175, -8
157   br i1 %7, label %for.end12, label %for.body4.preheader89
159 for.body4.preheader89:                            ; preds = %for.body4.prol.loopexit
160   br label %for.body4
162 for.body4:                                        ; preds = %for.body4.preheader89, %for.body4
163   %p.270 = phi i64 [ %inc11.7, %for.body4 ], [ %p.270.unr, %for.body4.preheader89 ]
164   %inc11.7 = add i64 %p.270, 8
165   %tobool3.not.7 = icmp eq i64 %inc11.7, 0
166   br i1 %tobool3.not.7, label %for.end12.loopexit, label %for.body4
168 for.end12.loopexit:                               ; preds = %for.body4
169   br label %for.end12
171 for.end12:                                        ; preds = %for.end12.loopexit, %for.body4.prol.loopexit, %for.cond2.preheader
172   %8 = load i32, i32* %1, align 4
173   %conv23 = zext i32 %8 to i64
174   %9 = load i64, i64* @b, align 8
175   %div24 = udiv i64 %9, %conv23
176   store i64 %div24, i64* @b, align 8
177   %sub = add i8 %l.176, -1
178   %tobool32.not72 = icmp eq i64 %.pr.pre, 0
179   br i1 %tobool32.not72, label %for.cond1.loopexit, label %for.inc34.preheader
181 for.inc34.preheader:                              ; preds = %for.end12
182   store i64 0, i64* @e, align 8
183   br label %for.cond1.loopexit
185 for.inc42:                                        ; preds = %for.inc42.preheader, %for.inc42
186   br label %for.inc42
188 cleanup45:                                        ; preds = %for.body
189   %cmp13 = icmp ne i8 %l.176, 0
190   %conv16 = zext i1 %cmp13 to i32
191   ret i32 %conv16