1; RUN: llc -verify-machineinstrs -O3 -mcpu=pwr8 \ 2; RUN: -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s 3 4; RUN: llc -verify-machineinstrs -O3 -mcpu=pwr8 -disable-ppc-vsx-swap-removal \ 5; RUN: -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck \ 6; RUN: -check-prefix=NOOPTSWAP %s 7 8; RUN: llc -O3 -mcpu=pwr9 -mtriple=powerpc64le-unknown-linux-gnu \ 9; RUN: -verify-machineinstrs -ppc-vsr-nums-as-vr < %s | FileCheck \ 10; RUN: -check-prefix=CHECK-P9 --implicit-check-not xxswapd %s 11 12; RUN: llc -O3 -mcpu=pwr9 -disable-ppc-vsx-swap-removal -mattr=-power9-vector \ 13; RUN: -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu < %s \ 14; RUN: | FileCheck -check-prefix=NOOPTSWAP %s 15 16; This test was generated from the following source: 17; 18; #define N 4096 19; int ca[N] __attribute__((aligned(16))); 20; int cb[N] __attribute__((aligned(16))); 21; int cc[N] __attribute__((aligned(16))); 22; int cd[N] __attribute__((aligned(16))); 23; 24; void foo () 25; { 26; int i; 27; for (i = 0; i < N; i++) { 28; ca[i] = (cb[i] + cc[i]) * cd[i]; 29; } 30; } 31 32@cb = common global [4096 x i32] zeroinitializer, align 16 33@cc = common global [4096 x i32] zeroinitializer, align 16 34@cd = common global [4096 x i32] zeroinitializer, align 16 35@ca = common global [4096 x i32] zeroinitializer, align 16 36 37define void @foo() { 38entry: 39 br label %vector.body 40 41vector.body: 42 %index = phi i64 [ 0, %entry ], [ %index.next.3, %vector.body ] 43 %0 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cb, i64 0, i64 %index 44 %1 = bitcast i32* %0 to <4 x i32>* 45 %wide.load = load <4 x i32>, <4 x i32>* %1, align 16 46 %2 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cc, i64 0, i64 %index 47 %3 = bitcast i32* %2 to <4 x i32>* 48 %wide.load13 = load <4 x i32>, <4 x i32>* %3, align 16 49 %4 = add nsw <4 x i32> %wide.load13, %wide.load 50 %5 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cd, i64 0, i64 %index 51 %6 = bitcast i32* %5 to <4 x i32>* 52 %wide.load14 = load <4 x i32>, <4 x i32>* %6, align 16 53 %7 = mul nsw <4 x i32> %4, %wide.load14 54 %8 = getelementptr inbounds [4096 x i32], [4096 x i32]* @ca, i64 0, i64 %index 55 %9 = bitcast i32* %8 to <4 x i32>* 56 store <4 x i32> %7, <4 x i32>* %9, align 16 57 %index.next = add nuw nsw i64 %index, 4 58 %10 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cb, i64 0, i64 %index.next 59 %11 = bitcast i32* %10 to <4 x i32>* 60 %wide.load.1 = load <4 x i32>, <4 x i32>* %11, align 16 61 %12 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cc, i64 0, i64 %index.next 62 %13 = bitcast i32* %12 to <4 x i32>* 63 %wide.load13.1 = load <4 x i32>, <4 x i32>* %13, align 16 64 %14 = add nsw <4 x i32> %wide.load13.1, %wide.load.1 65 %15 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cd, i64 0, i64 %index.next 66 %16 = bitcast i32* %15 to <4 x i32>* 67 %wide.load14.1 = load <4 x i32>, <4 x i32>* %16, align 16 68 %17 = mul nsw <4 x i32> %14, %wide.load14.1 69 %18 = getelementptr inbounds [4096 x i32], [4096 x i32]* @ca, i64 0, i64 %index.next 70 %19 = bitcast i32* %18 to <4 x i32>* 71 store <4 x i32> %17, <4 x i32>* %19, align 16 72 %index.next.1 = add nuw nsw i64 %index.next, 4 73 %20 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cb, i64 0, i64 %index.next.1 74 %21 = bitcast i32* %20 to <4 x i32>* 75 %wide.load.2 = load <4 x i32>, <4 x i32>* %21, align 16 76 %22 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cc, i64 0, i64 %index.next.1 77 %23 = bitcast i32* %22 to <4 x i32>* 78 %wide.load13.2 = load <4 x i32>, <4 x i32>* %23, align 16 79 %24 = add nsw <4 x i32> %wide.load13.2, %wide.load.2 80 %25 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cd, i64 0, i64 %index.next.1 81 %26 = bitcast i32* %25 to <4 x i32>* 82 %wide.load14.2 = load <4 x i32>, <4 x i32>* %26, align 16 83 %27 = mul nsw <4 x i32> %24, %wide.load14.2 84 %28 = getelementptr inbounds [4096 x i32], [4096 x i32]* @ca, i64 0, i64 %index.next.1 85 %29 = bitcast i32* %28 to <4 x i32>* 86 store <4 x i32> %27, <4 x i32>* %29, align 16 87 %index.next.2 = add nuw nsw i64 %index.next.1, 4 88 %30 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cb, i64 0, i64 %index.next.2 89 %31 = bitcast i32* %30 to <4 x i32>* 90 %wide.load.3 = load <4 x i32>, <4 x i32>* %31, align 16 91 %32 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cc, i64 0, i64 %index.next.2 92 %33 = bitcast i32* %32 to <4 x i32>* 93 %wide.load13.3 = load <4 x i32>, <4 x i32>* %33, align 16 94 %34 = add nsw <4 x i32> %wide.load13.3, %wide.load.3 95 %35 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cd, i64 0, i64 %index.next.2 96 %36 = bitcast i32* %35 to <4 x i32>* 97 %wide.load14.3 = load <4 x i32>, <4 x i32>* %36, align 16 98 %37 = mul nsw <4 x i32> %34, %wide.load14.3 99 %38 = getelementptr inbounds [4096 x i32], [4096 x i32]* @ca, i64 0, i64 %index.next.2 100 %39 = bitcast i32* %38 to <4 x i32>* 101 store <4 x i32> %37, <4 x i32>* %39, align 16 102 %index.next.3 = add nuw nsw i64 %index.next.2, 4 103 %40 = icmp eq i64 %index.next.3, 4096 104 br i1 %40, label %for.end, label %vector.body 105 106for.end: 107 ret void 108} 109 110; CHECK-LABEL: @foo 111; CHECK-NOT: xxpermdi 112; CHECK-NOT: xxswapd 113; CHECK-P9-NOT: xxpermdi 114 115; CHECK: lxvd2x 116; CHECK: lxvd2x 117; CHECK-DAG: lxvd2x 118; CHECK-DAG: vadduwm 119; CHECK: vmuluwm 120; CHECK: stxvd2x 121 122; CHECK: lxvd2x 123; CHECK: lxvd2x 124; CHECK-DAG: lxvd2x 125; CHECK-DAG: vadduwm 126; CHECK: vmuluwm 127; CHECK: stxvd2x 128 129; CHECK: lxvd2x 130; CHECK: lxvd2x 131; CHECK-DAG: lxvd2x 132; CHECK-DAG: vadduwm 133; CHECK: vmuluwm 134; CHECK: stxvd2x 135 136; CHECK: lxvd2x 137; CHECK: lxvd2x 138; CHECK-DAG: lxvd2x 139; CHECK-DAG: vadduwm 140; CHECK: vmuluwm 141; CHECK: stxvd2x 142 143; NOOPTSWAP-LABEL: @foo 144 145; NOOPTSWAP: lxvd2x 146; NOOPTSWAP-DAG: lxvd2x 147; NOOPTSWAP-DAG: lxvd2x 148; NOOPTSWAP-DAG: xxswapd 149; NOOPTSWAP-DAG: xxswapd 150; NOOPTSWAP-DAG: xxswapd 151; NOOPTSWAP-DAG: vadduwm 152; NOOPTSWAP: vmuluwm 153; NOOPTSWAP: xxswapd 154; NOOPTSWAP-DAG: xxswapd 155; NOOPTSWAP-DAG: xxswapd 156; NOOPTSWAP-DAG: stxvd2x 157; NOOPTSWAP-DAG: stxvd2x 158; NOOPTSWAP: stxvd2x 159 160; CHECK-P9-LABEL: @foo 161; CHECK-P9-DAG: lxvx 162; CHECK-P9-DAG: lxvx 163; CHECK-P9-DAG: lxvx 164; CHECK-P9-DAG: lxvx 165; CHECK-P9-DAG: lxvx 166; CHECK-P9-DAG: lxvx 167; CHECK-P9-DAG: lxvx 168; CHECK-P9-DAG: lxvx 169; CHECK-P9-DAG: lxvx 170; CHECK-P9-DAG: lxvx 171; CHECK-P9-DAG: lxvx 172; CHECK-P9-DAG: lxvx 173; CHECK-P9-DAG: vadduwm 174; CHECK-P9-DAG: vadduwm 175; CHECK-P9-DAG: vadduwm 176; CHECK-P9-DAG: vadduwm 177; CHECK-P9-DAG: vmuluwm 178; CHECK-P9-DAG: vmuluwm 179; CHECK-P9-DAG: vmuluwm 180; CHECK-P9-DAG: vmuluwm 181; CHECK-P9-DAG: stxvx 182; CHECK-P9-DAG: stxvx 183; CHECK-P9-DAG: stxvx 184; CHECK-P9-DAG: stxvx 185 186