1; RUN: opt < %s -ipsccp -S | FileCheck %s 2 3; x = [10, 21), y = [100, 201) 4; x + y = [110, 221) 5define internal i1 @f.add(i32 %x, i32 %y) { 6; CHECK-LABEL: define internal i1 @f.add(i32 %x, i32 %y) { 7; CHECK-NEXT: %a.1 = add i32 %x, %y 8; CHECK-NEXT: %c.2 = icmp sgt i32 %a.1, 219 9; CHECK-NEXT: %c.4 = icmp slt i32 %a.1, 111 10; CHECK-NEXT: %c.5 = icmp eq i32 %a.1, 150 11; CHECK-NEXT: %c.6 = icmp slt i32 %a.1, 150 12; CHECK-NEXT: %res.1 = add i1 false, %c.2 13; CHECK-NEXT: %res.2 = add i1 %res.1, false 14; CHECK-NEXT: %res.3 = add i1 %res.2, %c.4 15; CHECK-NEXT: %res.4 = add i1 %res.3, %c.5 16; CHECK-NEXT: %res.5 = add i1 %res.4, %c.6 17; CHECK-NEXT: ret i1 %res.5 18; 19 %a.1 = add i32 %x, %y 20 %c.1 = icmp sgt i32 %a.1, 220 21 %c.2 = icmp sgt i32 %a.1, 219 22 %c.3 = icmp slt i32 %a.1, 110 23 %c.4 = icmp slt i32 %a.1, 111 24 %c.5 = icmp eq i32 %a.1, 150 25 %c.6 = icmp slt i32 %a.1, 150 26 %res.1 = add i1 %c.1, %c.2 27 %res.2 = add i1 %res.1, %c.3 28 %res.3 = add i1 %res.2, %c.4 29 %res.4 = add i1 %res.3, %c.5 30 %res.5 = add i1 %res.4, %c.6 31 ret i1 %res.5 32} 33 34define i1 @caller.add() { 35; CHECK-LABEL: define i1 @caller.add() { 36; CHECK-NEXT: %call.1 = tail call i1 @f.add(i32 10, i32 100) 37; CHECK-NEXT: %call.2 = tail call i1 @f.add(i32 20, i32 200) 38; CHECK-NEXT: %res = and i1 %call.1, %call.2 39; CHECK-NEXT: ret i1 %res 40; 41 %call.1 = tail call i1 @f.add(i32 10, i32 100) 42 %call.2 = tail call i1 @f.add(i32 20, i32 200) 43 %res = and i1 %call.1, %call.2 44 ret i1 %res 45} 46 47 48; x = [10, 21), y = [100, 201) 49; x - y = [-190, -79) 50define internal i1 @f.sub(i32 %x, i32 %y) { 51; CHECK-LABEL: define internal i1 @f.sub(i32 %x, i32 %y) { 52; CHECK-NEXT: %a.1 = sub i32 %x, %y 53; CHECK-NEXT: %c.2 = icmp sgt i32 %a.1, -81 54; CHECK-NEXT: %c.4 = icmp slt i32 %a.1, -189 55; CHECK-NEXT: %c.5 = icmp eq i32 %a.1, -150 56; CHECK-NEXT: %c.6 = icmp slt i32 %a.1, -150 57; CHECK-NEXT: %res.1 = add i1 false, %c.2 58; CHECK-NEXT: %res.2 = add i1 %res.1, false 59; CHECK-NEXT: %res.3 = add i1 %res.2, %c.4 60; CHECK-NEXT: %res.4 = add i1 %res.3, %c.5 61; CHECK-NEXT: %res.5 = add i1 %res.4, %c.6 62; CHECK-NEXT: ret i1 %res.5 63; 64 %a.1 = sub i32 %x, %y 65 %c.1 = icmp sgt i32 %a.1, -80 66 %c.2 = icmp sgt i32 %a.1, -81 67 %c.3 = icmp slt i32 %a.1, -190 68 %c.4 = icmp slt i32 %a.1, -189 69 %c.5 = icmp eq i32 %a.1, -150 70 %c.6 = icmp slt i32 %a.1, -150 71 %res.1 = add i1 %c.1, %c.2 72 %res.2 = add i1 %res.1, %c.3 73 %res.3 = add i1 %res.2, %c.4 74 %res.4 = add i1 %res.3, %c.5 75 %res.5 = add i1 %res.4, %c.6 76 ret i1 %res.5 77} 78 79define i1 @caller.sub() { 80; CHECK-LABEL: define i1 @caller.sub() { 81; CHECK-NEXT: %call.1 = tail call i1 @f.sub(i32 10, i32 100) 82; CHECK-NEXT: %call.2 = tail call i1 @f.sub(i32 20, i32 200) 83; CHECK-NEXT: %res = and i1 %call.1, %call.2 84; CHECK-NEXT: ret i1 %res 85; 86 %call.1 = tail call i1 @f.sub(i32 10, i32 100) 87 %call.2 = tail call i1 @f.sub(i32 20, i32 200) 88 %res = and i1 %call.1, %call.2 89 ret i1 %res 90} 91 92; x = [10, 21), y = [100, 201) 93; x * y = [1000, 4001) 94define internal i1 @f.mul(i32 %x, i32 %y) { 95; CHECK-LABEL: define internal i1 @f.mul(i32 %x, i32 %y) { 96; CHECK-NEXT: %a.1 = mul i32 %x, %y 97; CHECK-NEXT: %c.2 = icmp sgt i32 %a.1, 3999 98; CHECK-NEXT: %c.4 = icmp slt i32 %a.1, 1001 99; CHECK-NEXT: %c.5 = icmp eq i32 %a.1, 1500 100; CHECK-NEXT: %c.6 = icmp slt i32 %a.1, 1500 101; CHECK-NEXT: %res.1 = add i1 false, %c.2 102; CHECK-NEXT: %res.2 = add i1 %res.1, false 103; CHECK-NEXT: %res.3 = add i1 %res.2, %c.4 104; CHECK-NEXT: %res.4 = add i1 %res.3, %c.5 105; CHECK-NEXT: %res.5 = add i1 %res.4, %c.6 106; CHECK-NEXT: ret i1 %res.5 107; 108 %a.1 = mul i32 %x, %y 109 %c.1 = icmp sgt i32 %a.1, 4000 110 %c.2 = icmp sgt i32 %a.1, 3999 111 %c.3 = icmp slt i32 %a.1, 1000 112 %c.4 = icmp slt i32 %a.1, 1001 113 %c.5 = icmp eq i32 %a.1, 1500 114 %c.6 = icmp slt i32 %a.1, 1500 115 %res.1 = add i1 %c.1, %c.2 116 %res.2 = add i1 %res.1, %c.3 117 %res.3 = add i1 %res.2, %c.4 118 %res.4 = add i1 %res.3, %c.5 119 %res.5 = add i1 %res.4, %c.6 120 ret i1 %res.5 121} 122 123define i1 @caller.mul() { 124; CHECK-LABEL: define i1 @caller.mul() { 125; CHECK-NEXT: %call.1 = tail call i1 @f.mul(i32 10, i32 100) 126; CHECK-NEXT: %call.2 = tail call i1 @f.mul(i32 20, i32 200) 127; CHECK-NEXT: %res = and i1 %call.1, %call.2 128; CHECK-NEXT: ret i1 %res 129; 130 %call.1 = tail call i1 @f.mul(i32 10, i32 100) 131 %call.2 = tail call i1 @f.mul(i32 20, i32 200) 132 %res = and i1 %call.1, %call.2 133 ret i1 %res 134} 135