brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.5 KiB · ead6e02 Raw
237 lines · plain
1; REQUIRES: asserts2; RUN: opt < %s -passes='sroa<preserve-cfg>' -disable-output -debug-only=sroa 2>&1 | FileCheck %s3; RUN: opt < %s -passes='sroa<modify-cfg>' -disable-output -debug-only=sroa 2>&1 | FileCheck %s4 5target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n8:16:32:64"6 7; CHECK-NOT: Tree structured merge rewrite8define i32 @test_alloca_not_fixed_vector() {9entry:10  %alloca = alloca [4 x float]11 12  %ptr0 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 013  store float 1.0, ptr %ptr014 15  %ptr1 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 116  store float 2.0, ptr %ptr117 18  %result = load i32, ptr %alloca19  ret i32 %result20}21 22define <4 x float> @test_more_than_one_load(<2 x float> %a, <2 x float> %b) {23entry:24  %alloca = alloca [4 x float]25 26  %ptr0 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 027  store <2 x float> %a, ptr %ptr028 29  %ptr1 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 230  store <2 x float> %b, ptr %ptr131 32  %result1 = load <4 x float>, ptr %alloca33  %result2 = load <4 x float>, ptr %alloca34 35  %final = fadd <4 x float> %result1, %result236  ret <4 x float> %final37}38 39define void @test_no_load(<4 x float> %a) {40entry:41  %alloca = alloca [4 x float]42  store <4 x float> %a, ptr %alloca43  ret void44}45 46define i32 @test_load_not_fixed_vector(<2 x float> %a, <2 x float> %b) {47entry:48  %alloca = alloca [4 x float]49 50  %ptr0 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 051  store <2 x float> %a, ptr %ptr052 53  %ptr1 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 254  store <2 x float> %b, ptr %ptr155 56  %result = load i32, ptr %alloca57  ret i32 %result58}59 60define <3 x float> @test_load_not_covering_alloca(<2 x float> %a, <2 x float> %b) {61entry:62  %alloca = alloca [4 x float]63 64  %ptr0 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 065  store <2 x float> %a, ptr %ptr066 67  %ptr1 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 268  store <2 x float> %b, ptr %ptr169 70  %result = load <3 x float>, ptr %ptr071  ret <3 x float> %result72}73 74define <4 x float> @test_store_not_fixed_vector(<vscale x 2 x float> %a) {75entry:76  %alloca = alloca [4 x float]77 78  %ptr0 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 079  %fixed = extractelement <vscale x 2 x float> %a, i32 080  store float %fixed, ptr %ptr081 82  %result = load <4 x float>, ptr %alloca83  ret <4 x float> %result84}85 86 87define <4 x float> @test_no_stores() {88entry:89  %alloca = alloca [4 x float]90 91  %result = load <4 x float>, ptr %alloca92  ret <4 x float> %result93}94 95define <4 x float> @test_stores_overlapping(<2 x float> %a, <2 x float> %b, <2 x float> %c) {96entry:97  %alloca = alloca [4 x float]98 99  %ptr0 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 0100  store <2 x float> %a, ptr %ptr0101 102  %ptr1 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 1103  store <2 x float> %b, ptr %ptr1104 105  %ptr2 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 2106  store <2 x float> %c, ptr %ptr2107 108  %result = load <4 x float>, ptr %alloca109  ret <4 x float> %result110}111 112define <4 x float> @test_stores_not_covering_alloca(<2 x float> %a) {113entry:114  %alloca = alloca [4 x float]115 116  %ptr0 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 0117  store <2 x float> %a, ptr %ptr0118 119  %result = load <4 x float>, ptr %alloca120  ret <4 x float> %result121}122 123define <4 x float> @test_stores_not_same_basic_block(<2 x float> %a, <2 x float> %b, i1 %cond) {124entry:125  %alloca = alloca [4 x float]126 127  %ptr0 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 0128  store <2 x float> %a, ptr %ptr0129 130  br i1 %cond, label %then, label %else131 132then:133  %ptr1 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 2134  store <2 x float> %b, ptr %ptr1135  br label %merge136 137else:138  br label %merge139 140merge:141  %result = load <4 x float>, ptr %alloca142  ret <4 x float> %result143}144 145define <4 x float> @test_load_before_stores(<2 x float> %a, <2 x float> %b) {146entry:147  %alloca = alloca [4 x float]148 149  %ptr0 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 0150  store <2 x float> %a, ptr %ptr0151 152  %intermediate = load <4 x float>, ptr %alloca153 154  %ptr1 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 2155  store <2 x float> %b, ptr %ptr1156 157  ret <4 x float> %intermediate158}159 160define <4 x float> @test_other_instructions(<2 x float> %a, <2 x float> %b) {161entry:162  %alloca = alloca [4 x float]163  164  ; Store first vector165  %ptr0 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 0166  store <2 x float> %a, ptr %ptr0167  168  ; Other instruction (memset) that's not a simple load/store169  call void @llvm.memset.p0.i64(ptr %alloca, i8 0, i64 8, i1 false)170  171  ; Store second vector172  %ptr1 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 2173  store <2 x float> %b, ptr %ptr1174  175  %result = load <4 x float>, ptr %alloca176  ret <4 x float> %result177}178 179define <4 x float> @volatile_stores(<2 x i32> %a, <2 x i32> %b) {180entry:181  %alloca = alloca [4 x float]182 183  %ptr0 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 0184  store volatile <2 x i32> %a, ptr %ptr0185 186  %ptr1 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 2187  store volatile <2 x i32> %b, ptr %ptr1188 189  %result = load <4 x float>, ptr %alloca190  ret <4 x float> %result191}192 193define <4 x float> @volatile_loads(<2 x i32> %a, <2 x i32> %b) {194entry:195  %alloca = alloca [4 x float]196 197  %ptr0 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 0198  store <2 x i32> %a, ptr %ptr0199 200  %ptr1 = getelementptr inbounds [4 x float], ptr %alloca, i32 0, i32 2201  store <2 x i32> %b, ptr %ptr1202 203  %result = load volatile <4 x float>, ptr %alloca204  ret <4 x float> %result205}206 207define <4 x i15> @non_byte_aligned_alloca(<2 x i15> %a, <2 x i15> %b) {208entry:209  %alloca = alloca [4 x i15]210 211  %ptr0 = getelementptr inbounds [4 x i15], ptr %alloca, i32 0, i32 0212  store <2 x i15> %a, ptr %ptr0213 214  %ptr1 = getelementptr inbounds [4 x i15], ptr %alloca, i32 0, i32 2215  store <2 x i15> %b, ptr %ptr1216 217  %result = load <4 x i15>, ptr %alloca218  ret <4 x i15> %result219 220}221 222define <1 x i32> @test_store_value_size_not_multiple_of_allocated_element_type_size(<1 x i16> %a, <1 x i16> %b) {223entry:224  %alloca = alloca [2 x i16]225 226  %ptr0 = getelementptr inbounds [2 x i16], ptr %alloca, i32 0, i32 0227  store <1 x i16> %a, ptr %ptr0228 229  %ptr1 = getelementptr inbounds [2 x i16], ptr %alloca, i32 0, i32 1230  store <1 x i16> %b, ptr %ptr1231 232  %result = load <1 x i32>, ptr %alloca233  ret <1 x i32> %result234}235 236declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg)237