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