1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4declare void @use.i8(i8) 5define i8 @test_add_nsw(i8 %x, i8 %y, i8 %z) { 6; CHECK-LABEL: @test_add_nsw( 7; CHECK-NEXT: [[LHS:%.*]] = add nsw i8 [[X:%.*]], [[Y:%.*]] 8; CHECK-NEXT: [[RHS:%.*]] = add nsw i8 [[X]], [[Z:%.*]] 9; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 10; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 11; CHECK-NEXT: [[R:%.*]] = sub nsw i8 [[Y]], [[Z]] 12; CHECK-NEXT: ret i8 [[R]] 13; 14 %lhs = add nsw i8 %x, %y 15 %rhs = add nsw i8 %x, %z 16 call void @use.i8(i8 %lhs) 17 call void @use.i8(i8 %rhs) 18 %r = sub nsw i8 %lhs, %rhs 19 ret i8 %r 20} 21 22define i8 @test_add_nsw_no_prop(i8 %x, i8 %y, i8 %z) { 23; CHECK-LABEL: @test_add_nsw_no_prop( 24; CHECK-NEXT: [[LHS:%.*]] = add nsw i8 [[X:%.*]], [[Y:%.*]] 25; CHECK-NEXT: [[RHS:%.*]] = add nuw i8 [[X]], [[Z:%.*]] 26; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 27; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 28; CHECK-NEXT: [[R:%.*]] = sub i8 [[Y]], [[Z]] 29; CHECK-NEXT: ret i8 [[R]] 30; 31 %lhs = add nsw i8 %x, %y 32 %rhs = add nuw i8 %x, %z 33 call void @use.i8(i8 %lhs) 34 call void @use.i8(i8 %rhs) 35 %r = sub nsw i8 %lhs, %rhs 36 ret i8 %r 37} 38 39define i8 @test_add(i8 %x, i8 %y, i8 %z) { 40; CHECK-LABEL: @test_add( 41; CHECK-NEXT: [[LHS:%.*]] = add i8 [[X:%.*]], [[Y:%.*]] 42; CHECK-NEXT: [[RHS:%.*]] = add i8 [[X]], [[Z:%.*]] 43; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 44; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 45; CHECK-NEXT: [[R:%.*]] = sub i8 [[Y]], [[Z]] 46; CHECK-NEXT: ret i8 [[R]] 47; 48 %lhs = add i8 %x, %y 49 %rhs = add i8 %x, %z 50 call void @use.i8(i8 %lhs) 51 call void @use.i8(i8 %rhs) 52 %r = sub i8 %lhs, %rhs 53 ret i8 %r 54} 55 56define i8 @test_add_fail(i8 %w, i8 %x, i8 %y, i8 %z) { 57; CHECK-LABEL: @test_add_fail( 58; CHECK-NEXT: [[LHS:%.*]] = add i8 [[W:%.*]], [[Y:%.*]] 59; CHECK-NEXT: [[RHS:%.*]] = add i8 [[X:%.*]], [[Z:%.*]] 60; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 61; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 62; CHECK-NEXT: [[R:%.*]] = sub i8 [[LHS]], [[RHS]] 63; CHECK-NEXT: ret i8 [[R]] 64; 65 %lhs = add i8 %w, %y 66 %rhs = add i8 %x, %z 67 call void @use.i8(i8 %lhs) 68 call void @use.i8(i8 %rhs) 69 %r = sub i8 %lhs, %rhs 70 ret i8 %r 71} 72 73define i8 @test_add_nuw(i8 %x, i8 %y, i8 %z) { 74; CHECK-LABEL: @test_add_nuw( 75; CHECK-NEXT: [[LHS:%.*]] = add i8 [[X:%.*]], [[Y:%.*]] 76; CHECK-NEXT: [[RHS:%.*]] = or disjoint i8 [[X]], [[Z:%.*]] 77; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 78; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 79; CHECK-NEXT: [[R:%.*]] = sub nuw i8 [[Y]], [[Z]] 80; CHECK-NEXT: ret i8 [[R]] 81; 82 %lhs = add i8 %x, %y 83 %rhs = or disjoint i8 %x, %z 84 call void @use.i8(i8 %lhs) 85 call void @use.i8(i8 %rhs) 86 %r = sub nuw i8 %lhs, %rhs 87 ret i8 %r 88} 89 90define i8 @test_add_nuw_no_prop(i8 %x, i8 %y, i8 %z) { 91; CHECK-LABEL: @test_add_nuw_no_prop( 92; CHECK-NEXT: [[LHS:%.*]] = add i8 [[X:%.*]], [[Y:%.*]] 93; CHECK-NEXT: [[RHS:%.*]] = or disjoint i8 [[X]], [[Z:%.*]] 94; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 95; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 96; CHECK-NEXT: [[R:%.*]] = sub i8 [[Y]], [[Z]] 97; CHECK-NEXT: ret i8 [[R]] 98; 99 %lhs = add i8 %x, %y 100 %rhs = or disjoint i8 %x, %z 101 call void @use.i8(i8 %lhs) 102 call void @use.i8(i8 %rhs) 103 %r = sub i8 %lhs, %rhs 104 ret i8 %r 105} 106 107define i8 @test_sub_nuw(i8 %x, i8 %y, i8 %z) { 108; CHECK-LABEL: @test_sub_nuw( 109; CHECK-NEXT: [[LHS:%.*]] = sub nuw i8 [[X:%.*]], [[Y:%.*]] 110; CHECK-NEXT: [[RHS:%.*]] = sub nuw i8 [[Y]], [[Z:%.*]] 111; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 112; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 113; CHECK-NEXT: [[R:%.*]] = sub nuw i8 [[X]], [[Z]] 114; CHECK-NEXT: ret i8 [[R]] 115; 116 %lhs = sub nuw i8 %x, %y 117 %rhs = sub nuw i8 %y, %z 118 call void @use.i8(i8 %lhs) 119 call void @use.i8(i8 %rhs) 120 %r = add i8 %lhs, %rhs 121 ret i8 %r 122} 123 124define i8 @test_sub_nuw_no_prop(i8 %x, i8 %y, i8 %z) { 125; CHECK-LABEL: @test_sub_nuw_no_prop( 126; CHECK-NEXT: [[LHS:%.*]] = sub nuw i8 [[X:%.*]], [[Y:%.*]] 127; CHECK-NEXT: [[RHS:%.*]] = sub i8 [[Y]], [[Z:%.*]] 128; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 129; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 130; CHECK-NEXT: [[R:%.*]] = sub i8 [[X]], [[Z]] 131; CHECK-NEXT: ret i8 [[R]] 132; 133 %lhs = sub nuw i8 %x, %y 134 %rhs = sub i8 %y, %z 135 call void @use.i8(i8 %lhs) 136 call void @use.i8(i8 %rhs) 137 %r = add nuw i8 %lhs, %rhs 138 ret i8 %r 139} 140 141define i8 @test_sub_nsw(i8 %x, i8 %y, i8 %z) { 142; CHECK-LABEL: @test_sub_nsw( 143; CHECK-NEXT: [[LHS:%.*]] = sub nsw i8 [[X:%.*]], [[Y:%.*]] 144; CHECK-NEXT: [[RHS:%.*]] = sub nsw i8 [[Y]], [[Z:%.*]] 145; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 146; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 147; CHECK-NEXT: [[R:%.*]] = sub nsw i8 [[X]], [[Z]] 148; CHECK-NEXT: ret i8 [[R]] 149; 150 %lhs = sub nsw i8 %x, %y 151 %rhs = sub nsw i8 %y, %z 152 call void @use.i8(i8 %lhs) 153 call void @use.i8(i8 %rhs) 154 %r = or disjoint i8 %lhs, %rhs 155 ret i8 %r 156} 157 158define i8 @test_sub_nsw_no_prop(i8 %x, i8 %y, i8 %z) { 159; CHECK-LABEL: @test_sub_nsw_no_prop( 160; CHECK-NEXT: [[LHS:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]] 161; CHECK-NEXT: [[RHS:%.*]] = sub nsw i8 [[Y]], [[Z:%.*]] 162; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 163; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 164; CHECK-NEXT: [[R:%.*]] = sub i8 [[X]], [[Z]] 165; CHECK-NEXT: ret i8 [[R]] 166; 167 %lhs = sub i8 %x, %y 168 %rhs = sub nsw i8 %y, %z 169 call void @use.i8(i8 %lhs) 170 call void @use.i8(i8 %rhs) 171 %r = or disjoint i8 %lhs, %rhs 172 ret i8 %r 173} 174 175define i8 @test_sub_none(i8 %x, i8 %y, i8 %z) { 176; CHECK-LABEL: @test_sub_none( 177; CHECK-NEXT: [[LHS:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]] 178; CHECK-NEXT: [[RHS:%.*]] = sub i8 [[Y]], [[Z:%.*]] 179; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 180; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 181; CHECK-NEXT: [[R:%.*]] = sub i8 [[X]], [[Z]] 182; CHECK-NEXT: ret i8 [[R]] 183; 184 %lhs = sub i8 %x, %y 185 %rhs = sub i8 %y, %z 186 call void @use.i8(i8 %lhs) 187 call void @use.i8(i8 %rhs) 188 %r = add i8 %lhs, %rhs 189 ret i8 %r 190} 191 192define i8 @test_sub_none_fail(i8 %x, i8 %y, i8 %z) { 193; CHECK-LABEL: @test_sub_none_fail( 194; CHECK-NEXT: [[LHS:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]] 195; CHECK-NEXT: [[RHS:%.*]] = sub i8 [[Z:%.*]], [[Y]] 196; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 197; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 198; CHECK-NEXT: [[R:%.*]] = add i8 [[LHS]], [[RHS]] 199; CHECK-NEXT: ret i8 [[R]] 200; 201 %lhs = sub i8 %x, %y 202 %rhs = sub i8 %z, %y 203 call void @use.i8(i8 %lhs) 204 call void @use.i8(i8 %rhs) 205 %r = add i8 %lhs, %rhs 206 ret i8 %r 207} 208