Bill Wendling | 988a47d | 2012-08-27 22:12:44 +0000 | [diff] [blame] | 1 | ; RUN: llc < %s -mcpu=cortex-a8 -march=thumb |
| 2 | ; Test that this doesn't crash. |
| 3 | ; <rdar://problem/12183003> |
| 4 | |
| 5 | target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32" |
| 6 | target triple = "thumbv7-apple-ios5.1.0" |
| 7 | |
| 8 | declare { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.arm.neon.vld3.v16i8(i8*, i32) nounwind readonly |
| 9 | |
| 10 | declare void @llvm.arm.neon.vst1.v16i8(i8*, <16 x i8>, i32) nounwind |
| 11 | |
| 12 | define void @findEdges(i8*) nounwind ssp { |
| 13 | %2 = icmp sgt i32 undef, 0 |
| 14 | br i1 %2, label %5, label %3 |
| 15 | |
| 16 | ; <label>:3 ; preds = %5, %1 |
| 17 | %4 = phi i8* [ %0, %1 ], [ %19, %5 ] |
| 18 | ret void |
| 19 | |
| 20 | ; <label>:5 ; preds = %5, %1 |
| 21 | %6 = phi i8* [ %19, %5 ], [ %0, %1 ] |
| 22 | %7 = tail call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.arm.neon.vld3.v16i8(i8* null, i32 1) |
| 23 | %8 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8> } %7, 0 |
| 24 | %9 = getelementptr inbounds i8* null, i32 3 |
| 25 | %10 = tail call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.arm.neon.vld3.v16i8(i8* %9, i32 1) |
| 26 | %11 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8> } %10, 2 |
| 27 | %12 = tail call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.arm.neon.vld3.v16i8(i8* %6, i32 1) |
| 28 | %13 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8> } %12, 0 |
| 29 | %14 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8> } %12, 1 |
| 30 | %15 = getelementptr inbounds i8* %6, i32 3 |
| 31 | %16 = tail call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.arm.neon.vld3.v16i8(i8* %15, i32 1) |
| 32 | %17 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8> } %16, 1 |
| 33 | %18 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8> } %16, 2 |
| 34 | %19 = getelementptr inbounds i8* %6, i32 48 |
| 35 | %20 = bitcast <16 x i8> %13 to <2 x i64> |
| 36 | %21 = bitcast <16 x i8> %8 to <2 x i64> |
| 37 | %22 = bitcast <16 x i8> %14 to <2 x i64> |
| 38 | %23 = shufflevector <2 x i64> %22, <2 x i64> undef, <1 x i32> zeroinitializer |
| 39 | %24 = bitcast <1 x i64> %23 to <8 x i8> |
| 40 | %25 = zext <8 x i8> %24 to <8 x i16> |
| 41 | %26 = sub <8 x i16> zeroinitializer, %25 |
| 42 | %27 = bitcast <16 x i8> %17 to <2 x i64> |
| 43 | %28 = tail call <8 x i16> @llvm.arm.neon.vabs.v8i16(<8 x i16> %26) nounwind |
| 44 | %29 = mul <8 x i16> %28, %28 |
| 45 | %30 = add <8 x i16> zeroinitializer, %29 |
| 46 | %31 = tail call <8 x i16> @llvm.arm.neon.vmaxu.v8i16(<8 x i16> undef, <8 x i16> %30) nounwind |
| 47 | %32 = bitcast <16 x i8> %11 to <2 x i64> |
| 48 | %33 = shufflevector <2 x i64> %32, <2 x i64> undef, <1 x i32> zeroinitializer |
| 49 | %34 = bitcast <1 x i64> %33 to <8 x i8> |
| 50 | %35 = zext <8 x i8> %34 to <8 x i16> |
| 51 | %36 = sub <8 x i16> %35, zeroinitializer |
| 52 | %37 = bitcast <16 x i8> %18 to <2 x i64> |
| 53 | %38 = shufflevector <2 x i64> %37, <2 x i64> undef, <1 x i32> zeroinitializer |
| 54 | %39 = bitcast <1 x i64> %38 to <8 x i8> |
| 55 | %40 = zext <8 x i8> %39 to <8 x i16> |
| 56 | %41 = sub <8 x i16> zeroinitializer, %40 |
| 57 | %42 = tail call <8 x i16> @llvm.arm.neon.vabs.v8i16(<8 x i16> %36) nounwind |
| 58 | %43 = tail call <8 x i16> @llvm.arm.neon.vabs.v8i16(<8 x i16> %41) nounwind |
| 59 | %44 = mul <8 x i16> %42, %42 |
| 60 | %45 = mul <8 x i16> %43, %43 |
| 61 | %46 = add <8 x i16> %45, %44 |
| 62 | %47 = tail call <8 x i16> @llvm.arm.neon.vmaxu.v8i16(<8 x i16> %31, <8 x i16> %46) nounwind |
| 63 | %48 = bitcast <8 x i16> %47 to <2 x i64> |
| 64 | %49 = shufflevector <2 x i64> %48, <2 x i64> undef, <1 x i32> zeroinitializer |
| 65 | %50 = bitcast <1 x i64> %49 to <4 x i16> |
| 66 | %51 = tail call <4 x i32> @llvm.arm.neon.vmullu.v4i32(<4 x i16> %50, <4 x i16> undef) nounwind |
| 67 | %52 = tail call <4 x i16> @llvm.arm.neon.vqshiftnu.v4i16(<4 x i32> %51, <4 x i32> <i32 -6, i32 -6, i32 -6, i32 -6>) |
| 68 | %53 = bitcast <4 x i16> %52 to <1 x i64> |
| 69 | %54 = shufflevector <1 x i64> %53, <1 x i64> undef, <2 x i32> <i32 0, i32 1> |
| 70 | %55 = bitcast <2 x i64> %54 to <8 x i16> |
| 71 | %56 = tail call <8 x i8> @llvm.arm.neon.vshiftn.v8i8(<8 x i16> %55, <8 x i16> <i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8>) |
| 72 | %57 = shufflevector <2 x i64> %20, <2 x i64> undef, <1 x i32> <i32 1> |
| 73 | %58 = bitcast <1 x i64> %57 to <8 x i8> |
| 74 | %59 = zext <8 x i8> %58 to <8 x i16> |
| 75 | %60 = sub <8 x i16> zeroinitializer, %59 |
| 76 | %61 = shufflevector <2 x i64> %21, <2 x i64> undef, <1 x i32> <i32 1> |
| 77 | %62 = bitcast <1 x i64> %61 to <8 x i8> |
| 78 | %63 = zext <8 x i8> %62 to <8 x i16> |
| 79 | %64 = sub <8 x i16> %63, zeroinitializer |
| 80 | %65 = tail call <8 x i16> @llvm.arm.neon.vabs.v8i16(<8 x i16> %60) nounwind |
| 81 | %66 = mul <8 x i16> %65, %65 |
| 82 | %67 = add <8 x i16> zeroinitializer, %66 |
| 83 | %68 = shufflevector <2 x i64> %27, <2 x i64> undef, <1 x i32> <i32 1> |
| 84 | %69 = bitcast <1 x i64> %68 to <8 x i8> |
| 85 | %70 = zext <8 x i8> %69 to <8 x i16> |
| 86 | %71 = sub <8 x i16> zeroinitializer, %70 |
| 87 | %72 = tail call <8 x i16> @llvm.arm.neon.vabs.v8i16(<8 x i16> undef) nounwind |
| 88 | %73 = tail call <8 x i16> @llvm.arm.neon.vabs.v8i16(<8 x i16> %71) nounwind |
| 89 | %74 = mul <8 x i16> %72, %72 |
| 90 | %75 = mul <8 x i16> %73, %73 |
| 91 | %76 = add <8 x i16> %75, %74 |
| 92 | %77 = shufflevector <2 x i64> %32, <2 x i64> undef, <1 x i32> <i32 1> |
| 93 | %78 = bitcast <1 x i64> %77 to <8 x i8> |
| 94 | %79 = zext <8 x i8> %78 to <8 x i16> |
| 95 | %80 = sub <8 x i16> %79, zeroinitializer |
| 96 | %81 = tail call <8 x i16> @llvm.arm.neon.vabs.v8i16(<8 x i16> %80) nounwind |
| 97 | %82 = mul <8 x i16> %81, %81 |
| 98 | %83 = add <8 x i16> zeroinitializer, %82 |
| 99 | %84 = tail call <8 x i16> @llvm.arm.neon.vmaxu.v8i16(<8 x i16> %76, <8 x i16> %83) nounwind |
| 100 | %85 = tail call <8 x i16> @llvm.arm.neon.vmaxu.v8i16(<8 x i16> %67, <8 x i16> %84) nounwind |
| 101 | %86 = bitcast <8 x i16> %85 to <2 x i64> |
| 102 | %87 = shufflevector <2 x i64> %86, <2 x i64> undef, <1 x i32> <i32 1> |
| 103 | %88 = bitcast <1 x i64> %87 to <4 x i16> |
| 104 | %89 = tail call <4 x i32> @llvm.arm.neon.vmullu.v4i32(<4 x i16> %88, <4 x i16> undef) nounwind |
| 105 | %90 = tail call <4 x i16> @llvm.arm.neon.vqrshiftnu.v4i16(<4 x i32> %89, <4 x i32> <i32 -6, i32 -6, i32 -6, i32 -6>) |
| 106 | %91 = bitcast <4 x i16> %90 to <1 x i64> |
| 107 | %92 = shufflevector <1 x i64> undef, <1 x i64> %91, <2 x i32> <i32 0, i32 1> |
| 108 | %93 = bitcast <2 x i64> %92 to <8 x i16> |
| 109 | %94 = tail call <8 x i8> @llvm.arm.neon.vshiftn.v8i8(<8 x i16> %93, <8 x i16> <i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8>) |
| 110 | %95 = bitcast <8 x i8> %56 to <1 x i64> |
| 111 | %96 = bitcast <8 x i8> %94 to <1 x i64> |
| 112 | %97 = shufflevector <1 x i64> %95, <1 x i64> %96, <2 x i32> <i32 0, i32 1> |
| 113 | %98 = bitcast <2 x i64> %97 to <16 x i8> |
| 114 | tail call void @llvm.arm.neon.vst1.v16i8(i8* null, <16 x i8> %98, i32 1) |
| 115 | %99 = icmp slt i32 undef, undef |
| 116 | br i1 %99, label %5, label %3 |
| 117 | } |
| 118 | |
| 119 | declare <4 x i16> @llvm.arm.neon.vqshiftnu.v4i16(<4 x i32>, <4 x i32>) nounwind readnone |
| 120 | |
| 121 | declare <8 x i8> @llvm.arm.neon.vshiftn.v8i8(<8 x i16>, <8 x i16>) nounwind readnone |
| 122 | |
| 123 | declare <4 x i16> @llvm.arm.neon.vqrshiftnu.v4i16(<4 x i32>, <4 x i32>) nounwind readnone |
| 124 | |
| 125 | declare <4 x i32> @llvm.arm.neon.vmullu.v4i32(<4 x i16>, <4 x i16>) nounwind readnone |
| 126 | |
| 127 | declare <8 x i16> @llvm.arm.neon.vmaxu.v8i16(<8 x i16>, <8 x i16>) nounwind readnone |
| 128 | |
| 129 | declare <8 x i16> @llvm.arm.neon.vabs.v8i16(<8 x i16>) nounwind readnone |