brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.1 KiB · 648ef08 Raw
167 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=correlated-propagation -S | FileCheck %s3 4; Check that debug locations are preserved. For more info see:5;   https://llvm.org/docs/SourceLevelDebugging.html#fixing-errors6; RUN: opt < %s -enable-debugify -passes=correlated-propagation -S 2>&1 | \7; RUN:   FileCheck %s -check-prefix=DEBUG8; DEBUG: CheckModuleDebugify: PASS9 10declare void @use64(i64)11 12define void @test1(i32 %n) {13; CHECK-LABEL: @test1(14; CHECK-NEXT:  entry:15; CHECK-NEXT:    br label [[FOR_COND:%.*]]16; CHECK:       for.cond:17; CHECK-NEXT:    [[A:%.*]] = phi i32 [ [[N:%.*]], [[ENTRY:%.*]] ], [ [[EXT:%.*]], [[FOR_BODY:%.*]] ]18; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[A]], -119; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]20; CHECK:       for.body:21; CHECK-NEXT:    [[EXT_WIDE1:%.*]] = zext nneg i32 [[A]] to i6422; CHECK-NEXT:    call void @use64(i64 [[EXT_WIDE1]])23; CHECK-NEXT:    [[EXT]] = trunc nuw nsw i64 [[EXT_WIDE1]] to i3224; CHECK-NEXT:    br label [[FOR_COND]]25; CHECK:       for.end:26; CHECK-NEXT:    ret void27;28entry:29  br label %for.cond30 31for.cond:                                         ; preds = %for.body, %entry32  %a = phi i32 [ %n, %entry ], [ %ext, %for.body ]33  %cmp = icmp sgt i32 %a, -134  br i1 %cmp, label %for.body, label %for.end35 36for.body:                                         ; preds = %for.cond37  %ext.wide = sext i32 %a to i6438  call void @use64(i64 %ext.wide)39  %ext = trunc i64 %ext.wide to i3240  br label %for.cond41 42for.end:                                          ; preds = %for.cond43  ret void44}45 46;; Negative test to show transform doesn't happen unless n >= 0.47define void @test2(i32 %n) {48; CHECK-LABEL: @test2(49; CHECK-NEXT:  entry:50; CHECK-NEXT:    br label [[FOR_COND:%.*]]51; CHECK:       for.cond:52; CHECK-NEXT:    [[A:%.*]] = phi i32 [ [[N:%.*]], [[ENTRY:%.*]] ], [ [[EXT:%.*]], [[FOR_BODY:%.*]] ]53; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[A]], -254; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]55; CHECK:       for.body:56; CHECK-NEXT:    [[EXT_WIDE:%.*]] = sext i32 [[A]] to i6457; CHECK-NEXT:    call void @use64(i64 [[EXT_WIDE]])58; CHECK-NEXT:    [[EXT]] = trunc nsw i64 [[EXT_WIDE]] to i3259; CHECK-NEXT:    br label [[FOR_COND]]60; CHECK:       for.end:61; CHECK-NEXT:    ret void62;63entry:64  br label %for.cond65 66for.cond:                                         ; preds = %for.body, %entry67  %a = phi i32 [ %n, %entry ], [ %ext, %for.body ]68  %cmp = icmp sgt i32 %a, -269  br i1 %cmp, label %for.body, label %for.end70 71for.body:                                         ; preds = %for.cond72  %ext.wide = sext i32 %a to i6473  call void @use64(i64 %ext.wide)74  %ext = trunc i64 %ext.wide to i3275  br label %for.cond76 77for.end:                                          ; preds = %for.cond78  ret void79}80 81;; Non looping test case.82define void @test3(i32 %n) {83; CHECK-LABEL: @test3(84; CHECK-NEXT:  entry:85; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[N:%.*]], -186; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]87; CHECK:       bb:88; CHECK-NEXT:    [[EXT_WIDE1:%.*]] = zext nneg i32 [[N]] to i6489; CHECK-NEXT:    call void @use64(i64 [[EXT_WIDE1]])90; CHECK-NEXT:    [[EXT:%.*]] = trunc nuw nsw i64 [[EXT_WIDE1]] to i3291; CHECK-NEXT:    br label [[EXIT]]92; CHECK:       exit:93; CHECK-NEXT:    ret void94;95entry:96  %cmp = icmp sgt i32 %n, -197  br i1 %cmp, label %bb, label %exit98 99bb:100  %ext.wide = sext i32 %n to i64101  call void @use64(i64 %ext.wide)102  %ext = trunc i64 %ext.wide to i32103  br label %exit104 105exit:106  ret void107}108 109;; Non looping negative test case.110define void @test4(i32 %n) {111; CHECK-LABEL: @test4(112; CHECK-NEXT:  entry:113; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[N:%.*]], -2114; CHECK-NEXT:    br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]115; CHECK:       bb:116; CHECK-NEXT:    [[EXT_WIDE:%.*]] = sext i32 [[N]] to i64117; CHECK-NEXT:    call void @use64(i64 [[EXT_WIDE]])118; CHECK-NEXT:    [[EXT:%.*]] = trunc nsw i64 [[EXT_WIDE]] to i32119; CHECK-NEXT:    br label [[EXIT]]120; CHECK:       exit:121; CHECK-NEXT:    ret void122;123entry:124  %cmp = icmp sgt i32 %n, -2125  br i1 %cmp, label %bb, label %exit126 127bb:128  %ext.wide = sext i32 %n to i64129  call void @use64(i64 %ext.wide)130  %ext = trunc i64 %ext.wide to i32131  br label %exit132 133exit:134  ret void135}136 137define i64 @may_including_undef(i1 %c.1, i1 %c.2) {138; CHECK-LABEL: @may_including_undef(139; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[TRUE_1:%.*]], label [[FALSE:%.*]]140; CHECK:       true.1:141; CHECK-NEXT:    br i1 [[C_2:%.*]], label [[TRUE_2:%.*]], label [[EXIT:%.*]]142; CHECK:       true.2:143; CHECK-NEXT:    br label [[EXIT]]144; CHECK:       false:145; CHECK-NEXT:    br label [[EXIT]]146; CHECK:       exit:147; CHECK-NEXT:    [[P:%.*]] = phi i32 [ 0, [[TRUE_1]] ], [ 1, [[TRUE_2]] ], [ undef, [[FALSE]] ]148; CHECK-NEXT:    [[EXT:%.*]] = sext i32 [[P]] to i64149; CHECK-NEXT:    ret i64 [[EXT]]150;151  br i1 %c.1, label %true.1, label %false152 153true.1:154  br i1 %c.2, label %true.2, label %exit155 156true.2:157  br label %exit158 159false:160  br label %exit161 162exit:163  %p = phi i32 [ 0, %true.1 ], [ 1, %true.2], [ undef, %false ]164  %ext = sext i32 %p to i64165  ret i64 %ext166}167