121 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 62; RUN: opt < %s -passes=gvn -S | FileCheck %s3 4%0 = type { i64, i1 }5 6define i64 @test1(i64 %a, i64 %b) nounwind ssp {7; CHECK-LABEL: define i64 @test1(8; CHECK-SAME: i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0:[0-9]+]] {9; CHECK-NEXT: [[ENTRY:.*:]]10; CHECK-NEXT: [[TMP0:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[A]], i64 [[B]])11; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i64, i1 } [[TMP0]], 012; CHECK-NEXT: [[TMP2:%.*]] = insertvalue [[TMP0]] poison, i64 [[TMP1]], 013; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP0]], 114; CHECK-NEXT: [[TMP4:%.*]] = insertvalue [[TMP0]] [[TMP2]], i1 [[TMP3]], 115; CHECK-NEXT: ret i64 [[TMP1]]16;17entry:18 %uadd = tail call %0 @llvm.uadd.with.overflow.i64(i64 %a, i64 %b)19 %uadd.0 = extractvalue %0 %uadd, 020 %add1 = add i64 %a, %b21 ret i64 %add122}23 24define i64 @test2(i64 %a, i64 %b) nounwind ssp {25; CHECK-LABEL: define i64 @test2(26; CHECK-SAME: i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {27; CHECK-NEXT: [[ENTRY:.*:]]28; CHECK-NEXT: [[TMP0:%.*]] = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 [[A]], i64 [[B]])29; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i64, i1 } [[TMP0]], 030; CHECK-NEXT: [[TMP2:%.*]] = insertvalue [[TMP0]] poison, i64 [[TMP1]], 031; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP0]], 132; CHECK-NEXT: [[TMP4:%.*]] = insertvalue [[TMP0]] [[TMP2]], i1 [[TMP3]], 133; CHECK-NEXT: ret i64 [[TMP1]]34;35entry:36 %usub = tail call %0 @llvm.usub.with.overflow.i64(i64 %a, i64 %b)37 %usub.0 = extractvalue %0 %usub, 038 %sub1 = sub i64 %a, %b39 ret i64 %sub140}41 42define i64 @test3(i64 %a, i64 %b) nounwind ssp {43; CHECK-LABEL: define i64 @test3(44; CHECK-SAME: i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {45; CHECK-NEXT: [[ENTRY:.*:]]46; CHECK-NEXT: [[TMP0:%.*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 [[A]], i64 [[B]])47; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i64, i1 } [[TMP0]], 048; CHECK-NEXT: [[TMP2:%.*]] = insertvalue [[TMP0]] poison, i64 [[TMP1]], 049; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP0]], 150; CHECK-NEXT: [[TMP4:%.*]] = insertvalue [[TMP0]] [[TMP2]], i1 [[TMP3]], 151; CHECK-NEXT: ret i64 [[TMP1]]52;53entry:54 %umul = tail call %0 @llvm.umul.with.overflow.i64(i64 %a, i64 %b)55 %umul.0 = extractvalue %0 %umul, 056 %mul1 = mul i64 %a, %b57 ret i64 %mul158}59 60define i64 @test4(i64 %a, i64 %b) nounwind ssp {61; CHECK-LABEL: define i64 @test4(62; CHECK-SAME: i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {63; CHECK-NEXT: [[ENTRY:.*:]]64; CHECK-NEXT: [[TMP0:%.*]] = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 [[A]], i64 [[B]])65; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i64, i1 } [[TMP0]], 066; CHECK-NEXT: [[TMP2:%.*]] = insertvalue [[TMP0]] poison, i64 [[TMP1]], 067; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP0]], 168; CHECK-NEXT: [[TMP4:%.*]] = insertvalue [[TMP0]] [[TMP2]], i1 [[TMP3]], 169; CHECK-NEXT: ret i64 [[TMP1]]70;71entry:72 %sadd = tail call %0 @llvm.sadd.with.overflow.i64(i64 %a, i64 %b)73 %sadd.0 = extractvalue %0 %sadd, 074 %add1 = add i64 %a, %b75 ret i64 %add176}77 78define i64 @test5(i64 %a, i64 %b) nounwind ssp {79; CHECK-LABEL: define i64 @test5(80; CHECK-SAME: i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {81; CHECK-NEXT: [[ENTRY:.*:]]82; CHECK-NEXT: [[TMP0:%.*]] = call { i64, i1 } @llvm.ssub.with.overflow.i64(i64 [[A]], i64 [[B]])83; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i64, i1 } [[TMP0]], 084; CHECK-NEXT: [[TMP2:%.*]] = insertvalue [[TMP0]] poison, i64 [[TMP1]], 085; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP0]], 186; CHECK-NEXT: [[TMP4:%.*]] = insertvalue [[TMP0]] [[TMP2]], i1 [[TMP3]], 187; CHECK-NEXT: ret i64 [[TMP1]]88;89entry:90 %ssub = tail call %0 @llvm.ssub.with.overflow.i64(i64 %a, i64 %b)91 %ssub.0 = extractvalue %0 %ssub, 092 %sub1 = sub i64 %a, %b93 ret i64 %sub194}95 96define i64 @test6(i64 %a, i64 %b) nounwind ssp {97; CHECK-LABEL: define i64 @test6(98; CHECK-SAME: i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {99; CHECK-NEXT: [[ENTRY:.*:]]100; CHECK-NEXT: [[TMP0:%.*]] = call { i64, i1 } @llvm.smul.with.overflow.i64(i64 [[A]], i64 [[B]])101; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { i64, i1 } [[TMP0]], 0102; CHECK-NEXT: [[TMP2:%.*]] = insertvalue [[TMP0]] poison, i64 [[TMP1]], 0103; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP0]], 1104; CHECK-NEXT: [[TMP4:%.*]] = insertvalue [[TMP0]] [[TMP2]], i1 [[TMP3]], 1105; CHECK-NEXT: ret i64 [[TMP1]]106;107entry:108 %smul = tail call %0 @llvm.smul.with.overflow.i64(i64 %a, i64 %b)109 %smul.0 = extractvalue %0 %smul, 0110 %mul1 = mul i64 %a, %b111 ret i64 %mul1112}113 114declare void @exit(i32) noreturn115declare %0 @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone116declare %0 @llvm.usub.with.overflow.i64(i64, i64) nounwind readnone117declare %0 @llvm.umul.with.overflow.i64(i64, i64) nounwind readnone118declare %0 @llvm.sadd.with.overflow.i64(i64, i64) nounwind readnone119declare %0 @llvm.ssub.with.overflow.i64(i64, i64) nounwind readnone120declare %0 @llvm.smul.with.overflow.i64(i64, i64) nounwind readnone121