blob: 86caedcc09f0da41b3eb7a38c745a0a76987536a [file] [log] [blame]
Tony Jiang8e8c4442017-01-16 20:12:26 +00001target 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
Tony Jiang3b49dc52017-12-11 20:42:37 +00004; This redudant ISEL is introduced during simple register coalescing stage.
5
6; Simple register coalescing first create the foldable ISEL instruction as we have seen in expand-foldable-isel.ll:
7; %vreg85<def> = ISEL8 %vreg83, %vreg83, %vreg33:sub_eq
8
9; Later the register coalescer figures out it could further coalesce %vreg85 with %vreg83:
10; merge %vreg85:1@2288r into %vreg83:5@400B --> @400B
11; erased: 2288r %vreg85<def> = COPY %vreg83
12
13; After that we have:
14; updated: 1504B %vreg83<def> = ISEL8 %vreg83, %vreg83, %vreg33:sub_eq
15
Tony Jiang8e8c4442017-01-16 20:12:26 +000016; 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
17; RUN: llc -verify-machineinstrs -O2 -ppc-asm-full-reg-names -mcpu=pwr7 -ppc-gen-isel=false < %s | FileCheck %s --implicit-check-not isel
Tony Jiang3b49dc52017-12-11 20:42:37 +000018
Tony Jiang8e8c4442017-01-16 20:12:26 +000019@.str = private unnamed_addr constant [3 x i8] c"]]\00", align 1
20@.str.1 = private unnamed_addr constant [35 x i8] c"Index < Length && \22Invalid index!\22\00", align 1
21@.str.2 = private unnamed_addr constant [50 x i8] c"/home/jtony/src/llvm/include/llvm/ADT/StringRef.h\00", align 1
22@__PRETTY_FUNCTION__._ZNK4llvm9StringRefixEm = private unnamed_addr constant [47 x i8] c"char llvm::StringRef::operator[](size_t) const\00", align 1
23@.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
24@__PRETTY_FUNCTION__._ZN4llvm9StringRefC2EPKcm = private unnamed_addr constant [49 x i8] c"llvm::StringRef::StringRef(const char *, size_t)\00", align 1
Tony Jiang3b49dc52017-12-11 20:42:37 +000025define i64 @_Z3fn1N4llvm9StringRefE([2 x i64] %Str.coerce) {
Tony Jiang8e8c4442017-01-16 20:12:26 +000026entry:
27 %Str.coerce.fca.0.extract = extractvalue [2 x i64] %Str.coerce, 0
28 %Str.coerce.fca.1.extract = extractvalue [2 x i64] %Str.coerce, 1
29 br label %while.cond.outer
Tony Jiang3b49dc52017-12-11 20:42:37 +000030while.cond.outer:
Tony Jiang8e8c4442017-01-16 20:12:26 +000031 %Str.sroa.0.0.ph = phi i64 [ %8, %_ZNK4llvm9StringRef6substrEmm.exit ], [ %Str.coerce.fca.0.extract, %entry ]
32 %.sink.ph = phi i64 [ %sub.i, %_ZNK4llvm9StringRef6substrEmm.exit ], [ %Str.coerce.fca.1.extract, %entry ]
33 %BracketDepth.0.ph = phi i64 [ %BracketDepth.1, %_ZNK4llvm9StringRef6substrEmm.exit ], [ undef, %entry ]
34 %cmp65 = icmp eq i64 %BracketDepth.0.ph, 0
35 br i1 %cmp65, label %while.cond.us.preheader, label %while.cond.preheader
Tony Jiang3b49dc52017-12-11 20:42:37 +000036while.cond.us.preheader:
Tony Jiang8e8c4442017-01-16 20:12:26 +000037 br label %while.cond.us
Tony Jiang3b49dc52017-12-11 20:42:37 +000038while.cond.preheader:
Tony Jiang8e8c4442017-01-16 20:12:26 +000039 %cmp.i34129 = icmp eq i64 %.sink.ph, 0
40 br i1 %cmp.i34129, label %cond.false.i.loopexit135, label %_ZNK4llvm9StringRefixEm.exit.preheader
Tony Jiang3b49dc52017-12-11 20:42:37 +000041_ZNK4llvm9StringRefixEm.exit.preheader:
Tony Jiang8e8c4442017-01-16 20:12:26 +000042 br label %_ZNK4llvm9StringRefixEm.exit
Tony Jiang3b49dc52017-12-11 20:42:37 +000043while.cond.us:
Tony Jiang8e8c4442017-01-16 20:12:26 +000044 %Str.sroa.0.0.us = phi i64 [ %3, %_ZNK4llvm9StringRef6substrEmm.exit50.us ], [ %Str.sroa.0.0.ph, %while.cond.us.preheader ]
45 %.sink.us = phi i64 [ %sub.i41.us, %_ZNK4llvm9StringRef6substrEmm.exit50.us ], [ %.sink.ph, %while.cond.us.preheader ]
46 %cmp.i30.us = icmp ult i64 %.sink.us, 2
47 br i1 %cmp.i30.us, label %if.end.us, label %if.end.i.i.us
Tony Jiang3b49dc52017-12-11 20:42:37 +000048if.end.i.i.us:
Tony Jiang8e8c4442017-01-16 20:12:26 +000049 %0 = inttoptr i64 %Str.sroa.0.0.us to i8*
Tony Jiang3b49dc52017-12-11 20:42:37 +000050 %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)
Tony Jiang8e8c4442017-01-16 20:12:26 +000051 %phitmp.i.us = icmp eq i32 %call.i.i.us, 0
52 br i1 %phitmp.i.us, label %if.then, label %_ZNK4llvm9StringRefixEm.exit.us
Tony Jiang3b49dc52017-12-11 20:42:37 +000053if.end.us:
Tony Jiang8e8c4442017-01-16 20:12:26 +000054 %cmp.i34.us = icmp eq i64 %.sink.us, 0
55 br i1 %cmp.i34.us, label %cond.false.i.loopexit, label %_ZNK4llvm9StringRefixEm.exit.us
Tony Jiang3b49dc52017-12-11 20:42:37 +000056_ZNK4llvm9StringRefixEm.exit.us:
Tony Jiang8e8c4442017-01-16 20:12:26 +000057 %1 = inttoptr i64 %Str.sroa.0.0.us to i8*
Tony Jiang3b49dc52017-12-11 20:42:37 +000058 %2 = load i8, i8* %1, align 1
Tony Jiang8e8c4442017-01-16 20:12:26 +000059 switch i8 %2, label %_ZNK4llvm9StringRef6substrEmm.exit.loopexit [
60 i8 92, label %if.then4.us
61 i8 93, label %if.then9
62 ]
Tony Jiang3b49dc52017-12-11 20:42:37 +000063if.then4.us:
Tony Jiang8e8c4442017-01-16 20:12:26 +000064 %.sroa.speculated12.i38.us = select i1 %cmp.i30.us, i64 %.sink.us, i64 2
65 %add.ptr.i40.us = getelementptr inbounds i8, i8* %1, i64 %.sroa.speculated12.i38.us
66 %sub.i41.us = sub i64 %.sink.us, %.sroa.speculated12.i38.us
67 %tobool.i.i44.us = icmp ne i8* %add.ptr.i40.us, null
68 %cmp.i4.i45.us = icmp eq i64 %sub.i41.us, 0
69 %or.cond.i.i46.us = or i1 %tobool.i.i44.us, %cmp.i4.i45.us
70 br i1 %or.cond.i.i46.us, label %_ZNK4llvm9StringRef6substrEmm.exit50.us, label %cond.false.i.i47.loopexit
Tony Jiang3b49dc52017-12-11 20:42:37 +000071_ZNK4llvm9StringRef6substrEmm.exit50.us:
Tony Jiang8e8c4442017-01-16 20:12:26 +000072 %3 = ptrtoint i8* %add.ptr.i40.us to i64
73 br label %while.cond.us
Tony Jiang3b49dc52017-12-11 20:42:37 +000074if.then:
Tony Jiang8e8c4442017-01-16 20:12:26 +000075 ret i64 undef
Tony Jiang3b49dc52017-12-11 20:42:37 +000076cond.false.i.loopexit:
Tony Jiang8e8c4442017-01-16 20:12:26 +000077 br label %cond.false.i
Tony Jiang3b49dc52017-12-11 20:42:37 +000078cond.false.i.loopexit134:
Tony Jiang8e8c4442017-01-16 20:12:26 +000079 br label %cond.false.i
Tony Jiang3b49dc52017-12-11 20:42:37 +000080cond.false.i.loopexit135:
Tony Jiang8e8c4442017-01-16 20:12:26 +000081 br label %cond.false.i
Tony Jiang3b49dc52017-12-11 20:42:37 +000082cond.false.i:
83 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))
Tony Jiang8e8c4442017-01-16 20:12:26 +000084 unreachable
Tony Jiang3b49dc52017-12-11 20:42:37 +000085_ZNK4llvm9StringRefixEm.exit:
Tony Jiang8e8c4442017-01-16 20:12:26 +000086 %.sink131 = phi i64 [ %sub.i41, %_ZNK4llvm9StringRef6substrEmm.exit50 ], [ %.sink.ph, %_ZNK4llvm9StringRefixEm.exit.preheader ]
87 %Str.sroa.0.0130 = phi i64 [ %6, %_ZNK4llvm9StringRef6substrEmm.exit50 ], [ %Str.sroa.0.0.ph, %_ZNK4llvm9StringRefixEm.exit.preheader ]
88 %4 = inttoptr i64 %Str.sroa.0.0130 to i8*
Tony Jiang3b49dc52017-12-11 20:42:37 +000089 %5 = load i8, i8* %4, align 1
Tony Jiang8e8c4442017-01-16 20:12:26 +000090 switch i8 %5, label %_ZNK4llvm9StringRef6substrEmm.exit.loopexit132 [
91 i8 92, label %if.then4
92 i8 93, label %if.end10
93 ]
Tony Jiang3b49dc52017-12-11 20:42:37 +000094if.then4:
Tony Jiang8e8c4442017-01-16 20:12:26 +000095 %cmp.i.i37 = icmp ult i64 %.sink131, 2
96 %.sroa.speculated12.i38 = select i1 %cmp.i.i37, i64 %.sink131, i64 2
97 %add.ptr.i40 = getelementptr inbounds i8, i8* %4, i64 %.sroa.speculated12.i38
98 %sub.i41 = sub i64 %.sink131, %.sroa.speculated12.i38
99 %tobool.i.i44 = icmp ne i8* %add.ptr.i40, null
100 %cmp.i4.i45 = icmp eq i64 %sub.i41, 0
101 %or.cond.i.i46 = or i1 %tobool.i.i44, %cmp.i4.i45
102 br i1 %or.cond.i.i46, label %_ZNK4llvm9StringRef6substrEmm.exit50, label %cond.false.i.i47.loopexit133
Tony Jiang3b49dc52017-12-11 20:42:37 +0000103cond.false.i.i47.loopexit:
Tony Jiang8e8c4442017-01-16 20:12:26 +0000104 br label %cond.false.i.i47
Tony Jiang3b49dc52017-12-11 20:42:37 +0000105cond.false.i.i47.loopexit133:
Tony Jiang8e8c4442017-01-16 20:12:26 +0000106 br label %cond.false.i.i47
Tony Jiang3b49dc52017-12-11 20:42:37 +0000107cond.false.i.i47:
108 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))
Tony Jiang8e8c4442017-01-16 20:12:26 +0000109 unreachable
Tony Jiang3b49dc52017-12-11 20:42:37 +0000110_ZNK4llvm9StringRef6substrEmm.exit50:
Tony Jiang8e8c4442017-01-16 20:12:26 +0000111 %6 = ptrtoint i8* %add.ptr.i40 to i64
112 %cmp.i34 = icmp eq i64 %sub.i41, 0
113 br i1 %cmp.i34, label %cond.false.i.loopexit134, label %_ZNK4llvm9StringRefixEm.exit
Tony Jiang3b49dc52017-12-11 20:42:37 +0000114if.then9:
115 tail call void @exit(i32 signext 1)
Tony Jiang8e8c4442017-01-16 20:12:26 +0000116 unreachable
Tony Jiang3b49dc52017-12-11 20:42:37 +0000117if.end10:
Tony Jiang8e8c4442017-01-16 20:12:26 +0000118 %dec = add i64 %BracketDepth.0.ph, -1
119 br label %_ZNK4llvm9StringRef6substrEmm.exit
Tony Jiang3b49dc52017-12-11 20:42:37 +0000120_ZNK4llvm9StringRef6substrEmm.exit.loopexit:
Tony Jiang8e8c4442017-01-16 20:12:26 +0000121 br label %_ZNK4llvm9StringRef6substrEmm.exit
Tony Jiang3b49dc52017-12-11 20:42:37 +0000122_ZNK4llvm9StringRef6substrEmm.exit.loopexit132:
Tony Jiang8e8c4442017-01-16 20:12:26 +0000123 br label %_ZNK4llvm9StringRef6substrEmm.exit
Tony Jiang3b49dc52017-12-11 20:42:37 +0000124_ZNK4llvm9StringRef6substrEmm.exit:
Tony Jiang8e8c4442017-01-16 20:12:26 +0000125 %.sink76 = phi i64 [ %.sink131, %if.end10 ], [ %.sink.us, %_ZNK4llvm9StringRef6substrEmm.exit.loopexit ], [ %.sink131, %_ZNK4llvm9StringRef6substrEmm.exit.loopexit132 ]
126 %7 = phi i8* [ %4, %if.end10 ], [ %1, %_ZNK4llvm9StringRef6substrEmm.exit.loopexit ], [ %4, %_ZNK4llvm9StringRef6substrEmm.exit.loopexit132 ]
127 %BracketDepth.1 = phi i64 [ %dec, %if.end10 ], [ 0, %_ZNK4llvm9StringRef6substrEmm.exit.loopexit ], [ %BracketDepth.0.ph, %_ZNK4llvm9StringRef6substrEmm.exit.loopexit132 ]
128 %sub.i = add i64 %.sink76, -1
129 %add.ptr.i = getelementptr inbounds i8, i8* %7, i64 1
130 %8 = ptrtoint i8* %add.ptr.i to i64
131 br label %while.cond.outer
132
133; CHECK-LABEL: @_Z3fn1N4llvm9StringRefE
Tony Jiang3b49dc52017-12-11 20:42:37 +0000134; Unecessary ISEL (all the registers are the same) is always removed
135; CHECK-GEN-ISEL-TRUE-NOT: isel [[SAME:r[0-9]+]], [[SAME]], [[SAME]]
Tony Jiang8e8c4442017-01-16 20:12:26 +0000136; CHECK-GEN-ISEL-TRUE: isel [[SAME:r[0-9]+]], {{r[0-9]+}}, [[SAME]]
Nemanja Ivanovic009016b2017-07-25 18:26:35 +0000137; CHECK: bc 12, eq, [[TRUE:.LBB[0-9]+]]
Tony Jiang8e8c4442017-01-16 20:12:26 +0000138; CHECK-NEXT: b [[SUCCESSOR:.LBB[0-9]+]]
139; CHECK-NEXT: [[TRUE]]
140; CHECK-NEXT: addi {{r[0-9]+}}, {{r[0-9]+}}, 0
141; CHECK-NEXT: [[SUCCESSOR]]
142}
143
144
145
Tony Jiang3b49dc52017-12-11 20:42:37 +0000146declare void @exit(i32 signext)
147declare signext i32 @memcmp(i8* nocapture, i8* nocapture, i64)
148declare void @__assert_fail(i8*, i8*, i32 zeroext, i8*)