1; RUN: opt < %s -instcombine -S | FileCheck %s 2 3define void @f(i64 %val, i32 %limit, i32 *%ptr) { 4; CHECK-LABEL: @f 5; CHECK: %0 = trunc i64 %val to i32 6; CHECK: %1 = phi i32 [ %0, %entry ], [ {{.*}}, %loop ] 7entry: 8 %tempvector = insertelement <16 x i64> undef, i64 %val, i32 0 9 %vector = shufflevector <16 x i64> %tempvector, <16 x i64> undef, <16 x i32> zeroinitializer 10 %0 = add <16 x i64> %vector, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15> 11 %1 = trunc <16 x i64> %0 to <16 x i32> 12 br label %loop 13 14loop: 15 %2 = phi <16 x i32> [ %1, %entry ], [ %inc, %loop ] 16 %elt = extractelement <16 x i32> %2, i32 0 17 %end = icmp ult i32 %elt, %limit 18 %3 = add i32 10, %elt 19 %4 = sext i32 %elt to i64 20 %5 = getelementptr i32, i32* %ptr, i64 %4 21 store i32 %3, i32* %5 22 %inc = add <16 x i32> %2, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16> 23 br i1 %end, label %loop, label %ret 24 25ret: 26 ret void 27} 28 29define void @copy(i64 %val, i32 %limit, i32 *%ptr) { 30; CHECK-LABEL: @copy 31; CHECK: %0 = trunc i64 %val to i32 32; CHECK: %1 = phi i32 [ %0, %entry ], [ {{.*}}, %loop ] 33entry: 34 %tempvector = insertelement <16 x i64> undef, i64 %val, i32 0 35 %vector = shufflevector <16 x i64> %tempvector, <16 x i64> undef, <16 x i32> zeroinitializer 36 %0 = add <16 x i64> %vector, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15> 37 %1 = trunc <16 x i64> %0 to <16 x i32> 38 br label %loop 39 40loop: 41 %2 = phi <16 x i32> [ %1, %entry ], [ %inc, %loop ] 42 %elt = extractelement <16 x i32> %2, i32 0 43 %eltcopy = extractelement <16 x i32> %2, i32 0 44 %end = icmp ult i32 %elt, %limit 45 %3 = add i32 10, %eltcopy 46 %4 = sext i32 %elt to i64 47 %5 = getelementptr i32, i32* %ptr, i64 %4 48 store i32 %3, i32* %5 49 %inc = add <16 x i32> %2, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16> 50 br i1 %end, label %loop, label %ret 51 52ret: 53 ret void 54} 55 56define void @nocopy(i64 %val, i32 %limit, i32 *%ptr) { 57; CHECK-LABEL: @nocopy 58; CHECK-NOT: phi i32 59; CHECK: phi <16 x i32> [ %1, %entry ], [ %inc, %loop ] 60entry: 61 %tempvector = insertelement <16 x i64> undef, i64 %val, i32 0 62 %vector = shufflevector <16 x i64> %tempvector, <16 x i64> undef, <16 x i32> zeroinitializer 63 %0 = add <16 x i64> %vector, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15> 64 %1 = trunc <16 x i64> %0 to <16 x i32> 65 br label %loop 66 67loop: 68 %2 = phi <16 x i32> [ %1, %entry ], [ %inc, %loop ] 69 %elt = extractelement <16 x i32> %2, i32 0 70 %eltcopy = extractelement <16 x i32> %2, i32 1 71 %end = icmp ult i32 %elt, %limit 72 %3 = add i32 10, %eltcopy 73 %4 = sext i32 %elt to i64 74 %5 = getelementptr i32, i32* %ptr, i64 %4 75 store i32 %3, i32* %5 76 %inc = add <16 x i32> %2, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16> 77 br i1 %end, label %loop, label %ret 78 79ret: 80 ret void 81} 82 83define i1 @g(<3 x i32> %input_2) { 84; CHECK-LABEL: @g 85; CHECK: extractelement <3 x i32> %input_2, i32 0 86entry: 87 br label %for.cond 88 89for.cond: 90 %input_2.addr.0 = phi <3 x i32> [ %input_2, %entry ], [ %div45, %for.body ] 91 %input_1.addr.1 = phi <3 x i32> [ undef, %entry ], [ %dec43, %for.body ] 92 br i1 undef, label %for.end, label %for.body 93 94; CHECK: extractelement <3 x i32> %{{.*}}, i32 0 95for.body: 96 %dec43 = add <3 x i32> %input_1.addr.1, <i32 -1, i32 -1, i32 -1> 97 %sub44 = sub <3 x i32> <i32 -1, i32 -1, i32 -1>, %dec43 98 %div45 = sdiv <3 x i32> %input_2.addr.0, %sub44 99 br label %for.cond 100 101for.end: 102 %0 = extractelement <3 x i32> %input_2.addr.0, i32 0 103 %.89 = select i1 false, i32 0, i32 %0 104 %tobool313 = icmp eq i32 %.89, 0 105 ret i1 %tobool313 106} 107 108