| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348 |
- ; RUN: opt -S -bdce -instsimplify < %s | FileCheck %s
- ; RUN: opt -S -instsimplify < %s | FileCheck %s -check-prefix=CHECK-IO
- target datalayout = "E-m:e-i64:64-n32:64"
- target triple = "powerpc64-unknown-linux-gnu"
- ; Function Attrs: nounwind readnone
- define signext i32 @bar(i32 signext %x) #0 {
- entry:
- %call = tail call signext i32 @foo(i32 signext 5) #0
- %and = and i32 %call, 4
- %or = or i32 %and, %x
- %call1 = tail call signext i32 @foo(i32 signext 3) #0
- %and2 = and i32 %call1, 8
- %or3 = or i32 %or, %and2
- %call4 = tail call signext i32 @foo(i32 signext 2) #0
- %and5 = and i32 %call4, 16
- %or6 = or i32 %or3, %and5
- %call7 = tail call signext i32 @foo(i32 signext 1) #0
- %and8 = and i32 %call7, 32
- %or9 = or i32 %or6, %and8
- %call10 = tail call signext i32 @foo(i32 signext 0) #0
- %and11 = and i32 %call10, 64
- %or12 = or i32 %or9, %and11
- %call13 = tail call signext i32 @foo(i32 signext 4) #0
- %and14 = and i32 %call13, 128
- %or15 = or i32 %or12, %and14
- %shr = ashr i32 %or15, 4
- ret i32 %shr
- ; CHECK-LABEL: @bar
- ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
- ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
- ; CHECK: tail call signext i32 @foo(i32 signext 2)
- ; CHECK: tail call signext i32 @foo(i32 signext 1)
- ; CHECK: tail call signext i32 @foo(i32 signext 0)
- ; CHECK: tail call signext i32 @foo(i32 signext 4)
- ; CHECK: ret i32
- ; Check that instsimplify is not doing this all on its own.
- ; CHECK-IO-LABEL: @bar
- ; CHECK-IO: tail call signext i32 @foo(i32 signext 5)
- ; CHECK-IO: tail call signext i32 @foo(i32 signext 3)
- ; CHECK-IO: tail call signext i32 @foo(i32 signext 2)
- ; CHECK-IO: tail call signext i32 @foo(i32 signext 1)
- ; CHECK-IO: tail call signext i32 @foo(i32 signext 0)
- ; CHECK-IO: tail call signext i32 @foo(i32 signext 4)
- ; CHECK-IO: ret i32
- }
- ; Function Attrs: nounwind readnone
- declare signext i32 @foo(i32 signext) #0
- ; Function Attrs: nounwind readnone
- define signext i32 @far(i32 signext %x) #1 {
- entry:
- %call = tail call signext i32 @goo(i32 signext 5) #1
- %and = and i32 %call, 4
- %or = or i32 %and, %x
- %call1 = tail call signext i32 @goo(i32 signext 3) #1
- %and2 = and i32 %call1, 8
- %or3 = or i32 %or, %and2
- %call4 = tail call signext i32 @goo(i32 signext 2) #1
- %and5 = and i32 %call4, 16
- %or6 = or i32 %or3, %and5
- %call7 = tail call signext i32 @goo(i32 signext 1) #1
- %and8 = and i32 %call7, 32
- %or9 = or i32 %or6, %and8
- %call10 = tail call signext i32 @goo(i32 signext 0) #1
- %and11 = and i32 %call10, 64
- %or12 = or i32 %or9, %and11
- %call13 = tail call signext i32 @goo(i32 signext 4) #1
- %and14 = and i32 %call13, 128
- %or15 = or i32 %or12, %and14
- %shr = ashr i32 %or15, 4
- ret i32 %shr
- ; CHECK-LABEL: @far
- ; Calls to foo(5) and foo(3) are still there, but their results are not used.
- ; CHECK: tail call signext i32 @goo(i32 signext 5)
- ; CHECK-NEXT: tail call signext i32 @goo(i32 signext 3)
- ; CHECK-NEXT: tail call signext i32 @goo(i32 signext 2)
- ; CHECK: tail call signext i32 @goo(i32 signext 1)
- ; CHECK: tail call signext i32 @goo(i32 signext 0)
- ; CHECK: tail call signext i32 @goo(i32 signext 4)
- ; CHECK: ret i32
- ; Check that instsimplify is not doing this all on its own.
- ; CHECK-IO-LABEL: @far
- ; CHECK-IO: tail call signext i32 @goo(i32 signext 5)
- ; CHECK-IO: tail call signext i32 @goo(i32 signext 3)
- ; CHECK-IO: tail call signext i32 @goo(i32 signext 2)
- ; CHECK-IO: tail call signext i32 @goo(i32 signext 1)
- ; CHECK-IO: tail call signext i32 @goo(i32 signext 0)
- ; CHECK-IO: tail call signext i32 @goo(i32 signext 4)
- ; CHECK-IO: ret i32
- }
- declare signext i32 @goo(i32 signext) #1
- ; Function Attrs: nounwind readnone
- define signext i32 @tar1(i32 signext %x) #0 {
- entry:
- %call = tail call signext i32 @foo(i32 signext 5) #0
- %and = and i32 %call, 33554432
- %or = or i32 %and, %x
- %call1 = tail call signext i32 @foo(i32 signext 3) #0
- %and2 = and i32 %call1, 67108864
- %or3 = or i32 %or, %and2
- %call4 = tail call signext i32 @foo(i32 signext 2) #0
- %and5 = and i32 %call4, 16
- %or6 = or i32 %or3, %and5
- %call7 = tail call signext i32 @foo(i32 signext 1) #0
- %and8 = and i32 %call7, 32
- %or9 = or i32 %or6, %and8
- %call10 = tail call signext i32 @foo(i32 signext 0) #0
- %and11 = and i32 %call10, 64
- %or12 = or i32 %or9, %and11
- %call13 = tail call signext i32 @foo(i32 signext 4) #0
- %and14 = and i32 %call13, 128
- %or15 = or i32 %or12, %and14
- %bs = tail call i32 @llvm.bswap.i32(i32 %or15) #0
- %shr = ashr i32 %bs, 4
- ret i32 %shr
- ; CHECK-LABEL: @tar1
- ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
- ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
- ; CHECK: tail call signext i32 @foo(i32 signext 2)
- ; CHECK: tail call signext i32 @foo(i32 signext 1)
- ; CHECK: tail call signext i32 @foo(i32 signext 0)
- ; CHECK: tail call signext i32 @foo(i32 signext 4)
- ; CHECK: ret i32
- }
- ; Function Attrs: nounwind readnone
- declare i32 @llvm.bswap.i32(i32) #0
- ; Function Attrs: nounwind readnone
- define signext i32 @tar2(i32 signext %x) #0 {
- entry:
- %call = tail call signext i32 @foo(i32 signext 5) #0
- %and = and i32 %call, 33554432
- %or = or i32 %and, %x
- %call1 = tail call signext i32 @foo(i32 signext 3) #0
- %and2 = and i32 %call1, 67108864
- %or3 = or i32 %or, %and2
- %call4 = tail call signext i32 @foo(i32 signext 2) #0
- %and5 = and i32 %call4, 16
- %or6 = or i32 %or3, %and5
- %call7 = tail call signext i32 @foo(i32 signext 1) #0
- %and8 = and i32 %call7, 32
- %or9 = or i32 %or6, %and8
- %call10 = tail call signext i32 @foo(i32 signext 0) #0
- %and11 = and i32 %call10, 64
- %or12 = or i32 %or9, %and11
- %call13 = tail call signext i32 @foo(i32 signext 4) #0
- %and14 = and i32 %call13, 128
- %or15 = or i32 %or12, %and14
- %shl = shl i32 %or15, 10
- ret i32 %shl
- ; CHECK-LABEL: @tar2
- ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
- ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
- ; CHECK: tail call signext i32 @foo(i32 signext 2)
- ; CHECK: tail call signext i32 @foo(i32 signext 1)
- ; CHECK: tail call signext i32 @foo(i32 signext 0)
- ; CHECK: tail call signext i32 @foo(i32 signext 4)
- ; CHECK: ret i32
- }
- ; Function Attrs: nounwind readnone
- define signext i32 @tar3(i32 signext %x) #0 {
- entry:
- %call = tail call signext i32 @foo(i32 signext 5) #0
- %and = and i32 %call, 33554432
- %or = or i32 %and, %x
- %call1 = tail call signext i32 @foo(i32 signext 3) #0
- %and2 = and i32 %call1, 67108864
- %or3 = or i32 %or, %and2
- %call4 = tail call signext i32 @foo(i32 signext 2) #0
- %and5 = and i32 %call4, 16
- %or6 = or i32 %or3, %and5
- %call7 = tail call signext i32 @foo(i32 signext 1) #0
- %and8 = and i32 %call7, 32
- %or9 = or i32 %or6, %and8
- %call10 = tail call signext i32 @foo(i32 signext 0) #0
- %and11 = and i32 %call10, 64
- %or12 = or i32 %or9, %and11
- %call13 = tail call signext i32 @foo(i32 signext 4) #0
- %and14 = and i32 %call13, 128
- %or15 = or i32 %or12, %and14
- %add = add i32 %or15, 5
- %shl = shl i32 %add, 10
- ret i32 %shl
- ; CHECK-LABEL: @tar3
- ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
- ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
- ; CHECK: tail call signext i32 @foo(i32 signext 2)
- ; CHECK: tail call signext i32 @foo(i32 signext 1)
- ; CHECK: tail call signext i32 @foo(i32 signext 0)
- ; CHECK: tail call signext i32 @foo(i32 signext 4)
- ; CHECK: ret i32
- }
- ; Function Attrs: nounwind readnone
- define signext i32 @tar4(i32 signext %x) #0 {
- entry:
- %call = tail call signext i32 @foo(i32 signext 5) #0
- %and = and i32 %call, 33554432
- %or = or i32 %and, %x
- %call1 = tail call signext i32 @foo(i32 signext 3) #0
- %and2 = and i32 %call1, 67108864
- %or3 = or i32 %or, %and2
- %call4 = tail call signext i32 @foo(i32 signext 2) #0
- %and5 = and i32 %call4, 16
- %or6 = or i32 %or3, %and5
- %call7 = tail call signext i32 @foo(i32 signext 1) #0
- %and8 = and i32 %call7, 32
- %or9 = or i32 %or6, %and8
- %call10 = tail call signext i32 @foo(i32 signext 0) #0
- %and11 = and i32 %call10, 64
- %or12 = or i32 %or9, %and11
- %call13 = tail call signext i32 @foo(i32 signext 4) #0
- %and14 = and i32 %call13, 128
- %or15 = or i32 %or12, %and14
- %sub = sub i32 %or15, 5
- %shl = shl i32 %sub, 10
- ret i32 %shl
- ; CHECK-LABEL: @tar4
- ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
- ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
- ; CHECK: tail call signext i32 @foo(i32 signext 2)
- ; CHECK: tail call signext i32 @foo(i32 signext 1)
- ; CHECK: tail call signext i32 @foo(i32 signext 0)
- ; CHECK: tail call signext i32 @foo(i32 signext 4)
- ; CHECK: ret i32
- }
- ; Function Attrs: nounwind readnone
- define signext i32 @tar5(i32 signext %x) #0 {
- entry:
- %call = tail call signext i32 @foo(i32 signext 5) #0
- %and = and i32 %call, 33554432
- %or = or i32 %and, %x
- %call1 = tail call signext i32 @foo(i32 signext 3) #0
- %and2 = and i32 %call1, 67108864
- %or3 = or i32 %or, %and2
- %call4 = tail call signext i32 @foo(i32 signext 2) #0
- %and5 = and i32 %call4, 16
- %or6 = or i32 %or3, %and5
- %call7 = tail call signext i32 @foo(i32 signext 1) #0
- %and8 = and i32 %call7, 32
- %or9 = or i32 %or6, %and8
- %call10 = tail call signext i32 @foo(i32 signext 0) #0
- %and11 = and i32 %call10, 64
- %or12 = or i32 %or9, %and11
- %call13 = tail call signext i32 @foo(i32 signext 4) #0
- %and14 = and i32 %call13, 128
- %or15 = or i32 %or12, %and14
- %xor = xor i32 %or15, 5
- %shl = shl i32 %xor, 10
- ret i32 %shl
- ; CHECK-LABEL: @tar5
- ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
- ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
- ; CHECK: tail call signext i32 @foo(i32 signext 2)
- ; CHECK: tail call signext i32 @foo(i32 signext 1)
- ; CHECK: tail call signext i32 @foo(i32 signext 0)
- ; CHECK: tail call signext i32 @foo(i32 signext 4)
- ; CHECK: ret i32
- }
- ; Function Attrs: nounwind readnone
- define signext i32 @tar7(i32 signext %x, i1 %b) #0 {
- entry:
- %call = tail call signext i32 @foo(i32 signext 5) #0
- %and = and i32 %call, 33554432
- %or = or i32 %and, %x
- %call1 = tail call signext i32 @foo(i32 signext 3) #0
- %and2 = and i32 %call1, 67108864
- %or3 = or i32 %or, %and2
- %call4 = tail call signext i32 @foo(i32 signext 2) #0
- %and5 = and i32 %call4, 16
- %or6 = or i32 %or3, %and5
- %call7 = tail call signext i32 @foo(i32 signext 1) #0
- %and8 = and i32 %call7, 32
- %or9 = or i32 %or6, %and8
- %call10 = tail call signext i32 @foo(i32 signext 0) #0
- %and11 = and i32 %call10, 64
- %or12 = or i32 %or9, %and11
- %call13 = tail call signext i32 @foo(i32 signext 4) #0
- %and14 = and i32 %call13, 128
- %or15 = or i32 %or12, %and14
- %v = select i1 %b, i32 %or15, i32 5
- %shl = shl i32 %v, 10
- ret i32 %shl
- ; CHECK-LABEL: @tar7
- ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
- ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
- ; CHECK: tail call signext i32 @foo(i32 signext 2)
- ; CHECK: tail call signext i32 @foo(i32 signext 1)
- ; CHECK: tail call signext i32 @foo(i32 signext 0)
- ; CHECK: tail call signext i32 @foo(i32 signext 4)
- ; CHECK: ret i32
- }
- ; Function Attrs: nounwind readnone
- define signext i16 @tar8(i32 signext %x) #0 {
- entry:
- %call = tail call signext i32 @foo(i32 signext 5) #0
- %and = and i32 %call, 33554432
- %or = or i32 %and, %x
- %call1 = tail call signext i32 @foo(i32 signext 3) #0
- %and2 = and i32 %call1, 67108864
- %or3 = or i32 %or, %and2
- %call4 = tail call signext i32 @foo(i32 signext 2) #0
- %and5 = and i32 %call4, 16
- %or6 = or i32 %or3, %and5
- %call7 = tail call signext i32 @foo(i32 signext 1) #0
- %and8 = and i32 %call7, 32
- %or9 = or i32 %or6, %and8
- %call10 = tail call signext i32 @foo(i32 signext 0) #0
- %and11 = and i32 %call10, 64
- %or12 = or i32 %or9, %and11
- %call13 = tail call signext i32 @foo(i32 signext 4) #0
- %and14 = and i32 %call13, 128
- %or15 = or i32 %or12, %and14
- %tr = trunc i32 %or15 to i16
- ret i16 %tr
- ; CHECK-LABEL: @tar8
- ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
- ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
- ; CHECK: tail call signext i32 @foo(i32 signext 2)
- ; CHECK: tail call signext i32 @foo(i32 signext 1)
- ; CHECK: tail call signext i32 @foo(i32 signext 0)
- ; CHECK: tail call signext i32 @foo(i32 signext 4)
- ; CHECK: ret i16
- }
- attributes #0 = { nounwind readnone }
- attributes #1 = { nounwind }
|