File: widening-vs-and-elimination.ll

package info (click to toggle)
llvm-toolchain-16 1%3A16.0.6-15~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,634,792 kB
  • sloc: cpp: 6,179,261; ansic: 1,216,205; asm: 741,319; python: 196,614; objc: 75,325; f90: 49,640; lisp: 32,396; pascal: 12,286; sh: 9,394; perl: 7,442; ml: 5,494; awk: 3,523; makefile: 2,723; javascript: 1,206; xml: 886; fortran: 581; cs: 573
file content (142 lines) | stat: -rw-r--r-- 6,825 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -S -passes=indvars < %s | FileCheck %s --check-prefixes=WIDENING_ON
; RUN: opt -S -passes=indvars -indvars-widen-indvars=false < %s | FileCheck %s --check-prefixes=WIDENING_OFF

target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2"
target triple = "x86_64-unknown-linux-gnu"

define void @test_01(i32 %start, i32 %limit) {
; WIDENING_ON-LABEL: @test_01(
; WIDENING_ON-NEXT:  bb:
; WIDENING_ON-NEXT:    [[TMP0:%.*]] = zext i32 [[START:%.*]] to i64
; WIDENING_ON-NEXT:    [[TMP1:%.*]] = add nsw i64 [[TMP0]], -1
; WIDENING_ON-NEXT:    [[TMP2:%.*]] = zext i32 [[LIMIT:%.*]] to i64
; WIDENING_ON-NEXT:    br label [[LOOP:%.*]]
; WIDENING_ON:       loop:
; WIDENING_ON-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ [[TMP0]], [[BB:%.*]] ]
; WIDENING_ON-NEXT:    [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], -1
; WIDENING_ON-NEXT:    [[NOT_ZERO:%.*]] = icmp ne i64 [[INDVARS_IV]], 0
; WIDENING_ON-NEXT:    [[RANGE_CHECK_WIDE_FIRST_ITER:%.*]] = icmp ult i64 [[TMP1]], [[TMP2]]
; WIDENING_ON-NEXT:    [[AND:%.*]] = and i1 [[NOT_ZERO]], [[RANGE_CHECK_WIDE_FIRST_ITER]]
; WIDENING_ON-NEXT:    br i1 [[AND]], label [[BACKEDGE]], label [[EXIT:%.*]]
; WIDENING_ON:       backedge:
; WIDENING_ON-NEXT:    br label [[LOOP]]
; WIDENING_ON:       exit:
; WIDENING_ON-NEXT:    ret void
;
; WIDENING_OFF-LABEL: @test_01(
; WIDENING_OFF-NEXT:  bb:
; WIDENING_OFF-NEXT:    [[TMP0:%.*]] = add i32 [[START:%.*]], -1
; WIDENING_OFF-NEXT:    br label [[LOOP:%.*]]
; WIDENING_OFF:       loop:
; WIDENING_OFF-NEXT:    [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ [[START]], [[BB:%.*]] ]
; WIDENING_OFF-NEXT:    [[IV_NEXT]] = add i32 [[IV]], -1
; WIDENING_OFF-NEXT:    [[NOT_ZERO:%.*]] = icmp ne i32 [[IV]], 0
; WIDENING_OFF-NEXT:    [[RANGE_CHECK_FIRST_ITER:%.*]] = icmp ult i32 [[TMP0]], [[LIMIT:%.*]]
; WIDENING_OFF-NEXT:    [[AND:%.*]] = and i1 [[NOT_ZERO]], [[RANGE_CHECK_FIRST_ITER]]
; WIDENING_OFF-NEXT:    br i1 [[AND]], label [[BACKEDGE]], label [[EXIT:%.*]]
; WIDENING_OFF:       backedge:
; WIDENING_OFF-NEXT:    [[ZEXT:%.*]] = zext i32 [[IV_NEXT]] to i64
; WIDENING_OFF-NEXT:    [[GEP:%.*]] = getelementptr inbounds i32, ptr addrspace(1) poison, i64 [[ZEXT]]
; WIDENING_OFF-NEXT:    br label [[LOOP]]
; WIDENING_OFF:       exit:
; WIDENING_OFF-NEXT:    ret void
;
bb:
  br label %loop

loop:                                              ; preds = %backedge, %bb
  %iv = phi i32 [ %iv.next, %backedge ], [ %start, %bb ]
  %iv.next = add i32 %iv, -1
  %not.zero = icmp ne i32 %iv, 0
  %range.check = icmp ult i32 %iv.next, %limit
  %and = and i1 %not.zero, %range.check
  br i1 %and, label %backedge, label %exit

backedge:                                              ; preds = %loop
  %zext = zext i32 %iv.next to i64
  %gep = getelementptr inbounds i32, ptr addrspace(1) poison, i64 %zext
  br label %loop

exit:                                             ; preds = %loop
  ret void
}

define i32 @test_02(i32 %start, i32 %limit) {
; WIDENING_ON-LABEL: @test_02(
; WIDENING_ON-NEXT:  bb:
; WIDENING_ON-NEXT:    [[TMP0:%.*]] = zext i32 [[START:%.*]] to i64
; WIDENING_ON-NEXT:    br label [[LOOP:%.*]]
; WIDENING_ON:       loop:
; WIDENING_ON-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ [[TMP0]], [[BB:%.*]] ]
; WIDENING_ON-NEXT:    [[CANONICAL_IV:%.*]] = phi i32 [ [[CANONICAL_IV_NEXT:%.*]], [[BACKEDGE]] ], [ 0, [[BB]] ]
; WIDENING_ON-NEXT:    [[EXITCOND:%.*]] = icmp ne i32 [[CANONICAL_IV]], 65635
; WIDENING_ON-NEXT:    br i1 [[EXITCOND]], label [[CHECKED:%.*]], label [[FAILED:%.*]]
; WIDENING_ON:       checked:
; WIDENING_ON-NEXT:    [[TMP1:%.*]] = add nsw i64 [[INDVARS_IV]], -1
; WIDENING_ON-NEXT:    [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], -1
; WIDENING_ON-NEXT:    [[NOT_ZERO:%.*]] = icmp ne i64 [[INDVARS_IV]], 0
; WIDENING_ON-NEXT:    [[TMP2:%.*]] = zext i32 [[LIMIT:%.*]] to i64
; WIDENING_ON-NEXT:    [[RANGE_CHECK_WIDE:%.*]] = icmp ult i64 [[TMP1]], [[TMP2]]
; WIDENING_ON-NEXT:    [[AND:%.*]] = and i1 [[NOT_ZERO]], [[RANGE_CHECK_WIDE]]
; WIDENING_ON-NEXT:    br i1 [[AND]], label [[BACKEDGE]], label [[EXIT:%.*]]
; WIDENING_ON:       backedge:
; WIDENING_ON-NEXT:    [[CANONICAL_IV_NEXT]] = add nuw nsw i32 [[CANONICAL_IV]], 1
; WIDENING_ON-NEXT:    br label [[LOOP]]
; WIDENING_ON:       exit:
; WIDENING_ON-NEXT:    ret i32 0
; WIDENING_ON:       failed:
; WIDENING_ON-NEXT:    ret i32 1
;
; WIDENING_OFF-LABEL: @test_02(
; WIDENING_OFF-NEXT:  bb:
; WIDENING_OFF-NEXT:    br label [[LOOP:%.*]]
; WIDENING_OFF:       loop:
; WIDENING_OFF-NEXT:    [[CANONICAL_IV:%.*]] = phi i32 [ [[CANONICAL_IV_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ 0, [[BB:%.*]] ]
; WIDENING_OFF-NEXT:    [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[BACKEDGE]] ], [ [[START:%.*]], [[BB]] ]
; WIDENING_OFF-NEXT:    [[EXITCOND:%.*]] = icmp ne i32 [[CANONICAL_IV]], 65635
; WIDENING_OFF-NEXT:    br i1 [[EXITCOND]], label [[CHECKED:%.*]], label [[FAILED:%.*]]
; WIDENING_OFF:       checked:
; WIDENING_OFF-NEXT:    [[IV_NEXT]] = add i32 [[IV]], -1
; WIDENING_OFF-NEXT:    [[NOT_ZERO:%.*]] = icmp ne i32 [[IV]], 0
; WIDENING_OFF-NEXT:    [[RANGE_CHECK:%.*]] = icmp ult i32 [[IV_NEXT]], [[LIMIT:%.*]]
; WIDENING_OFF-NEXT:    [[AND:%.*]] = and i1 [[NOT_ZERO]], [[RANGE_CHECK]]
; WIDENING_OFF-NEXT:    br i1 [[AND]], label [[BACKEDGE]], label [[EXIT:%.*]]
; WIDENING_OFF:       backedge:
; WIDENING_OFF-NEXT:    [[ZEXT:%.*]] = zext i32 [[IV_NEXT]] to i64
; WIDENING_OFF-NEXT:    [[GEP:%.*]] = getelementptr inbounds i32, ptr addrspace(1) poison, i64 [[ZEXT]]
; WIDENING_OFF-NEXT:    [[CANONICAL_IV_NEXT]] = add nuw nsw i32 [[CANONICAL_IV]], 1
; WIDENING_OFF-NEXT:    br label [[LOOP]]
; WIDENING_OFF:       exit:
; WIDENING_OFF-NEXT:    ret i32 0
; WIDENING_OFF:       failed:
; WIDENING_OFF-NEXT:    ret i32 1
;
bb:
  br label %loop

loop:                                              ; preds = %backedge, %bb
  %canonical_iv = phi i32 [ %canonical_iv.next, %backedge ], [ 0, %bb ]
  %iv = phi i32 [ %iv.next, %backedge ], [ %start, %bb ]
  %canonical_iv_check = icmp ult i32 %canonical_iv, 65635
  br i1 %canonical_iv_check, label %checked, label %failed

checked:
  %iv.next = add i32 %iv, -1
  %not.zero = icmp ne i32 %iv, 0
  %range.check = icmp ult i32 %iv.next, %limit
  %and = and i1 %not.zero, %range.check
  br i1 %and, label %backedge, label %exit

backedge:                                              ; preds = %loop
  %zext = zext i32 %iv.next to i64
  %gep = getelementptr inbounds i32, ptr addrspace(1) poison, i64 %zext
  %canonical_iv.next = add i32 %canonical_iv, 1
  br label %loop

exit:                                             ; preds = %loop
  ret i32 0

failed:
  ret i32 1
}