Test Failure: Transforms/LowerConstantIntrinsics/builtin-object-size-phi.ll

Test source: git

Log:

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

----------------------------------------
declare ptr @malloc(noundef i64) noundef noalias allocsize(0)

@buffer = global 4 bytes, align 1

define i64 @pick_max(i32 noundef %n) {
entry:
  %cond = icmp eq i32 noundef %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  %malloced = call ptr @malloc(noundef i64 8) nofree noundef nothrow noalias willreturn dereferenceable_or_null(8) alloc-family(malloc) allockind(alloc, uninitialized) allocsize(0) memory(inaccessiblemem: readwrite)
  br label %if.end

if.end:
  %p = phi ptr [ %malloced, %if.else ], [ @buffer, %entry ]
  %size = objectsize ptr %p, i1 0, i1 1
  ret i64 %size
}
Transformation seems to be correct! (syntactically equal)

-- 3. LowerConstantIntrinsicsPass

----------------------------------------
declare ptr @malloc(noundef i64) noundef noalias allocsize(0)

@buffer = global 4 bytes, align 1

define i64 @pick_max(i32 noundef %n) {
entry:
  %cond = icmp eq i32 noundef %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  %malloced = call ptr @malloc(noundef i64 8) nofree noundef nothrow noalias willreturn dereferenceable_or_null(8) alloc-family(malloc) allockind(alloc, uninitialized) allocsize(0) memory(inaccessiblemem: readwrite)
  br label %if.end

if.end:
  %p = phi ptr [ %malloced, %if.else ], [ @buffer, %entry ]
  %size = objectsize ptr %p, i1 0, i1 1
  ret i64 %size
}
=>
declare ptr @malloc(noundef i64) noundef noalias allocsize(0)

@buffer = global 4 bytes, align 1

define i64 @pick_max(i32 noundef %n) {
entry:
  %cond = icmp eq i32 noundef %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  %malloced = call ptr @malloc(noundef i64 8) nofree noundef nothrow noalias willreturn dereferenceable_or_null(8) alloc-family(malloc) allockind(alloc, uninitialized) allocsize(0) memory(inaccessiblemem: readwrite)
  br label %if.end

if.end:
  ret i64 8
}
Transformation seems to be correct!

-- 4. PassManager<Function> : Skipping NOP
-- 5. PassManager<Function> : Skipping NOP
-- 6. LowerConstantIntrinsicsPass

----------------------------------------
declare ptr @malloc(noundef i64) noundef noalias allocsize(0)

@buffer = global 4 bytes, align 1

define i64 @pick_min(i32 noundef %n) {
entry:
  %cond = icmp eq i32 noundef %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  %malloced = call ptr @malloc(noundef i64 8) nofree noundef nothrow noalias willreturn dereferenceable_or_null(8) alloc-family(malloc) allockind(alloc, uninitialized) allocsize(0) memory(inaccessiblemem: readwrite)
  br label %if.end

if.end:
  %p = phi ptr [ %malloced, %if.else ], [ @buffer, %entry ]
  %size = objectsize ptr %p, i1 1, i1 1
  ret i64 %size
}
Transformation seems to be correct! (syntactically equal)

-- 7. LowerConstantIntrinsicsPass

----------------------------------------
declare ptr @malloc(noundef i64) noundef noalias allocsize(0)

@buffer = global 4 bytes, align 1

define i64 @pick_min(i32 noundef %n) {
entry:
  %cond = icmp eq i32 noundef %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  %malloced = call ptr @malloc(noundef i64 8) nofree noundef nothrow noalias willreturn dereferenceable_or_null(8) alloc-family(malloc) allockind(alloc, uninitialized) allocsize(0) memory(inaccessiblemem: readwrite)
  br label %if.end

if.end:
  %p = phi ptr [ %malloced, %if.else ], [ @buffer, %entry ]
  %size = objectsize ptr %p, i1 1, i1 1
  ret i64 %size
}
=>
declare ptr @malloc(noundef i64) noundef noalias allocsize(0)

@buffer = global 4 bytes, align 1

