1dc37f537SNikita Popov; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2d6e7e477SRoman Lebedev; RUN: opt -S < %s -passes=load-store-vectorizer | FileCheck %s 3cee313d2SEric Christopher; RUN: opt -S < %s -passes='function(load-store-vectorizer)' | FileCheck %s 4cee313d2SEric Christopher 5cee313d2SEric Christopherdeclare void @llvm.sideeffect() 6cee313d2SEric Christopher 7cee313d2SEric Christopher; load-store vectorization across a @llvm.sideeffect. 8cee313d2SEric Christopher 9ba1759c4SNikita Popovdefine void @test_sideeffect(ptr %p) { 10dc37f537SNikita Popov; CHECK-LABEL: @test_sideeffect( 11ba1759c4SNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = load <4 x float>, ptr [[P:%.*]], align 16 12dc37f537SNikita Popov; CHECK-NEXT: [[L01:%.*]] = extractelement <4 x float> [[TMP2]], i32 0 13dc37f537SNikita Popov; CHECK-NEXT: [[L12:%.*]] = extractelement <4 x float> [[TMP2]], i32 1 14dc37f537SNikita Popov; CHECK-NEXT: [[L23:%.*]] = extractelement <4 x float> [[TMP2]], i32 2 15dc37f537SNikita Popov; CHECK-NEXT: [[L34:%.*]] = extractelement <4 x float> [[TMP2]], i32 3 16dc37f537SNikita Popov; CHECK-NEXT: call void @llvm.sideeffect() 17dc37f537SNikita Popov; CHECK-NEXT: call void @llvm.sideeffect() 18cf284f6cShyeongyu kim; CHECK-NEXT: [[TMP3:%.*]] = insertelement <4 x float> poison, float [[L01]], i32 0 19dc37f537SNikita Popov; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x float> [[TMP3]], float [[L12]], i32 1 20dc37f537SNikita Popov; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x float> [[TMP4]], float [[L23]], i32 2 21dc37f537SNikita Popov; CHECK-NEXT: [[TMP6:%.*]] = insertelement <4 x float> [[TMP5]], float [[L34]], i32 3 22ba1759c4SNikita Popov; CHECK-NEXT: store <4 x float> [[TMP6]], ptr [[P]], align 16 23dc37f537SNikita Popov; CHECK-NEXT: ret void 24dc37f537SNikita Popov; 25ba1759c4SNikita Popov %p1 = getelementptr float, ptr %p, i64 1 26ba1759c4SNikita Popov %p2 = getelementptr float, ptr %p, i64 2 27ba1759c4SNikita Popov %p3 = getelementptr float, ptr %p, i64 3 28ba1759c4SNikita Popov %l0 = load float, ptr %p, align 16 29ba1759c4SNikita Popov %l1 = load float, ptr %p1 30ba1759c4SNikita Popov %l2 = load float, ptr %p2 31cee313d2SEric Christopher call void @llvm.sideeffect() 32ba1759c4SNikita Popov %l3 = load float, ptr %p3 33ba1759c4SNikita Popov store float %l0, ptr %p, align 16 34cee313d2SEric Christopher call void @llvm.sideeffect() 35ba1759c4SNikita Popov store float %l1, ptr %p1 36ba1759c4SNikita Popov store float %l2, ptr %p2 37ba1759c4SNikita Popov store float %l3, ptr %p3 38cee313d2SEric Christopher ret void 39cee313d2SEric Christopher} 40dc37f537SNikita Popov 41dc37f537SNikita Popovdeclare void @foo() 42dc37f537SNikita Popov 43ba1759c4SNikita Popovdefine void @test_inaccessiblememonly_nounwind_willreturn(ptr %p) { 44330cb032SNikita Popov; CHECK-LABEL: @test_inaccessiblememonly_nounwind_willreturn( 45ba1759c4SNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = load <4 x float>, ptr [[P:%.*]], align 16 469d720dcbSNikita Popov; CHECK-NEXT: [[L01:%.*]] = extractelement <4 x float> [[TMP2]], i32 0 479d720dcbSNikita Popov; CHECK-NEXT: [[L12:%.*]] = extractelement <4 x float> [[TMP2]], i32 1 489d720dcbSNikita Popov; CHECK-NEXT: [[L23:%.*]] = extractelement <4 x float> [[TMP2]], i32 2 499d720dcbSNikita Popov; CHECK-NEXT: [[L34:%.*]] = extractelement <4 x float> [[TMP2]], i32 3 50dc37f537SNikita Popov; CHECK-NEXT: call void @foo() #[[ATTR1:[0-9]+]] 51dc37f537SNikita Popov; CHECK-NEXT: call void @foo() #[[ATTR1]] 52cf284f6cShyeongyu kim; CHECK-NEXT: [[TMP3:%.*]] = insertelement <4 x float> poison, float [[L01]], i32 0 539d720dcbSNikita Popov; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x float> [[TMP3]], float [[L12]], i32 1 549d720dcbSNikita Popov; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x float> [[TMP4]], float [[L23]], i32 2 559d720dcbSNikita Popov; CHECK-NEXT: [[TMP6:%.*]] = insertelement <4 x float> [[TMP5]], float [[L34]], i32 3 56ba1759c4SNikita Popov; CHECK-NEXT: store <4 x float> [[TMP6]], ptr [[P]], align 16 57dc37f537SNikita Popov; CHECK-NEXT: ret void 58dc37f537SNikita Popov; 59ba1759c4SNikita Popov %p1 = getelementptr float, ptr %p, i64 1 60ba1759c4SNikita Popov %p2 = getelementptr float, ptr %p, i64 2 61ba1759c4SNikita Popov %p3 = getelementptr float, ptr %p, i64 3 62ba1759c4SNikita Popov %l0 = load float, ptr %p, align 16 63ba1759c4SNikita Popov %l1 = load float, ptr %p1 64ba1759c4SNikita Popov %l2 = load float, ptr %p2 65330cb032SNikita Popov call void @foo() inaccessiblememonly nounwind willreturn 66ba1759c4SNikita Popov %l3 = load float, ptr %p3 67ba1759c4SNikita Popov store float %l0, ptr %p, align 16 68330cb032SNikita Popov call void @foo() inaccessiblememonly nounwind willreturn 69ba1759c4SNikita Popov store float %l1, ptr %p1 70ba1759c4SNikita Popov store float %l2, ptr %p2 71ba1759c4SNikita Popov store float %l3, ptr %p3 72330cb032SNikita Popov ret void 73330cb032SNikita Popov} 74330cb032SNikita Popov 75ba1759c4SNikita Popovdefine void @test_inaccessiblememonly_not_willreturn(ptr %p) { 76330cb032SNikita Popov; CHECK-LABEL: @test_inaccessiblememonly_not_willreturn( 77ba1759c4SNikita Popov; CHECK-NEXT: [[P1:%.*]] = getelementptr float, ptr [[P:%.*]], i64 1 78ba1759c4SNikita Popov; CHECK-NEXT: [[P2:%.*]] = getelementptr float, ptr [[P]], i64 2 79ba1759c4SNikita Popov; CHECK-NEXT: [[P3:%.*]] = getelementptr float, ptr [[P]], i64 3 80ba1759c4SNikita Popov; CHECK-NEXT: [[L0:%.*]] = load float, ptr [[P]], align 16 81*2be0abb7SJustin Lebar; CHECK-NEXT: call void @foo() #[[ATTR2:[0-9]+]] 82ba1759c4SNikita Popov; CHECK-NEXT: [[L1:%.*]] = load float, ptr [[P1]], align 4 83ba1759c4SNikita Popov; CHECK-NEXT: [[L2:%.*]] = load float, ptr [[P2]], align 4 84ba1759c4SNikita Popov; CHECK-NEXT: [[L3:%.*]] = load float, ptr [[P3]], align 4 85ba1759c4SNikita Popov; CHECK-NEXT: store float [[L0]], ptr [[P]], align 16 86330cb032SNikita Popov; CHECK-NEXT: call void @foo() #[[ATTR2]] 87ba1759c4SNikita Popov; CHECK-NEXT: store float [[L1]], ptr [[P1]], align 4 88ba1759c4SNikita Popov; CHECK-NEXT: store float [[L2]], ptr [[P2]], align 4 89ba1759c4SNikita Popov; CHECK-NEXT: store float [[L3]], ptr [[P3]], align 4 90330cb032SNikita Popov; CHECK-NEXT: ret void 91330cb032SNikita Popov; 92ba1759c4SNikita Popov %p1 = getelementptr float, ptr %p, i64 1 93ba1759c4SNikita Popov %p2 = getelementptr float, ptr %p, i64 2 94ba1759c4SNikita Popov %p3 = getelementptr float, ptr %p, i64 3 95ba1759c4SNikita Popov %l0 = load float, ptr %p, align 16 96*2be0abb7SJustin Lebar call void @foo() inaccessiblememonly nounwind 97ba1759c4SNikita Popov %l1 = load float, ptr %p1 98ba1759c4SNikita Popov %l2 = load float, ptr %p2 99ba1759c4SNikita Popov %l3 = load float, ptr %p3 100ba1759c4SNikita Popov store float %l0, ptr %p, align 16 101dc37f537SNikita Popov call void @foo() inaccessiblememonly nounwind 102ba1759c4SNikita Popov store float %l1, ptr %p1 103ba1759c4SNikita Popov store float %l2, ptr %p2 104ba1759c4SNikita Popov store float %l3, ptr %p3 105dc37f537SNikita Popov ret void 106dc37f537SNikita Popov} 107330cb032SNikita Popov 108ba1759c4SNikita Popovdefine void @test_inaccessiblememonly_not_nounwind(ptr %p) { 109330cb032SNikita Popov; CHECK-LABEL: @test_inaccessiblememonly_not_nounwind( 110ba1759c4SNikita Popov; CHECK-NEXT: [[P1:%.*]] = getelementptr float, ptr [[P:%.*]], i64 1 111ba1759c4SNikita Popov; CHECK-NEXT: [[P2:%.*]] = getelementptr float, ptr [[P]], i64 2 112ba1759c4SNikita Popov; CHECK-NEXT: [[P3:%.*]] = getelementptr float, ptr [[P]], i64 3 113ba1759c4SNikita Popov; CHECK-NEXT: [[L0:%.*]] = load float, ptr [[P]], align 16 114*2be0abb7SJustin Lebar; CHECK-NEXT: call void @foo() #[[ATTR3:[0-9]+]] 115ba1759c4SNikita Popov; CHECK-NEXT: [[L1:%.*]] = load float, ptr [[P1]], align 4 116ba1759c4SNikita Popov; CHECK-NEXT: [[L2:%.*]] = load float, ptr [[P2]], align 4 117ba1759c4SNikita Popov; CHECK-NEXT: [[L3:%.*]] = load float, ptr [[P3]], align 4 118ba1759c4SNikita Popov; CHECK-NEXT: store float [[L0]], ptr [[P]], align 16 119330cb032SNikita Popov; CHECK-NEXT: call void @foo() #[[ATTR3]] 120ba1759c4SNikita Popov; CHECK-NEXT: store float [[L1]], ptr [[P1]], align 4 121ba1759c4SNikita Popov; CHECK-NEXT: store float [[L2]], ptr [[P2]], align 4 122ba1759c4SNikita Popov; CHECK-NEXT: store float [[L3]], ptr [[P3]], align 4 123330cb032SNikita Popov; CHECK-NEXT: ret void 124330cb032SNikita Popov; 125ba1759c4SNikita Popov %p1 = getelementptr float, ptr %p, i64 1 126ba1759c4SNikita Popov %p2 = getelementptr float, ptr %p, i64 2 127ba1759c4SNikita Popov %p3 = getelementptr float, ptr %p, i64 3 128ba1759c4SNikita Popov %l0 = load float, ptr %p, align 16 129*2be0abb7SJustin Lebar call void @foo() inaccessiblememonly willreturn 130ba1759c4SNikita Popov %l1 = load float, ptr %p1 131ba1759c4SNikita Popov %l2 = load float, ptr %p2 132ba1759c4SNikita Popov %l3 = load float, ptr %p3 133ba1759c4SNikita Popov store float %l0, ptr %p, align 16 134330cb032SNikita Popov call void @foo() inaccessiblememonly willreturn 135ba1759c4SNikita Popov store float %l1, ptr %p1 136ba1759c4SNikita Popov store float %l2, ptr %p2 137ba1759c4SNikita Popov store float %l3, ptr %p3 138330cb032SNikita Popov ret void 139330cb032SNikita Popov} 140