Test Failure: Transforms/IRCE/non-loop-invariant-rhs-instr.ll

Test source: git

Comments: LLVM PR57523

Log:

Source: <stdin>
-- 1. ModuleToFunctionPassAdaptor
-- 1. PassManager<Function> : Skipping NOP
-- 2. IRCEPass

----------------------------------------
define i32 @test_01(i32 %A, i64 %Len, ptr %array) {
%preheader:
  %tripcheck = icmp sgt i64 %Len, 2
  br i1 %tripcheck, label %loop, label %zero

%loop:
  %indvar = phi i64 [ 1, %preheader ], [ %indvar.next, %latch ]
  %0 = icmp ult i64 %indvar, %Len
  br i1 %0, label %guarded, label %deopt

%guarded:
  %addr = gep inbounds ptr %array, 4 x i64 %indvar
  %res = load i32, ptr %addr, align 4
  %cmp = icmp eq i32 %res, 0
  br i1 %cmp, label %zero, label %latch

%zero:
  ret i32 0

%latch:
  %indvar.next = add nsw nuw i64 %indvar, 2
  %res2 = mul i32 %res, 3
  %1 = zext i32 %A to i64
  %cmp2 = icmp ugt i64 %indvar.next, %1
  br i1 %cmp2, label %loopexit, label %loop

%loopexit:
  ret i32 %res2

%deopt:
  ret i32 1
}
Transformation seems to be correct! (syntactically equal)

-- 3. IRCEPass

----------------------------------------
define i32 @test_01(i32 %A, i64 %Len, ptr %array) {
%preheader:
  %tripcheck = icmp sgt i64 %Len, 2
  br i1 %tripcheck, label %loop, label %zero

%loop:
  %indvar = phi i64 [ 1, %preheader ], [ %indvar.next, %latch ]
  %0 = icmp ult i64 %indvar, %Len
  br i1 %0, label %guarded, label %deopt

%guarded:
  %addr = gep inbounds ptr %array, 4 x i64 %indvar
  %res = load i32, ptr %addr, align 4
  %cmp = icmp eq i32 %res, 0
  br i1 %cmp, label %zero, label %latch

%zero:
  ret i32 0

%latch:
  %indvar.next = add nsw nuw i64 %indvar, 2
  %res2 = mul i32 %res, 3
  %1 = zext i32 %A to i64
  %cmp2 = icmp ugt i64 %indvar.next, %1
  br i1 %cmp2, label %loopexit, label %loop

%loopexit:
  ret i32 %res2

%deopt:
  ret i32 1
}
=>
define i32 @test_01(i32 %A, i64 %Len, ptr %array) {
%preheader:
  %tripcheck = icmp sgt i64 %Len, 2
  br i1 %tripcheck, label %loop.preheader, label %zero

%loop.preheader:
  %0 = zext i32 %A to i64
  %1 = add i64 %0, 1
  %smin = smin i64 %Len, 0
  %2 = sub i64 %Len, %smin
  %umin = umin i64 %2, %1
  %exit.mainloop.at = umax i64 %umin, 1
  %3 = icmp ult i64 1, %exit.mainloop.at
  br i1 %3, label %loop.preheader2, label %main.pseudo.exit

%loop.preheader2:
  br label %loop

%loop:
  %indvar = phi i64 [ %indvar.next, %latch ], [ 1, %loop.preheader2 ]
  br i1 1, label %guarded, label %deopt.loopexit3

%guarded:
  %addr = gep inbounds ptr %array, 4 x i64 %indvar
  %res = load i32, ptr %addr, align 4
  %cmp = icmp eq i32 %res, 0
  br i1 %cmp, label %zero.loopexit.loopexit4, label %latch

%zero.loopexit.loopexit4:
  br label %zero.loopexit

%latch:
  %indvar.next = add nsw nuw i64 %indvar, 2
  %res2 = mul i32 %res, 3
  %6 = icmp ult i64 %indvar.next, %exit.mainloop.at
  %7 = xor i1 %6, 1
  br i1 %7, label %main.exit.selector, label %loop

%main.exit.selector:
  %indvar.next.lcssa = phi i64 [ %indvar.next, %latch ]
  %res2.lcssa1 = phi i32 [ %res2, %latch ]
  %8 = icmp ult i64 %indvar.next.lcssa, %1
  br i1 %8, label %main.pseudo.exit, label %loopexit

%deopt.loopexit3:
  br label %deopt

%main.pseudo.exit:
  %indvar.copy = phi i64 [ 1, %loop.preheader ], [ %indvar.next.lcssa, %main.exit.selector ]
  %indvar.end = phi i64 [ 1, %loop.preheader ], [ %indvar.next.lcssa, %main.exit.selector ]
  br label %postloop

%postloop:
  br label %loop.postloop

%loop.postloop:
  %indvar.postloop = phi i64 [ %indvar.next.postloop, %latch.postloop ], [ %indvar.copy, %postloop ]
  %9 = icmp ult i64 %indvar.postloop, %Len
  br i1 %9, label %guarded.postloop, label %deopt.loopexit

%guarded.postloop:
  %addr.postloop = gep inbounds ptr %array, 4 x i64 %indvar.postloop
  %res.postloop = load i32, ptr %addr.postloop, align 4
  %cmp.postloop = icmp eq i32 %res.postloop, 0
  br i1 %cmp.postloop, label %zero.loopexit.loopexit, label %latch.postloop

%zero.loopexit.loopexit:
  br label %zero.loopexit

%zero.loopexit:
  br label %zero

%zero:
  ret i32 0

%latch.postloop:
  %indvar.next.postloop = add nsw nuw i64 %indvar.postloop, 2
  %res2.postloop = mul i32 %res.postloop, 3
  %10 = zext i32 %A to i64
  %cmp2.postloop = icmp ugt i64 %indvar.next.postloop, %10
  br i1 %cmp2.postloop, label %loopexit.loopexit, label %loop.postloop

%loopexit.loopexit:
  %res2.lcssa.ph = phi i32 [ %res2.postloop, %latch.postloop ]
  br label %loopexit

%loopexit:
  %res2.lcssa = phi i32 [ %res2.lcssa1, %main.exit.selector ], [ %res2.lcssa.ph, %loopexit.loopexit ]
  ret i32 %res2.lcssa

%deopt.loopexit:
  br label %deopt

%deopt:
  ret i32 1
}
Transformation doesn't verify! (unsound)
ERROR: Source is more defined than target

