1dc37f537SNikita Popov; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2cee313d2SEric Christopher; RUN: opt -S < %s -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 9dc37f537SNikita Popovdefine void @test_sideeffect(float* %p) { 10dc37f537SNikita Popov; CHECK-LABEL: @test_sideeffect( 11dc37f537SNikita Popov; CHECK-NEXT: [[P0:%.*]] = getelementptr float, float* [[P:%.*]], i64 0 12dc37f537SNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = bitcast float* [[P0]] to <4 x float>* 13dc37f537SNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = load <4 x float>, <4 x float>* [[TMP1]], align 16 14dc37f537SNikita Popov; CHECK-NEXT: [[L01:%.*]] = extractelement <4 x float> [[TMP2]], i32 0 15dc37f537SNikita Popov; CHECK-NEXT: [[L12:%.*]] = extractelement <4 x float> [[TMP2]], i32 1 16dc37f537SNikita Popov; CHECK-NEXT: [[L23:%.*]] = extractelement <4 x float> [[TMP2]], i32 2 17dc37f537SNikita Popov; CHECK-NEXT: [[L34:%.*]] = extractelement <4 x float> [[TMP2]], i32 3 18dc37f537SNikita Popov; CHECK-NEXT: call void @llvm.sideeffect() 19dc37f537SNikita Popov; CHECK-NEXT: call void @llvm.sideeffect() 20cf284f6cShyeongyu kim; CHECK-NEXT: [[TMP3:%.*]] = insertelement <4 x float> poison, float [[L01]], i32 0 21dc37f537SNikita Popov; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x float> [[TMP3]], float [[L12]], i32 1 22dc37f537SNikita Popov; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x float> [[TMP4]], float [[L23]], i32 2 23dc37f537SNikita Popov; CHECK-NEXT: [[TMP6:%.*]] = insertelement <4 x float> [[TMP5]], float [[L34]], i32 3 24dc37f537SNikita Popov; CHECK-NEXT: [[TMP7:%.*]] = bitcast float* [[P0]] to <4 x float>* 25dc37f537SNikita Popov; CHECK-NEXT: store <4 x float> [[TMP6]], <4 x float>* [[TMP7]], align 16 26dc37f537SNikita Popov; CHECK-NEXT: ret void 27dc37f537SNikita Popov; 28cee313d2SEric Christopher %p0 = getelementptr float, float* %p, i64 0 29cee313d2SEric Christopher %p1 = getelementptr float, float* %p, i64 1 30cee313d2SEric Christopher %p2 = getelementptr float, float* %p, i64 2 31cee313d2SEric Christopher %p3 = getelementptr float, float* %p, i64 3 32cee313d2SEric Christopher %l0 = load float, float* %p0, align 16 33cee313d2SEric Christopher %l1 = load float, float* %p1 34cee313d2SEric Christopher %l2 = load float, float* %p2 35cee313d2SEric Christopher call void @llvm.sideeffect() 36cee313d2SEric Christopher %l3 = load float, float* %p3 37cee313d2SEric Christopher store float %l0, float* %p0, align 16 38cee313d2SEric Christopher call void @llvm.sideeffect() 39cee313d2SEric Christopher store float %l1, float* %p1 40cee313d2SEric Christopher store float %l2, float* %p2 41cee313d2SEric Christopher store float %l3, float* %p3 42cee313d2SEric Christopher ret void 43cee313d2SEric Christopher} 44dc37f537SNikita Popov 45dc37f537SNikita Popovdeclare void @foo() 46dc37f537SNikita Popov 47*330cb032SNikita Popovdefine void @test_inaccessiblememonly_nounwind_willreturn(float* %p) { 48*330cb032SNikita Popov; CHECK-LABEL: @test_inaccessiblememonly_nounwind_willreturn( 49dc37f537SNikita Popov; CHECK-NEXT: [[P0:%.*]] = getelementptr float, float* [[P:%.*]], i64 0 509d720dcbSNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = bitcast float* [[P0]] to <4 x float>* 519d720dcbSNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = load <4 x float>, <4 x float>* [[TMP1]], align 16 529d720dcbSNikita Popov; CHECK-NEXT: [[L01:%.*]] = extractelement <4 x float> [[TMP2]], i32 0 539d720dcbSNikita Popov; CHECK-NEXT: [[L12:%.*]] = extractelement <4 x float> [[TMP2]], i32 1 549d720dcbSNikita Popov; CHECK-NEXT: [[L23:%.*]] = extractelement <4 x float> [[TMP2]], i32 2 559d720dcbSNikita Popov; CHECK-NEXT: [[L34:%.*]] = extractelement <4 x float> [[TMP2]], i32 3 56dc37f537SNikita Popov; CHECK-NEXT: call void @foo() #[[ATTR1:[0-9]+]] 57dc37f537SNikita Popov; CHECK-NEXT: call void @foo() #[[ATTR1]] 58cf284f6cShyeongyu kim; CHECK-NEXT: [[TMP3:%.*]] = insertelement <4 x float> poison, float [[L01]], i32 0 599d720dcbSNikita Popov; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x float> [[TMP3]], float [[L12]], i32 1 609d720dcbSNikita Popov; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x float> [[TMP4]], float [[L23]], i32 2 619d720dcbSNikita Popov; CHECK-NEXT: [[TMP6:%.*]] = insertelement <4 x float> [[TMP5]], float [[L34]], i32 3 629d720dcbSNikita Popov; CHECK-NEXT: [[TMP7:%.*]] = bitcast float* [[P0]] to <4 x float>* 639d720dcbSNikita Popov; CHECK-NEXT: store <4 x float> [[TMP6]], <4 x float>* [[TMP7]], align 16 64dc37f537SNikita Popov; CHECK-NEXT: ret void 65dc37f537SNikita Popov; 66dc37f537SNikita Popov %p0 = getelementptr float, float* %p, i64 0 67dc37f537SNikita Popov %p1 = getelementptr float, float* %p, i64 1 68dc37f537SNikita Popov %p2 = getelementptr float, float* %p, i64 2 69dc37f537SNikita Popov %p3 = getelementptr float, float* %p, i64 3 70dc37f537SNikita Popov %l0 = load float, float* %p0, align 16 71dc37f537SNikita Popov %l1 = load float, float* %p1 72dc37f537SNikita Popov %l2 = load float, float* %p2 73*330cb032SNikita Popov call void @foo() inaccessiblememonly nounwind willreturn 74*330cb032SNikita Popov %l3 = load float, float* %p3 75*330cb032SNikita Popov store float %l0, float* %p0, align 16 76*330cb032SNikita Popov call void @foo() inaccessiblememonly nounwind willreturn 77*330cb032SNikita Popov store float %l1, float* %p1 78*330cb032SNikita Popov store float %l2, float* %p2 79*330cb032SNikita Popov store float %l3, float* %p3 80*330cb032SNikita Popov ret void 81*330cb032SNikita Popov} 82*330cb032SNikita Popov 83*330cb032SNikita Popovdefine void @test_inaccessiblememonly_not_willreturn(float* %p) { 84*330cb032SNikita Popov; CHECK-LABEL: @test_inaccessiblememonly_not_willreturn( 85*330cb032SNikita Popov; CHECK-NEXT: [[P0:%.*]] = getelementptr float, float* [[P:%.*]], i64 0 86*330cb032SNikita Popov; CHECK-NEXT: [[P1:%.*]] = getelementptr float, float* [[P]], i64 1 87*330cb032SNikita Popov; CHECK-NEXT: [[P2:%.*]] = getelementptr float, float* [[P]], i64 2 88*330cb032SNikita Popov; CHECK-NEXT: [[P3:%.*]] = getelementptr float, float* [[P]], i64 3 89*330cb032SNikita Popov; CHECK-NEXT: [[L0:%.*]] = load float, float* [[P0]], align 16 90*330cb032SNikita Popov; CHECK-NEXT: [[L1:%.*]] = load float, float* [[P1]], align 4 91*330cb032SNikita Popov; CHECK-NEXT: [[L2:%.*]] = load float, float* [[P2]], align 4 92*330cb032SNikita Popov; CHECK-NEXT: call void @foo() #[[ATTR2:[0-9]+]] 93*330cb032SNikita Popov; CHECK-NEXT: [[L3:%.*]] = load float, float* [[P3]], align 4 94*330cb032SNikita Popov; CHECK-NEXT: store float [[L0]], float* [[P0]], align 16 95*330cb032SNikita Popov; CHECK-NEXT: call void @foo() #[[ATTR2]] 96*330cb032SNikita Popov; CHECK-NEXT: store float [[L1]], float* [[P1]], align 4 97*330cb032SNikita Popov; CHECK-NEXT: store float [[L2]], float* [[P2]], align 4 98*330cb032SNikita Popov; CHECK-NEXT: store float [[L3]], float* [[P3]], align 4 99*330cb032SNikita Popov; CHECK-NEXT: ret void 100*330cb032SNikita Popov; 101*330cb032SNikita Popov %p0 = getelementptr float, float* %p, i64 0 102*330cb032SNikita Popov %p1 = getelementptr float, float* %p, i64 1 103*330cb032SNikita Popov %p2 = getelementptr float, float* %p, i64 2 104*330cb032SNikita Popov %p3 = getelementptr float, float* %p, i64 3 105*330cb032SNikita Popov %l0 = load float, float* %p0, align 16 106*330cb032SNikita Popov %l1 = load float, float* %p1 107*330cb032SNikita Popov %l2 = load float, float* %p2 108dc37f537SNikita Popov call void @foo() inaccessiblememonly nounwind 109dc37f537SNikita Popov %l3 = load float, float* %p3 110dc37f537SNikita Popov store float %l0, float* %p0, align 16 111dc37f537SNikita Popov call void @foo() inaccessiblememonly nounwind 112dc37f537SNikita Popov store float %l1, float* %p1 113dc37f537SNikita Popov store float %l2, float* %p2 114dc37f537SNikita Popov store float %l3, float* %p3 115dc37f537SNikita Popov ret void 116dc37f537SNikita Popov} 117*330cb032SNikita Popov 118*330cb032SNikita Popovdefine void @test_inaccessiblememonly_not_nounwind(float* %p) { 119*330cb032SNikita Popov; CHECK-LABEL: @test_inaccessiblememonly_not_nounwind( 120*330cb032SNikita Popov; CHECK-NEXT: [[P0:%.*]] = getelementptr float, float* [[P:%.*]], i64 0 121*330cb032SNikita Popov; CHECK-NEXT: [[P1:%.*]] = getelementptr float, float* [[P]], i64 1 122*330cb032SNikita Popov; CHECK-NEXT: [[P2:%.*]] = getelementptr float, float* [[P]], i64 2 123*330cb032SNikita Popov; CHECK-NEXT: [[P3:%.*]] = getelementptr float, float* [[P]], i64 3 124*330cb032SNikita Popov; CHECK-NEXT: [[L0:%.*]] = load float, float* [[P0]], align 16 125*330cb032SNikita Popov; CHECK-NEXT: [[L1:%.*]] = load float, float* [[P1]], align 4 126*330cb032SNikita Popov; CHECK-NEXT: [[L2:%.*]] = load float, float* [[P2]], align 4 127*330cb032SNikita Popov; CHECK-NEXT: call void @foo() #[[ATTR3:[0-9]+]] 128*330cb032SNikita Popov; CHECK-NEXT: [[L3:%.*]] = load float, float* [[P3]], align 4 129*330cb032SNikita Popov; CHECK-NEXT: store float [[L0]], float* [[P0]], align 16 130*330cb032SNikita Popov; CHECK-NEXT: call void @foo() #[[ATTR3]] 131*330cb032SNikita Popov; CHECK-NEXT: store float [[L1]], float* [[P1]], align 4 132*330cb032SNikita Popov; CHECK-NEXT: store float [[L2]], float* [[P2]], align 4 133*330cb032SNikita Popov; CHECK-NEXT: store float [[L3]], float* [[P3]], align 4 134*330cb032SNikita Popov; CHECK-NEXT: ret void 135*330cb032SNikita Popov; 136*330cb032SNikita Popov %p0 = getelementptr float, float* %p, i64 0 137*330cb032SNikita Popov %p1 = getelementptr float, float* %p, i64 1 138*330cb032SNikita Popov %p2 = getelementptr float, float* %p, i64 2 139*330cb032SNikita Popov %p3 = getelementptr float, float* %p, i64 3 140*330cb032SNikita Popov %l0 = load float, float* %p0, align 16 141*330cb032SNikita Popov %l1 = load float, float* %p1 142*330cb032SNikita Popov %l2 = load float, float* %p2 143*330cb032SNikita Popov call void @foo() inaccessiblememonly willreturn 144*330cb032SNikita Popov %l3 = load float, float* %p3 145*330cb032SNikita Popov store float %l0, float* %p0, align 16 146*330cb032SNikita Popov call void @foo() inaccessiblememonly willreturn 147*330cb032SNikita Popov store float %l1, float* %p1 148*330cb032SNikita Popov store float %l2, float* %p2 149*330cb032SNikita Popov store float %l3, float* %p3 150*330cb032SNikita Popov ret void 151*330cb032SNikita Popov} 152