define i64 @pick_min(i32 noundef %n) {
entry:
  %cond = icmp eq i32 noundef %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  %malloced = call ptr @malloc(noundef i64 8) nofree noundef nothrow noalias willreturn dereferenceable_or_null(8) alloc-family(malloc) allockind(alloc, uninitialized) allocsize(0) memory(inaccessiblemem: readwrite)
  br label %if.end

if.end:
  ret i64 4
}
Transformation seems to be correct!

-- 8. PassManager<Function> : Skipping NOP
-- 9. PassManager<Function> : Skipping NOP
-- 10. LowerConstantIntrinsicsPass

----------------------------------------
define i64 @pick_max_same(i32 %n) {
entry:
  %buffer = alloca i64 1 x i64 20, align 1
  %cond = icmp eq i32 %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  %offseted = gep ptr %buffer, 1 x i64 10
  br label %if.end

if.end:
  %p = phi ptr [ %offseted, %if.else ], [ %buffer, %entry ]
  %size = objectsize ptr %p, i1 0, i1 1
  ret i64 %size
}
Transformation seems to be correct! (syntactically equal)

-- 11. LowerConstantIntrinsicsPass

----------------------------------------
define i64 @pick_max_same(i32 %n) {
entry:
  %buffer = alloca i64 1 x i64 20, align 1
  %cond = icmp eq i32 %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  %offseted = gep ptr %buffer, 1 x i64 10
  br label %if.end

if.end:
  %p = phi ptr [ %offseted, %if.else ], [ %buffer, %entry ]
  %size = objectsize ptr %p, i1 0, i1 1
  ret i64 %size
}
=>
define i64 @pick_max_same(i32 %n) {
entry:
  %buffer = alloca i64 1 x i64 20, align 1
  %cond = icmp eq i32 %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  br label %if.end

if.end:
  ret i64 20
}
Transformation seems to be correct!

-- 12. PassManager<Function> : Skipping NOP
-- 13. PassManager<Function> : Skipping NOP
-- 14. LowerConstantIntrinsicsPass

----------------------------------------
define i64 @pick_min_same(i32 %n) {
entry:
  %buffer = alloca i64 1 x i64 20, align 1
  %cond = icmp eq i32 %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  %offseted = gep ptr %buffer, 1 x i64 10
  br label %if.end

if.end:
  %p = phi ptr [ %offseted, %if.else ], [ %buffer, %entry ]
  %size = objectsize ptr %p, i1 1, i1 1
  ret i64 %size
}
Transformation seems to be correct! (syntactically equal)

-- 15. LowerConstantIntrinsicsPass

----------------------------------------
define i64 @pick_min_same(i32 %n) {
entry:
  %buffer = alloca i64 1 x i64 20, align 1
  %cond = icmp eq i32 %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  %offseted = gep ptr %buffer, 1 x i64 10
  br label %if.end

if.end:
  %p = phi ptr [ %offseted, %if.else ], [ %buffer, %entry ]
  %size = objectsize ptr %p, i1 1, i1 1
  ret i64 %size
}
=>
define i64 @pick_min_same(i32 %n) {
entry:
  %buffer = alloca i64 1 x i64 20, align 1
  %cond = icmp eq i32 %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  br label %if.end

if.end:
  ret i64 10
}
Transformation seems to be correct!

-- 16. PassManager<Function> : Skipping NOP
-- 17. PassManager<Function> : Skipping NOP
-- 18. LowerConstantIntrinsicsPass

----------------------------------------
define i64 @pick_max_large(i1 %c) {
#0:
  %buffer = alloca i64 1 x i64 -7, align 1
  %s = select i1 %c, ptr null, ptr %buffer
  %objsize = objectsize ptr %s, i1 0, i1 0
  ret i64 %objsize
}
Transformation seems to be correct! (syntactically equal)

-- 19. LowerConstantIntrinsicsPass

