138 lines · plain
1; RUN: opt -S -mtriple=amdgcn--amdhsa -passes=load-store-vectorizer < %s | FileCheck %s2; RUN: opt -S -mtriple=amdgcn--amdhsa -passes='function(load-store-vectorizer)' < %s | FileCheck %s3 4; Check that vectorizer can find a GEP through bitcast5; CHECK-LABEL: @vect_zext_bitcast_f32_to_i32_idx6; CHECK: load <4 x i32>7define void @vect_zext_bitcast_f32_to_i32_idx(ptr addrspace(1) %arg1, i32 %base) {8 %add1 = add nuw i32 %base, 09 %zext1 = zext i32 %add1 to i6410 %gep1 = getelementptr inbounds float, ptr addrspace(1) %arg1, i64 %zext111 %load1 = load i32, ptr addrspace(1) %gep1, align 412 %add2 = add nuw i32 %base, 113 %zext2 = zext i32 %add2 to i6414 %gep2 = getelementptr inbounds float, ptr addrspace(1) %arg1, i64 %zext215 %load2 = load i32, ptr addrspace(1) %gep2, align 416 %add3 = add nuw i32 %base, 217 %zext3 = zext i32 %add3 to i6418 %gep3 = getelementptr inbounds float, ptr addrspace(1) %arg1, i64 %zext319 %load3 = load i32, ptr addrspace(1) %gep3, align 420 %add4 = add nuw i32 %base, 321 %zext4 = zext i32 %add4 to i6422 %gep4 = getelementptr inbounds float, ptr addrspace(1) %arg1, i64 %zext423 %load4 = load i32, ptr addrspace(1) %gep4, align 424 ret void25}26 27; CHECK-LABEL: @vect_zext_bitcast_i8_st1_to_i32_idx28; CHECK: load i3229; CHECK: load i3230; CHECK: load i3231; CHECK: load i3232define void @vect_zext_bitcast_i8_st1_to_i32_idx(ptr addrspace(1) %arg1, i32 %base) {33 %add1 = add nuw i32 %base, 034 %zext1 = zext i32 %add1 to i6435 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %arg1, i64 %zext136 %load1 = load i32, ptr addrspace(1) %gep1, align 437 %add2 = add nuw i32 %base, 138 %zext2 = zext i32 %add2 to i6439 %gep2 = getelementptr inbounds i8,ptr addrspace(1) %arg1, i64 %zext240 %load2 = load i32, ptr addrspace(1) %gep2, align 441 %add3 = add nuw i32 %base, 242 %zext3 = zext i32 %add3 to i6443 %gep3 = getelementptr inbounds i8, ptr addrspace(1) %arg1, i64 %zext344 %load3 = load i32, ptr addrspace(1) %gep3, align 445 %add4 = add nuw i32 %base, 346 %zext4 = zext i32 %add4 to i6447 %gep4 = getelementptr inbounds i8, ptr addrspace(1) %arg1, i64 %zext448 %load4 = load i32, ptr addrspace(1) %gep4, align 449 ret void50}51 52; CHECK-LABEL: @vect_zext_bitcast_i8_st4_to_i32_idx53; CHECK: load <4 x i32>54define void @vect_zext_bitcast_i8_st4_to_i32_idx(ptr addrspace(1) %arg1, i32 %base) {55 %add1 = add nuw i32 %base, 056 %zext1 = zext i32 %add1 to i6457 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %arg1, i64 %zext158 %load1 = load i32, ptr addrspace(1) %gep1, align 459 %add2 = add nuw i32 %base, 460 %zext2 = zext i32 %add2 to i6461 %gep2 = getelementptr inbounds i8,ptr addrspace(1) %arg1, i64 %zext262 %load2 = load i32, ptr addrspace(1) %gep2, align 463 %add3 = add nuw i32 %base, 864 %zext3 = zext i32 %add3 to i6465 %gep3 = getelementptr inbounds i8, ptr addrspace(1) %arg1, i64 %zext366 %load3 = load i32, ptr addrspace(1) %gep3, align 467 %add4 = add nuw i32 %base, 1268 %zext4 = zext i32 %add4 to i6469 %gep4 = getelementptr inbounds i8, ptr addrspace(1) %arg1, i64 %zext470 %load4 = load i32, ptr addrspace(1) %gep4, align 471 ret void72}73 74; CHECK-LABEL: @vect_zext_bitcast_negative_ptr_delta75; CHECK: load <2 x i32>76define void @vect_zext_bitcast_negative_ptr_delta(ptr addrspace(1) %p, i32 %base) {77 %a.offset = add nuw i32 %base, 478 %t.offset.zexted = zext i32 %base to i6479 %a.offset.zexted = zext i32 %a.offset to i6480 %t.ptr = getelementptr inbounds i16, ptr addrspace(1) %p, i64 %t.offset.zexted81 %a.ptr = getelementptr inbounds i16, ptr addrspace(1) %p, i64 %a.offset.zexted82 %b.ptr = getelementptr inbounds i16, ptr addrspace(1) %t.ptr, i64 683 %a.val = load i32, ptr addrspace(1) %a.ptr84 %b.val = load i32, ptr addrspace(1) %b.ptr85 ret void86}87 88; Check i1 corner case89; CHECK-LABEL: @zexted_i1_gep_index90; CHECK: load i3291; CHECK: load i3292define void @zexted_i1_gep_index(ptr addrspace(1) %p, i32 %val) {93 %selector = icmp eq i32 %val, 094 %flipped = xor i1 %selector, 195 %index.0 = zext i1 %selector to i6496 %index.1 = zext i1 %flipped to i6497 %gep.0 = getelementptr inbounds i32, ptr addrspace(1) %p, i64 %index.098 %gep.1 = getelementptr inbounds i32, ptr addrspace(1) %p, i64 %index.199 %val0 = load i32, ptr addrspace(1) %gep.0100 %val1 = load i32, ptr addrspace(1) %gep.1101 ret void102}103 104; Check i1 corner case105; CHECK-LABEL: @sexted_i1_gep_index106; CHECK: load i32107; CHECK: load i32108define void @sexted_i1_gep_index(ptr addrspace(1) %p, i32 %val) {109 %selector = icmp eq i32 %val, 0110 %flipped = xor i1 %selector, 1111 %index.0 = sext i1 %selector to i64112 %index.1 = sext i1 %flipped to i64113 %gep.0 = getelementptr inbounds i32, ptr addrspace(1) %p, i64 %index.0114 %gep.1 = getelementptr inbounds i32, ptr addrspace(1) %p, i64 %index.1115 %val0 = load i32, ptr addrspace(1) %gep.0116 %val1 = load i32, ptr addrspace(1) %gep.1117 ret void118}119 120; CHECK-LABEL: @zexted_i1_gep_index_different_bbs121; CHECK: load i32122; CHECK: load i32123define void @zexted_i1_gep_index_different_bbs(ptr addrspace(1) %p, i32 %val) {124entry:125 %selector = icmp eq i32 %val, 0126 %flipped = xor i1 %selector, 1127 %index.0 = zext i1 %selector to i64128 %index.1 = zext i1 %flipped to i64129 %gep.0 = getelementptr inbounds i32, ptr addrspace(1) %p, i64 %index.0130 br label %next131 132next:133 %gep.1 = getelementptr inbounds i32, ptr addrspace(1) %p, i64 %index.1134 %val0 = load i32, ptr addrspace(1) %gep.0135 %val1 = load i32, ptr addrspace(1) %gep.1136 ret void137}138