brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.7 KiB · c2663d8 Raw
325 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4; The result has the fewest vector elements between the result and the two operands so the negation can be moved there5define <2 x double> @test_negation_move_to_result(<6 x double> %a, <3 x double> %b) {6; CHECK-LABEL: @test_negation_move_to_result(7; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x double> @llvm.matrix.multiply.v2f64.v6f64.v3f64(<6 x double> [[A:%.*]], <3 x double> [[B:%.*]], i32 2, i32 3, i32 1)8; CHECK-NEXT:    [[RES:%.*]] = fneg <2 x double> [[TMP1]]9; CHECK-NEXT:    ret <2 x double> [[RES]]10;11  %a.neg = fneg <6 x double> %a12  %res = tail call <2 x double> @llvm.matrix.multiply.v2f64.v6f64.v3f64(<6 x double> %a.neg, <3 x double> %b, i32 2, i32 3, i32 1)13  ret <2 x double> %res14}15 16; The result has the fewest vector elements between the result and the two operands so the negation can be moved there17; Fast flag should be preserved18define <2 x double> @test_negation_move_to_result_with_fastflags(<6 x double> %a, <3 x double> %b) {19; CHECK-LABEL: @test_negation_move_to_result_with_fastflags(20; CHECK-NEXT:    [[TMP1:%.*]] = call fast <2 x double> @llvm.matrix.multiply.v2f64.v6f64.v3f64(<6 x double> [[A:%.*]], <3 x double> [[B:%.*]], i32 2, i32 3, i32 1)21; CHECK-NEXT:    [[RES:%.*]] = fneg fast <2 x double> [[TMP1]]22; CHECK-NEXT:    ret <2 x double> [[RES]]23;24  %a.neg = fneg <6 x double> %a25  %res = tail call fast <2 x double> @llvm.matrix.multiply.v2f64.v6f64.v3f64(<6 x double> %a.neg, <3 x double> %b, i32 2, i32 3, i32 1)26  ret <2 x double> %res27}28 29define <2 x double> @test_negation_move_to_result_with_nnan_flag(<6 x double> %a, <3 x double> %b) {30; CHECK-LABEL: @test_negation_move_to_result_with_nnan_flag(31; CHECK-NEXT:    [[TMP1:%.*]] = call nnan <2 x double> @llvm.matrix.multiply.v2f64.v6f64.v3f64(<6 x double> [[A:%.*]], <3 x double> [[B:%.*]], i32 2, i32 3, i32 1)32; CHECK-NEXT:    [[RES:%.*]] = fneg nnan <2 x double> [[TMP1]]33; CHECK-NEXT:    ret <2 x double> [[RES]]34;35  %a.neg = fneg <6 x double> %a36  %res = tail call nnan <2 x double> @llvm.matrix.multiply.v2f64.v6f64.v3f64(<6 x double> %a.neg, <3 x double> %b, i32 2, i32 3, i32 1)37  ret <2 x double> %res38}39 40define <2 x double> @test_negation_move_to_result_with_nsz_flag(<6 x double> %a, <3 x double> %b) {41; CHECK-LABEL: @test_negation_move_to_result_with_nsz_flag(42; CHECK-NEXT:    [[TMP1:%.*]] = call nsz <2 x double> @llvm.matrix.multiply.v2f64.v6f64.v3f64(<6 x double> [[A:%.*]], <3 x double> [[B:%.*]], i32 2, i32 3, i32 1)43; CHECK-NEXT:    [[RES:%.*]] = fneg nsz <2 x double> [[TMP1]]44; CHECK-NEXT:    ret <2 x double> [[RES]]45;46  %a.neg = fneg <6 x double> %a47  %res = tail call nsz <2 x double> @llvm.matrix.multiply.v2f64.v6f64.v3f64(<6 x double> %a.neg, <3 x double> %b, i32 2, i32 3, i32 1)48  ret <2 x double> %res49}50 51define <2 x double> @test_negation_move_to_result_with_fastflag_on_negation(<6 x double> %a, <3 x double> %b) {52; CHECK-LABEL: @test_negation_move_to_result_with_fastflag_on_negation(53; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x double> @llvm.matrix.multiply.v2f64.v6f64.v3f64(<6 x double> [[A:%.*]], <3 x double> [[B:%.*]], i32 2, i32 3, i32 1)54; CHECK-NEXT:    [[RES:%.*]] = fneg <2 x double> [[TMP1]]55; CHECK-NEXT:    ret <2 x double> [[RES]]56;57  %a.neg = fneg fast<6 x double> %a58  %res = tail call <2 x double> @llvm.matrix.multiply.v2f64.v6f64.v3f64(<6 x double> %a.neg, <3 x double> %b, i32 2, i32 3, i32 1)59  ret <2 x double> %res60}61 62; %b has the fewest vector elements between the result and the two operands so the negation can be moved there63define <9 x double> @test_move_negation_to_second_operand(<27 x double> %a, <3 x double> %b) {64; CHECK-LABEL: @test_move_negation_to_second_operand(65; CHECK-NEXT:    [[TMP1:%.*]] = fneg <3 x double> [[B:%.*]]66; CHECK-NEXT:    [[RES:%.*]] = tail call <9 x double> @llvm.matrix.multiply.v9f64.v27f64.v3f64(<27 x double> [[A:%.*]], <3 x double> [[TMP1]], i32 9, i32 3, i32 1)67; CHECK-NEXT:    ret <9 x double> [[RES]]68;69  %a.neg = fneg <27 x double> %a70  %res = tail call <9 x double> @llvm.matrix.multiply.v9f64.v27f64.v3f64(<27 x double> %a.neg, <3 x double> %b, i32 9, i32 3, i32 1)71  ret <9 x double> %res72}73 74; %b has the fewest vector elements between the result and the two operands so the negation can be moved there75; Fast flag should be preserved76define <9 x double> @test_move_negation_to_second_operand_with_fast_flags(<27 x double> %a, <3 x double> %b) {77; CHECK-LABEL: @test_move_negation_to_second_operand_with_fast_flags(78; CHECK-NEXT:    [[TMP1:%.*]] = fneg <3 x double> [[B:%.*]]79; CHECK-NEXT:    [[RES:%.*]] = tail call fast <9 x double> @llvm.matrix.multiply.v9f64.v27f64.v3f64(<27 x double> [[A:%.*]], <3 x double> [[TMP1]], i32 9, i32 3, i32 1)80; CHECK-NEXT:    ret <9 x double> [[RES]]81;82  %a.neg = fneg <27 x double> %a83  %res = tail call fast <9 x double> @llvm.matrix.multiply.v9f64.v27f64.v3f64(<27 x double> %a.neg, <3 x double> %b, i32 9, i32 3, i32 1)84  ret <9 x double> %res85}86 87; The result has the fewest vector elements between the result and the two operands so the negation can be moved there88define <2 x double> @test_negation_move_to_result_from_second_operand(<3 x double> %a, <6 x double> %b){89; CHECK-LABEL: @test_negation_move_to_result_from_second_operand(90; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x double> @llvm.matrix.multiply.v2f64.v3f64.v6f64(<3 x double> [[A:%.*]], <6 x double> [[B:%.*]], i32 1, i32 3, i32 2)91; CHECK-NEXT:    [[RES:%.*]] = fneg <2 x double> [[TMP1]]92; CHECK-NEXT:    ret <2 x double> [[RES]]93;94  %b.neg = fneg <6 x double> %b95  %res = tail call <2 x double> @llvm.matrix.multiply.v2f64.v3f64.v6f64(<3 x double> %a, <6 x double> %b.neg, i32 1, i32 3, i32 2)96  ret <2 x double> %res97}98 99; %a has the fewest vector elements between the result and the two operands so the negation can be moved there100define <9 x double> @test_move_negation_to_first_operand(<3 x double> %a, <27 x double> %b) {101; CHECK-LABEL: @test_move_negation_to_first_operand(102; CHECK-NEXT:    [[TMP1:%.*]] = fneg <3 x double> [[A:%.*]]103; CHECK-NEXT:    [[RES:%.*]] = tail call <9 x double> @llvm.matrix.multiply.v9f64.v3f64.v27f64(<3 x double> [[TMP1]], <27 x double> [[B:%.*]], i32 1, i32 3, i32 9)104; CHECK-NEXT:    ret <9 x double> [[RES]]105;106  %b.neg = fneg <27 x double> %b107  %res = tail call <9 x double> @llvm.matrix.multiply.v9f64.v3f64.v27f64(<3 x double> %a, <27 x double> %b.neg, i32 1, i32 3, i32 9)108  ret <9 x double> %res109}110 111; %a has the fewest vector elements between the result and the two operands so the negation is not moved112define <15 x double> @test_negation_not_moved(<3 x double> %a, <5 x double> %b) {113; CHECK-LABEL: @test_negation_not_moved(114; CHECK-NEXT:    [[A_NEG:%.*]] = fneg <3 x double> [[A:%.*]]115; CHECK-NEXT:    [[RES:%.*]] = tail call <15 x double> @llvm.matrix.multiply.v15f64.v3f64.v5f64(<3 x double> [[A_NEG]], <5 x double> [[B:%.*]], i32 3, i32 1, i32 5)116; CHECK-NEXT:    ret <15 x double> [[RES]]117;118  %a.neg = fneg <3 x double> %a119  %res = tail call <15 x double> @llvm.matrix.multiply.v15f64.v3f64.v5f64(<3 x double> %a.neg, <5 x double> %b, i32 3, i32 1, i32 5)120  ret <15 x double> %res121}122 123; %b as the fewest vector elements between the result and the two operands so the negation is not moved124define <15 x double> @test_negation_not_moved_second_operand(<5 x double> %a, <3 x double> %b) {125; CHECK-LABEL: @test_negation_not_moved_second_operand(126; CHECK-NEXT:    [[B_NEG:%.*]] = fneg <3 x double> [[B:%.*]]127; CHECK-NEXT:    [[RES:%.*]] = tail call <15 x double> @llvm.matrix.multiply.v15f64.v5f64.v3f64(<5 x double> [[A:%.*]], <3 x double> [[B_NEG]], i32 5, i32 1, i32 3)128; CHECK-NEXT:    ret <15 x double> [[RES]]129;130  %b.neg = fneg <3 x double> %b131  %res = tail call <15 x double> @llvm.matrix.multiply.v15f64.v5f64.v3f64(<5 x double> %a, <3 x double> %b.neg, i32 5, i32 1, i32 3)132  ret <15 x double> %res133}134 135; the negation should be moved from the result to operand %a because it has the smallest vector element count136define <15 x double> @test_negation_on_result(<3 x double> %a, <5 x double> %b) {137; CHECK-LABEL: @test_negation_on_result(138; CHECK-NEXT:    [[RES:%.*]] = tail call <15 x double> @llvm.matrix.multiply.v15f64.v3f64.v5f64(<3 x double> [[A:%.*]], <5 x double> [[B:%.*]], i32 3, i32 1, i32 5)139; CHECK-NEXT:    [[RES_2:%.*]] = fneg <15 x double> [[RES]]140; CHECK-NEXT:    ret <15 x double> [[RES_2]]141;142  %res = tail call <15 x double> @llvm.matrix.multiply.v15f64.v3f64.v5f64(<3 x double> %a, <5 x double> %b, i32 3, i32 1, i32 5)143  %res.2 = fneg <15 x double> %res144  ret <15 x double> %res.2145}146 147; both negations can be deleted148define <2 x double> @test_with_two_operands_negated1(<6 x double> %a, <3 x double> %b){149; CHECK-LABEL: @test_with_two_operands_negated1(150; CHECK-NEXT:    [[RES:%.*]] = tail call <2 x double> @llvm.matrix.multiply.v2f64.v6f64.v3f64(<6 x double> [[A:%.*]], <3 x double> [[B:%.*]], i32 2, i32 3, i32 1)151; CHECK-NEXT:    ret <2 x double> [[RES]]152;153  %a.neg = fneg <6 x double> %a154  %b.neg = fneg <3 x double> %b155  %res = tail call <2 x double> @llvm.matrix.multiply.v2f64.v6f64.v3f64(<6 x double> %a.neg, <3 x double> %b.neg, i32 2, i32 3, i32 1)156  ret <2 x double> %res157}158 159; both negations will be removed160define <9 x double> @test_with_two_operands_negated2(<27 x double> %a, <3 x double> %b){161; CHECK-LABEL: @test_with_two_operands_negated2(162; CHECK-NEXT:    [[RES:%.*]] = tail call <9 x double> @llvm.matrix.multiply.v9f64.v27f64.v3f64(<27 x double> [[A:%.*]], <3 x double> [[B:%.*]], i32 9, i32 3, i32 1)163; CHECK-NEXT:    ret <9 x double> [[RES]]164;165  %a.neg = fneg <27 x double> %a166  %b.neg = fneg <3 x double> %b167  %res = tail call <9 x double> @llvm.matrix.multiply.v9f64.v27f64.v3f64(<27 x double> %a.neg, <3 x double> %b.neg, i32 9, i32 3, i32 1)168  ret <9 x double> %res169}170 171; both negations will be removed172define <9 x double> @test_with_two_operands_negated_with_fastflags(<27 x double> %a, <3 x double> %b){173; CHECK-LABEL: @test_with_two_operands_negated_with_fastflags(174; CHECK-NEXT:    [[RES:%.*]] = tail call fast <9 x double> @llvm.matrix.multiply.v9f64.v27f64.v3f64(<27 x double> [[A:%.*]], <3 x double> [[B:%.*]], i32 9, i32 3, i32 1)175; CHECK-NEXT:    ret <9 x double> [[RES]]176;177  %a.neg = fneg <27 x double> %a178  %b.neg = fneg <3 x double> %b179  %res = tail call fast <9 x double> @llvm.matrix.multiply.v9f64.v27f64.v3f64(<27 x double> %a.neg, <3 x double> %b.neg, i32 9, i32 3, i32 1)180  ret <9 x double> %res181}182 183; both negations should be removed184define <9 x double> @test_with_two_operands_negated2_commute(<3 x double> %a, <27 x double> %b){185; CHECK-LABEL: @test_with_two_operands_negated2_commute(186; CHECK-NEXT:    [[RES:%.*]] = call <9 x double> @llvm.matrix.multiply.v9f64.v3f64.v27f64(<3 x double> [[A:%.*]], <27 x double> [[B:%.*]], i32 1, i32 3, i32 9)187; CHECK-NEXT:    ret <9 x double> [[RES]]188;189  %a.neg = fneg <3 x double> %a190  %b.neg = fneg <27 x double> %b191  %res = call <9 x double> @llvm.matrix.multiply.v9f64.v3f64.v27f64(<3 x double> %a.neg, <27 x double> %b.neg, i32 1, i32 3, i32 9)192  ret <9 x double> %res193}194 195define <4 x double> @matrix_multiply_two_operands_negated_with_same_size(<2 x double> %a, <2 x double> %b) {196; CHECK-LABEL: @matrix_multiply_two_operands_negated_with_same_size(197; CHECK-NEXT:    [[RES:%.*]] = call <4 x double> @llvm.matrix.multiply.v4f64.v2f64.v2f64(<2 x double> [[A:%.*]], <2 x double> [[B:%.*]], i32 2, i32 1, i32 2)198; CHECK-NEXT:    ret <4 x double> [[RES]]199;200  %a.neg = fneg <2 x double> %a201  %b.neg = fneg <2 x double> %b202  %res = call <4 x double> @llvm.matrix.multiply.v4f64.v2f64.v2f64(<2 x double> %a.neg, <2 x double> %b.neg, i32 2, i32 1, i32 2)203  ret <4 x double> %res204}205 206define <2 x double> @matrix_multiply_two_operands_with_multiple_uses(<6 x double> %a, <3 x double> %b) {207; CHECK-LABEL: @matrix_multiply_two_operands_with_multiple_uses(208; CHECK-NEXT:    [[A_NEG:%.*]] = fneg <6 x double> [[A:%.*]]209; CHECK-NEXT:    [[RES:%.*]] = tail call <2 x double> @llvm.matrix.multiply.v2f64.v6f64.v3f64(<6 x double> [[A]], <3 x double> [[B:%.*]], i32 2, i32 3, i32 1)210; CHECK-NEXT:    [[RES_2:%.*]] = shufflevector <6 x double> [[A_NEG]], <6 x double> poison, <2 x i32> <i32 0, i32 1>211; CHECK-NEXT:    [[RES_3:%.*]] = fadd <2 x double> [[RES_2]], [[RES]]212; CHECK-NEXT:    ret <2 x double> [[RES_3]]213;214  %a.neg = fneg <6 x double> %a215  %b.neg = fneg <3 x double> %b216  %res = tail call <2 x double> @llvm.matrix.multiply.v2f64.v6f64.v3f64(<6 x double> %a.neg, <3 x double> %b.neg, i32 2, i32 3, i32 1)217  %res.2 = shufflevector <6 x double> %a.neg, <6 x double> undef,218  <2 x i32>  <i32 0, i32 1>219  %res.3 = fadd <2 x double> %res.2, %res220  ret <2 x double> %res.3221}222 223define <9 x double> @matrix_multiply_two_operands_with_multiple_uses2(<27 x double> %a, <3 x double> %b, ptr %a_loc, ptr %b_loc){224; CHECK-LABEL: @matrix_multiply_two_operands_with_multiple_uses2(225; CHECK-NEXT:    [[A_NEG:%.*]] = fneg <27 x double> [[A:%.*]]226; CHECK-NEXT:    [[B_NEG:%.*]] = fneg <3 x double> [[B:%.*]]227; CHECK-NEXT:    [[RES:%.*]] = tail call <9 x double> @llvm.matrix.multiply.v9f64.v27f64.v3f64(<27 x double> [[A]], <3 x double> [[B]], i32 9, i32 3, i32 1)228; CHECK-NEXT:    store <27 x double> [[A_NEG]], ptr [[A_LOC:%.*]], align 256229; CHECK-NEXT:    store <3 x double> [[B_NEG]], ptr [[B_LOC:%.*]], align 32230; CHECK-NEXT:    ret <9 x double> [[RES]]231;232  %a.neg = fneg <27 x double> %a233  %b.neg = fneg <3 x double> %b234  %res = tail call <9 x double> @llvm.matrix.multiply.v9f64.v27f64.v3f64(<27 x double> %a.neg, <3 x double> %b.neg, i32 9, i32 3, i32 1)235  store <27 x double> %a.neg, ptr %a_loc236  store <3 x double> %b.neg, ptr %b_loc237  ret <9 x double> %res238}239 240define <12 x double> @fneg_with_multiple_uses(<15 x double> %a, <20 x double> %b){241; CHECK-LABEL: @fneg_with_multiple_uses(242; CHECK-NEXT:    [[A_NEG:%.*]] = fneg <15 x double> [[A:%.*]]243; CHECK-NEXT:    [[RES:%.*]] = tail call <12 x double> @llvm.matrix.multiply.v12f64.v15f64.v20f64(<15 x double> [[A_NEG]], <20 x double> [[B:%.*]], i32 3, i32 5, i32 4)244; CHECK-NEXT:    [[RES_2:%.*]] = shufflevector <15 x double> [[A_NEG]], <15 x double> poison, <12 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11>245; CHECK-NEXT:    [[RES_3:%.*]] = fadd <12 x double> [[RES_2]], [[RES]]246; CHECK-NEXT:    ret <12 x double> [[RES_3]]247;248  %a.neg = fneg <15 x double> %a249  %res = tail call <12 x double> @llvm.matrix.multiply.v12f64.v15f64.v20f64(<15 x double> %a.neg, <20 x double> %b, i32 3, i32 5, i32 4)250  %res.2 = shufflevector <15 x double> %a.neg, <15 x double> undef,251  <12 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11>252  %res.3 = fadd <12 x double> %res.2, %res253  ret <12 x double> %res.3254}255 256define <12 x double> @fneg_with_multiple_uses_2(<15 x double> %a, <20 x double> %b, ptr %a_loc){257; CHECK-LABEL: @fneg_with_multiple_uses_2(258; CHECK-NEXT:    [[A_NEG:%.*]] = fneg <15 x double> [[A:%.*]]259; CHECK-NEXT:    [[RES:%.*]] = tail call <12 x double> @llvm.matrix.multiply.v12f64.v15f64.v20f64(<15 x double> [[A_NEG]], <20 x double> [[B:%.*]], i32 3, i32 5, i32 4)260; CHECK-NEXT:    store <15 x double> [[A_NEG]], ptr [[A_LOC:%.*]], align 128261; CHECK-NEXT:    ret <12 x double> [[RES]]262;263  %a.neg = fneg <15 x double> %a264  %res = tail call <12 x double> @llvm.matrix.multiply.v12f64.v15f64.v20f64(<15 x double> %a.neg, <20 x double> %b, i32 3, i32 5, i32 4)265  store <15 x double> %a.neg, ptr %a_loc266  ret <12 x double> %res267}268; negation should be moved to the second operand given it has the smallest operand count269define <72 x double> @chain_of_matrix_multiplies(<27 x double> %a, <3 x double> %b, <8 x double> %c) {270; CHECK-LABEL: @chain_of_matrix_multiplies(271; CHECK-NEXT:    [[TMP1:%.*]] = fneg <3 x double> [[B:%.*]]272; CHECK-NEXT:    [[RES:%.*]] = tail call <9 x double> @llvm.matrix.multiply.v9f64.v27f64.v3f64(<27 x double> [[A:%.*]], <3 x double> [[TMP1]], i32 9, i32 3, i32 1)273; CHECK-NEXT:    [[RES_2:%.*]] = tail call <72 x double> @llvm.matrix.multiply.v72f64.v9f64.v8f64(<9 x double> [[RES]], <8 x double> [[C:%.*]], i32 9, i32 1, i32 8)274; CHECK-NEXT:    ret <72 x double> [[RES_2]]275;276  %a.neg = fneg <27 x double> %a277  %res = tail call <9 x double> @llvm.matrix.multiply.v9f64.v27f64.v3f64(<27 x double> %a.neg, <3 x double> %b, i32 9, i32 3, i32 1)278  %res.2 = tail call <72 x double> @llvm.matrix.multiply.v72f64.v9f64.v8f64(<9 x double> %res, <8 x double> %c, i32 9, i32 1, i32 8)279  ret <72 x double> %res.2280}281 282; first negation should be moved to %a283; second negation should be moved to the result of the second multipication284define <6 x double> @chain_of_matrix_multiplies_with_two_negations(<3 x double> %a, <5 x double> %b, <10 x double> %c) {285; CHECK-LABEL: @chain_of_matrix_multiplies_with_two_negations(286; CHECK-NEXT:    [[TMP1:%.*]] = fneg <3 x double> [[A:%.*]]287; CHECK-NEXT:    [[RES:%.*]] = tail call <15 x double> @llvm.matrix.multiply.v15f64.v3f64.v5f64(<3 x double> [[TMP1]], <5 x double> [[B:%.*]], i32 3, i32 1, i32 5)288; CHECK-NEXT:    [[TMP2:%.*]] = call <6 x double> @llvm.matrix.multiply.v6f64.v15f64.v10f64(<15 x double> [[RES]], <10 x double> [[C:%.*]], i32 3, i32 5, i32 2)289; CHECK-NEXT:    [[RES_2:%.*]] = fneg <6 x double> [[TMP2]]290; CHECK-NEXT:    ret <6 x double> [[RES_2]]291;292  %b.neg = fneg <5 x double> %b293  %res = tail call <15 x double> @llvm.matrix.multiply.v15f64.v3f64.v5f64(<3 x double> %a, <5 x double> %b.neg, i32 3, i32 1, i32 5)294  %res.neg = fneg <15 x double> %res295  %res.2 = tail call <6 x double> @llvm.matrix.multiply.v6f64.v15f64.v10f64(<15 x double> %res.neg, <10 x double> %c, i32 3, i32 5, i32 2)296  ret <6 x double> %res.2297}298 299; negation should be propagated to the result of the second matrix multiplication300define <6 x double> @chain_of_matrix_multiplies_propagation(<15 x double> %a, <20 x double> %b, <8 x double> %c){301; CHECK-LABEL: @chain_of_matrix_multiplies_propagation(302; CHECK-NEXT:    [[TMP1:%.*]] = call <12 x double> @llvm.matrix.multiply.v12f64.v15f64.v20f64(<15 x double> [[A:%.*]], <20 x double> [[B:%.*]], i32 3, i32 5, i32 4)303; CHECK-NEXT:    [[TMP2:%.*]] = call <6 x double> @llvm.matrix.multiply.v6f64.v12f64.v8f64(<12 x double> [[TMP1]], <8 x double> [[C:%.*]], i32 3, i32 4, i32 2)304; CHECK-NEXT:    [[RES_2:%.*]] = fneg <6 x double> [[TMP2]]305; CHECK-NEXT:    ret <6 x double> [[RES_2]]306;307  %a.neg = fneg <15 x double> %a308  %res = tail call <12 x double> @llvm.matrix.multiply.v12f64.v15f64.v20f64(<15 x double> %a.neg, <20 x double> %b, i32 3, i32 5, i32 4)309  %res.2 = tail call <6 x double> @llvm.matrix.multiply.v6f64.v12f64.v8f64(<12 x double> %res, <8 x double> %c, i32 3, i32 4, i32 2)310  ret <6 x double> %res.2311}312 313declare <2 x double> @llvm.matrix.multiply.v2f64.v6f64.v3f64(<6 x double>, <3 x double>, i32 immarg, i32 immarg, i32 immarg) #1314declare <4 x double> @llvm.matrix.multiply.v4f64.v2f64.v2f64(<2 x double>, <2 x double>, i32 immarg, i32 immarg, i32 immarg) #1315declare <2 x double> @llvm.matrix.multiply.v2f64.v3f64.v6f64(<3 x double>, <6 x double>, i32 immarg, i32 immarg, i32 immarg) #1316declare <9 x double> @llvm.matrix.multiply.v9f64.v27f64.v3f64(<27 x double>, <3 x double>, i32 immarg, i32 immarg, i32 immarg) #1317declare <9 x double> @llvm.matrix.multiply.v9f64.v3f64.v27f64(<3 x double>, <27 x double>, i32 immarg, i32 immarg, i32 immarg)318declare <15 x double> @llvm.matrix.multiply.v15f64.v3f64.v5f64(<3 x double>, <5 x double>, i32 immarg, i32 immarg, i32 immarg) #1319declare <15 x double> @llvm.matrix.multiply.v15f64.v5f64.v3f64(<5 x double>, <3 x double>, i32 immarg, i32 immarg, i32 immarg) #1320declare <72 x double> @llvm.matrix.multiply.v72f64.v9f64.v8f64(<9 x double>, <8 x double>, i32 immarg, i32 immarg, i32 immarg) #1321declare <12 x double> @llvm.matrix.multiply.v12f64.v15f64.v20f64(<15 x double>, <20 x double>, i32 immarg, i32 immarg, i32 immarg) #1322declare <21 x double> @llvm.matrix.multiply.v21f64.v15f64.v35f64(<15 x double>, <35 x double>, i32 immarg, i32 immarg, i32 immarg) #1323declare <6 x double> @llvm.matrix.multiply.v6f64.v15f64.v10f64(<15 x double>, <10 x double>, i32 immarg, i32 immarg, i32 immarg) #1324declare <6 x double> @llvm.matrix.multiply.v6f64.v12f64.v8f64(<12 x double>, <8 x double>, i32 immarg, i32 immarg, i32 immarg) #1325