147 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 42; RUN: opt < %s -passes=newgvn -S | FileCheck %s3;4 5%0 = type { i64, i1 }6 7define i64 @test1(i64 %a, i64 %b) nounwind ssp {8; CHECK-LABEL: define i64 @test1(9; CHECK-SAME: i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0:[0-9]+]] {10; CHECK-NEXT: entry:11; CHECK-NEXT: [[TMP0:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[A]], i64 [[B]])12; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i64, i1 } [[TMP0]], 013; CHECK-NEXT: [[TMP2:%.*]] = insertvalue [[TMP0]] poison, i64 [[TMP1]], 014; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP0]], 115; CHECK-NEXT: [[TMP4:%.*]] = insertvalue [[TMP0]] [[TMP2]], i1 [[TMP3]], 116; CHECK-NEXT: [[UADD_0:%.*]] = extractvalue [[TMP0]] [[TMP4]], 017; CHECK-NEXT: [[ADD2:%.*]] = add i64 [[TMP1]], [[UADD_0]]18; CHECK-NEXT: ret i64 [[ADD2]]19;20entry:21 %uadd = tail call %0 @llvm.uadd.with.overflow.i64(i64 %a, i64 %b)22 %uadd.0 = extractvalue %0 %uadd, 023 %add1 = add i64 %a, %b24 %add2 = add i64 %add1, %uadd.025 ret i64 %add226}27 28 29define i64 @test2(i64 %a, i64 %b) nounwind ssp {30; CHECK-LABEL: define i64 @test2(31; CHECK-SAME: i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {32; CHECK-NEXT: entry:33; CHECK-NEXT: [[TMP0:%.*]] = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 [[A]], i64 [[B]])34; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i64, i1 } [[TMP0]], 035; CHECK-NEXT: [[TMP2:%.*]] = insertvalue [[TMP0]] poison, i64 [[TMP1]], 036; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP0]], 137; CHECK-NEXT: [[TMP4:%.*]] = insertvalue [[TMP0]] [[TMP2]], i1 [[TMP3]], 138; CHECK-NEXT: [[USUB_0:%.*]] = extractvalue [[TMP0]] [[TMP4]], 039; CHECK-NEXT: [[ADD2:%.*]] = add i64 [[TMP1]], [[USUB_0]]40; CHECK-NEXT: ret i64 [[ADD2]]41;42entry:43 %usub = tail call %0 @llvm.usub.with.overflow.i64(i64 %a, i64 %b)44 %usub.0 = extractvalue %0 %usub, 045 %sub1 = sub i64 %a, %b46 %add2 = add i64 %sub1, %usub.047 ret i64 %add248}49 50 51define i64 @test3(i64 %a, i64 %b) nounwind ssp {52; CHECK-LABEL: define i64 @test3(53; CHECK-SAME: i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {54; CHECK-NEXT: entry:55; CHECK-NEXT: [[TMP0:%.*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 [[A]], i64 [[B]])56; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i64, i1 } [[TMP0]], 057; CHECK-NEXT: [[TMP2:%.*]] = insertvalue [[TMP0]] poison, i64 [[TMP1]], 058; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP0]], 159; CHECK-NEXT: [[TMP4:%.*]] = insertvalue [[TMP0]] [[TMP2]], i1 [[TMP3]], 160; CHECK-NEXT: [[UMUL_0:%.*]] = extractvalue [[TMP0]] [[TMP4]], 061; CHECK-NEXT: [[ADD2:%.*]] = add i64 [[TMP1]], [[UMUL_0]]62; CHECK-NEXT: ret i64 [[ADD2]]63;64entry:65 %umul = tail call %0 @llvm.umul.with.overflow.i64(i64 %a, i64 %b)66 %umul.0 = extractvalue %0 %umul, 067 %mul1 = mul i64 %a, %b68 %add2 = add i64 %mul1, %umul.069 ret i64 %add270}71 72 73define i64 @test4(i64 %a, i64 %b) nounwind ssp {74; CHECK-LABEL: define i64 @test4(75; CHECK-SAME: i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {76; CHECK-NEXT: entry:77; CHECK-NEXT: [[TMP0:%.*]] = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 [[A]], i64 [[B]])78; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i64, i1 } [[TMP0]], 079; CHECK-NEXT: [[TMP2:%.*]] = insertvalue [[TMP0]] poison, i64 [[TMP1]], 080; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP0]], 181; CHECK-NEXT: [[TMP4:%.*]] = insertvalue [[TMP0]] [[TMP2]], i1 [[TMP3]], 182; CHECK-NEXT: [[SADD_0:%.*]] = extractvalue [[TMP0]] [[TMP4]], 083; CHECK-NEXT: [[ADD2:%.*]] = add i64 [[TMP1]], [[SADD_0]]84; CHECK-NEXT: ret i64 [[ADD2]]85;86entry:87 %sadd = tail call %0 @llvm.sadd.with.overflow.i64(i64 %a, i64 %b)88 %sadd.0 = extractvalue %0 %sadd, 089 %add1 = add i64 %a, %b90 %add2 = add i64 %add1, %sadd.091 ret i64 %add292}93 94 95define i64 @test5(i64 %a, i64 %b) nounwind ssp {96; CHECK-LABEL: define i64 @test5(97; CHECK-SAME: i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {98; CHECK-NEXT: entry:99; CHECK-NEXT: [[TMP0:%.*]] = call { i64, i1 } @llvm.ssub.with.overflow.i64(i64 [[A]], i64 [[B]])100; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i64, i1 } [[TMP0]], 0101; CHECK-NEXT: [[TMP2:%.*]] = insertvalue [[TMP0]] poison, i64 [[TMP1]], 0102; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP0]], 1103; CHECK-NEXT: [[TMP4:%.*]] = insertvalue [[TMP0]] [[TMP2]], i1 [[TMP3]], 1104; CHECK-NEXT: [[SSUB_0:%.*]] = extractvalue [[TMP0]] [[TMP4]], 0105; CHECK-NEXT: [[ADD2:%.*]] = add i64 [[TMP1]], [[SSUB_0]]106; CHECK-NEXT: ret i64 [[ADD2]]107;108entry:109 %ssub = tail call %0 @llvm.ssub.with.overflow.i64(i64 %a, i64 %b)110 %ssub.0 = extractvalue %0 %ssub, 0111 %sub1 = sub i64 %a, %b112 %add2 = add i64 %sub1, %ssub.0113 ret i64 %add2114}115 116 117define i64 @test6(i64 %a, i64 %b) nounwind ssp {118; CHECK-LABEL: define i64 @test6(119; CHECK-SAME: i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {120; CHECK-NEXT: entry:121; CHECK-NEXT: [[TMP0:%.*]] = call { i64, i1 } @llvm.smul.with.overflow.i64(i64 [[A]], i64 [[B]])122; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i64, i1 } [[TMP0]], 0123; CHECK-NEXT: [[TMP2:%.*]] = insertvalue [[TMP0]] poison, i64 [[TMP1]], 0124; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP0]], 1125; CHECK-NEXT: [[TMP4:%.*]] = insertvalue [[TMP0]] [[TMP2]], i1 [[TMP3]], 1126; CHECK-NEXT: [[SMUL_0:%.*]] = extractvalue [[TMP0]] [[TMP4]], 0127; CHECK-NEXT: [[ADD2:%.*]] = add i64 [[TMP1]], [[SMUL_0]]128; CHECK-NEXT: ret i64 [[ADD2]]129;130entry:131 %smul = tail call %0 @llvm.smul.with.overflow.i64(i64 %a, i64 %b)132 %smul.0 = extractvalue %0 %smul, 0133 %mul1 = mul i64 %a, %b134 %add2 = add i64 %mul1, %smul.0135 ret i64 %add2136}137 138 139declare void @exit(i32) noreturn140declare %0 @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone141declare %0 @llvm.usub.with.overflow.i64(i64, i64) nounwind readnone142declare %0 @llvm.umul.with.overflow.i64(i64, i64) nounwind readnone143declare %0 @llvm.sadd.with.overflow.i64(i64, i64) nounwind readnone144declare %0 @llvm.ssub.with.overflow.i64(i64, i64) nounwind readnone145declare %0 @llvm.smul.with.overflow.i64(i64, i64) nounwind readnone146 147