File: sink-inf-loop.ll

package info (click to toggle)
llvm-toolchain-17 1%3A17.0.6-22
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,799,624 kB
  • sloc: cpp: 6,428,607; ansic: 1,383,196; asm: 793,408; python: 223,504; objc: 75,364; f90: 60,502; lisp: 33,869; pascal: 15,282; sh: 9,684; perl: 7,453; ml: 4,937; awk: 3,523; makefile: 2,889; javascript: 2,149; xml: 888; fortran: 619; cs: 573
file content (49 lines) | stat: -rw-r--r-- 1,894 bytes parent folder | download | duplicates (12)
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
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt %s -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -keep-loops=false -sink-common-insts=true -S | FileCheck %s

; This would infinite-loop because we allowed code sinking to examine an infinite-loop block (%j).

define void @PR49541(ptr %t1, i32 %a, i1 %bool) {
; CHECK-LABEL: @PR49541(
; CHECK-NEXT:  entry:
; CHECK-NEXT:    br label [[I:%.*]]
; CHECK:       j:
; CHECK-NEXT:    [[T3:%.*]] = phi i32 [ [[B:%.*]], [[J:%.*]] ], [ [[A:%.*]], [[COND_TRUE:%.*]] ], [ [[A]], [[COND_FALSE:%.*]] ]
; CHECK-NEXT:    [[T2:%.*]] = phi i32 [ [[T2]], [[J]] ], [ [[PRE2:%.*]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ]
; CHECK-NEXT:    [[B]] = load i32, ptr [[T1:%.*]], align 4
; CHECK-NEXT:    br label [[J]]
; CHECK:       i:
; CHECK-NEXT:    [[G_1:%.*]] = phi i16 [ undef, [[ENTRY:%.*]] ], [ [[G_1]], [[COND_FALSE]] ]
; CHECK-NEXT:    br i1 [[BOOL:%.*]], label [[COND_FALSE]], label [[COND_TRUE]]
; CHECK:       cond.true:
; CHECK-NEXT:    [[TOBOOL9_NOT:%.*]] = icmp eq i16 [[G_1]], 0
; CHECK-NEXT:    [[PRE2]] = load i32, ptr [[T1]], align 4
; CHECK-NEXT:    br label [[J]]
; CHECK:       cond.false:
; CHECK-NEXT:    [[T5:%.*]] = load i32, ptr [[T1]], align 4
; CHECK-NEXT:    [[B2:%.*]] = icmp eq i32 [[T5]], 0
; CHECK-NEXT:    br i1 [[B2]], label [[J]], label [[I]]
;
entry:
  br label %i

j:
  %t3 = phi i32 [ %b, %j ], [ %a, %cond.true ], [ %a, %cond.false ]
  %t2 = phi i32 [ %t2, %j ], [ %pre2, %cond.true ], [ 0, %cond.false ]
  %b = load i32, ptr %t1, align 4
  br label %j

i:
  %g.1 = phi i16 [ undef, %entry ], [ %g.1, %cond.false ]
  br i1 %bool, label %cond.false, label %cond.true

cond.true:
  %tobool9.not = icmp eq i16 %g.1, 0
  %pre2 = load i32, ptr %t1, align 4
  br label %j

cond.false:
  %t5 = load i32, ptr %t1, align 4
  %b2 = icmp eq i32 %t5, 0
  br i1 %b2, label %j, label %i
}