Example:
i32 %A = poison
i64 %Len = #x0000000000000003 (3)
ptr %array = pointer(non-local, block_id=1, offset=0)

Source:
i1 %tripcheck = #x1 (1)
  >> Jump to %loop
i64 %indvar = #x0000000000000001 (1)
i1 %0 = #x1 (1)
  >> Jump to %guarded
ptr %addr = pointer(non-local, block_id=1, offset=4)
i32 %res = #x00000000 (0)
i1 %cmp = #x1 (1)
  >> Jump to %zero

SOURCE MEMORY STATE
===================
NON-LOCAL BLOCKS:
Block 0 >	size: 0	align: 4	alloc type: 0
Block 1 >	size: 4611686018427387904	align: 8	alloc type: 0

Target:
i1 %tripcheck = #x1 (1)
  >> Jump to %loop.preheader
i64 %0 = poison
i64 %1 = poison
i64 %smin = #x0000000000000000 (0)
i64 %2 = #x0000000000000003 (3)
i64 %umin = poison
i64 %exit.mainloop.at = poison
i1 %3 = poison
UB triggered on br


Pass: IRCEPass
Command line: '/home/nlopes/llvm/build/bin/opt' '-load=/home/nlopes/alive2/build/tv/tv.so' '-load-pass-plugin=/home/nlopes/alive2/build/tv/tv.so' '-tv-exit-on-error' '-S' '-passes=irce,verify' '-verify-loop-info' '-tv-smt-to=20000' '-tv-report-dir=/home/nlopes/alive2/build/logs' '-tv-smt-stats'
Wrote bitcode to: "/home/nlopes/alive2/build/logs/in_yONkKhWq_6tcb.bc"


------------------- SMT STATS -------------------
Num queries: 4
Num invalid: 0
Num skips:   0
Num trivial: 11 (73.3%)
Num timeout: 0 (0.0%)
Num errors:  0 (0.0%)
Num SAT:     4 (100.0%)
Num UNSAT:   0 (0.0%)
Alive2: Transform doesn't verify; aborting!

stderr:

+ : 'RUN: at line 2'
+ /bitbucket/nlopes/llvm/build/bin/FileCheck /bitbucket/nlopes/llvm/llvm/test/Transforms/IRCE/non-loop-invariant-rhs-instr.ll
+ /home/nlopes/alive2/build/opt-alive.sh -S -passes=irce,verify -verify-loop-info
/bitbucket/nlopes/llvm/llvm/test/Transforms/IRCE/non-loop-invariant-rhs-instr.ll:6:16: error: CHECK-LABEL: expected string not found in input
; CHECK-LABEL: @test_01(
               ^
<stdin>:1:1: note: scanning from here

^
<stdin>:1:11: note: possible intended match here

          ^

Input file: <stdin>
Check file: /bitbucket/nlopes/llvm/llvm/test/Transforms/IRCE/non-loop-invariant-rhs-instr.ll

-dump-input=help explains the following input dump.

Input was:
<<<<<<
           1:  
label:6'0     X~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ error: no match found
label:6'1               ?                                                         possible intended match
>>>>>>

 

<-- Back