1target datalayout = "e-m:e-i64:64-n32:64"
2target triple = "powerpc64le-unknown-linux-gnu"
3; This file mainly tests that one of the ISEL instruction in the group uses the same register for operand RT, RA, RB
4; RUN: llc -verify-machineinstrs -O2 -ppc-asm-full-reg-names -mcpu=pwr7 -ppc-gen-isel=true < %s | FileCheck %s --check-prefix=CHECK-GEN-ISEL-TRUE
5; RUN: llc -verify-machineinstrs -O2 -ppc-asm-full-reg-names -mcpu=pwr7 -ppc-gen-isel=false < %s | FileCheck %s --implicit-check-not isel
6; Function Attrs: norecurse nounwind readnone
7@.str = private unnamed_addr constant [3 x i8] c"]]\00", align 1
8@.str.1 = private unnamed_addr constant [35 x i8] c"Index < Length && \22Invalid index!\22\00", align 1
9@.str.2 = private unnamed_addr constant [50 x i8] c"/home/jtony/src/llvm/include/llvm/ADT/StringRef.h\00", align 1
10@__PRETTY_FUNCTION__._ZNK4llvm9StringRefixEm = private unnamed_addr constant [47 x i8] c"char llvm::StringRef::operator[](size_t) const\00", align 1
11@.str.3 = private unnamed_addr constant [95 x i8] c"(data || length == 0) && \22StringRef cannot be built from a NULL argument with non-null length\22\00", align 1
12@__PRETTY_FUNCTION__._ZN4llvm9StringRefC2EPKcm = private unnamed_addr constant [49 x i8] c"llvm::StringRef::StringRef(const char *, size_t)\00", align 1
13; Function Attrs: nounwind
14define i64 @_Z3fn1N4llvm9StringRefE([2 x i64] %Str.coerce) local_unnamed_addr #0 {
15entry:
16  %Str.coerce.fca.0.extract = extractvalue [2 x i64] %Str.coerce, 0
17  %Str.coerce.fca.1.extract = extractvalue [2 x i64] %Str.coerce, 1
18  br label %while.cond.outer
19while.cond.outer:                                 ; preds = %_ZNK4llvm9StringRef6substrEmm.exit, %entry
20  %Str.sroa.0.0.ph = phi i64 [ %8, %_ZNK4llvm9StringRef6substrEmm.exit ], [ %Str.coerce.fca.0.extract, %entry ]
21  %.sink.ph = phi i64 [ %sub.i, %_ZNK4llvm9StringRef6substrEmm.exit ], [ %Str.coerce.fca.1.extract, %entry ]
22  %BracketDepth.0.ph = phi i64 [ %BracketDepth.1, %_ZNK4llvm9StringRef6substrEmm.exit ], [ undef, %entry ]
23  %cmp65 = icmp eq i64 %BracketDepth.0.ph, 0
24  br i1 %cmp65, label %while.cond.us.preheader, label %while.cond.preheader
25while.cond.us.preheader:                          ; preds = %while.cond.outer
26  br label %while.cond.us
27while.cond.preheader:                             ; preds = %while.cond.outer
28  %cmp.i34129 = icmp eq i64 %.sink.ph, 0
29  br i1 %cmp.i34129, label %cond.false.i.loopexit135, label %_ZNK4llvm9StringRefixEm.exit.preheader
30_ZNK4llvm9StringRefixEm.exit.preheader:           ; preds = %while.cond.preheader
31  br label %_ZNK4llvm9StringRefixEm.exit
32while.cond.us:                                    ; preds = %while.cond.us.preheader, %_ZNK4llvm9StringRef6substrEmm.exit50.us
33  %Str.sroa.0.0.us = phi i64 [ %3, %_ZNK4llvm9StringRef6substrEmm.exit50.us ], [ %Str.sroa.0.0.ph, %while.cond.us.preheader ]
34  %.sink.us = phi i64 [ %sub.i41.us, %_ZNK4llvm9StringRef6substrEmm.exit50.us ], [ %.sink.ph, %while.cond.us.preheader ]
35  %cmp.i30.us = icmp ult i64 %.sink.us, 2
36  br i1 %cmp.i30.us, label %if.end.us, label %if.end.i.i.us
37if.end.i.i.us:                                    ; preds = %while.cond.us
38  %0 = inttoptr i64 %Str.sroa.0.0.us to i8*
39  %call.i.i.us = tail call signext i32 @memcmp(i8* %0, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i64 0, i64 0), i64 2) #3
40  %phitmp.i.us = icmp eq i32 %call.i.i.us, 0
41  br i1 %phitmp.i.us, label %if.then, label %_ZNK4llvm9StringRefixEm.exit.us
42if.end.us:                                        ; preds = %while.cond.us
43  %cmp.i34.us = icmp eq i64 %.sink.us, 0
44  br i1 %cmp.i34.us, label %cond.false.i.loopexit, label %_ZNK4llvm9StringRefixEm.exit.us
45_ZNK4llvm9StringRefixEm.exit.us:                  ; preds = %if.end.i.i.us, %if.end.us
46  %1 = inttoptr i64 %Str.sroa.0.0.us to i8*
47  %2 = load i8, i8* %1, align 1, !tbaa !2
48  switch i8 %2, label %_ZNK4llvm9StringRef6substrEmm.exit.loopexit [
49    i8 92, label %if.then4.us
50    i8 93, label %if.then9
51  ]
52if.then4.us:                                      ; preds = %_ZNK4llvm9StringRefixEm.exit.us
53  %.sroa.speculated12.i38.us = select i1 %cmp.i30.us, i64 %.sink.us, i64 2
54  %add.ptr.i40.us = getelementptr inbounds i8, i8* %1, i64 %.sroa.speculated12.i38.us
55  %sub.i41.us = sub i64 %.sink.us, %.sroa.speculated12.i38.us
56  %tobool.i.i44.us = icmp ne i8* %add.ptr.i40.us, null
57  %cmp.i4.i45.us = icmp eq i64 %sub.i41.us, 0
58  %or.cond.i.i46.us = or i1 %tobool.i.i44.us, %cmp.i4.i45.us
59  br i1 %or.cond.i.i46.us, label %_ZNK4llvm9StringRef6substrEmm.exit50.us, label %cond.false.i.i47.loopexit
60_ZNK4llvm9StringRef6substrEmm.exit50.us:          ; preds = %if.then4.us
61  %3 = ptrtoint i8* %add.ptr.i40.us to i64
62  br label %while.cond.us
63if.then:                                          ; preds = %if.end.i.i.us
64  ret i64 undef
65cond.false.i.loopexit:                            ; preds = %if.end.us
66  br label %cond.false.i
67cond.false.i.loopexit134:                         ; preds = %_ZNK4llvm9StringRef6substrEmm.exit50
68  br label %cond.false.i
69cond.false.i.loopexit135:                         ; preds = %while.cond.preheader
70  br label %cond.false.i
71cond.false.i:                                     ; preds = %cond.false.i.loopexit135, %cond.false.i.loopexit134, %cond.false.i.loopexit
72  tail call void @__assert_fail(i8* getelementptr inbounds ([35 x i8], [35 x i8]* @.str.1, i64 0, i64 0), i8* getelementptr inbounds ([50 x i8], [50 x i8]* @.str.2, i64 0, i64 0), i32 zeroext 225, i8* getelementptr inbounds ([47 x i8], [47 x i8]* @__PRETTY_FUNCTION__._ZNK4llvm9StringRefixEm, i64 0, i64 0)) #4
73  unreachable
74_ZNK4llvm9StringRefixEm.exit:                     ; preds = %_ZNK4llvm9StringRefixEm.exit.preheader, %_ZNK4llvm9StringRef6substrEmm.exit50
75  %.sink131 = phi i64 [ %sub.i41, %_ZNK4llvm9StringRef6substrEmm.exit50 ], [ %.sink.ph, %_ZNK4llvm9StringRefixEm.exit.preheader ]
76  %Str.sroa.0.0130 = phi i64 [ %6, %_ZNK4llvm9StringRef6substrEmm.exit50 ], [ %Str.sroa.0.0.ph, %_ZNK4llvm9StringRefixEm.exit.preheader ]
77  %4 = inttoptr i64 %Str.sroa.0.0130 to i8*
78  %5 = load i8, i8* %4, align 1, !tbaa !2
79  switch i8 %5, label %_ZNK4llvm9StringRef6substrEmm.exit.loopexit132 [
80    i8 92, label %if.then4
81    i8 93, label %if.end10
82  ]
83if.then4:                                         ; preds = %_ZNK4llvm9StringRefixEm.exit
84  %cmp.i.i37 = icmp ult i64 %.sink131, 2
85  %.sroa.speculated12.i38 = select i1 %cmp.i.i37, i64 %.sink131, i64 2
86  %add.ptr.i40 = getelementptr inbounds i8, i8* %4, i64 %.sroa.speculated12.i38
87  %sub.i41 = sub i64 %.sink131, %.sroa.speculated12.i38
88  %tobool.i.i44 = icmp ne i8* %add.ptr.i40, null
89  %cmp.i4.i45 = icmp eq i64 %sub.i41, 0
90  %or.cond.i.i46 = or i1 %tobool.i.i44, %cmp.i4.i45
91  br i1 %or.cond.i.i46, label %_ZNK4llvm9StringRef6substrEmm.exit50, label %cond.false.i.i47.loopexit133
92cond.false.i.i47.loopexit:                        ; preds = %if.then4.us
93  br label %cond.false.i.i47
94cond.false.i.i47.loopexit133:                     ; preds = %if.then4
95  br label %cond.false.i.i47
96cond.false.i.i47:                                 ; preds = %cond.false.i.i47.loopexit133, %cond.false.i.i47.loopexit
97  tail call void @__assert_fail(i8* getelementptr inbounds ([95 x i8], [95 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([50 x i8], [50 x i8]* @.str.2, i64 0, i64 0), i32 zeroext 90, i8* getelementptr inbounds ([49 x i8], [49 x i8]* @__PRETTY_FUNCTION__._ZN4llvm9StringRefC2EPKcm, i64 0, i64 0)) #4
98  unreachable
99_ZNK4llvm9StringRef6substrEmm.exit50:             ; preds = %if.then4
100  %6 = ptrtoint i8* %add.ptr.i40 to i64
101  %cmp.i34 = icmp eq i64 %sub.i41, 0
102  br i1 %cmp.i34, label %cond.false.i.loopexit134, label %_ZNK4llvm9StringRefixEm.exit
103if.then9:                                         ; preds = %_ZNK4llvm9StringRefixEm.exit.us
104  tail call void @exit(i32 signext 1) #4
105  unreachable
106if.end10:                                         ; preds = %_ZNK4llvm9StringRefixEm.exit
107  %dec = add i64 %BracketDepth.0.ph, -1
108  br label %_ZNK4llvm9StringRef6substrEmm.exit
109_ZNK4llvm9StringRef6substrEmm.exit.loopexit:      ; preds = %_ZNK4llvm9StringRefixEm.exit.us
110  br label %_ZNK4llvm9StringRef6substrEmm.exit
111_ZNK4llvm9StringRef6substrEmm.exit.loopexit132:   ; preds = %_ZNK4llvm9StringRefixEm.exit
112  br label %_ZNK4llvm9StringRef6substrEmm.exit
113_ZNK4llvm9StringRef6substrEmm.exit:               ; preds = %_ZNK4llvm9StringRef6substrEmm.exit.loopexit132, %_ZNK4llvm9StringRef6substrEmm.exit.loopexit, %if.end10
114  %.sink76 = phi i64 [ %.sink131, %if.end10 ], [ %.sink.us, %_ZNK4llvm9StringRef6substrEmm.exit.loopexit ], [ %.sink131, %_ZNK4llvm9StringRef6substrEmm.exit.loopexit132 ]
115  %7 = phi i8* [ %4, %if.end10 ], [ %1, %_ZNK4llvm9StringRef6substrEmm.exit.loopexit ], [ %4, %_ZNK4llvm9StringRef6substrEmm.exit.loopexit132 ]
116  %BracketDepth.1 = phi i64 [ %dec, %if.end10 ], [ 0, %_ZNK4llvm9StringRef6substrEmm.exit.loopexit ], [ %BracketDepth.0.ph, %_ZNK4llvm9StringRef6substrEmm.exit.loopexit132 ]
117  %sub.i = add i64 %.sink76, -1
118  %add.ptr.i = getelementptr inbounds i8, i8* %7, i64 1
119  %8 = ptrtoint i8* %add.ptr.i to i64
120  br label %while.cond.outer
121
122; CHECK-LABEL: @_Z3fn1N4llvm9StringRefE
123; CHECK-GEN-ISEL-TRUE: isel [[SAME:r[0-9]+]], [[SAME]], [[SAME]]
124; CHECK-GEN-ISEL-TRUE: isel [[SAME:r[0-9]+]], {{r[0-9]+}}, [[SAME]]
125; CHECK: bc 12, 2, [[TRUE:.LBB[0-9]+]]
126; CHECK-NEXT: b [[SUCCESSOR:.LBB[0-9]+]]
127; CHECK-NEXT: [[TRUE]]
128; CHECK-NEXT: addi {{r[0-9]+}}, {{r[0-9]+}}, 0
129; CHECK-NEXT: [[SUCCESSOR]]
130}
131
132
133
134; Function Attrs: noreturn nounwind
135declare void @exit(i32 signext) local_unnamed_addr #1
136; Function Attrs: nounwind readonly
137declare signext i32 @memcmp(i8* nocapture, i8* nocapture, i64) local_unnamed_addr #2
138; Function Attrs: noreturn nounwind
139declare void @__assert_fail(i8*, i8*, i32 zeroext, i8*) local_unnamed_addr #1
140attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="ppc64le" "target-features"="+altivec,+bpermd,+crypto,+direct-move,+extdiv,+power8-vector,+vsx,-power9-vector,-qpx" "unsafe-fp-math"="false" "use-soft-float"="false" }
141attributes #1 = { noreturn nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="ppc64le" "target-features"="+altivec,+bpermd,+crypto,+direct-move,+extdiv,+power8-vector,+vsx,-power9-vector,-qpx" "unsafe-fp-math"="false" "use-soft-float"="false" }
142attributes #2 = { nounwind readonly "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="ppc64le" "target-features"="+altivec,+bpermd,+crypto,+direct-move,+extdiv,+power8-vector,+vsx,-power9-vector,-qpx" "unsafe-fp-math"="false" "use-soft-float"="false" }
143attributes #3 = { nounwind readonly }
144attributes #4 = { noreturn nounwind }
145!llvm.module.flags = !{!0}
146!llvm.ident = !{!1}
147!0 = !{i32 1, !"PIC Level", i32 2}
148!1 = !{!"clang version 4.0.0 (trunk 286863) (llvm/trunk 286967)"}
149!2 = !{!3, !3, i64 0}
150!3 = !{!"omnipotent char", !4, i64 0}
151!4 = !{!"Simple C++ TBAA"}
152