----------------------------------------
define i64 @pick_max_large(i1 %c) {
#0:
  %buffer = alloca i64 1 x i64 -7, align 1
  %s = select i1 %c, ptr null, ptr %buffer
  %objsize = objectsize ptr %s, i1 0, i1 0
  ret i64 %objsize
}
=>
define i64 @pick_max_large(i1 %c) {
#0:
  %buffer = alloca i64 1 x i64 -7, align 1
  ret i64 -1
}

****************************************
WARNING: Source function is always UB.
It can be refined by any target function.
Please make sure this is what you wanted.
****************************************

Transformation seems to be correct!

-- 20. PassManager<Function> : Skipping NOP
-- 21. PassManager<Function> : Skipping NOP
-- 22. LowerConstantIntrinsicsPass

----------------------------------------
define i64 @pick_max_one_oob(i1 %c0, i1 %c1) {
#0:
  %p = alloca i64 2, align 1
  br i1 %c0, label %if.then, label %if.else

if.else:
  %p.else = gep inbounds ptr %p, 2 x i64 0, 1 x i64 -1
  br label %if.end

if.then:
  %p.then = gep inbounds ptr %p, 2 x i64 0, 1 x i64 1
  br label %if.end

if.end:
  %p.end = phi ptr [ %p.else, %if.else ], [ %p.then, %if.then ]
  %objsize.max = objectsize ptr %p.end, i1 0, i1 1
  %objsize.min = objectsize ptr %p.end, i1 1, i1 1
  %objsize = select i1 %c1, i64 %objsize.max, i64 %objsize.min
  ret i64 %objsize
}
Transformation seems to be correct! (syntactically equal)

-- 23. LowerConstantIntrinsicsPass

----------------------------------------
define i64 @pick_max_one_oob(i1 %c0, i1 %c1) {
#0:
  %p = alloca i64 2, align 1
  br i1 %c0, label %if.then, label %if.else

if.else:
  %p.else = gep inbounds ptr %p, 2 x i64 0, 1 x i64 -1
  br label %if.end

if.then:
  %p.then = gep inbounds ptr %p, 2 x i64 0, 1 x i64 1
  br label %if.end

if.end:
  %p.end = phi ptr [ %p.else, %if.else ], [ %p.then, %if.then ]
  %objsize.max = objectsize ptr %p.end, i1 0, i1 1
  %objsize.min = objectsize ptr %p.end, i1 1, i1 1
  %objsize = select i1 %c1, i64 %objsize.max, i64 %objsize.min
  ret i64 %objsize
}
=>
define i64 @pick_max_one_oob(i1 %c0, i1 %c1) {
#0:
  %p = alloca i64 2, align 1
  br i1 %c0, label %if.then, label %if.else

if.else:
  br label %if.end

if.then:
  br label %if.end

if.end:
  %objsize = select i1 %c1, i64 -1, i64 0
  ret i64 %objsize
}
Transformation seems to be correct!

-- 24. PassManager<Function> : Skipping NOP
-- 25. PassManager<Function> : Skipping NOP
-- 26. LowerConstantIntrinsicsPass

----------------------------------------
define i64 @pick_negative_offset(i32 %n) {
entry:
  %buffer0 = alloca i64 1 x i64 20, align 1
  %offseted0 = gep ptr %buffer0, 1 x i64 20
  %cond = icmp eq i32 %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  %buffer1 = alloca i64 1 x i64 20, align 1
  %offseted1 = gep ptr %buffer1, 1 x i64 20
  br label %if.end

if.end:
  %p = phi ptr [ %offseted1, %if.else ], [ %offseted0, %entry ]
  %poffseted = gep ptr %p, 1 x i64 -4
  %size = objectsize ptr %poffseted, i1 0, i1 0
  ret i64 %size
}
Transformation seems to be correct! (syntactically equal)

-- 27. LowerConstantIntrinsicsPass

