annotate test/Transforms/InstCombine/assume.ll @ 134:3a76565eade5 LLVM5.0.1

update 5.0.1
author mir3636
date Sat, 17 Feb 2018 09:57:20 +0900
parents 803732b1fca8
children c2174574ed3a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 ; RUN: opt < %s -instcombine -S | FileCheck %s
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 target triple = "x86_64-unknown-linux-gnu"
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 define i32 @foo1(i32* %a) #0 {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 entry:
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
7 %0 = load i32, i32* %a, align 4
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 ; Check that the alignment has been upgraded and that the assume has not
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 ; been removed:
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 ; CHECK-LABEL: @foo1
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
12 ; CHECK-DAG: load i32, i32* %a, align 32
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 ; CHECK-DAG: call void @llvm.assume
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 ; CHECK: ret i32
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 %ptrint = ptrtoint i32* %a to i64
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 %maskedptr = and i64 %ptrint, 31
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 %maskcond = icmp eq i64 %maskedptr, 0
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 tail call void @llvm.assume(i1 %maskcond)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 ret i32 %0
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 define i32 @foo2(i32* %a) #0 {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 entry:
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 ; Same check as in @foo1, but make sure it works if the assume is first too.
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 ; CHECK-LABEL: @foo2
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
28 ; CHECK-DAG: load i32, i32* %a, align 32
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 ; CHECK-DAG: call void @llvm.assume
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 ; CHECK: ret i32
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 %ptrint = ptrtoint i32* %a to i64
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 %maskedptr = and i64 %ptrint, 31
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 %maskcond = icmp eq i64 %maskedptr, 0
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 tail call void @llvm.assume(i1 %maskcond)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
37 %0 = load i32, i32* %a, align 4
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 ret i32 %0
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 declare void @llvm.assume(i1) #1
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 define i32 @simple(i32 %a) #1 {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 entry:
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 ; CHECK-LABEL: @simple
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 ; CHECK: call void @llvm.assume
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 ; CHECK: ret i32 4
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 %cmp = icmp eq i32 %a, 4
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 tail call void @llvm.assume(i1 %cmp)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 ret i32 %a
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 define i32 @can1(i1 %a, i1 %b, i1 %c) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 entry:
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 %and1 = and i1 %a, %b
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 %and = and i1 %and1, %c
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 tail call void @llvm.assume(i1 %and)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 ; CHECK-LABEL: @can1
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 ; CHECK: call void @llvm.assume(i1 %a)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 ; CHECK: call void @llvm.assume(i1 %b)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 ; CHECK: call void @llvm.assume(i1 %c)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 ; CHECK: ret i32
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 ret i32 5
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 define i32 @can2(i1 %a, i1 %b, i1 %c) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 entry:
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 %v = or i1 %a, %b
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 %w = xor i1 %v, 1
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 tail call void @llvm.assume(i1 %w)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 ; CHECK-LABEL: @can2
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 ; CHECK: %[[V1:[^ ]+]] = xor i1 %a, true
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 ; CHECK: call void @llvm.assume(i1 %[[V1]])
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 ; CHECK: %[[V2:[^ ]+]] = xor i1 %b, true
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 ; CHECK: call void @llvm.assume(i1 %[[V2]])
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 ; CHECK: ret i32
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 ret i32 5
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 define i32 @bar1(i32 %a) #0 {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 entry:
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 %and1 = and i32 %a, 3
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 ; CHECK-LABEL: @bar1
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 ; CHECK: call void @llvm.assume
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 ; CHECK: ret i32 1
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 %and = and i32 %a, 7
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 %cmp = icmp eq i32 %and, 1
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 tail call void @llvm.assume(i1 %cmp)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 ret i32 %and1
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 define i32 @bar2(i32 %a) #0 {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 entry:
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 ; CHECK-LABEL: @bar2
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 ; CHECK: call void @llvm.assume
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 ; CHECK: ret i32 1
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 %and = and i32 %a, 7
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 %cmp = icmp eq i32 %and, 1
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 tail call void @llvm.assume(i1 %cmp)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 %and1 = and i32 %a, 3
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 ret i32 %and1
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 define i32 @bar3(i32 %a, i1 %x, i1 %y) #0 {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 entry:
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 %and1 = and i32 %a, 3
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 ; Don't be fooled by other assumes around.
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 ; CHECK-LABEL: @bar3
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 ; CHECK: call void @llvm.assume
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 ; CHECK: ret i32 1
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 tail call void @llvm.assume(i1 %x)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 %and = and i32 %a, 7
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 %cmp = icmp eq i32 %and, 1
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 tail call void @llvm.assume(i1 %cmp)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 tail call void @llvm.assume(i1 %y)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 ret i32 %and1
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 define i32 @bar4(i32 %a, i32 %b) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 entry:
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 %and1 = and i32 %b, 3
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 ; CHECK-LABEL: @bar4
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 ; CHECK: call void @llvm.assume
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 ; CHECK: call void @llvm.assume
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 ; CHECK: ret i32 1
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 %and = and i32 %a, 7
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 %cmp = icmp eq i32 %and, 1
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 tail call void @llvm.assume(i1 %cmp)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 %cmp2 = icmp eq i32 %a, %b
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 tail call void @llvm.assume(i1 %cmp2)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 ret i32 %and1
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 define i32 @icmp1(i32 %a) #0 {
121
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
155 ; CHECK-LABEL: @icmp1(
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
156 ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 5
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
157 ; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
158 ; CHECK-NEXT: ret i32 1
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
159 ;
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 %cmp = icmp sgt i32 %a, 5
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 tail call void @llvm.assume(i1 %cmp)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 %conv = zext i1 %cmp to i32
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 ret i32 %conv
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
165
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 define i32 @icmp2(i32 %a) #0 {
121
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
167 ; CHECK-LABEL: @icmp2(
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
168 ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 5
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
169 ; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
170 ; CHECK-NEXT: ret i32 0
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
171 ;
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 %cmp = icmp sgt i32 %a, 5
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 tail call void @llvm.assume(i1 %cmp)
121
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
174 %t0 = zext i1 %cmp to i32
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
175 %lnot.ext = xor i32 %t0, 1
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 ret i32 %lnot.ext
121
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
177 }
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
178
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
179 ; If the 'not' of a condition is known true, then the condition must be false.
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
180
121
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
181 define i1 @assume_not(i1 %cond) {
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
182 ; CHECK-LABEL: @assume_not(
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
183 ; CHECK-NEXT: [[NOTCOND:%.*]] = xor i1 [[COND:%.*]], true
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
184 ; CHECK-NEXT: call void @llvm.assume(i1 [[NOTCOND]])
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
185 ; CHECK-NEXT: ret i1 false
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
186 ;
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
187 %notcond = xor i1 %cond, true
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
188 call void @llvm.assume(i1 %notcond)
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
189 ret i1 %cond
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
191
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
192 declare void @escape(i32* %a)
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
193
121
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
194 ; Canonicalize a nonnull assumption on a load into metadata form.
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
195
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
196 define i1 @nonnull1(i32** %a) {
121
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
197 ; CHECK-LABEL: @nonnull1(
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
198 ; CHECK-NEXT: [[LOAD:%.*]] = load i32*, i32** %a, align 8, !nonnull !0
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
199 ; CHECK-NEXT: tail call void @escape(i32* nonnull [[LOAD]])
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
200 ; CHECK-NEXT: ret i1 false
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
201 ;
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
202 %load = load i32*, i32** %a
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
203 %cmp = icmp ne i32* %load, null
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
204 tail call void @llvm.assume(i1 %cmp)
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
205 tail call void @escape(i32* %load)
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
206 %rval = icmp eq i32* %load, null
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
207 ret i1 %rval
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
208 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
209
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
210 ; Make sure the above canonicalization applies only
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
211 ; to pointer types. Doing otherwise would be illegal.
121
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
212
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
213 define i1 @nonnull2(i32* %a) {
121
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
214 ; CHECK-LABEL: @nonnull2(
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
215 ; CHECK-NEXT: [[LOAD:%.*]] = load i32, i32* %a, align 4
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
216 ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[LOAD]], 0
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
217 ; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
218 ; CHECK-NEXT: [[RVAL:%.*]] = icmp eq i32 [[LOAD]], 0
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
219 ; CHECK-NEXT: ret i1 [[RVAL]]
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
220 ;
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
221 %load = load i32, i32* %a
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
222 %cmp = icmp ne i32 %load, 0
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
223 tail call void @llvm.assume(i1 %cmp)
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
224 %rval = icmp eq i32 %load, 0
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
225 ret i1 %rval
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
226 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
227
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
228 ; Make sure the above canonicalization does not trigger
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
229 ; if the assume is control dependent on something else
121
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
230
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
231 define i1 @nonnull3(i32** %a, i1 %control) {
121
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
232 ; CHECK-LABEL: @nonnull3(
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
233 ; CHECK-NEXT: entry:
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
234 ; CHECK-NEXT: [[LOAD:%.*]] = load i32*, i32** %a, align 8
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
235 ; CHECK-NEXT: br i1 %control, label %taken, label %not_taken
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
236 ; CHECK: taken:
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
237 ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32* [[LOAD]], null
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
238 ; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
239 ; CHECK-NEXT: [[RVAL:%.*]] = icmp eq i32* [[LOAD]], null
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
240 ; CHECK-NEXT: ret i1 [[RVAL]]
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
241 ; CHECK: not_taken:
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
242 ; CHECK-NEXT: ret i1 true
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
243 ;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
244 entry:
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
245 %load = load i32*, i32** %a
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
246 %cmp = icmp ne i32* %load, null
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
247 br i1 %control, label %taken, label %not_taken
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
248 taken:
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
249 tail call void @llvm.assume(i1 %cmp)
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
250 %rval = icmp eq i32* %load, null
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
251 ret i1 %rval
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
252 not_taken:
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
253 ret i1 true
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
254 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
255
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
256 ; Make sure the above canonicalization does not trigger
121
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
257 ; if the path from the load to the assume is potentially
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
258 ; interrupted by an exception being thrown
121
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
259
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
260 define i1 @nonnull4(i32** %a) {
121
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
261 ; CHECK-LABEL: @nonnull4(
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
262 ; CHECK-NEXT: [[LOAD:%.*]] = load i32*, i32** %a, align 8
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
263 ; CHECK-NEXT: tail call void @escape(i32* [[LOAD]])
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
264 ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32* [[LOAD]], null
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
265 ; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
266 ; CHECK-NEXT: [[RVAL:%.*]] = icmp eq i32* [[LOAD]], null
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
267 ; CHECK-NEXT: ret i1 [[RVAL]]
803732b1fca8 LLVM 5.0
kono
parents: 95
diff changeset
268 ;
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
269 %load = load i32*, i32** %a
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
270 ;; This call may throw!
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
271 tail call void @escape(i32* %load)
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
272 %cmp = icmp ne i32* %load, null
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
273 tail call void @llvm.assume(i1 %cmp)
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
274 %rval = icmp eq i32* %load, null
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
275 ret i1 %rval
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
276 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
277
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
278 ; PR35846 - https://bugs.llvm.org/show_bug.cgi?id=35846
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
279
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
280 define i32 @assumption_conflicts_with_known_bits(i32 %a, i32 %b) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
281 ; CHECK-LABEL: @assumption_conflicts_with_known_bits(
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
282 ; CHECK-NEXT: tail call void @llvm.assume(i1 false)
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
283 ; CHECK-NEXT: ret i32 0
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
284 ;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
285 %and1 = and i32 %b, 3
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
286 %B1 = lshr i32 %and1, %and1
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
287 %B3 = shl nuw nsw i32 %and1, %B1
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
288 %cmp = icmp eq i32 %B3, 1
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
289 tail call void @llvm.assume(i1 %cmp)
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
290 %cmp2 = icmp eq i32 %B1, %B3
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
291 tail call void @llvm.assume(i1 %cmp2)
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
292 ret i32 %and1
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
293 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
294
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
295
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
296 attributes #0 = { nounwind uwtable }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
297 attributes #1 = { nounwind }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
298