xref: /llvm-project/llvm/test/Transforms/CorrelatedValuePropagation/zext.ll (revision dc6d0773960c664eee12a1ed871fad5c81a20a12)
1*dc6d0773SYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*dc6d0773SYingwei Zheng; RUN: opt < %s -passes=correlated-propagation -S | FileCheck %s
3*dc6d0773SYingwei Zheng
4*dc6d0773SYingwei Zhengdeclare void @use64(i64)
5*dc6d0773SYingwei Zheng
6*dc6d0773SYingwei Zhengdefine void @test1(i32 %n) {
7*dc6d0773SYingwei Zheng; CHECK-LABEL: @test1(
8*dc6d0773SYingwei Zheng; CHECK-NEXT:  entry:
9*dc6d0773SYingwei Zheng; CHECK-NEXT:    br label [[FOR_COND:%.*]]
10*dc6d0773SYingwei Zheng; CHECK:       for.cond:
11*dc6d0773SYingwei Zheng; CHECK-NEXT:    [[A:%.*]] = phi i32 [ [[N:%.*]], [[ENTRY:%.*]] ], [ [[EXT:%.*]], [[FOR_BODY:%.*]] ]
12*dc6d0773SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[A]], -1
13*dc6d0773SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
14*dc6d0773SYingwei Zheng; CHECK:       for.body:
15*dc6d0773SYingwei Zheng; CHECK-NEXT:    [[EXT_WIDE:%.*]] = zext nneg i32 [[A]] to i64
16*dc6d0773SYingwei Zheng; CHECK-NEXT:    call void @use64(i64 [[EXT_WIDE]])
17*dc6d0773SYingwei Zheng; CHECK-NEXT:    [[EXT]] = trunc i64 [[EXT_WIDE]] to i32
18*dc6d0773SYingwei Zheng; CHECK-NEXT:    br label [[FOR_COND]]
19*dc6d0773SYingwei Zheng; CHECK:       for.end:
20*dc6d0773SYingwei Zheng; CHECK-NEXT:    ret void
21*dc6d0773SYingwei Zheng;
22*dc6d0773SYingwei Zhengentry:
23*dc6d0773SYingwei Zheng  br label %for.cond
24*dc6d0773SYingwei Zheng
25*dc6d0773SYingwei Zhengfor.cond:                                         ; preds = %for.body, %entry
26*dc6d0773SYingwei Zheng  %a = phi i32 [ %n, %entry ], [ %ext, %for.body ]
27*dc6d0773SYingwei Zheng  %cmp = icmp sgt i32 %a, -1
28*dc6d0773SYingwei Zheng  br i1 %cmp, label %for.body, label %for.end
29*dc6d0773SYingwei Zheng
30*dc6d0773SYingwei Zhengfor.body:                                         ; preds = %for.cond
31*dc6d0773SYingwei Zheng  %ext.wide = zext i32 %a to i64
32*dc6d0773SYingwei Zheng  call void @use64(i64 %ext.wide)
33*dc6d0773SYingwei Zheng  %ext = trunc i64 %ext.wide to i32
34*dc6d0773SYingwei Zheng  br label %for.cond
35*dc6d0773SYingwei Zheng
36*dc6d0773SYingwei Zhengfor.end:                                          ; preds = %for.cond
37*dc6d0773SYingwei Zheng  ret void
38*dc6d0773SYingwei Zheng}
39*dc6d0773SYingwei Zheng
40*dc6d0773SYingwei Zheng;; Negative test to show transform doesn't happen unless n >= 0.
41*dc6d0773SYingwei Zhengdefine void @test2(i32 %n) {
42*dc6d0773SYingwei Zheng; CHECK-LABEL: @test2(
43*dc6d0773SYingwei Zheng; CHECK-NEXT:  entry:
44*dc6d0773SYingwei Zheng; CHECK-NEXT:    br label [[FOR_COND:%.*]]
45*dc6d0773SYingwei Zheng; CHECK:       for.cond:
46*dc6d0773SYingwei Zheng; CHECK-NEXT:    [[A:%.*]] = phi i32 [ [[N:%.*]], [[ENTRY:%.*]] ], [ [[EXT:%.*]], [[FOR_BODY:%.*]] ]
47*dc6d0773SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[A]], -2
48*dc6d0773SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
49*dc6d0773SYingwei Zheng; CHECK:       for.body:
50*dc6d0773SYingwei Zheng; CHECK-NEXT:    [[EXT_WIDE:%.*]] = zext i32 [[A]] to i64
51*dc6d0773SYingwei Zheng; CHECK-NEXT:    call void @use64(i64 [[EXT_WIDE]])
52*dc6d0773SYingwei Zheng; CHECK-NEXT:    [[EXT]] = trunc i64 [[EXT_WIDE]] to i32
53*dc6d0773SYingwei Zheng; CHECK-NEXT:    br label [[FOR_COND]]
54*dc6d0773SYingwei Zheng; CHECK:       for.end:
55*dc6d0773SYingwei Zheng; CHECK-NEXT:    ret void
56*dc6d0773SYingwei Zheng;
57*dc6d0773SYingwei Zhengentry:
58*dc6d0773SYingwei Zheng  br label %for.cond
59*dc6d0773SYingwei Zheng
60*dc6d0773SYingwei Zhengfor.cond:                                         ; preds = %for.body, %entry
61*dc6d0773SYingwei Zheng  %a = phi i32 [ %n, %entry ], [ %ext, %for.body ]
62*dc6d0773SYingwei Zheng  %cmp = icmp sgt i32 %a, -2
63*dc6d0773SYingwei Zheng  br i1 %cmp, label %for.body, label %for.end
64*dc6d0773SYingwei Zheng
65*dc6d0773SYingwei Zhengfor.body:                                         ; preds = %for.cond
66*dc6d0773SYingwei Zheng  %ext.wide = zext i32 %a to i64
67*dc6d0773SYingwei Zheng  call void @use64(i64 %ext.wide)
68*dc6d0773SYingwei Zheng  %ext = trunc i64 %ext.wide to i32
69*dc6d0773SYingwei Zheng  br label %for.cond
70*dc6d0773SYingwei Zheng
71*dc6d0773SYingwei Zhengfor.end:                                          ; preds = %for.cond
72*dc6d0773SYingwei Zheng  ret void
73*dc6d0773SYingwei Zheng}
74*dc6d0773SYingwei Zheng
75*dc6d0773SYingwei Zheng;; Non looping test case.
76*dc6d0773SYingwei Zhengdefine void @test3(i32 %n) {
77*dc6d0773SYingwei Zheng; CHECK-LABEL: @test3(
78*dc6d0773SYingwei Zheng; CHECK-NEXT:  entry:
79*dc6d0773SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[N:%.*]], -1
80*dc6d0773SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
81*dc6d0773SYingwei Zheng; CHECK:       bb:
82*dc6d0773SYingwei Zheng; CHECK-NEXT:    [[EXT_WIDE:%.*]] = zext nneg i32 [[N]] to i64
83*dc6d0773SYingwei Zheng; CHECK-NEXT:    call void @use64(i64 [[EXT_WIDE]])
84*dc6d0773SYingwei Zheng; CHECK-NEXT:    [[EXT:%.*]] = trunc i64 [[EXT_WIDE]] to i32
85*dc6d0773SYingwei Zheng; CHECK-NEXT:    br label [[EXIT]]
86*dc6d0773SYingwei Zheng; CHECK:       exit:
87*dc6d0773SYingwei Zheng; CHECK-NEXT:    ret void
88*dc6d0773SYingwei Zheng;
89*dc6d0773SYingwei Zhengentry:
90*dc6d0773SYingwei Zheng  %cmp = icmp sgt i32 %n, -1
91*dc6d0773SYingwei Zheng  br i1 %cmp, label %bb, label %exit
92*dc6d0773SYingwei Zheng
93*dc6d0773SYingwei Zhengbb:
94*dc6d0773SYingwei Zheng  %ext.wide = zext i32 %n to i64
95*dc6d0773SYingwei Zheng  call void @use64(i64 %ext.wide)
96*dc6d0773SYingwei Zheng  %ext = trunc i64 %ext.wide to i32
97*dc6d0773SYingwei Zheng  br label %exit
98*dc6d0773SYingwei Zheng
99*dc6d0773SYingwei Zhengexit:
100*dc6d0773SYingwei Zheng  ret void
101*dc6d0773SYingwei Zheng}
102*dc6d0773SYingwei Zheng
103*dc6d0773SYingwei Zheng;; Non looping negative test case.
104*dc6d0773SYingwei Zhengdefine void @test4(i32 %n) {
105*dc6d0773SYingwei Zheng; CHECK-LABEL: @test4(
106*dc6d0773SYingwei Zheng; CHECK-NEXT:  entry:
107*dc6d0773SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[N:%.*]], -2
108*dc6d0773SYingwei Zheng; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
109*dc6d0773SYingwei Zheng; CHECK:       bb:
110*dc6d0773SYingwei Zheng; CHECK-NEXT:    [[EXT_WIDE:%.*]] = zext i32 [[N]] to i64
111*dc6d0773SYingwei Zheng; CHECK-NEXT:    call void @use64(i64 [[EXT_WIDE]])
112*dc6d0773SYingwei Zheng; CHECK-NEXT:    [[EXT:%.*]] = trunc i64 [[EXT_WIDE]] to i32
113*dc6d0773SYingwei Zheng; CHECK-NEXT:    br label [[EXIT]]
114*dc6d0773SYingwei Zheng; CHECK:       exit:
115*dc6d0773SYingwei Zheng; CHECK-NEXT:    ret void
116*dc6d0773SYingwei Zheng;
117*dc6d0773SYingwei Zhengentry:
118*dc6d0773SYingwei Zheng  %cmp = icmp sgt i32 %n, -2
119*dc6d0773SYingwei Zheng  br i1 %cmp, label %bb, label %exit
120*dc6d0773SYingwei Zheng
121*dc6d0773SYingwei Zhengbb:
122*dc6d0773SYingwei Zheng  %ext.wide = zext i32 %n to i64
123*dc6d0773SYingwei Zheng  call void @use64(i64 %ext.wide)
124*dc6d0773SYingwei Zheng  %ext = trunc i64 %ext.wide to i32
125*dc6d0773SYingwei Zheng  br label %exit
126*dc6d0773SYingwei Zheng
127*dc6d0773SYingwei Zhengexit:
128*dc6d0773SYingwei Zheng  ret void
129*dc6d0773SYingwei Zheng}
130*dc6d0773SYingwei Zheng
131*dc6d0773SYingwei Zhengdefine i64 @may_including_undef(i1 %c.1, i1 %c.2) {
132*dc6d0773SYingwei Zheng; CHECK-LABEL: @may_including_undef(
133*dc6d0773SYingwei Zheng; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[TRUE_1:%.*]], label [[FALSE:%.*]]
134*dc6d0773SYingwei Zheng; CHECK:       true.1:
135*dc6d0773SYingwei Zheng; CHECK-NEXT:    br i1 [[C_2:%.*]], label [[TRUE_2:%.*]], label [[EXIT:%.*]]
136*dc6d0773SYingwei Zheng; CHECK:       true.2:
137*dc6d0773SYingwei Zheng; CHECK-NEXT:    br label [[EXIT]]
138*dc6d0773SYingwei Zheng; CHECK:       false:
139*dc6d0773SYingwei Zheng; CHECK-NEXT:    br label [[EXIT]]
140*dc6d0773SYingwei Zheng; CHECK:       exit:
141*dc6d0773SYingwei Zheng; CHECK-NEXT:    [[P:%.*]] = phi i32 [ 0, [[TRUE_1]] ], [ 1, [[TRUE_2]] ], [ undef, [[FALSE]] ]
142*dc6d0773SYingwei Zheng; CHECK-NEXT:    [[EXT:%.*]] = zext i32 [[P]] to i64
143*dc6d0773SYingwei Zheng; CHECK-NEXT:    ret i64 [[EXT]]
144*dc6d0773SYingwei Zheng;
145*dc6d0773SYingwei Zheng  br i1 %c.1, label %true.1, label %false
146*dc6d0773SYingwei Zheng
147*dc6d0773SYingwei Zhengtrue.1:
148*dc6d0773SYingwei Zheng  br i1 %c.2, label %true.2, label %exit
149*dc6d0773SYingwei Zheng
150*dc6d0773SYingwei Zhengtrue.2:
151*dc6d0773SYingwei Zheng  br label %exit
152*dc6d0773SYingwei Zheng
153*dc6d0773SYingwei Zhengfalse:
154*dc6d0773SYingwei Zheng  br label %exit
155*dc6d0773SYingwei Zheng
156*dc6d0773SYingwei Zhengexit:
157*dc6d0773SYingwei Zheng  %p = phi i32 [ 0, %true.1 ], [ 1, %true.2], [ undef, %false ]
158*dc6d0773SYingwei Zheng  %ext = zext i32 %p to i64
159*dc6d0773SYingwei Zheng  ret i64 %ext
160*dc6d0773SYingwei Zheng}
161*dc6d0773SYingwei Zheng
162*dc6d0773SYingwei Zhengdefine i64 @test_infer_at_use(i32 noundef %n) {
163*dc6d0773SYingwei Zheng; CHECK-LABEL: @test_infer_at_use(
164*dc6d0773SYingwei Zheng; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[N:%.*]], -1
165*dc6d0773SYingwei Zheng; CHECK-NEXT:    [[EXT:%.*]] = zext nneg i32 [[N]] to i64
166*dc6d0773SYingwei Zheng; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[CMP]], i64 [[EXT]], i64 0
167*dc6d0773SYingwei Zheng; CHECK-NEXT:    ret i64 [[SELECT]]
168*dc6d0773SYingwei Zheng;
169*dc6d0773SYingwei Zheng  %cmp = icmp sgt i32 %n, -1
170*dc6d0773SYingwei Zheng  %ext = zext i32 %n to i64
171*dc6d0773SYingwei Zheng  %select = select i1 %cmp, i64 %ext, i64 0
172*dc6d0773SYingwei Zheng  ret i64 %select
173*dc6d0773SYingwei Zheng}
174