----------------------------------------
define i64 @pick_negative_offset(i32 %n) {
entry:
  %buffer0 = alloca i64 1 x i64 20, align 1
  %offseted0 = gep ptr %buffer0, 1 x i64 20
  %cond = icmp eq i32 %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  %buffer1 = alloca i64 1 x i64 20, align 1
  %offseted1 = gep ptr %buffer1, 1 x i64 20
  br label %if.end

if.end:
  %p = phi ptr [ %offseted1, %if.else ], [ %offseted0, %entry ]
  %poffseted = gep ptr %p, 1 x i64 -4
  %size = objectsize ptr %poffseted, i1 0, i1 0
  ret i64 %size
}
=>
define i64 @pick_negative_offset(i32 %n) {
entry:
  %buffer0 = alloca i64 1 x i64 20, align 1
  %cond = icmp eq i32 %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  %buffer1 = alloca i64 1 x i64 20, align 1
  br label %if.end

if.end:
  ret i64 4
}
Transformation seems to be correct!

-- 28. PassManager<Function> : Skipping NOP
-- 29. PassManager<Function> : Skipping NOP
-- 30. LowerConstantIntrinsicsPass

----------------------------------------
define i64 @pick_negative_offset_different_width(i32 %n) {
entry:
  %buffer0 = alloca i64 1 x i64 4, align 1
  %buffer1 = alloca i64 1 x i64 8, align 1
  %cond = icmp eq i32 %n, 0
  br i1 %cond, label %if.then, label %if.else

if.else:
  %offseted1 = gep ptr %buffer1, 1 x i64 6
  br label %if.end

if.then:
  %offseted0 = gep ptr %buffer0, 1 x i64 1
  br label %if.end

if.end:
  %p = phi ptr [ %offseted0, %if.then ], [ %offseted1, %if.else ]
  %poffseted = gep ptr %p, 1 x i64 -2
  %size = objectsize ptr %poffseted, i1 0, i1 0
  ret i64 %size
}
Transformation seems to be correct! (syntactically equal)

-- 31. LowerConstantIntrinsicsPass

----------------------------------------
define i64 @pick_negative_offset_different_width(i32 %n) {
entry:
  %buffer0 = alloca i64 1 x i64 4, align 1
  %buffer1 = alloca i64 1 x i64 8, align 1
  %cond = icmp eq i32 %n, 0
  br i1 %cond, label %if.then, label %if.else

if.else:
  %offseted1 = gep ptr %buffer1, 1 x i64 6
  br label %if.end

if.then:
  %offseted0 = gep ptr %buffer0, 1 x i64 1
  br label %if.end

if.end:
  %p = phi ptr [ %offseted0, %if.then ], [ %offseted1, %if.else ]
  %poffseted = gep ptr %p, 1 x i64 -2
  %size = objectsize ptr %poffseted, i1 0, i1 0
  ret i64 %size
}
=>
define i64 @pick_negative_offset_different_width(i32 %n) {
entry:
  %buffer0 = alloca i64 1 x i64 4, align 1
  %buffer1 = alloca i64 1 x i64 8, align 1
  %cond = icmp eq i32 %n, 0
  br i1 %cond, label %if.then, label %if.else

if.else:
  br label %if.end

if.then:
  br label %if.end

if.end:
  ret i64 5
}
Transformation seems to be correct!

-- 32. PassManager<Function> : Skipping NOP
-- 33. PassManager<Function> : Skipping NOP
-- 34. LowerConstantIntrinsicsPass

----------------------------------------
define i64 @pick_negative_offset_with_nullptr(i32 %n) {
entry:
  %buffer0 = alloca i64 1 x i64 20, align 1
  %offseted0 = gep ptr %buffer0, 1 x i64 20
  %cond = icmp eq i32 %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  br label %if.end

if.end:
  %p0 = phi ptr [ %offseted0, %entry ], [ null, %if.else ]
  %p1 = phi ptr [ null, %if.else ], [ %offseted0, %entry ]
  %p0offseted = gep ptr %p0, 1 x i64 -4
  %p1offseted = gep ptr %p1, 1 x i64 -4
  %size0 = objectsize ptr %p0offseted, i1 0, i1 0
  %size1 = objectsize ptr %p1offseted, i1 0, i1 0
  %size = select i1 %cond, i64 %size0, i64 %size1
  ret i64 %size
}
Transformation seems to be correct! (syntactically equal)

