1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py 2; RUN: opt -passes="print<cost-model>" 2>&1 -disable-output -mtriple=thumbv8m.main < %s | FileCheck %s --check-prefix=V8M 3; RUN: opt -passes="print<cost-model>" 2>&1 -disable-output -mtriple=armv8a-linux-gnueabihf < %s | FileCheck %s --check-prefix=NEON 4; RUN: opt -passes="print<cost-model>" 2>&1 -disable-output -mtriple=armv8.1m.main -mattr=+mve < %s | FileCheck %s --check-prefix=MVE 5 6target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64" 7 8define i32 @reduce_i64(i32 %arg) { 9; V8M-LABEL: 'reduce_i64' 10; V8M-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %V1 = call i64 @llvm.vector.reduce.umax.v1i64(<1 x i64> undef) 11; V8M-NEXT: Cost Model: Found an estimated cost of 13 for instruction: %V2 = call i64 @llvm.vector.reduce.umax.v2i64(<2 x i64> undef) 12; V8M-NEXT: Cost Model: Found an estimated cost of 35 for instruction: %V4 = call i64 @llvm.vector.reduce.umax.v4i64(<4 x i64> undef) 13; V8M-NEXT: Cost Model: Found an estimated cost of 79 for instruction: %V8 = call i64 @llvm.vector.reduce.umax.v8i64(<8 x i64> undef) 14; V8M-NEXT: Cost Model: Found an estimated cost of 167 for instruction: %V16 = call i64 @llvm.vector.reduce.umax.v16i64(<16 x i64> undef) 15; V8M-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret i32 undef 16; 17; NEON-LABEL: 'reduce_i64' 18; NEON-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %V1 = call i64 @llvm.vector.reduce.umax.v1i64(<1 x i64> undef) 19; NEON-NEXT: Cost Model: Found an estimated cost of 17 for instruction: %V2 = call i64 @llvm.vector.reduce.umax.v2i64(<2 x i64> undef) 20; NEON-NEXT: Cost Model: Found an estimated cost of 31 for instruction: %V4 = call i64 @llvm.vector.reduce.umax.v4i64(<4 x i64> undef) 21; NEON-NEXT: Cost Model: Found an estimated cost of 76 for instruction: %V8 = call i64 @llvm.vector.reduce.umax.v8i64(<8 x i64> undef) 22; NEON-NEXT: Cost Model: Found an estimated cost of 178 for instruction: %V16 = call i64 @llvm.vector.reduce.umax.v16i64(<16 x i64> undef) 23; NEON-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef 24; 25; MVE-LABEL: 'reduce_i64' 26; MVE-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %V1 = call i64 @llvm.vector.reduce.umax.v1i64(<1 x i64> undef) 27; MVE-NEXT: Cost Model: Found an estimated cost of 110 for instruction: %V2 = call i64 @llvm.vector.reduce.umax.v2i64(<2 x i64> undef) 28; MVE-NEXT: Cost Model: Found an estimated cost of 212 for instruction: %V4 = call i64 @llvm.vector.reduce.umax.v4i64(<4 x i64> undef) 29; MVE-NEXT: Cost Model: Found an estimated cost of 416 for instruction: %V8 = call i64 @llvm.vector.reduce.umax.v8i64(<8 x i64> undef) 30; MVE-NEXT: Cost Model: Found an estimated cost of 824 for instruction: %V16 = call i64 @llvm.vector.reduce.umax.v16i64(<16 x i64> undef) 31; MVE-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef 32; 33 %V1 = call i64 @llvm.vector.reduce.umax.v1i64(<1 x i64> undef) 34 %V2 = call i64 @llvm.vector.reduce.umax.v2i64(<2 x i64> undef) 35 %V4 = call i64 @llvm.vector.reduce.umax.v4i64(<4 x i64> undef) 36 %V8 = call i64 @llvm.vector.reduce.umax.v8i64(<8 x i64> undef) 37 %V16 = call i64 @llvm.vector.reduce.umax.v16i64(<16 x i64> undef) 38 ret i32 undef 39} 40 41define i32 @reduce_i32(i32 %arg) { 42; V8M-LABEL: 'reduce_i32' 43; V8M-NEXT: Cost Model: Found an estimated cost of 7 for instruction: %V2 = call i32 @llvm.vector.reduce.umax.v2i32(<2 x i32> undef) 44; V8M-NEXT: Cost Model: Found an estimated cost of 19 for instruction: %V4 = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> undef) 45; V8M-NEXT: Cost Model: Found an estimated cost of 43 for instruction: %V8 = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> undef) 46; V8M-NEXT: Cost Model: Found an estimated cost of 91 for instruction: %V16 = call i32 @llvm.vector.reduce.umax.v16i32(<16 x i32> undef) 47; V8M-NEXT: Cost Model: Found an estimated cost of 187 for instruction: %V32 = call i32 @llvm.vector.reduce.umax.v32i32(<32 x i32> undef) 48; V8M-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret i32 undef 49; 50; NEON-LABEL: 'reduce_i32' 51; NEON-NEXT: Cost Model: Found an estimated cost of 16 for instruction: %V2 = call i32 @llvm.vector.reduce.umax.v2i32(<2 x i32> undef) 52; NEON-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V4 = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> undef) 53; NEON-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %V8 = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> undef) 54; NEON-NEXT: Cost Model: Found an estimated cost of 16 for instruction: %V16 = call i32 @llvm.vector.reduce.umax.v16i32(<16 x i32> undef) 55; NEON-NEXT: Cost Model: Found an estimated cost of 32 for instruction: %V32 = call i32 @llvm.vector.reduce.umax.v32i32(<32 x i32> undef) 56; NEON-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef 57; 58; MVE-LABEL: 'reduce_i32' 59; MVE-NEXT: Cost Model: Found an estimated cost of 58 for instruction: %V2 = call i32 @llvm.vector.reduce.umax.v2i32(<2 x i32> undef) 60; MVE-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V4 = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> undef) 61; MVE-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %V8 = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> undef) 62; MVE-NEXT: Cost Model: Found an estimated cost of 16 for instruction: %V16 = call i32 @llvm.vector.reduce.umax.v16i32(<16 x i32> undef) 63; MVE-NEXT: Cost Model: Found an estimated cost of 32 for instruction: %V32 = call i32 @llvm.vector.reduce.umax.v32i32(<32 x i32> undef) 64; MVE-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef 65; 66 %V2 = call i32 @llvm.vector.reduce.umax.v2i32(<2 x i32> undef) 67 %V4 = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> undef) 68 %V8 = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> undef) 69 %V16 = call i32 @llvm.vector.reduce.umax.v16i32(<16 x i32> undef) 70 %V32 = call i32 @llvm.vector.reduce.umax.v32i32(<32 x i32> undef) 71 ret i32 undef 72} 73 74define i32 @reduce_i16(i32 %arg) { 75; V8M-LABEL: 'reduce_i16' 76; V8M-NEXT: Cost Model: Found an estimated cost of 7 for instruction: %V2 = call i16 @llvm.vector.reduce.umax.v2i16(<2 x i16> undef) 77; V8M-NEXT: Cost Model: Found an estimated cost of 19 for instruction: %V4 = call i16 @llvm.vector.reduce.umax.v4i16(<4 x i16> undef) 78; V8M-NEXT: Cost Model: Found an estimated cost of 43 for instruction: %V8 = call i16 @llvm.vector.reduce.umax.v8i16(<8 x i16> undef) 79; V8M-NEXT: Cost Model: Found an estimated cost of 91 for instruction: %V16 = call i16 @llvm.vector.reduce.umax.v16i16(<16 x i16> undef) 80; V8M-NEXT: Cost Model: Found an estimated cost of 187 for instruction: %V32 = call i16 @llvm.vector.reduce.umax.v32i16(<32 x i16> undef) 81; V8M-NEXT: Cost Model: Found an estimated cost of 379 for instruction: %V64 = call i16 @llvm.vector.reduce.umax.v64i16(<64 x i16> undef) 82; V8M-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret i32 undef 83; 84; NEON-LABEL: 'reduce_i16' 85; NEON-NEXT: Cost Model: Found an estimated cost of 16 for instruction: %V2 = call i16 @llvm.vector.reduce.umax.v2i16(<2 x i16> undef) 86; NEON-NEXT: Cost Model: Found an estimated cost of 53 for instruction: %V4 = call i16 @llvm.vector.reduce.umax.v4i16(<4 x i16> undef) 87; NEON-NEXT: Cost Model: Found an estimated cost of 6 for instruction: %V8 = call i16 @llvm.vector.reduce.umax.v8i16(<8 x i16> undef) 88; NEON-NEXT: Cost Model: Found an estimated cost of 12 for instruction: %V16 = call i16 @llvm.vector.reduce.umax.v16i16(<16 x i16> undef) 89; NEON-NEXT: Cost Model: Found an estimated cost of 24 for instruction: %V32 = call i16 @llvm.vector.reduce.umax.v32i16(<32 x i16> undef) 90; NEON-NEXT: Cost Model: Found an estimated cost of 48 for instruction: %V64 = call i16 @llvm.vector.reduce.umax.v64i16(<64 x i16> undef) 91; NEON-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef 92; 93; MVE-LABEL: 'reduce_i16' 94; MVE-NEXT: Cost Model: Found an estimated cost of 58 for instruction: %V2 = call i16 @llvm.vector.reduce.umax.v2i16(<2 x i16> undef) 95; MVE-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V4 = call i16 @llvm.vector.reduce.umax.v4i16(<4 x i16> undef) 96; MVE-NEXT: Cost Model: Found an estimated cost of 6 for instruction: %V8 = call i16 @llvm.vector.reduce.umax.v8i16(<8 x i16> undef) 97; MVE-NEXT: Cost Model: Found an estimated cost of 12 for instruction: %V16 = call i16 @llvm.vector.reduce.umax.v16i16(<16 x i16> undef) 98; MVE-NEXT: Cost Model: Found an estimated cost of 24 for instruction: %V32 = call i16 @llvm.vector.reduce.umax.v32i16(<32 x i16> undef) 99; MVE-NEXT: Cost Model: Found an estimated cost of 48 for instruction: %V64 = call i16 @llvm.vector.reduce.umax.v64i16(<64 x i16> undef) 100; MVE-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef 101; 102 %V2 = call i16 @llvm.vector.reduce.umax.v2i16(<2 x i16> undef) 103 %V4 = call i16 @llvm.vector.reduce.umax.v4i16(<4 x i16> undef) 104 %V8 = call i16 @llvm.vector.reduce.umax.v8i16(<8 x i16> undef) 105 %V16 = call i16 @llvm.vector.reduce.umax.v16i16(<16 x i16> undef) 106 %V32 = call i16 @llvm.vector.reduce.umax.v32i16(<32 x i16> undef) 107 %V64 = call i16 @llvm.vector.reduce.umax.v64i16(<64 x i16> undef) 108 ret i32 undef 109} 110 111define i32 @reduce_i8(i32 %arg) { 112; V8M-LABEL: 'reduce_i8' 113; V8M-NEXT: Cost Model: Found an estimated cost of 7 for instruction: %V2 = call i8 @llvm.vector.reduce.umax.v2i8(<2 x i8> undef) 114; V8M-NEXT: Cost Model: Found an estimated cost of 19 for instruction: %V4 = call i8 @llvm.vector.reduce.umax.v4i8(<4 x i8> undef) 115; V8M-NEXT: Cost Model: Found an estimated cost of 43 for instruction: %V8 = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> undef) 116; V8M-NEXT: Cost Model: Found an estimated cost of 91 for instruction: %V16 = call i8 @llvm.vector.reduce.umax.v16i8(<16 x i8> undef) 117; V8M-NEXT: Cost Model: Found an estimated cost of 187 for instruction: %V32 = call i8 @llvm.vector.reduce.umax.v32i8(<32 x i8> undef) 118; V8M-NEXT: Cost Model: Found an estimated cost of 379 for instruction: %V64 = call i8 @llvm.vector.reduce.umax.v64i8(<64 x i8> undef) 119; V8M-NEXT: Cost Model: Found an estimated cost of 763 for instruction: %V128 = call i8 @llvm.vector.reduce.umax.v128i8(<128 x i8> undef) 120; V8M-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret i32 undef 121; 122; NEON-LABEL: 'reduce_i8' 123; NEON-NEXT: Cost Model: Found an estimated cost of 16 for instruction: %V2 = call i8 @llvm.vector.reduce.umax.v2i8(<2 x i8> undef) 124; NEON-NEXT: Cost Model: Found an estimated cost of 53 for instruction: %V4 = call i8 @llvm.vector.reduce.umax.v4i8(<4 x i8> undef) 125; NEON-NEXT: Cost Model: Found an estimated cost of 150 for instruction: %V8 = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> undef) 126; NEON-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %V16 = call i8 @llvm.vector.reduce.umax.v16i8(<16 x i8> undef) 127; NEON-NEXT: Cost Model: Found an estimated cost of 16 for instruction: %V32 = call i8 @llvm.vector.reduce.umax.v32i8(<32 x i8> undef) 128; NEON-NEXT: Cost Model: Found an estimated cost of 32 for instruction: %V64 = call i8 @llvm.vector.reduce.umax.v64i8(<64 x i8> undef) 129; NEON-NEXT: Cost Model: Found an estimated cost of 64 for instruction: %V128 = call i8 @llvm.vector.reduce.umax.v128i8(<128 x i8> undef) 130; NEON-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef 131; 132; MVE-LABEL: 'reduce_i8' 133; MVE-NEXT: Cost Model: Found an estimated cost of 58 for instruction: %V2 = call i8 @llvm.vector.reduce.umax.v2i8(<2 x i8> undef) 134; MVE-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %V4 = call i8 @llvm.vector.reduce.umax.v4i8(<4 x i8> undef) 135; MVE-NEXT: Cost Model: Found an estimated cost of 6 for instruction: %V8 = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> undef) 136; MVE-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %V16 = call i8 @llvm.vector.reduce.umax.v16i8(<16 x i8> undef) 137; MVE-NEXT: Cost Model: Found an estimated cost of 16 for instruction: %V32 = call i8 @llvm.vector.reduce.umax.v32i8(<32 x i8> undef) 138; MVE-NEXT: Cost Model: Found an estimated cost of 32 for instruction: %V64 = call i8 @llvm.vector.reduce.umax.v64i8(<64 x i8> undef) 139; MVE-NEXT: Cost Model: Found an estimated cost of 64 for instruction: %V128 = call i8 @llvm.vector.reduce.umax.v128i8(<128 x i8> undef) 140; MVE-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef 141; 142 %V2 = call i8 @llvm.vector.reduce.umax.v2i8(<2 x i8> undef) 143 %V4 = call i8 @llvm.vector.reduce.umax.v4i8(<4 x i8> undef) 144 %V8 = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> undef) 145 %V16 = call i8 @llvm.vector.reduce.umax.v16i8(<16 x i8> undef) 146 %V32 = call i8 @llvm.vector.reduce.umax.v32i8(<32 x i8> undef) 147 %V64 = call i8 @llvm.vector.reduce.umax.v64i8(<64 x i8> undef) 148 %V128 = call i8 @llvm.vector.reduce.umax.v128i8(<128 x i8> undef) 149 ret i32 undef 150} 151 152declare i64 @llvm.vector.reduce.umax.v1i64(<1 x i64>) 153declare i64 @llvm.vector.reduce.umax.v2i64(<2 x i64>) 154declare i64 @llvm.vector.reduce.umax.v4i64(<4 x i64>) 155declare i64 @llvm.vector.reduce.umax.v8i64(<8 x i64>) 156declare i64 @llvm.vector.reduce.umax.v16i64(<16 x i64>) 157 158declare i32 @llvm.vector.reduce.umax.v2i32(<2 x i32>) 159declare i32 @llvm.vector.reduce.umax.v4i32(<4 x i32>) 160declare i32 @llvm.vector.reduce.umax.v8i32(<8 x i32>) 161declare i32 @llvm.vector.reduce.umax.v16i32(<16 x i32>) 162declare i32 @llvm.vector.reduce.umax.v32i32(<32 x i32>) 163 164declare i16 @llvm.vector.reduce.umax.v2i16(<2 x i16>) 165declare i16 @llvm.vector.reduce.umax.v4i16(<4 x i16>) 166declare i16 @llvm.vector.reduce.umax.v8i16(<8 x i16>) 167declare i16 @llvm.vector.reduce.umax.v16i16(<16 x i16>) 168declare i16 @llvm.vector.reduce.umax.v32i16(<32 x i16>) 169declare i16 @llvm.vector.reduce.umax.v64i16(<64 x i16>) 170 171declare i8 @llvm.vector.reduce.umax.v2i8(<2 x i8>) 172declare i8 @llvm.vector.reduce.umax.v4i8(<4 x i8>) 173declare i8 @llvm.vector.reduce.umax.v8i8(<8 x i8>) 174declare i8 @llvm.vector.reduce.umax.v16i8(<16 x i8>) 175declare i8 @llvm.vector.reduce.umax.v32i8(<32 x i8>) 176declare i8 @llvm.vector.reduce.umax.v64i8(<64 x i8>) 177declare i8 @llvm.vector.reduce.umax.v128i8(<128 x i8>) 178