[ARM] More MVE compare vector splat combines for ANDs
[llvm-complete.git] / test / CodeGen / ARM / lsr-undef-in-binop.ll
blob564328d999982ca4af6877a4297e255275d8cec2
1 ; REQUIRES: arm-registered-target
2 ; RUN: opt -S -loop-reduce %s -o - | FileCheck %s
4 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5 target triple = "armv8-unknown-hurd-eabihf"
7 %"class.std::__1::vector.182" = type { %"class.std::__1::__vector_base.183" }
8 %"class.std::__1::__vector_base.183" = type { i8*, i8*, %"class.std::__1::__compressed_pair.184" }
9 %"class.std::__1::__compressed_pair.184" = type { %"struct.std::__1::__compressed_pair_elem.185" }
10 %"struct.std::__1::__compressed_pair_elem.185" = type { i8* }
11 %"class.std::__1::__vector_base_common" = type { i8 }
13 $vector_insert = comdat any
15 declare i8* @Allocate(i32) local_unnamed_addr
16 declare void @Free(i8*) local_unnamed_addr
17 declare void @_ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv(%"class.std::__1::__vector_base_common"*) local_unnamed_addr
18 declare i8* @memmove(i8*, i8*, i32) local_unnamed_addr
20 ; Function Attrs: noimplicitfloat nounwind uwtable
21 define linkonce_odr i32 @vector_insert(%"class.std::__1::vector.182"*, [1 x i32], i8*, i8*) local_unnamed_addr #1 comdat align 2 {
22 ; CHECK-LABEL: vector_insert
23   %5 = extractvalue [1 x i32] %1, 0
24   %6 = getelementptr inbounds %"class.std::__1::vector.182", %"class.std::__1::vector.182"* %0, i32 0, i32 0, i32 0
25   %7 = load i8*, i8** %6, align 4
26 ; CHECK: [[LOAD:%[0-9]+]] = load i8*, i8**
27   %8 = bitcast %"class.std::__1::vector.182"* %0 to i32*
28   %9 = ptrtoint i8* %7 to i32
29 ; CHECK: [[NEW_CAST:%[0-9]+]] = ptrtoint i8* [[LOAD]] to i32
30 ; CHECK: [[OLD_CAST:%[0-9]+]] = ptrtoint i8* [[LOAD]] to i32
31   %10 = sub i32 %5, %9
32   %11 = getelementptr inbounds i8, i8* %7, i32 %10
33   %12 = ptrtoint i8* %3 to i32
34   %13 = ptrtoint i8* %2 to i32
35   %14 = sub i32 %12, %13
36   %15 = icmp sgt i32 %14, 0
37   br i1 %15, label %18, label %16
39 ; <label>:16:                                     ; preds = %4
40   %17 = ptrtoint i8* %11 to i32
41   br label %148
43 ; <label>:18:                                     ; preds = %4
44   %19 = getelementptr inbounds %"class.std::__1::vector.182", %"class.std::__1::vector.182"* %0, i32 0, i32 0, i32 2, i32 0, i32 0
45   %20 = bitcast i8** %19 to i32*
46   %21 = load i32, i32* %20, align 4
47   %22 = getelementptr inbounds %"class.std::__1::vector.182", %"class.std::__1::vector.182"* %0, i32 0, i32 0, i32 1
48   %23 = load i8*, i8** %22, align 4
49   %24 = ptrtoint i8* %23 to i32
50   %25 = sub i32 %21, %24
51   %26 = icmp sgt i32 %14, %25
52   %27 = bitcast i8** %22 to i32*
53   br i1 %26, label %77, label %28
55 ; <label>:28:                                     ; preds = %18
56   %29 = ptrtoint i8* %11 to i32
57   %30 = sub i32 %24, %29
58   %31 = icmp sgt i32 %14, %30
59   br i1 %31, label %32, label %48
61 ; <label>:32:                                     ; preds = %28
62   %33 = getelementptr inbounds i8, i8* %2, i32 %30
63   %34 = icmp eq i8* %33, %3
64   br i1 %34, label %43, label %35
66 ; <label>:35:                                     ; preds = %32, %35
67   %36 = phi i8* [ %41, %35 ], [ %23, %32 ]
68   %37 = phi i8* [ %39, %35 ], [ %33, %32 ]
69   %38 = load i8, i8* %37, align 1
70   store i8 %38, i8* %36, align 1
71   %39 = getelementptr inbounds i8, i8* %37, i32 1
72   %40 = load i8*, i8** %22, align 4
73   %41 = getelementptr inbounds i8, i8* %40, i32 1
74   store i8* %41, i8** %22, align 4
75   %42 = icmp eq i8* %39, %3
76   br i1 %42, label %43, label %35
78 ; <label>:43:                                     ; preds = %35, %32
79   %44 = phi i8* [ %23, %32 ], [ %41, %35 ]
80   %45 = icmp sgt i32 %30, 0
81   br i1 %45, label %46, label %148
83 ; <label>:46:                                     ; preds = %43
84   %47 = ptrtoint i8* %44 to i32
85   br label %48
87 ; <label>:48:                                     ; preds = %46, %28
88   %49 = phi i32 [ %47, %46 ], [ %24, %28 ]
89   %50 = phi i8* [ %44, %46 ], [ %23, %28 ]
90   %51 = phi i8* [ %33, %46 ], [ %3, %28 ]
91   %52 = getelementptr inbounds i8, i8* %11, i32 %14
92   %53 = ptrtoint i8* %52 to i32
93   %54 = sub i32 %49, %53
94   %55 = getelementptr inbounds i8, i8* %11, i32 %54
95   %56 = icmp ult i8* %55, %23
96   br i1 %56, label %63, label %57
98 ; <label>:57:                                     ; preds = %63, %48
99   %58 = icmp eq i32 %54, 0
100   br i1 %58, label %71, label %59
102 ; <label>:59:                                     ; preds = %57
103   %60 = sub i32 0, %54
104   %61 = getelementptr inbounds i8, i8* %50, i32 %60
105   %62 = tail call i8* @memmove(i8* %61, i8* %11, i32 %54) #13
106   br label %71
108 ; <label>:63:                                     ; preds = %48, %63
109   %64 = phi i8* [ %69, %63 ], [ %50, %48 ]
110   %65 = phi i8* [ %67, %63 ], [ %55, %48 ]
111   %66 = load i8, i8* %65, align 1
112   store i8 %66, i8* %64, align 1
113   %67 = getelementptr inbounds i8, i8* %65, i32 1
114   %68 = load i8*, i8** %22, align 4
115   %69 = getelementptr inbounds i8, i8* %68, i32 1
116   store i8* %69, i8** %22, align 4
117   %70 = icmp eq i8* %67, %23
118   br i1 %70, label %57, label %63
120 ; <label>:71:                                     ; preds = %57, %59
121   %72 = ptrtoint i8* %51 to i32
122   %73 = sub i32 %72, %13
123   %74 = icmp eq i32 %73, 0
124   br i1 %74, label %148, label %75
126 ; <label>:75:                                     ; preds = %71
127   %76 = tail call i8* @memmove(i8* %11, i8* %2, i32 %73) #13
128   br label %148
130 ; <label>:77:                                     ; preds = %18
131   %78 = sub i32 %24, %9
132   %79 = add i32 %78, %14
133   %80 = icmp slt i32 %79, 0
134   br i1 %80, label %81, label %83
136 ; <label>:81:                                     ; preds = %77
137   %82 = bitcast %"class.std::__1::vector.182"* %0 to %"class.std::__1::__vector_base_common"*
138   tail call void @_ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv(%"class.std::__1::__vector_base_common"* %82) #15
139   unreachable
141 ; <label>:83:                                     ; preds = %77
142   %84 = sub i32 %21, %9
143   %85 = icmp ult i32 %84, 1073741823
144   br i1 %85, label %86, label %91
146 ; <label>:86:                                     ; preds = %83
147   %87 = shl i32 %84, 1
148   %88 = icmp ult i32 %87, %79
149   %89 = select i1 %88, i32 %79, i32 %87
150   %90 = icmp eq i32 %89, 0
151   br i1 %90, label %94, label %91
153 ; <label>:91:                                     ; preds = %83, %86
154   %92 = phi i32 [ %89, %86 ], [ 2147483647, %83 ]
155   %93 = tail call i8* @Allocate(i32 %92) #13
156   br label %94
158 ; <label>:94:                                     ; preds = %86, %91
159   %95 = phi i32 [ %92, %91 ], [ 0, %86 ]
160   %96 = phi i8* [ %93, %91 ], [ null, %86 ]
161   %97 = getelementptr inbounds i8, i8* %96, i32 %10
162   %98 = ptrtoint i8* %97 to i32
163   %99 = getelementptr inbounds i8, i8* %96, i32 %95
164   %100 = ptrtoint i8* %99 to i32
165   %101 = icmp eq i8* %2, %3
166   br i1 %101, label %111, label %102
168 ; <label>:102:                                    ; preds = %94, %102
169   %103 = phi i8* [ %106, %102 ], [ %97, %94 ]
170   %104 = phi i8* [ %107, %102 ], [ %2, %94 ]
171   %105 = load i8, i8* %104, align 1
172   store i8 %105, i8* %103, align 1
173   %106 = getelementptr inbounds i8, i8* %103, i32 1
174   %107 = getelementptr inbounds i8, i8* %104, i32 1
175   %108 = icmp eq i8* %107, %3
176   br i1 %108, label %109, label %102
178 ; <label>:109:                                    ; preds = %102
179   %110 = ptrtoint i8* %106 to i32
180   br label %111
182 ; <label>:111:                                    ; preds = %109, %94
183   %112 = phi i32 [ %98, %94 ], [ %110, %109 ]
184   %113 = load i8*, i8** %6, align 4
185   %114 = icmp eq i8* %113, %11
186   br i1 %114, label %124, label %115
188 ; CHECK-LABEL: .preheader:
189 ; CHECK-NEXT: sub i32 [[OLD_CAST]], [[NEW_CAST]]
190 ; <label>:115:                                    ; preds = %111, %115
191   %116 = phi i8* [ %118, %115 ], [ %97, %111 ]
192   %117 = phi i8* [ %119, %115 ], [ %11, %111 ]
193   %118 = getelementptr inbounds i8, i8* %116, i32 -1
194   %119 = getelementptr inbounds i8, i8* %117, i32 -1
195   %120 = load i8, i8* %119, align 1
196   store i8 %120, i8* %118, align 1
197   %121 = icmp eq i8* %119, %113
198   br i1 %121, label %122, label %115
200 ; <label>:122:                                    ; preds = %115
201   %123 = ptrtoint i8* %118 to i32
202   br label %124
204 ; <label>:124:                                    ; preds = %122, %111
205   %125 = phi i32 [ %98, %111 ], [ %123, %122 ]
206   %126 = phi i8* [ %97, %111 ], [ %118, %122 ]
207   %127 = load i8*, i8** %22, align 4
208   %128 = icmp eq i8* %127, %11
209   br i1 %128, label %129, label %131
211 ; <label>:129:                                    ; preds = %124
212   %130 = ptrtoint i8* %126 to i32
213   br label %142
215 ; <label>:131:                                    ; preds = %124
216   %132 = inttoptr i32 %112 to i8*
217   br label %133
219 ; <label>:133:                                    ; preds = %133, %131
220   %134 = phi i8* [ %138, %133 ], [ %132, %131 ]
221   %135 = phi i8* [ %137, %133 ], [ %11, %131 ]
222   %136 = load i8, i8* %135, align 1
223   store i8 %136, i8* %134, align 1
224   %137 = getelementptr inbounds i8, i8* %135, i32 1
225   %138 = getelementptr inbounds i8, i8* %134, i32 1
226   %139 = icmp eq i8* %137, %127
227   br i1 %139, label %140, label %133
229 ; <label>:140:                                    ; preds = %133
230   %141 = ptrtoint i8* %138 to i32
231   br label %142
233 ; <label>:142:                                    ; preds = %140, %129
234   %143 = phi i32 [ %112, %129 ], [ %141, %140 ]
235   %144 = phi i32 [ %130, %129 ], [ %125, %140 ]
236   %145 = load i8*, i8** %6, align 4
237   store i32 %144, i32* %8, align 4
238   store i32 %143, i32* %27, align 4
239   store i32 %100, i32* %20, align 4
240   %146 = icmp eq i8* %145, null
241   br i1 %146, label %148, label %147
243 ; <label>:147:                                    ; preds = %142
244   tail call void @Free(i8* nonnull %145) #13
245   br label %148
247 ; <label>:148:                                    ; preds = %16, %147, %142, %43, %71, %75
248   %149 = phi i32 [ %17, %16 ], [ %98, %147 ], [ %98, %142 ], [ %29, %43 ], [ %29, %71 ], [ %29, %75 ]
249   ret i32 %149