1155e3aa0SNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2155e3aa0SNoah Goldstein; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3155e3aa0SNoah Goldstein 4155e3aa0SNoah Goldsteindeclare void @use.i8(i8) 5155e3aa0SNoah Goldsteindefine i8 @test_add_nsw(i8 %x, i8 %y, i8 %z) { 6155e3aa0SNoah Goldstein; CHECK-LABEL: @test_add_nsw( 7155e3aa0SNoah Goldstein; CHECK-NEXT: [[LHS:%.*]] = add nsw i8 [[X:%.*]], [[Y:%.*]] 8155e3aa0SNoah Goldstein; CHECK-NEXT: [[RHS:%.*]] = add nsw i8 [[X]], [[Z:%.*]] 9155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 10155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 11*a6edcea2SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = sub nsw i8 [[Y]], [[Z]] 12155e3aa0SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 13155e3aa0SNoah Goldstein; 14155e3aa0SNoah Goldstein %lhs = add nsw i8 %x, %y 15155e3aa0SNoah Goldstein %rhs = add nsw i8 %x, %z 16155e3aa0SNoah Goldstein call void @use.i8(i8 %lhs) 17155e3aa0SNoah Goldstein call void @use.i8(i8 %rhs) 18155e3aa0SNoah Goldstein %r = sub nsw i8 %lhs, %rhs 19155e3aa0SNoah Goldstein ret i8 %r 20155e3aa0SNoah Goldstein} 21155e3aa0SNoah Goldstein 22155e3aa0SNoah Goldsteindefine i8 @test_add_nsw_no_prop(i8 %x, i8 %y, i8 %z) { 23155e3aa0SNoah Goldstein; CHECK-LABEL: @test_add_nsw_no_prop( 24155e3aa0SNoah Goldstein; CHECK-NEXT: [[LHS:%.*]] = add nsw i8 [[X:%.*]], [[Y:%.*]] 25155e3aa0SNoah Goldstein; CHECK-NEXT: [[RHS:%.*]] = add nuw i8 [[X]], [[Z:%.*]] 26155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 27155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 28*a6edcea2SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = sub i8 [[Y]], [[Z]] 29155e3aa0SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 30155e3aa0SNoah Goldstein; 31155e3aa0SNoah Goldstein %lhs = add nsw i8 %x, %y 32155e3aa0SNoah Goldstein %rhs = add nuw i8 %x, %z 33155e3aa0SNoah Goldstein call void @use.i8(i8 %lhs) 34155e3aa0SNoah Goldstein call void @use.i8(i8 %rhs) 35155e3aa0SNoah Goldstein %r = sub nsw i8 %lhs, %rhs 36155e3aa0SNoah Goldstein ret i8 %r 37155e3aa0SNoah Goldstein} 38155e3aa0SNoah Goldstein 39155e3aa0SNoah Goldsteindefine i8 @test_add(i8 %x, i8 %y, i8 %z) { 40155e3aa0SNoah Goldstein; CHECK-LABEL: @test_add( 41155e3aa0SNoah Goldstein; CHECK-NEXT: [[LHS:%.*]] = add i8 [[X:%.*]], [[Y:%.*]] 42155e3aa0SNoah Goldstein; CHECK-NEXT: [[RHS:%.*]] = add i8 [[X]], [[Z:%.*]] 43155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 44155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 45*a6edcea2SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = sub i8 [[Y]], [[Z]] 46155e3aa0SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 47155e3aa0SNoah Goldstein; 48155e3aa0SNoah Goldstein %lhs = add i8 %x, %y 49155e3aa0SNoah Goldstein %rhs = add i8 %x, %z 50155e3aa0SNoah Goldstein call void @use.i8(i8 %lhs) 51155e3aa0SNoah Goldstein call void @use.i8(i8 %rhs) 52155e3aa0SNoah Goldstein %r = sub i8 %lhs, %rhs 53155e3aa0SNoah Goldstein ret i8 %r 54155e3aa0SNoah Goldstein} 55155e3aa0SNoah Goldstein 56155e3aa0SNoah Goldsteindefine i8 @test_add_fail(i8 %w, i8 %x, i8 %y, i8 %z) { 57155e3aa0SNoah Goldstein; CHECK-LABEL: @test_add_fail( 58155e3aa0SNoah Goldstein; CHECK-NEXT: [[LHS:%.*]] = add i8 [[W:%.*]], [[Y:%.*]] 59155e3aa0SNoah Goldstein; CHECK-NEXT: [[RHS:%.*]] = add i8 [[X:%.*]], [[Z:%.*]] 60155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 61155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 62155e3aa0SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = sub i8 [[LHS]], [[RHS]] 63155e3aa0SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 64155e3aa0SNoah Goldstein; 65155e3aa0SNoah Goldstein %lhs = add i8 %w, %y 66155e3aa0SNoah Goldstein %rhs = add i8 %x, %z 67155e3aa0SNoah Goldstein call void @use.i8(i8 %lhs) 68155e3aa0SNoah Goldstein call void @use.i8(i8 %rhs) 69155e3aa0SNoah Goldstein %r = sub i8 %lhs, %rhs 70155e3aa0SNoah Goldstein ret i8 %r 71155e3aa0SNoah Goldstein} 72155e3aa0SNoah Goldstein 73155e3aa0SNoah Goldsteindefine i8 @test_add_nuw(i8 %x, i8 %y, i8 %z) { 74155e3aa0SNoah Goldstein; CHECK-LABEL: @test_add_nuw( 75155e3aa0SNoah Goldstein; CHECK-NEXT: [[LHS:%.*]] = add i8 [[X:%.*]], [[Y:%.*]] 76155e3aa0SNoah Goldstein; CHECK-NEXT: [[RHS:%.*]] = or disjoint i8 [[X]], [[Z:%.*]] 77155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 78155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 79*a6edcea2SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = sub nuw i8 [[Y]], [[Z]] 80155e3aa0SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 81155e3aa0SNoah Goldstein; 82155e3aa0SNoah Goldstein %lhs = add i8 %x, %y 83155e3aa0SNoah Goldstein %rhs = or disjoint i8 %x, %z 84155e3aa0SNoah Goldstein call void @use.i8(i8 %lhs) 85155e3aa0SNoah Goldstein call void @use.i8(i8 %rhs) 86155e3aa0SNoah Goldstein %r = sub nuw i8 %lhs, %rhs 87155e3aa0SNoah Goldstein ret i8 %r 88155e3aa0SNoah Goldstein} 89155e3aa0SNoah Goldstein 90155e3aa0SNoah Goldsteindefine i8 @test_add_nuw_no_prop(i8 %x, i8 %y, i8 %z) { 91155e3aa0SNoah Goldstein; CHECK-LABEL: @test_add_nuw_no_prop( 92155e3aa0SNoah Goldstein; CHECK-NEXT: [[LHS:%.*]] = add i8 [[X:%.*]], [[Y:%.*]] 93155e3aa0SNoah Goldstein; CHECK-NEXT: [[RHS:%.*]] = or disjoint i8 [[X]], [[Z:%.*]] 94155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 95155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 96*a6edcea2SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = sub i8 [[Y]], [[Z]] 97155e3aa0SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 98155e3aa0SNoah Goldstein; 99155e3aa0SNoah Goldstein %lhs = add i8 %x, %y 100155e3aa0SNoah Goldstein %rhs = or disjoint i8 %x, %z 101155e3aa0SNoah Goldstein call void @use.i8(i8 %lhs) 102155e3aa0SNoah Goldstein call void @use.i8(i8 %rhs) 103155e3aa0SNoah Goldstein %r = sub i8 %lhs, %rhs 104155e3aa0SNoah Goldstein ret i8 %r 105155e3aa0SNoah Goldstein} 106155e3aa0SNoah Goldstein 107155e3aa0SNoah Goldsteindefine i8 @test_sub_nuw(i8 %x, i8 %y, i8 %z) { 108155e3aa0SNoah Goldstein; CHECK-LABEL: @test_sub_nuw( 109155e3aa0SNoah Goldstein; CHECK-NEXT: [[LHS:%.*]] = sub nuw i8 [[X:%.*]], [[Y:%.*]] 110155e3aa0SNoah Goldstein; CHECK-NEXT: [[RHS:%.*]] = sub nuw i8 [[Y]], [[Z:%.*]] 111155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 112155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 113*a6edcea2SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = sub nuw i8 [[X]], [[Z]] 114155e3aa0SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 115155e3aa0SNoah Goldstein; 116155e3aa0SNoah Goldstein %lhs = sub nuw i8 %x, %y 117155e3aa0SNoah Goldstein %rhs = sub nuw i8 %y, %z 118155e3aa0SNoah Goldstein call void @use.i8(i8 %lhs) 119155e3aa0SNoah Goldstein call void @use.i8(i8 %rhs) 120155e3aa0SNoah Goldstein %r = add i8 %lhs, %rhs 121155e3aa0SNoah Goldstein ret i8 %r 122155e3aa0SNoah Goldstein} 123155e3aa0SNoah Goldstein 124155e3aa0SNoah Goldsteindefine i8 @test_sub_nuw_no_prop(i8 %x, i8 %y, i8 %z) { 125155e3aa0SNoah Goldstein; CHECK-LABEL: @test_sub_nuw_no_prop( 126155e3aa0SNoah Goldstein; CHECK-NEXT: [[LHS:%.*]] = sub nuw i8 [[X:%.*]], [[Y:%.*]] 127155e3aa0SNoah Goldstein; CHECK-NEXT: [[RHS:%.*]] = sub i8 [[Y]], [[Z:%.*]] 128155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 129155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 130*a6edcea2SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = sub i8 [[X]], [[Z]] 131155e3aa0SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 132155e3aa0SNoah Goldstein; 133155e3aa0SNoah Goldstein %lhs = sub nuw i8 %x, %y 134155e3aa0SNoah Goldstein %rhs = sub i8 %y, %z 135155e3aa0SNoah Goldstein call void @use.i8(i8 %lhs) 136155e3aa0SNoah Goldstein call void @use.i8(i8 %rhs) 137155e3aa0SNoah Goldstein %r = add nuw i8 %lhs, %rhs 138155e3aa0SNoah Goldstein ret i8 %r 139155e3aa0SNoah Goldstein} 140155e3aa0SNoah Goldstein 141155e3aa0SNoah Goldsteindefine i8 @test_sub_nsw(i8 %x, i8 %y, i8 %z) { 142155e3aa0SNoah Goldstein; CHECK-LABEL: @test_sub_nsw( 143155e3aa0SNoah Goldstein; CHECK-NEXT: [[LHS:%.*]] = sub nsw i8 [[X:%.*]], [[Y:%.*]] 144155e3aa0SNoah Goldstein; CHECK-NEXT: [[RHS:%.*]] = sub nsw i8 [[Y]], [[Z:%.*]] 145155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 146155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 147*a6edcea2SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = sub nsw i8 [[X]], [[Z]] 148155e3aa0SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 149155e3aa0SNoah Goldstein; 150155e3aa0SNoah Goldstein %lhs = sub nsw i8 %x, %y 151155e3aa0SNoah Goldstein %rhs = sub nsw i8 %y, %z 152155e3aa0SNoah Goldstein call void @use.i8(i8 %lhs) 153155e3aa0SNoah Goldstein call void @use.i8(i8 %rhs) 154155e3aa0SNoah Goldstein %r = or disjoint i8 %lhs, %rhs 155155e3aa0SNoah Goldstein ret i8 %r 156155e3aa0SNoah Goldstein} 157155e3aa0SNoah Goldstein 158155e3aa0SNoah Goldsteindefine i8 @test_sub_nsw_no_prop(i8 %x, i8 %y, i8 %z) { 159155e3aa0SNoah Goldstein; CHECK-LABEL: @test_sub_nsw_no_prop( 160155e3aa0SNoah Goldstein; CHECK-NEXT: [[LHS:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]] 161155e3aa0SNoah Goldstein; CHECK-NEXT: [[RHS:%.*]] = sub nsw i8 [[Y]], [[Z:%.*]] 162155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 163155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 164*a6edcea2SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = sub i8 [[X]], [[Z]] 165155e3aa0SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 166155e3aa0SNoah Goldstein; 167155e3aa0SNoah Goldstein %lhs = sub i8 %x, %y 168155e3aa0SNoah Goldstein %rhs = sub nsw i8 %y, %z 169155e3aa0SNoah Goldstein call void @use.i8(i8 %lhs) 170155e3aa0SNoah Goldstein call void @use.i8(i8 %rhs) 171155e3aa0SNoah Goldstein %r = or disjoint i8 %lhs, %rhs 172155e3aa0SNoah Goldstein ret i8 %r 173155e3aa0SNoah Goldstein} 174155e3aa0SNoah Goldstein 175155e3aa0SNoah Goldsteindefine i8 @test_sub_none(i8 %x, i8 %y, i8 %z) { 176155e3aa0SNoah Goldstein; CHECK-LABEL: @test_sub_none( 177155e3aa0SNoah Goldstein; CHECK-NEXT: [[LHS:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]] 178155e3aa0SNoah Goldstein; CHECK-NEXT: [[RHS:%.*]] = sub i8 [[Y]], [[Z:%.*]] 179155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 180155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 181*a6edcea2SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = sub i8 [[X]], [[Z]] 182155e3aa0SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 183155e3aa0SNoah Goldstein; 184155e3aa0SNoah Goldstein %lhs = sub i8 %x, %y 185155e3aa0SNoah Goldstein %rhs = sub i8 %y, %z 186155e3aa0SNoah Goldstein call void @use.i8(i8 %lhs) 187155e3aa0SNoah Goldstein call void @use.i8(i8 %rhs) 188155e3aa0SNoah Goldstein %r = add i8 %lhs, %rhs 189155e3aa0SNoah Goldstein ret i8 %r 190155e3aa0SNoah Goldstein} 191155e3aa0SNoah Goldstein 192155e3aa0SNoah Goldsteindefine i8 @test_sub_none_fail(i8 %x, i8 %y, i8 %z) { 193155e3aa0SNoah Goldstein; CHECK-LABEL: @test_sub_none_fail( 194155e3aa0SNoah Goldstein; CHECK-NEXT: [[LHS:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]] 195155e3aa0SNoah Goldstein; CHECK-NEXT: [[RHS:%.*]] = sub i8 [[Z:%.*]], [[Y]] 196155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[LHS]]) 197155e3aa0SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[RHS]]) 198155e3aa0SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = add i8 [[LHS]], [[RHS]] 199155e3aa0SNoah Goldstein; CHECK-NEXT: ret i8 [[R]] 200155e3aa0SNoah Goldstein; 201155e3aa0SNoah Goldstein %lhs = sub i8 %x, %y 202155e3aa0SNoah Goldstein %rhs = sub i8 %z, %y 203155e3aa0SNoah Goldstein call void @use.i8(i8 %lhs) 204155e3aa0SNoah Goldstein call void @use.i8(i8 %rhs) 205155e3aa0SNoah Goldstein %r = add i8 %lhs, %rhs 206155e3aa0SNoah Goldstein ret i8 %r 207155e3aa0SNoah Goldstein} 208