-- 35. LowerConstantIntrinsicsPass

----------------------------------------
define i64 @pick_negative_offset_with_nullptr(i32 %n) {
entry:
  %buffer0 = alloca i64 1 x i64 20, align 1
  %offseted0 = gep ptr %buffer0, 1 x i64 20
  %cond = icmp eq i32 %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  br label %if.end

if.end:
  %p0 = phi ptr [ %offseted0, %entry ], [ null, %if.else ]
  %p1 = phi ptr [ null, %if.else ], [ %offseted0, %entry ]
  %p0offseted = gep ptr %p0, 1 x i64 -4
  %p1offseted = gep ptr %p1, 1 x i64 -4
  %size0 = objectsize ptr %p0offseted, i1 0, i1 0
  %size1 = objectsize ptr %p1offseted, i1 0, i1 0
  %size = select i1 %cond, i64 %size0, i64 %size1
  ret i64 %size
}
=>
define i64 @pick_negative_offset_with_nullptr(i32 %n) {
entry:
  %buffer0 = alloca i64 1 x i64 20, align 1
  %cond = icmp eq i32 %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  br label %if.end

if.end:
  ret i64 4
}
Transformation seems to be correct!

-- 36. PassManager<Function> : Skipping NOP
-- 37. PassManager<Function> : Skipping NOP
-- 38. LowerConstantIntrinsicsPass

----------------------------------------
define i64 @pick_negative_offset_with_unsized_nullptr(i32 %n) {
entry:
  %buffer0 = alloca i64 1 x i64 20, align 1
  %offseted0 = gep ptr %buffer0, 1 x i64 20
  %cond = icmp eq i32 %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  br label %if.end

if.end:
  %p0 = phi ptr [ %offseted0, %entry ], [ null, %if.else ]
  %p1 = phi ptr [ null, %if.else ], [ %offseted0, %entry ]
  %p0offseted = gep ptr %p0, 1 x i64 -4
  %p1offseted = gep ptr %p1, 1 x i64 -4
  %size0 = objectsize ptr %p0offseted, i1 0, i1 1
  %size1 = objectsize ptr %p1offseted, i1 0, i1 1
  %size = select i1 %cond, i64 %size0, i64 %size1
  ret i64 %size
}
Transformation seems to be correct! (syntactically equal)

-- 39. LowerConstantIntrinsicsPass

----------------------------------------
define i64 @pick_negative_offset_with_unsized_nullptr(i32 %n) {
entry:
  %buffer0 = alloca i64 1 x i64 20, align 1
  %offseted0 = gep ptr %buffer0, 1 x i64 20
  %cond = icmp eq i32 %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  br label %if.end

if.end:
  %p0 = phi ptr [ %offseted0, %entry ], [ null, %if.else ]
  %p1 = phi ptr [ null, %if.else ], [ %offseted0, %entry ]
  %p0offseted = gep ptr %p0, 1 x i64 -4
  %p1offseted = gep ptr %p1, 1 x i64 -4
  %size0 = objectsize ptr %p0offseted, i1 0, i1 1
  %size1 = objectsize ptr %p1offseted, i1 0, i1 1
  %size = select i1 %cond, i64 %size0, i64 %size1
  ret i64 %size
}
=>
define i64 @pick_negative_offset_with_unsized_nullptr(i32 %n) {
entry:
  %buffer0 = alloca i64 1 x i64 20, align 1
  %cond = icmp eq i32 %n, 0
  br i1 %cond, label %if.else, label %if.end

if.else:
  br label %if.end

if.end:
  ret i64 -1
}
Transformation seems to be correct!

-- 40. PassManager<Function> : Skipping NOP
-- 41. PassManager<Function> : Skipping NOP
-- 42. LowerConstantIntrinsicsPass

