138 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=ipsccp -S %s -o -| FileCheck %s3 4define i64 @test1(i32 %x) {5; CHECK-LABEL: @test1(6; CHECK-NEXT: [[C:%.*]] = icmp sgt i32 [[X:%.*]], 07; CHECK-NEXT: br i1 [[C]], label [[TRUE:%.*]], label [[FALSE:%.*]]8; CHECK: true:9; CHECK-NEXT: [[EXT_1:%.*]] = zext nneg i32 [[X]] to i6410; CHECK-NEXT: ret i64 [[EXT_1]]11; CHECK: false:12; CHECK-NEXT: [[EXT_2:%.*]] = sext i32 [[X]] to i6413; CHECK-NEXT: ret i64 [[EXT_2]]14;15 %c = icmp sgt i32 %x, 016 br i1 %c, label %true, label %false17 18true:19 %ext.1 = sext i32 %x to i6420 ret i64 %ext.121 22false:23 %ext.2 = sext i32 %x to i6424 ret i64 %ext.225}26 27define i64 @test2(i32 %x) {28; CHECK-LABEL: @test2(29; CHECK-NEXT: [[C:%.*]] = icmp sge i32 [[X:%.*]], 030; CHECK-NEXT: br i1 [[C]], label [[TRUE:%.*]], label [[FALSE:%.*]]31; CHECK: true:32; CHECK-NEXT: [[EXT_1:%.*]] = zext nneg i32 [[X]] to i6433; CHECK-NEXT: ret i64 [[EXT_1]]34; CHECK: false:35; CHECK-NEXT: [[EXT_2:%.*]] = sext i32 [[X]] to i6436; CHECK-NEXT: ret i64 [[EXT_2]]37;38 %c = icmp sge i32 %x, 039 br i1 %c, label %true, label %false40 41true:42 %ext.1 = sext i32 %x to i6443 ret i64 %ext.144 45false:46 %ext.2 = sext i32 %x to i6447 ret i64 %ext.248}49 50 51define i64 @test3(i32 %x) {52; CHECK-LABEL: @test3(53; CHECK-NEXT: [[C:%.*]] = icmp sge i32 [[X:%.*]], -154; CHECK-NEXT: br i1 [[C]], label [[TRUE:%.*]], label [[FALSE:%.*]]55; CHECK: true:56; CHECK-NEXT: [[EXT_1:%.*]] = sext i32 [[X]] to i6457; CHECK-NEXT: ret i64 [[EXT_1]]58; CHECK: false:59; CHECK-NEXT: [[EXT_2:%.*]] = sext i32 [[X]] to i6460; CHECK-NEXT: ret i64 [[EXT_2]]61;62 %c = icmp sge i32 %x, -163 br i1 %c, label %true, label %false64 65true:66 %ext.1 = sext i32 %x to i6467 ret i64 %ext.168 69false:70 %ext.2 = sext i32 %x to i6471 ret i64 %ext.272}73 74define i64 @test4_sext_op_can_be_undef(i1 %c.1, i1 %c.2) {75; CHECK-LABEL: @test4_sext_op_can_be_undef(76; CHECK-NEXT: br i1 [[C_1:%.*]], label [[TRUE_1:%.*]], label [[FALSE:%.*]]77; CHECK: true.1:78; CHECK-NEXT: br i1 [[C_2:%.*]], label [[TRUE_2:%.*]], label [[EXIT:%.*]]79; CHECK: true.2:80; CHECK-NEXT: br label [[EXIT]]81; CHECK: false:82; CHECK-NEXT: br label [[EXIT]]83; CHECK: exit:84; CHECK-NEXT: [[P:%.*]] = phi i32 [ 0, [[TRUE_1]] ], [ 1, [[TRUE_2]] ], [ undef, [[FALSE]] ]85; CHECK-NEXT: [[EXT:%.*]] = sext i32 [[P]] to i6486; CHECK-NEXT: ret i64 [[EXT]]87;88 br i1 %c.1, label %true.1, label %false89 90true.1:91 br i1 %c.2, label %true.2, label %exit92 93true.2:94 br label %exit95 96false:97 br label %exit98 99exit:100 %p = phi i32 [ 0, %true.1 ], [ 1, %true.2], [ undef, %false ]101 %ext = sext i32 %p to i64102 ret i64 %ext103}104 105define i64 @test5(i32 %x) {106; CHECK-LABEL: @test5(107; CHECK-NEXT: [[P:%.*]] = and i32 [[X:%.*]], 15108; CHECK-NEXT: [[EXT:%.*]] = zext nneg i32 [[P]] to i64109; CHECK-NEXT: ret i64 [[EXT]]110;111 %p = and i32 %x, 15112 %ext = sext i32 %p to i64113 ret i64 %ext114}115 116; sext is constant folded before sext -> zext conversion.117define i64 @test6(i32 %x) {118; CHECK-LABEL: @test6(119; CHECK-NEXT: ret i64 10120;121 %ext = sext i32 10 to i64122 ret i64 %ext123}124 125; sext that can be converted to zext feeds another sext.126define i64 @test7(i16 %x) {127; CHECK-LABEL: @test7(128; CHECK-NEXT: [[P:%.*]] = and i16 [[X:%.*]], 15129; CHECK-NEXT: [[EXT_1:%.*]] = zext nneg i16 [[P]] to i32130; CHECK-NEXT: [[EXT_2:%.*]] = sext i32 [[EXT_1]] to i64131; CHECK-NEXT: ret i64 [[EXT_2]]132;133 %p = and i16 %x, 15134 %ext.1 = sext i16 %p to i32135 %ext.2 = sext i32 %ext.1 to i64136 ret i64 %ext.2137}138