brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.2 KiB · 8e43244 Raw
174 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=correlated-propagation -S | FileCheck %s3 4declare void @use64(i64)5 6define void @test1(i32 %n) {7; CHECK-LABEL: @test1(8; CHECK-NEXT:  entry:9; CHECK-NEXT:    br label [[FOR_COND:%.*]]10; CHECK:       for.cond:11; CHECK-NEXT:    [[A:%.*]] = phi i32 [ [[N:%.*]], [[ENTRY:%.*]] ], [ [[EXT:%.*]], [[FOR_BODY:%.*]] ]12; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[A]], -113; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]14; CHECK:       for.body:15; CHECK-NEXT:    [[EXT_WIDE:%.*]] = zext nneg i32 [[A]] to i6416; CHECK-NEXT:    call void @use64(i64 [[EXT_WIDE]])17; CHECK-NEXT:    [[EXT]] = trunc nuw nsw i64 [[EXT_WIDE]] to i3218; CHECK-NEXT:    br label [[FOR_COND]]19; CHECK:       for.end:20; CHECK-NEXT:    ret void21;22entry:23  br label %for.cond24 25for.cond:                                         ; preds = %for.body, %entry26  %a = phi i32 [ %n, %entry ], [ %ext, %for.body ]27  %cmp = icmp sgt i32 %a, -128  br i1 %cmp, label %for.body, label %for.end29 30for.body:                                         ; preds = %for.cond31  %ext.wide = zext i32 %a to i6432  call void @use64(i64 %ext.wide)33  %ext = trunc i64 %ext.wide to i3234  br label %for.cond35 36for.end:                                          ; preds = %for.cond37  ret void38}39 40;; Negative test to show transform doesn't happen unless n >= 0.41define void @test2(i32 %n) {42; CHECK-LABEL: @test2(43; CHECK-NEXT:  entry:44; CHECK-NEXT:    br label [[FOR_COND:%.*]]45; CHECK:       for.cond:46; CHECK-NEXT:    [[A:%.*]] = phi i32 [ [[N:%.*]], [[ENTRY:%.*]] ], [ [[EXT:%.*]], [[FOR_BODY:%.*]] ]47; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[A]], -248; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]49; CHECK:       for.body:50; CHECK-NEXT:    [[EXT_WIDE:%.*]] = zext i32 [[A]] to i6451; CHECK-NEXT:    call void @use64(i64 [[EXT_WIDE]])52; CHECK-NEXT:    [[EXT]] = trunc nuw i64 [[EXT_WIDE]] to i3253; CHECK-NEXT:    br label [[FOR_COND]]54; CHECK:       for.end:55; CHECK-NEXT:    ret void56;57entry:58  br label %for.cond59 60for.cond:                                         ; preds = %for.body, %entry61  %a = phi i32 [ %n, %entry ], [ %ext, %for.body ]62  %cmp = icmp sgt i32 %a, -263  br i1 %cmp, label %for.body, label %for.end64 65for.body:                                         ; preds = %for.cond66  %ext.wide = zext i32 %a to i6467  call void @use64(i64 %ext.wide)68  %ext = trunc i64 %ext.wide to i3269  br label %for.cond70 71for.end:                                          ; preds = %for.cond72  ret void73}74 75;; Non looping test case.76define void @test3(i32 %n) {77; CHECK-LABEL: @test3(78; CHECK-NEXT:  entry:79; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[N:%.*]], -180; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]81; CHECK:       bb:82; CHECK-NEXT:    [[EXT_WIDE:%.*]] = zext nneg i32 [[N]] to i6483; CHECK-NEXT:    call void @use64(i64 [[EXT_WIDE]])84; CHECK-NEXT:    [[EXT:%.*]] = trunc nuw nsw i64 [[EXT_WIDE]] to i3285; CHECK-NEXT:    br label [[EXIT]]86; CHECK:       exit:87; CHECK-NEXT:    ret void88;89entry:90  %cmp = icmp sgt i32 %n, -191  br i1 %cmp, label %bb, label %exit92 93bb:94  %ext.wide = zext i32 %n to i6495  call void @use64(i64 %ext.wide)96  %ext = trunc i64 %ext.wide to i3297  br label %exit98 99exit:100  ret void101}102 103;; Non looping negative test case.104define void @test4(i32 %n) {105; CHECK-LABEL: @test4(106; CHECK-NEXT:  entry:107; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[N:%.*]], -2108; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]109; CHECK:       bb:110; CHECK-NEXT:    [[EXT_WIDE:%.*]] = zext i32 [[N]] to i64111; CHECK-NEXT:    call void @use64(i64 [[EXT_WIDE]])112; CHECK-NEXT:    [[EXT:%.*]] = trunc nuw i64 [[EXT_WIDE]] to i32113; CHECK-NEXT:    br label [[EXIT]]114; CHECK:       exit:115; CHECK-NEXT:    ret void116;117entry:118  %cmp = icmp sgt i32 %n, -2119  br i1 %cmp, label %bb, label %exit120 121bb:122  %ext.wide = zext i32 %n to i64123  call void @use64(i64 %ext.wide)124  %ext = trunc i64 %ext.wide to i32125  br label %exit126 127exit:128  ret void129}130 131define i64 @may_including_undef(i1 %c.1, i1 %c.2) {132; CHECK-LABEL: @may_including_undef(133; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[TRUE_1:%.*]], label [[FALSE:%.*]]134; CHECK:       true.1:135; CHECK-NEXT:    br i1 [[C_2:%.*]], label [[TRUE_2:%.*]], label [[EXIT:%.*]]136; CHECK:       true.2:137; CHECK-NEXT:    br label [[EXIT]]138; CHECK:       false:139; CHECK-NEXT:    br label [[EXIT]]140; CHECK:       exit:141; CHECK-NEXT:    [[P:%.*]] = phi i32 [ 0, [[TRUE_1]] ], [ 1, [[TRUE_2]] ], [ undef, [[FALSE]] ]142; CHECK-NEXT:    [[EXT:%.*]] = zext i32 [[P]] to i64143; CHECK-NEXT:    ret i64 [[EXT]]144;145  br i1 %c.1, label %true.1, label %false146 147true.1:148  br i1 %c.2, label %true.2, label %exit149 150true.2:151  br label %exit152 153false:154  br label %exit155 156exit:157  %p = phi i32 [ 0, %true.1 ], [ 1, %true.2], [ undef, %false ]158  %ext = zext i32 %p to i64159  ret i64 %ext160}161 162define i64 @test_infer_at_use(i32 noundef %n) {163; CHECK-LABEL: @test_infer_at_use(164; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[N:%.*]], -1165; CHECK-NEXT:    [[EXT:%.*]] = zext nneg i32 [[N]] to i64166; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[CMP]], i64 [[EXT]], i64 0167; CHECK-NEXT:    ret i64 [[SELECT]]168;169  %cmp = icmp sgt i32 %n, -1170  %ext = zext i32 %n to i64171  %select = select i1 %cmp, i64 %ext, i64 0172  ret i64 %select173}174