----------------------------------------
define i64 @chain_pick_negative_offset_with_nullptr(i32 %x) {
entry:
  %array = alloca i64 16, align 4
  %c = icmp eq i32 %x, 0
  %p = gep ptr %array, 1 x i64 8
  %cond = select i1 %c, ptr %p, ptr null
  %p4 = gep ptr %cond, 1 x i64 8
  %cond6 = select i1 %c, ptr %p4, ptr null
  %p7 = gep ptr %cond6, 1 x i64 -4
  %size = objectsize ptr %p7, i1 0, i1 0
  ret i64 %size
}
Transformation seems to be correct! (syntactically equal)

-- 43. LowerConstantIntrinsicsPass

----------------------------------------
define i64 @chain_pick_negative_offset_with_nullptr(i32 %x) {
entry:
  %array = alloca i64 16, align 4
  %c = icmp eq i32 %x, 0
  %p = gep ptr %array, 1 x i64 8
  %cond = select i1 %c, ptr %p, ptr null
  %p4 = gep ptr %cond, 1 x i64 8
  %cond6 = select i1 %c, ptr %p4, ptr null
  %p7 = gep ptr %cond6, 1 x i64 -4
  %size = objectsize ptr %p7, i1 0, i1 0
  ret i64 %size
}
=>
define i64 @chain_pick_negative_offset_with_nullptr(i32 %x) {
entry:
  %array = alloca i64 16, align 4
  ret i64 4
}
Transformation seems to be correct!

-- 44. PassManager<Function> : Skipping NOP
-- 45. PassManager<Function> : Skipping NOP
-- 46. LowerConstantIntrinsicsPass

----------------------------------------
define i64 @negative_offset_dynamic_eval(i32 %x, i64 %i) {
entry:
  %array1 = alloca i64 16, align 16
  %array2 = alloca i64 32, align 16
  %tobool.not = icmp eq i32 %x, 0
  br i1 %tobool.not, label %if.else, label %if.then

if.then:
  br label %if.end

if.else:
  %add.ptr = gep inbounds ptr %array2, 1 x i64 16
  br label %if.end

if.end:
  %ptr = phi ptr [ %array1, %if.then ], [ %add.ptr, %if.else ]
  %add.ptr2 = gep inbounds ptr %ptr, 4 x i64 %i
  %objsize = objectsize ptr %add.ptr2, i1 0, i1 1
  ret i64 %objsize
}
Transformation seems to be correct! (syntactically equal)

-- 47. LowerConstantIntrinsicsPass

----------------------------------------
define i64 @negative_offset_dynamic_eval(i32 %x, i64 %i) {
entry:
  %array1 = alloca i64 16, align 16
  %array2 = alloca i64 32, align 16
  %tobool.not = icmp eq i32 %x, 0
  br i1 %tobool.not, label %if.else, label %if.then

if.then:
  br label %if.end

if.else:
  %add.ptr = gep inbounds ptr %array2, 1 x i64 16
  br label %if.end

if.end:
  %ptr = phi ptr [ %array1, %if.then ], [ %add.ptr, %if.else ]
  %add.ptr2 = gep inbounds ptr %ptr, 4 x i64 %i
  %objsize = objectsize ptr %add.ptr2, i1 0, i1 1
  ret i64 %objsize
}
=>
define i64 @negative_offset_dynamic_eval(i32 %x, i64 %i) {
entry:
  %array1 = alloca i64 16, align 16
  %array2 = alloca i64 32, align 16
  %tobool.not = icmp eq i32 %x, 0
  br i1 %tobool.not, label %if.else, label %if.then

if.then:
  br label %if.end

if.else:
  br label %if.end

if.end:
  %#0 = phi i64 [ 16, %if.then ], [ 32, %if.else ]
  %#1 = phi i64 [ 0, %if.then ], [ 16, %if.else ]
  %add.ptr2.idx = mul i64 %i, 4
  %#2 = add i64 %#1, %add.ptr2.idx
  %#3 = sub i64 %#0, %#2
  %#4 = icmp ult i64 %#0, %#2
  %#5 = select i1 %#4, i64 0, i64 %#3
  %#6 = icmp ne i64 %#5, -1
  assume i1 %#6
  ret i64 %#5
}
Transformation doesn't verify! (unsound)
ERROR: Source is more defined than target

