1; RUN: opt -arm-parallel-dsp -mtriple=armv7-a -S %s -o - | FileCheck %s 2 3; CHECK-LABEL: single_block 4; CHECK: [[CAST_A:%[^ ]+]] = bitcast i16* %a to i32* 5; CHECK: [[A:%[^ ]+]] = load i32, i32* [[CAST_A]] 6; CHECK: [[CAST_B:%[^ ]+]] = bitcast i16* %b to i32* 7; CHECK: [[B:%[^ ]+]] = load i32, i32* [[CAST_B]] 8; CHECK: call i32 @llvm.arm.smlad(i32 [[A]], i32 [[B]], i32 %acc) 9define i32 @single_block(i16* %a, i16* %b, i32 %acc) { 10entry: 11 %ld.a.0 = load i16, i16* %a 12 %sext.a.0 = sext i16 %ld.a.0 to i32 13 %ld.b.0 = load i16, i16* %b 14 %sext.b.0 = sext i16 %ld.b.0 to i32 15 %mul.0 = mul i32 %sext.a.0, %sext.b.0 16 %addr.a.1 = getelementptr i16, i16* %a, i32 1 17 %addr.b.1 = getelementptr i16, i16* %b, i32 1 18 %ld.a.1 = load i16, i16* %addr.a.1 19 %sext.a.1 = sext i16 %ld.a.1 to i32 20 %ld.b.1 = load i16, i16* %addr.b.1 21 %sext.b.1 = sext i16 %ld.b.1 to i32 22 %mul.1 = mul i32 %sext.a.1, %sext.b.1 23 %add = add i32 %mul.0, %mul.1 24 %res = add i32 %add, %acc 25 ret i32 %res 26} 27 28; CHECK-LABEL: multi_block 29; CHECK: [[CAST_A:%[^ ]+]] = bitcast i16* %a to i32* 30; CHECK: [[A:%[^ ]+]] = load i32, i32* [[CAST_A]] 31; CHECK: [[CAST_B:%[^ ]+]] = bitcast i16* %b to i32* 32; CHECK: [[B:%[^ ]+]] = load i32, i32* [[CAST_B]] 33; CHECK: call i32 @llvm.arm.smlad(i32 [[A]], i32 [[B]], i32 0) 34define i32 @multi_block(i16* %a, i16* %b, i32 %acc) { 35entry: 36 %ld.a.0 = load i16, i16* %a 37 %sext.a.0 = sext i16 %ld.a.0 to i32 38 %ld.b.0 = load i16, i16* %b 39 %sext.b.0 = sext i16 %ld.b.0 to i32 40 %mul.0 = mul i32 %sext.a.0, %sext.b.0 41 %addr.a.1 = getelementptr i16, i16* %a, i32 1 42 %addr.b.1 = getelementptr i16, i16* %b, i32 1 43 %ld.a.1 = load i16, i16* %addr.a.1 44 %sext.a.1 = sext i16 %ld.a.1 to i32 45 %ld.b.1 = load i16, i16* %addr.b.1 46 %sext.b.1 = sext i16 %ld.b.1 to i32 47 %mul.1 = mul i32 %sext.a.1, %sext.b.1 48 %add = add i32 %mul.0, %mul.1 49 br label %bb.1 50 51bb.1: 52 %res = add i32 %add, %acc 53 ret i32 %res 54} 55 56; CHECK-LABEL: multi_block_1 57; CHECK-NOT: call i32 @llvm.arm.smlad 58define i32 @multi_block_1(i16* %a, i16* %b, i32 %acc) { 59entry: 60 %ld.a.0 = load i16, i16* %a 61 %sext.a.0 = sext i16 %ld.a.0 to i32 62 %ld.b.0 = load i16, i16* %b 63 %sext.b.0 = sext i16 %ld.b.0 to i32 64 %mul.0 = mul i32 %sext.a.0, %sext.b.0 65 br label %bb.1 66 67bb.1: 68 %addr.a.1 = getelementptr i16, i16* %a, i32 1 69 %addr.b.1 = getelementptr i16, i16* %b, i32 1 70 %ld.a.1 = load i16, i16* %addr.a.1 71 %sext.a.1 = sext i16 %ld.a.1 to i32 72 %ld.b.1 = load i16, i16* %addr.b.1 73 %sext.b.1 = sext i16 %ld.b.1 to i32 74 %mul.1 = mul i32 %sext.a.1, %sext.b.1 75 %add = add i32 %mul.0, %mul.1 76 %res = add i32 %add, %acc 77 ret i32 %res 78} 79 80