[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / JumpThreading / freeze-lvi-edgevaluelocal.ll
blobdb851c46ff5cac2fd6ee9ff9dec6dcd35a740234
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -jump-threading -S < %s | FileCheck %s
4 declare void @f()
5 declare void @f2()
6 declare void @f3()
8 ; br on cond.fr should be removed & ENTRY -> A -> B should be threaded
9 define i32 @simple(i1 %cond) {
10 ; CHECK-LABEL: @simple(
11 ; CHECK-NEXT:  ENTRY:
12 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[B:%.*]], label [[EXIT:%.*]]
13 ; CHECK:       B:
14 ; CHECK-NEXT:    call void @f()
15 ; CHECK-NEXT:    ret i32 1
16 ; CHECK:       EXIT:
17 ; CHECK-NEXT:    ret i32 0
19 ENTRY:
20   %cond.fr = freeze i1 %cond
21   br i1 %cond, label %A, label %EXIT
23   br i1 %cond.fr, label %B, label %EXIT
25   call void @f()
26   ret i32 1
27 EXIT:
28   ret i32 0
31 define void @switch(i32 %cond) {
32 ; CHECK-LABEL: @switch(
33 ; CHECK-NEXT:  ENTRY:
34 ; CHECK-NEXT:    [[COND_FR:%.*]] = freeze i32 [[COND:%.*]]
35 ; CHECK-NEXT:    switch i32 [[COND]], label [[DEFAULT:%.*]] [
36 ; CHECK-NEXT:    i32 0, label [[A_TAKEN:%.*]]
37 ; CHECK-NEXT:    i32 1, label [[B_TAKEN:%.*]]
38 ; CHECK-NEXT:    ]
39 ; CHECK:       DEFAULT:
40 ; CHECK-NEXT:    switch i32 [[COND_FR]], label [[PRESERVED1:%.*]] [
41 ; CHECK-NEXT:    i32 0, label [[PRESERVED2:%.*]]
42 ; CHECK-NEXT:    ]
43 ; CHECK:       PRESERVED1:
44 ; CHECK-NEXT:    call void @f()
45 ; CHECK-NEXT:    ret void
46 ; CHECK:       PRESERVED2:
47 ; CHECK-NEXT:    call void @f2()
48 ; CHECK-NEXT:    ret void
49 ; CHECK:       A_TAKEN:
50 ; CHECK-NEXT:    call void @f()
51 ; CHECK-NEXT:    ret void
52 ; CHECK:       B_TAKEN:
53 ; CHECK-NEXT:    call void @f()
54 ; CHECK-NEXT:    ret void
56 ENTRY:
57   %cond.fr = freeze i32 %cond
58   switch i32 %cond, label %DEFAULT [
59   i32 0, label %A
60   i32 1, label %B
61   ]
62 DEFAULT:
63   switch i32 %cond.fr, label %PRESERVED1 [
64   i32 0, label %PRESERVED2
65   ]
66 PRESERVED1:
67   call void @f()
68   ret void
69 PRESERVED2:
70   call void @f2()
71   ret void
74   switch i32 %cond.fr, label %A_NOTTAKEN [
75   i32 0, label %A_TAKEN
76   ]
77 A_TAKEN:
78   call void @f()
79   ret void
80 A_NOTTAKEN:
81   call void @f2()
82   ret void
85   switch i32 %cond.fr, label %B_TAKEN [
86   i32 0, label %B_NOTTAKEN
87   ]
88 B_TAKEN:
89   call void @f()
90   ret void
91 B_NOTTAKEN:
92   call void @f2()
93   ret void