Example:
i32 %x = #x00000000 (0)
i64 %i = poison

Source:
ptr %array1 = pointer(local, block_id=0, offset=0) / Address=#x00000000000000c0
ptr %array2 = pointer(local, block_id=1, offset=0) / Address=#x0000000000000050
i1 %tobool.not = #x1 (1)
  >> Jump to %if.else
ptr %add.ptr = pointer(local, block_id=1, offset=16) / Address=#x0000000000000060
  >> Jump to %if.end
ptr %ptr = pointer(local, block_id=1, offset=16) / Address=#x0000000000000060
ptr %add.ptr2 = poison
i64 %objsize = poison

SOURCE MEMORY STATE
===================
LOCAL BLOCKS:
Block 0 >	size: 16	align: 16	alloc type: 1	alive: true	address: #x00000000000000c0
Block 1 >	size: 32	align: 16	alloc type: 1	alive: true	address: #x0000000000000050

Target:
ptr %array1 = pointer(local, block_id=0, offset=0) / Address=#x0000000000000010
ptr %array2 = pointer(local, block_id=1, offset=0) / Address=#x0000000000000080
i1 %tobool.not = #x1 (1)
  >> Jump to %if.else
  >> Jump to %if.end
i64 %#0 = #x0000000000000020 (32)
i64 %#1 = #x0000000000000010 (16)
i64 %add.ptr2.idx = poison
i64 %#2 = poison
i64 %#3 = poison
i1 %#4 = poison
i64 %#5 = poison
i1 %#6 = poison
void = UB triggered!

TARGET MEMORY STATE
===================
LOCAL BLOCKS:
Block 0 >	size: 16	align: 16	alloc type: 1	alive: true	address: #x0000000000000010
Block 1 >	size: 32	align: 16	alloc type: 1	alive: true	address: #x0000000000000080


Pass: LowerConstantIntrinsicsPass
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' '-passes=lower-constant-intrinsics' '-S' '-tv-smt-to=20000' '-tv-report-dir=/home/nlopes/alive2/build/logs' '-tv-smt-stats'

Wrote bitcode to: "/home/nlopes/alive2/build/logs/in_ckQ1GCxb_GXzz.bc"

------------------- SMT STATS -------------------
Num queries: 71
Num invalid: 0
Num skips:   0
Num trivial: 66 (48.2%)
Num timeout: 0 (0.0%)
Num errors:  0 (0.0%)
Num SAT:     51 (71.8%)
Num UNSAT:   20 (28.2%)
Alive2: Transform doesn't verify; aborting!

stderr:

Transforms/LowerConstantIntrinsics/builtin-object-size-phi.ll' FAILED ********************
Exit Code: 2

Command Output (stdout):
--
# RUN: at line 2
/home/nlopes/alive2/build/opt-alive.sh -passes=lower-constant-intrinsics  -S < /bitbucket/nlopes/llvm/llvm/test/Transforms/LowerConstantIntrinsics/builtin-object-size-phi.ll | /bitbucket/nlopes/llvm/build/bin/FileCheck /bitbucket/nlopes/llvm/llvm/test/Transforms/LowerConstantIntrinsics/builtin-object-size-phi.ll
# executed command: /home/nlopes/alive2/build/opt-alive.sh -passes=lower-constant-intrinsics -S
# .---command stderr------------
# `-----------------------------
# error: command failed with exit status: 1
# executed command: /bitbucket/nlopes/llvm/build/bin/FileCheck /bitbucket/nlopes/llvm/llvm/test/Transforms/LowerConstantIntrinsics/builtin-object-size-phi.ll
# .---command stderr------------
# | FileCheck error: '<stdin>' is empty.
# | FileCheck command line:  /bitbucket/nlopes/llvm/build/bin/FileCheck /bitbucket/nlopes/llvm/llvm/test/Transforms/LowerConstantIntrinsics/builtin-object-size-phi.ll
# `-----------------------------
# error: command failed with exit status: 2

--

 

<-- Back